当我们的 OpenLDAP 服务器断电时,CentOS 机器的控制台几乎无法使用。
我们尝试使用本地帐户登录,但每个命令都需要几分钟才能返回。即使是简单的命令ls
也只是坐在那里。
这在 Ubuntu 下使用相同的配置似乎不是问题。本地帐户的初始登录需要一段时间才能成功,但是一旦您进入,一切正常。
我正在寻找一种方法来缓解这个问题,并提出了几个想法:
- 为 ldap-pam 模块设置超时值(如果存在)
- 运行本地 ldap db 并使用它进行身份验证(它将是主数据库的从属)
- 如果我们失去与 ldap 服务器的连接,请创建一个 cron 作业以启用/禁用
有没有更好的解决方案来管理 LDAP 的某种冗余/故障转移?
你有几个选择。
我们使用复制在网络上拥有多个 LDAP 服务器,隐藏在负载均衡器后面,因此如果其中一个出现故障,我们仍然有一个可用。我们使用 keepalived 进行负载平衡。您还可以在故障转移设置中使用 keepalived,其中您有一个热备份从站。
其次,您可以在每个工作站上拥有一个本地 LDAP 服务器,但这会导致维护工作非常头疼,因为您需要管理所有这些并监控它们以确保它们跟上复制的速度。您不希望它们不同步。
当您有从属服务器时,请确保您设置了 updateref 选项,以便将任何尝试的更新发送到主服务器。
/etc/ldap.conf 中有几个设置可以用来改善情况。最重要的是:
默认值为“硬”,它将不断重试联系服务器,并在两者之间等待。如果将其设置为软,它将立即返回。您还可以使用超时选项来减少它等待的时间。
我知道你已经接受了大卫的回答,但我想在这里提出一种不同的方法并分享我的一些经验。
我发现使用的问题
bind_policy soft
是,如果您没有立即从服务器获得响应,例如它很忙或者您的网络负载很高,您将立即收到 LDAP 故障。对于 nss_ldap 这意味着您的 nss 查找将失败,并且任何尝试使用它的进程都会简单地报告它找不到它正在查找的用户或组并失败。当您的 LDAP 服务器启动时,这在正常操作期间可能是一个问题,IMO 比服务器关闭时的问题更糟糕。通过使用以下设置,我找到了更可接受的解决方案:
这样,您仍将拥有硬连接策略,但这些
nss_reconnect_*
设置将大大减少您的 LDAP 客户端尝试获取 LDAP 结果所花费的时间。这也意味着在正常使用过程中,如果第一次尝试获取 LDAP 结果失败,它会再次尝试,通常第二次获取。这意味着在正常使用期间发生的故障更少。至于在每个工作站上运行本地 LDAP 服务器,我不建议这样做。我可以向您指出的是nsscache。它是由 Google 的一些工程师编写的,它通过创建 LDAP 数据库的本地缓存并通过 cron 作业逐步更新它来解决这个问题。然后,您将 nsswitch 源设置为使用他们的库而不是 nss_ldap,并且所有查找都是本地的。这样做的好处是可以大大减少 LDAP 服务器上的负载,并在与服务器的连接断开时使所有查找可用。它现在没有最好的文档,也没有被广泛使用,但它确实运作良好,邮件列表非常敏感。
我们遇到了这个问题,我们的解决方案是告诉 LDAP 不要成为服务器运行所需的组的来源。这是通过将以下内容放在我们的末尾来完成的
ldap.conf
从nss_ldap 手册页
所以基本上 LDAP 在不联系主服务器的情况下假装它不认识这些用户,因此 NSS 依靠本地用户并且系统工作正常。
我们还在许多服务器上设置了 LDAP 副本,以采用带和大括号的方法。