• Memcached笔记——(一)安装&常规错误&监控


    08年的时候接触过Memcached,当时还对它的客户端产品嗤之以鼻,毕竟手工代码没有各种ORM原生XML配置方便。尽管如此,Memcached现在已经成了服务器架构里不可或缺的一部分!

    相关链接:
    Memcached笔记——(一)安装&常规错误&监控
    Memcached笔记——(二)XMemcached&Spring集成
    Memcached笔记——(三)Memcached使用总结
    Memcached笔记——(四)应对高并发攻击


    一、下载
    1.Libevent
    简单的说就是一个事件触发的网络库,Memcached离不开它。
    Shell代码 复制代码 收藏代码
    1. wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.17-stable.tar.gz
    wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.17-stable.tar.gz

    2.Memcached
    今天的主角
    Shell代码 复制代码 收藏代码
    1. wget http://memcached.googlecode.com/files/memcached-1.4.13.tar.gz
    wget http://memcached.googlecode.com/files/memcached-1.4.13.tar.gz

    二、安装
    1.Libevent
    解压缩
    Shell代码 复制代码 收藏代码
    1. tar zxvf libevent-2.0.17-stable.tar.gz
    tar zxvf libevent-2.0.17-stable.tar.gz

    编译、安装
    Shell代码 复制代码 收藏代码
    1. ./configure --prefix=/usr && make && make install
    ./configure --prefix=/usr && make && make install 

    这里一定要注意指定--prefix,后面配置memcached的时候就有必要用到。
    2.Memcached
    解压
    Shell代码 复制代码 收藏代码
    1. tar zxvf memcached-1.4.13.tar.gz
    tar zxvf memcached-1.4.13.tar.gz

    编译、安装
    Shell代码 复制代码 收藏代码
    1. ./configure --with-libevent=/usr/lib && make && make install
    ./configure --with-libevent=/usr/lib && make && make install

    这里一定要指定libevent的路径,否则启动的时候就有找不到libevent的so文件的错误!
    启动
    Shell代码 复制代码 收藏代码
    1. memcached -d -m 512 -p 11211 -u root -c 256 -P /var/run/memcached.pid
    memcached -d -m 512 -p 11211 -u root -c 256 -P /var/run/memcached.pid

    参数
    引用

    -p <num> TCP port number to listen on (default: 11211)
    -U <num> UDP port number to listen on (default: 11211, 0 is off)
    -l <addr> interface to listen on (default: INADDR_ANY, all addresses)
    <addr> may be specified as host:port. If you don't specify
    a port number, the value you specified with -p or -U is
    used. You may specify multiple addresses separated by comma
    or by using -l multiple times
    -d run as a daemon
    -u <username> assume identity of <username> (only when run as root)
    -m <num> max memory to use for items in megabytes (default: 64 MB)
    -M return error on memory exhausted (rather than removing items)
    -c <num> max simultaneous connections (default: 1024)
    -v verbose (print errors/warnings while in event loop)
    -P <file> save PID in <file>, only used with -d option

    要关掉memcached
    Shell代码 复制代码 收藏代码
    1. kill -9 `cat /var/run/memcached.pid`
    kill -9 `cat /var/run/memcached.pid`  

    是否正常?Telnet上去看看
    Shell代码 复制代码 收藏代码
    1. telnet xxx.xxx.xxx.xxx 11211
    telnet xxx.xxx.xxx.xxx 11211

    然后输入
    Shell代码 复制代码 收藏代码
    1. stats
    stats

    接着就能看到:
    引用

    STAT pid 3021
    STAT uptime 3621
    STAT time 1331261509
    STAT version 1.4.13
    STAT libevent 2.0.17-stable
    STAT pointer_size 64
    STAT rusage_user 0.000000
    STAT rusage_system 0.000999
    STAT curr_connections 6
    STAT total_connections 7
    STAT connection_structures 7
    STAT reserved_fds 20
    STAT cmd_get 0
    STAT cmd_set 0
    STAT cmd_flush 0
    STAT cmd_touch 0
    STAT get_hits 0
    STAT get_misses 0
    STAT delete_misses 0
    STAT delete_hits 0
    STAT incr_misses 0
    STAT incr_hits 0
    STAT decr_misses 0
    STAT decr_hits 0
    STAT cas_misses 0
    STAT cas_hits 0
    STAT cas_badval 0
    STAT touch_hits 0
    STAT touch_misses 0
    STAT auth_cmds 0
    STAT auth_errors 0
    STAT bytes_read 72
    STAT bytes_written 1038
    STAT limit_maxbytes 52428800
    STAT accepting_conns 1
    STAT listen_disabled_num 0
    STAT threads 4
    STAT conn_yields 0
    STAT hash_power_level 16
    STAT hash_bytes 524288
    STAT hash_is_expanding 0
    STAT expired_unfetched 0
    STAT evicted_unfetched 0
    STAT bytes 0
    STAT curr_items 0
    STAT total_items 0
    STAT evictions 0
    STAT reclaimed 0
    END

    上面状况说明Memcached服务正常。
    还可以试试get、set、delete、replace
    引用
    set foo 0 0 3 (保存命令)
    bar (数据)
    STORED (结果)
    get foo (取得命令)
    VALUE foo 0 3 (数据)
    bar (数据)


    输入
    Shell代码 复制代码 收藏代码
    1. quit
    quit
    退出。

    三、系统服务
    参照Nginx的系统服务,自己写了一个Memcached的系统服务脚本。
    先构建/etc/init.d/memcahed这个文件,然后赋予其可执行权限:
    Shell代码 复制代码 收藏代码
    1. touch /etc/init.d/memcached
    2. chmod +x /etc/init.d/memcached
    touch /etc/init.d/memcached
    chmod +x /etc/init.d/memcached
    

    memcached脚本如下:
    Shell代码 复制代码 收藏代码
    1. #!/bin/bash
    2. # v.0.0.1
    3. # create by snowolf at 2012.5.25
    4. #
    5. # memcached - This shell script takes care of starting and stopping memcached.
    6. #
    7. # chkconfig: - 90 10
    8. # description: Memcache provides fast memory based storage.
    9. # processname: memcached
    10. memcached_path="/usr/local/bin/memcached"
    11. memcached_pid="/var/run/memcached.pid"
    12. memcached_memory="1024"
    13. # Source function library.
    14. . /etc/rc.d/init.d/functions
    15. [ -x $memcached_path ] || exit 0
    16. RETVAL=0
    17. prog="memcached"
    18. # Start daemons.
    19. start() {
    20. if [ -e $memcached_pid -a ! -z $memcached_pid ];then
    21. echo $prog" already running...."
    22. exit 1
    23. fi
    24. echo -n $"Starting $prog "
    25. # Single instance for all caches
    26. $memcached_path -m $memcached_memory -l 0.0.0.0 -p 11211 -u root -d -P $memcached_pid
    27. RETVAL=$?
    28. [ $RETVAL -eq 0 ] && {
    29. touch /var/lock/subsys/$prog
    30. success $"$prog"
    31. }
    32. echo
    33. return $RETVAL
    34. }
    35. # Stop daemons.
    36. stop() {
    37. echo -n $"Stopping $prog "
    38. killproc -d 10 $memcached_path
    39. echo
    40. [ $RETVAL = 0 ] && rm -f $memcached_pid /var/lock/subsys/$prog
    41. RETVAL=$?
    42. return $RETVAL
    43. }
    44. # See how we were called.
    45. case "$1" in
    46. start)
    47. start
    48. ;;
    49. stop)
    50. stop
    51. ;;
    52. status)
    53. status $prog
    54. RETVAL=$?
    55. ;;
    56. restart)
    57. stop
    58. start
    59. ;;
    60. *)
    61. echo $"Usage: $0 {start|stop|status|restart}"
    62. exit 1
    63. esac
    64. exit $RETVAL
    #!/bin/bash
    # v.0.0.1
    # create by snowolf at 2012.5.25
    #
    # memcached  - This shell script takes care of starting and stopping memcached.
    #
    # chkconfig: - 90 10
    # description: Memcache provides fast memory based storage.
    # processname: memcached
    
    memcached_path="/usr/local/bin/memcached"
    memcached_pid="/var/run/memcached.pid"
    memcached_memory="1024"
    
    # Source function library.
    . /etc/rc.d/init.d/functions
    
    [ -x $memcached_path ] || exit 0
    
    RETVAL=0
    prog="memcached"
    
    # Start daemons.
    start() {
        if [ -e $memcached_pid -a ! -z $memcached_pid ];then
            echo $prog" already running...."
            exit 1
        fi
    
        echo -n $"Starting $prog "
        # Single instance for all caches
        $memcached_path -m $memcached_memory -l 0.0.0.0 -p 11211 -u root -d -P $memcached_pid
        RETVAL=$?
        [ $RETVAL -eq 0 ] && {
            touch /var/lock/subsys/$prog
            success $"$prog"
        }
        echo
        return $RETVAL
    }
    
    
    # Stop daemons.
    stop() {
        echo -n $"Stopping $prog "
        killproc -d 10 $memcached_path
        echo
        [ $RETVAL = 0 ] && rm -f $memcached_pid /var/lock/subsys/$prog
    
        RETVAL=$?
        return $RETVAL
    }
    
    # See how we were called.
    case "$1" in
            start)
                start
                ;;
            stop)
                stop
                ;;
            status)
                status $prog
                RETVAL=$?
                ;;
            restart)
                stop
                start
                ;;
            *)
                echo $"Usage: $0 {start|stop|status|restart}"
                exit 1
    esac
    exit $RETVAL
    

    注意这几行配置,请根据实际情况配置memcached执行文件路径,以及Memcached使用内存大小:
    引用
    memcached_path="/usr/local/bin/memcached"
    memcached_memory="1024"


    追加为系统服务:
    Shell代码 复制代码 收藏代码
    1. chkconfig --add memcached
    2. chkconfig memcached on
    chkconfig --add memcached
    chkconfig memcached on
    


    然后就可以通过service memcached start|stop|status|restart控制memcached了!

    四、常规错误
    一开始没有指定libevent路径安装memcached的时候,启动memcached就报这个错误:
    引用
    memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

    其实这个文件就在/usr/lib下。错就错在Linux是64bit系统,如果没有指定libevent路径,memcached就会去/usr/lib64下去找。
    找到这个文件
    Shell代码 复制代码 收藏代码
    1. whereis libevent-2.0.so.5
    whereis libevent-2.0.so.5

    引用
    libevent-2.0.so: /usr/lib/libevent-2.0.so.5

    Shell代码 复制代码 收藏代码
    1. ldd /usr/local/bin/memcached
    ldd /usr/local/bin/memcached

    提示找不到libevent-2.0.so.5
    引用
    linux-vdso.so.1 => (0x00007fff41dfd000)
    libevent-2.0.so.5 => not found
    librt.so.1 => /lib64/librt.so.1 (0x0000003c94a00000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003c93a00000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003c92e00000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003c92a00000)

    定位
    Shell代码 复制代码 收藏代码
    1. LD_DEBUG=libs /usr/local/bin/memcached -v
    LD_DEBUG=libs /usr/local/bin/memcached -v

    引用
    19905: find library=libevent-2.0.so.5 [0]; searching
    19905: search path=/usr/lib/lib/tls/x86_64:/usr/lib/lib/tls:/usr/lib/lib/x86_64:/usr/lib/lib (RPATH from file /usr/local/bin/memcached)
    19905: trying file=/usr/lib/lib/tls/x86_64/libevent-2.0.so.5
    19905: trying file=/usr/lib/lib/tls/libevent-2.0.so.5
    19905: trying file=/usr/lib/lib/x86_64/libevent-2.0.so.5
    19905: trying file=/usr/lib/lib/libevent-2.0.so.5
    19905: search cache=/etc/ld.so.cache
    19905: search path=/lib64/tls/x86_64:/lib64/tls:/lib64/x86_64:/lib64:/usr/lib64/tls/x86_64:/usr/lib64/tls:/usr/lib64/x86_64:/usr/lib64 (system search path)
    19905: trying file=/lib64/tls/x86_64/libevent-2.0.so.5
    19905: trying file=/lib64/tls/libevent-2.0.so.5
    19905: trying file=/lib64/x86_64/libevent-2.0.so.5
    19905: trying file=/lib64/libevent-2.0.so.5
    19905: trying file=/usr/lib64/tls/x86_64/libevent-2.0.so.5
    19905: trying file=/usr/lib64/tls/libevent-2.0.so.5
    19905: trying file=/usr/lib64/x86_64/libevent-2.0.so.5
    19905: trying file=/usr/lib64/libevent-2.0.so.5
    19905:
    /usr/local/bin/memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

    注意这句:
    引用
    19905: trying file=/usr/lib64/libevent-2.0.so.5


    做个软连接
    Shell代码 复制代码 收藏代码
    1. ln -s /usr/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5
    ln -s /usr/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5

    再试试:
    Shell代码 复制代码 收藏代码
    1. ldd /usr/local/bin/memcached
    ldd /usr/local/bin/memcached

    这回找到了!
    引用
    linux-vdso.so.1 => (0x00007fffffef6000)
    libevent-2.0.so.5 => /usr/lib64/libevent-2.0.so.5 (0x00002b5608a26000)
    librt.so.1 => /lib64/librt.so.1 (0x0000003c94a00000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003c93a00000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003c92e00000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003c92a00000)


    五、监控
    可以在服务器上配置一个PHP页面来监测Memcached的情况,
    下载MemcachePHP



    配置也比较简单,主要包括账户配置,以及Memcached Server地址配置。
    Php代码 复制代码 收藏代码
    1. define('ADMIN_USERNAME','memcache'); // Admin Username
    2. define('ADMIN_PASSWORD','password'); // Admin Password
    3. define('DATE_FORMAT','Y/m/d H:i:s');
    4. define('GRAPH_SIZE',200);
    5. define('MAX_ITEM_DUMP',50);
    6. $MEMCACHE_SERVERS[] = 'mymemcache-server1:11211'; // add more as an array
    7. $MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array
    define('ADMIN_USERNAME','memcache'); 	// Admin Username
    define('ADMIN_PASSWORD','password');  	// Admin Password
    define('DATE_FORMAT','Y/m/d H:i:s');
    define('GRAPH_SIZE',200);
    define('MAX_ITEM_DUMP',50);
    
    $MEMCACHE_SERVERS[] = 'mymemcache-server1:11211'; // add more as an array
    $MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array
    


    常见错误:
    引用
    Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in /home/usr/local/apache.../memcache.php on line 726

    在memcache.php顶端加上“date_default_timezone_set('Asia/Hong_Kong');”即可,具体地域设置参考:http://www.php.net/manual/zh/datetime.configuration.php#ini.date.timezone

    如果不方便搭建PHP服务,可以使用Perl脚本memcache-top
    修改@default_instances或使用--instances参数:
    Shell代码 复制代码 收藏代码
    1. perl memcache-top-v0.6 --instances 10.11.155.26 10.11.155.41
    perl memcache-top-v0.6 --instances 10.11.155.26 10.11.155.41




    先到这里,后续做压力测试,Java客户端开发,Spring系统集成等。

    相关链接:
    Memcached笔记——(一)安装&常规错误&监控
    Memcached笔记——(二)XMemcached&Spring集成
    Memcached笔记——(三)Memcached使用总结
    Memcached笔记——(四)应对高并发攻击
  • 相关阅读:
    go微服务框架kratos学习笔记十(熔断器)
    go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)
    go微服务框架kratos学习笔记八 (kratos的依赖注入)
    go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer)
    编译原理之语法分析-自下而上分析(四)
    编译原理之语法分析-自下而上分析(三)
    编译原理之语法分析-自下而上分析(二)
    编译原理之语法分析-自下而上分析(一)
    TreeSet的两种实现方法:Comparable和Comparator(Java比较器)
    JavaWeb学习之JSP(三) EL表达式
  • 原文地址:https://www.cnblogs.com/yangkai-cn/p/4016758.html
Copyright © 2020-2023  润新知