• OpenLdap+MySQL笔记


    20元现金领取地址:http://jdb.jiudingcapital.com/phone.html
    内部邀请码:C8E245J (不写邀请码,没有现金送)

    国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为“中国PE第一股”,市值超1000亿元。

    最近项目原因,在CentOS下做了一套简单的LDAP服务,在此记录一二,本文强调后期碰到的问题和解决方法

    下面的链接是比较详细的安装和基本配置过程,这个链接适用于debian,但是类似的可以在其他发行版下借鉴:

    http://www.wingfoss.com/content/how-to-install-openldap-with-mysql-on-debian6

    如果从源代码安装的话,slapd不会被注册成服务,需要手动来做。下面是一个Ldap自启动的脚本,我在CentOS下试过了,可以用的

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    #!/bin/sh
    #
    # ldap This shell script takes care of starting and stopping
    # ldap servers (slapd and slurpd).
    #
    # chkconfig: - 70 40
    # description: LDAP stands for Lightweight Directory Access Protocol, used
    # for implementing the industry standard directory services.
    # processname: slapd
    # config: /etc/openldap/slapd.conf
    # pidfile: /var/run/slapd.pid
    # Source function library.
    . /etc/rc.d/init.d/functions
    # Source networking configuration.
    . /etc/sysconfig/network
    # Check that networking is up.
    [ ${NETWORKING} = "no" ] && exit 0
    [ -f /usr/local/libexec/slapd ] || exit 0
    # [ -f /usr/sbin/slurpd ] || exit 0
     
    export CPPFLAGS="-I/opt/BerkeleyDB.5.3/include"
    export LDFLAGS="-L/opt/BerkeleyDB.5.3/lib"
    export LD_LIBRARY_PATH="/opt/BerkeleyDB.5.3/lib"
     
    RETVAL=0
    # See how we were called.
    case "$1" in
            start)
            # Start daemons.
                    echo -n "Starting ldap: "
                    daemon /usr/local/libexec/slapd
                    RETVAL=$?
                    if [ $RETVAL -eq 0 ]; then
                            if grep -q "^replogfile" /etc/openldap/slapd.conf; then
                                    daemon slurpd
                                    RETVAL=$?
                                    [ $RETVAL -eq 0 ] && pidof slurpd | cut -f 1 -d " " > /var/run/slurpd
                            fi
                    fi
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/ldap
    ;;
            stop)
            # Stop daemons.
                    echo -n "Shutting down ldap: "
                    killproc slapd
                    RETVAL=$?
                    if [ $RETVAL -eq 0 ]; then
                            if grep -q "^replogfile" /etc/openldap/slapd.conf; then
                            killproc slurpd
                            RETVAL=$?
                            fi
                    fi
    echo
    if [ $RETVAL -eq 0 ]; then
                    rm -f /var/lock/subsys/ldap
                    rm -f /var/run/slapd.args
                    fi
    ;;
            status)
                    status slapd
                    RETVAL=$?
                    if [ $RETVAL -eq 0 ]; then
                            if grep -q "^replogfile" /etc/openldap/slapd.conf; then
                                    status slurpd
                                    RETVAL=$?
                            fi
                    fi
    ;;
            restart)
                    $0 stop
                    $0 start
                    RETVAL=$?
    ;;
            reload)
                    killproc -HUP slapd
                    RETVAL=$?
                    if [ $RETVAL -eq 0 ]; then
                            if grep -q "^replogfile" /etc/openldap/slapd.conf; then
                                    killproc -HUP slurpd
                                    RETVAL=$?
                            fi
                    fi
    ;;
    *)
    echo "Usage: $0 start|stop|restart|status}"
    exit 1
    esac
    exit $RETVAL

    对脚本的一些说明

    • # chkconfig: - 70 40 :此行不仅仅是注释,服务注册的命令(chkconfig)会根据这行还决定服务的启动顺序
    • export是导出BerkeleyDB的库文件和头文件

    将脚本保存在/etc/init.d下,为其设置可执行权限

    1
    chmod 700 /etc/init.d/ldap

    用chkconfig命令注册脚本在启动时运行

    1
    2
    chkconfig --add ldap
    chkconfig --level 345 ldap on

    因为是基于mysql的后端数据库,所以要保证ldap在mysql启动后启动,查看相应运行级别的rc.d文件(比如在level3时,进入到/etc/rc.d/rc3.d),查看其中的链接的开头数字是否大于mysql服务的数字。关于CentOS下,服务的基本概念这里不再说了

    后续问题:长时间inactive,LDAP故障,需要重启

    LDAP上线后,发现每天晚上过来LDAP服务都不可用了。这个问题一度困扰了我很长时间,网上各种查都无果,为此还在论坛上提问了。详见http://www.linuxcast.net/ask/show/480

    最终偶然的机会,同事抱怨说Oracle数据库链接超过上线,要释放。我突然来了灵感,猜测是Mysql数据库链接自动关闭的问题,回头一查,果然mysql的如下参数设置成了8小时:

    interactive_timeout    | 28800

    wait_timeout       | 28800

    这样一来,一晚上(超过8小时)过来mysql主动将LDAP打开并保存的链接单方面关闭了,而LDAP全然不知,也没有重试链接,导致无法查询数据库。将这个值改大后可以保证一晚上不释放即可。

    后续问题:性能低下

    由于保存用户信息,用于登陆验证。用户感知登陆很慢,通常要10秒以上,才能登录。开始分析:先打开LDAP的log,在LDAP的配置文件里面配置

    loglevel   256

    然后在linux的日志服务的配置文件中添加

    local4.*   -/var/log/ldap.log

    log将输出到上面的路径下,关于linux系统日志服务的基本知识这里略过

    观察log发现search每次都要大约6秒钟的时间,是主要的性能瓶颈。最初想为LDAP加索引和缓存,索引似乎只能支持bdb,缓存似乎要另外装插件;再看mysql端是否可以优化的,用脚本创建出来的表都带有索引,于是考虑mysql查询缓存是否能帮上忙:http://blog.webwlan.net/wordpress/?p=422

    最终,尝试配置下面的配置:query_cache_size。这个值默认是0,因此,即使query_cache_type默认是启用的,也不能缓存查询结果。将query_cache_size配置成大约100M,测试LDAP,明显登录加快。再看log,查询时间缩短到1秒,暂时解决了燃眉之急。

  • 相关阅读:
    Python并发编程之多进程(实战)
    ThreadPoolExecutor源码分析
    JDK 1.8 JVM的变化
    JDK1.8 hashMap源码分析
    Spring解决循环依赖
    spring
    实现一个可重入锁和不可重入锁
    B树与B+树
    WebMagic
    Java高频面试题
  • 原文地址:https://www.cnblogs.com/AloneSword/p/4759791.html
Copyright © 2020-2023  润新知