当LDAP服务器closures时,Linux控制台不可用

当我们的OpenLDAP服务器断电时,CentOS机器的控制台几乎无法使用。

我们试图用本地帐户login,但是每个命令都需要几分钟才能返回。 即使像ls这样简单的命令也只是坐在那里。

这似乎没有在Ubuntu下相同的configuration问题。 初始login需要一段时间才能成功完成本地帐户,但是一旦完成所有工作。

我正在寻找一种方法来缓解这个问题,并提出了一些想法:

  • 为ldap-pam模块设置超时值(如果存在)
  • 运行一个本地ldap数据库并进行身份validation(这将是主要的奴隶)
  • 创build一个cron作业来启用/禁用连接到ldap服务器的连接

有什么更好的解决scheme来pipe理LDAP的某种冗余/故障转移?

你有几个select。

我们使用复制在networking上有几个LDAP服务器,隐藏在负载均衡器后面,所以如果出现故障,我们仍然有一个可用。 我们使用keepalived进行负载平衡。 您也可以在故障转移设置中使用keepalived,在此设置热备份从站。

其次,每个工作站上都​​可以有一个本地LDAP服务器,但是这会导致很高的维护难度,因为您需要pipe理所有这些服务器并对其进行监视,以确保它们与复制保持同步。 你不希望他们失去同步。

当你有一台从服务器时,确保你设置了updateref选项,以便任何尝试的更新被发送到主服务器。

/etc/ldap.conf中有几个设置可以用来改善情况。 最重要的是:

 bind_policy soft 

默认是“硬”,这将继续重试联系服务器之间的等待。 如果将其设置为软,它将立即返回。 您也可以使用超时选项来减less等待的时间。

 # Search timelimit timelimit 30 # Bind/connect timelimit bind_timelimit 30 

我知道你有一个大卫接受的答案,但我想在这里提出一个不同的方法,分享我的一些经验。

我发现使用bind_policy soft的问题是,如果你没有立即得到服务器的响应,比如说它很忙,或者你的networking负载很高,你将立即得到一个LDAP失败。 对于nss_ldap来说,这意味着你的nss查询将会失败,任何正在尝试使用它的进程都会报告它找不到正在查找和失败的用户或组。 当你的LDAP服务器启动时,这在正常的操作过程中可能是一个问题,哪个IMO比服务器closures时的问题还要严重。

我使用以下设置find了更可接受的解决scheme:

 bind_policy hard nss_reconnect_tries 3 nss_reconnect_sleeptime 1 nss_reconnect_maxsleeptime 8 nss_reconnect_maxconntries 2 

这样,您仍然可以使用硬连接策略,但nss_reconnect_*设置将大大减less您的LDAP客户端尝试获取LDAP结果的时间。 这也意味着在正常使用过程中,如果第一次尝试不能获得LDAP结果,它将再次尝试,通常第二次尝试。 这意味着在正常使用中失败的次数更less

至于在每个工作站上运行本地LDAP服务器,我不build议这样做。 我可以指向你,而不是nsscache 。 它是由Google的一些工程师编写的,它通过创buildLDAP数据库的本地caching并通过cron作业递增更新来解决此问题。 然后,您将nsswitch源设置为使用其库而不是nss_ldap,并且所有查找都是本地的。 这样做的好处是可以大大减lessLDAP服务器的负载,并在服务器连接断开的情况下使所有查找可用。 它现在没有最好的文档,没有被广泛使用,但是它确实运行良好,邮件列表相当敏感。

我们遇到了这个问题,我们的解决scheme是告诉LDAP不要成为服务器运行所需的组的源。 这是通过在我们的ldap.conf的末尾放置以下内容来完成的

 # We need to ensure that various things can work without LDAP being available # for example: booting, ssh in as root, apache ... nss_initgroups_ignoreusers avahi,avahi-autoipd,backup,bin,daemon,dhcp,dhcpd,games,gdm,gnats,haldaemon,hplip,irc,klog,libuuid,list,lp,mail,man,messagebus,munin,mysql,nbd,news,ntp,nut,polkituser,proxy,pulse,root,sshd,statd,sync,sys,syslog,uucp,www-data 

从nss_ldap手册页

 nss_initgroups_ignoreusers <user1,user2,...,userN> This option directs the nss_ldap implementation of initgroups(3) to return NSS_STATUS_NOTFOUND if called with a listed users as its argument. 

所以基本上LDAP假装不知道那些用户,甚至没有联系主服务器,所以NSS落在本地用户上,系统工作正常。

我们还在许多服务器上设置了LDAP副本,以实现腰带和大括号方式。