zoukankan      html  css  js  c++  java
  • Redis-sentinel集群

    Redis-sentinel集群

    环境:
    CentOS 6.5 x64

    官方网站:Redis
    http://www.redis.io/
    http://www.redis.cn

    http://www.redis.cn/topics/cluster-tutorial.html
    http://www.redis.cn/topics/sentinel.html
    http://redis.io/topics/sentinel-clients
    参考文档:
    https://github.com/LittlePeng/redis-monitor
    https://github.com/twitter/twemproxy
    http://blog.csdn.net/pi9nc/article/details/17735653
    http://redis.readthedocs.org/en/latest/topic/sentinel.html

    以redis-2.8.18为例
    单机redis
    一.安装编译依赖库
    [root@master ~]# yum -y install gcc gcc-c++ make tcl-devel

    二.下载并安装
    [root@master ~]# wget http://download.redis.io/releases/redis-2.8.18.tar.gz
    [root@master ~]# tar -xvf redis-2.8.18.tar.gz  -C /usr/local/src
    [root@master ~]# cd /usr/local/src/redis-2.8.18
    [root@master redis-2.8.18]# ls
    00-RELEASENOTES  COPYING  Makefile   redis.conf        sentinel.conf  utils
    BUGS             deps     MANIFESTO  runtest           src
    CONTRIBUTING     INSTALL  README     runtest-sentinel  tests
    [root@master redis-2.8.18]# make && make install
    [root@master redis-2.8.18]# which redis-server
    /usr/local/bin/redis-server

    三.配置redis sysV管控脚本
    [root@master redis-2.8.18]# cd utils/
    [root@master utils]# ls
    build-static-symbols.tcl  mkrelease.sh           redis-sha1.rb
    generate-command-help.rb  redis-copy.rb          speed-regression.tcl
    hyperloglog               redis_init_script      whatisdoing.sh
    install_server.sh         redis_init_script.tpl
    [root@master utils]# ./install_server.sh
    Welcome to the redis service installer
    This script will help you easily set up a running redis server

    Please select the redis port for this instance: [6379]
    Selecting default: 6379
    Please select the redis config file name [/etc/redis/6379.conf]
    Selected default - /etc/redis/6379.conf
    Please select the redis log file name [/var/log/redis_6379.log]
    Selected default - /var/log/redis_6379.log
    Please select the data directory for this instance [/var/lib/redis/6379]
    Selected default - /var/lib/redis/6379
    Please select the redis executable path [/usr/local/bin/redis-server]
    Selected config:
    Port           : 6379
    Config file    : /etc/redis/6379.conf
    Log file       : /var/log/redis_6379.log
    Data dir       : /var/lib/redis/6379
    Executable     : /usr/local/bin/redis-server
    Cli Executable : /usr/local/bin/redis-cli
    Is this ok? Then press ENTER to go on or Ctrl-C to abort.
    Copied /tmp/6379.conf => /etc/init.d/redis_6379
    Installing service...
    Successfully added to chkconfig!
    Successfully added to runlevels 345!
    Starting Redis server...
    Installation successful!
    默认的话,一路回车即可。init脚本会自动生成
    [root@master utils]# mv /etc/init.d/redis_6379 /etc/init.d/redis
    [root@master utils]# /etc/init.d/redis
    Please use start, stop, restart or status as first argument
    [root@master utils]# /etc/init.d/redis status
    Redis is running (4796)
    [root@master utils]# /etc/init.d/redis restart
    Stopping ...
    Redis stopped
    Starting Redis server...
    [root@master utils]# chkconfig --add redis
    [root@master utils]# chkconfig redis on
    [root@master utils]# chkconfig --list redis
    redis_6379         0:off    1:off    2:on    3:on    4:on    5:on    6:off
    [root@master utils]# netstat -tunlp|grep redis
    tcp            0 0.0.0.0:6379                0.0.0.0:*                   LISTEN      4812/redis-server *
    可以看到,redis己成功运行并监听在6379端口上。


    redis-sentinel
    集群监控
    Redis-sentinel是Redis官方提供的实例监控管理、通知和实例失效备援服务,是Redis集群的管理工具,用来监控其他redis instance的工作情况并且进行故障恢复,来提高集群的高可用性。

    一.安装同上

    二.
    配置redis-sentinel sysV管控脚本
    [root@master redis]# cd /usr/local/src/redis-2.8.18/utils/
    [root@master utils]# ./install_server.sh
    Welcome to the redis service installer
    This script will help you easily set up a running redis server

    Please select the redis port for this instance: [6379] 26379
    Please select the redis config file name [/etc/redis/26379.conf] /etc/redis/sentinel.conf
    Please select the redis log file name [/var/log/redis_26379.log] /var/log/redis_sentinel.log
    Please select the data directory for this instance [/var/lib/redis/26379] /var/lib/redis/sentinel
    Please select the redis executable path [/usr/local/bin/redis-server]
    Selected config:
    Port           : 26379
    Config file    : /etc/redis/sentinel.conf
    Log file       : /var/log/redis/sentinel.log
    Data dir       : /var/lib/redis/sentinel
    Executable     : /usr/local/bin/redis-server
    Cli Executable : /usr/local/bin/redis-cli
    Is this ok? Then press ENTER to go on or Ctrl-C to abort.
    Copied /tmp/26379.conf => /etc/init.d/redis_26379
    Installing service...
    Successfully added to chkconfig!
    Successfully added to runlevels 345!
    Starting Redis server...
    Installation successful!

    三.修改配置文件/etc/redis/sentinel.conf
    [root@slave redis]# /etc/init.d/redis_26379 stop
    Stopping ...
    Redis stopped
    [root@master ~]# cd /etc/redis/
    [root@master redis]# cp -fv /usr/local/src/redis-2.8.18/sentinel.conf .
    cp: overwrite `./sentinel.conf'? y
    `/usr/local/src/redis-2.8.18/sentinel.conf' -> `./sentinel.conf'
    [root@master redis]# mv /etc/init.d/redis_26379 /etc/init.d/redis_sentinel
    [root@master redis]# vim /etc/init.d/redis_sentinel
    PIDFILE=/var/run/redis.pid
    $EXEC $CONF --sentinel
    echo "Redis started"

    redis-sentinel集群模式需要在管控脚本吕加入--sentinel参数,如上,
    redis是修改的,
    --sentinel
    echo "Redis started"是添加的。

    补充:
    也可以通过redis-sentinel命令来启动服务,效果一样
    [root@master ~]# cp -fv /usr/local/src/redis-2.8.18/src/redis-sentinel /usr/local/bin/
    `/usr/local/src/redis-2.8.18/src/redis-sentinel' -> `/usr/local/bin/redis-sentinel'
    [root@master ~]# vim /etc/init.d/redis_sentinel
    EXEC=/usr/local/bin/redis-sentinel
    PIDFILE=/var/run/redis.pid
    echo "Redis started"

    [root@master redis]# /etc/init.d/redis_sentinel restart
    /var/run/redis_26379.pid does not exist, process is not running
    Starting Redis server...
    [1880] 18 Dec 17:18:57.606 * Increased maximum number of open files to 10032 (it was originally set to 1024).

                   _._                                                  

               _.-``__ ''-._                                             

          _.-``    `.  `_.  ''-._           Redis 2.8.18 (00000000/0) 64 bit

      .-`` .-```.  ```/    _.,_ ''-._                                   

            ,       .-`  | `,    )     Running in sentinel mode

     |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379

        `-._   `._    /     _.-'    |     PID: 70563

      `-._    `-._  `-./  _.-'    _.-'                                   

     |`-._`-._    `-.__.-'    _.-'_.-'|                                  

        `-._`-._        _.-'_.-'    |           http://redis.io        

      `-._    `-._`-.__.-'_.-'    _.-'                                   

     |`-._`-._    `-.__.-'    _.-'_.-'|                                  

        `-._`-._        _.-'_.-'    |                                  

      `-._    `-._`-.__.-'_.-'    _.-'                                   

          `-._    `-.__.-'    _.-'                                       

              `-._        _.-'                                           

                  `-.__.-' 

    [1880] 18 Dec 17:18:57.608 # Sentinel runid is 79d27d0eb9c06622660dd3261ea56f2ffe6b77f6
    [1880] 18 Dec 17:18:57.608 # +monitor master mymaster 127.0.0.1 6379 quorum 2
    daemonize yes #在配置文件/etc/redis/sentinel.conf中加入该参数可以后台运行


    加入开机启动项
    [root@master ~]# chkconfig --add redis_sentinel
    [root@master ~]# chkconfig redis_sentinel on
    [root@master ~]# chkconfig --list redis_sentinel
    redis_sentinel     0:off    1:off    2:on    3:on    4:on    5:on    6:off
    [root@master ~]# netstat -tunlp|grep redis
    tcp            0 0.0.0.0:26379               0.0.0.0:*                   LISTEN      1898/redis-server *



    配置集群
    Sentinel: 192.168.8.80
    Master: 192.168.8.81
    Slave: 192.168.8.82

    Master
    redis配置文件,使用默认的配置文件就可以了

    Slave redis配置文件,需要指定Master主机

    slaveof 192.168.8.81 6379

    [root@slave redis]# /etc/init.d/redis restart
    Stopping ...
    Redis stopped
    Starting Redis server...
    slave修改配置文件后需要重启服务才能和master建立主从关系。
    查看master节点信息
    [root@slave redis]# redis-cli -h 192.168.8.81 info Replication
    # Replication
    role:master
    connected_slaves:1
    slave0:ip=192.168.8.82,port=6379,state=online,offset=29,lag=1

    master_repl_offset:29
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:2
    repl_backlog_histlen:28
    查看slave节点信息
    [root@slave redis]# redis-cli -h 192.168.8.82 info Replication
    # Replication
    role:slave
    master_host:192.168.8.81
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:8
    master_sync_in_progress:0
    slave_repl_offset:85
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    可以看到,master和slave已经成功建立主从关系。

    配置集群监控sentinel

    [root@sentinel redis]# vim sentinel.conf
    #daemonize yes
    port 26379
    logfile /var/log/redis/sentinel.log

    sentinel monitor mymaster 192.168.8.81 6379 1
    sentinel down-after-milliseconds mymaster 5000
    sentinel failover-timeout mymaster 900000
    sentinel parallel-syncs mymaster 2


    #sentinel monitor mymaster 192.168.8.71 6379 1
    #sentinel down-after-milliseconds mymaster 5000
    #sentinel failover-timeout mymaster 900000
    #sentinel parallel-syncs mymaster 2

    提示:可以监控多个主从

    [root@sentinel redis]# /etc/init.d/redis_sentinel restart
    /var/run/redis.pid does not exist, process is not running
    Starting Redis server...
    [25497] 20 Dec 13:33:04.377 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                                                 

                   _._                                                  

               _.-``__ ''-._                                             

          _.-``    `.  `_.  ''-._           Redis 2.8.18 (00000000/0) 64 bit

      .-`` .-```.  ```/    _.,_ ''-._                                   

            ,       .-`  | `,    )     Running in sentinel mode

     |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379

        `-._   `._    /     _.-'    |     PID: 25497

      `-._    `-._  `-./  _.-'    _.-'                                   

     |`-._`-._    `-.__.-'    _.-'_.-'|                                  

        `-._`-._        _.-'_.-'    |           http://redis.io        

      `-._    `-._`-.__.-'_.-'    _.-'                                   

     |`-._`-._    `-.__.-'    _.-'_.-'|                                  

        `-._`-._        _.-'_.-'    |                                  

      `-._    `-._`-.__.-'_.-'    _.-'                                   

          `-._    `-.__.-'    _.-'                                       

              `-._        _.-'                                           

                  `-.__.-' 

    [25497] 20 Dec 13:33:04.379 # Sentinel runid is c1a5ea6985be2f345f1439fd6e96994c8bf02d8e
    [25497] 20 Dec 13:33:04.379 # +monitor master mymaster 192.168.8.81 6379 quorum 1
    [25497] 20 Dec 13:33:04.382 * +slave slave 192.168.8.82:6379 192.168.8.82 6379 @ mymaster 192.168.8.81 6379
    可以看到sentinel己成功监控到master和slave
    补充:安全设置
    可以置客户端访问密码
    Master配置文件中加入
    requirepass test123

    Slave
    配置文件中加入
    requirepass test123
    masterauth test123

    Redis-sentinel配置文件中加入
    sentinel auth-pass mymaster test123


     查看监控信息

    [root@sentinel ~]# redis-cli -h 192.168.8.80 -p 26379 info Sentinel
    # Sentinel
    sentinel_masters:1
    sentinel_tilt:0
    sentinel_running_scripts:0
    sentinel_scripts_queue_length:0
    master0:name=mymaster,status=ok,address=192.168.8.81:6379,slaves=1,sentinels=1
    或者
    [root@sentinel ~]# redis-cli -p 26379
    127.0.0.1:26379> PING
    PONG
    127.0.0.1:26379> SENTINEL masters
    1)  1) "name"
        2) "mymaster"
        3) "ip"
        4) "192.168.8.81"
        5) "port"
        6) "6379"
        7) "runid"
        8) "8765726c8f96596128c54df0769bda6e42316d8f"
        9) "flags"
       10) "master"
       11) "pending-commands"
       12) "0"
       13) "last-ping-sent"
       14) "0"
       15) "last-ok-ping-reply"
       16) "302"
       17) "last-ping-reply"
       18) "302"
       19) "down-after-milliseconds"
       20) "5000"
       21) "info-refresh"
       22) "7140"
       23) "role-reported"
       24) "master"
       25) "role-reported-time"
       26) "509174"
       27) "config-epoch"
       28) "0"
       29) "num-slaves"
       30) "1"
       31) "num-other-sentinels"
       32) "0"
       33) "quorum"
       34) "1"
       35) "failover-timeout"
       36) "900000"
       37) "parallel-syncs"
       38) "2"
    127.0.0.1:26379> SENTINEL slaves mymaster
    1)  1) "name"
        2) "192.168.8.82:6379"
        3) "ip"
        4) "192.168.8.82"
        5) "port"
        6) "6379"
        7) "runid"
        8) "7fadb0805198cb4a0c68eb6e8aad1580378d9c4d"
        9) "flags"
       10) "slave"
       11) "pending-commands"
       12) "0"
       13) "last-ping-sent"
       14) "0"
       15) "last-ok-ping-reply"
       16) "720"
       17) "last-ping-reply"
       18) "720"
       19) "down-after-milliseconds"
       20) "5000"
       21) "info-refresh"
       22) "5366"
       23) "role-reported"
       24) "slave"
       25) "role-reported-time"
       26) "527579"
       27) "master-link-down-time"
       28) "0"
       29) "master-link-status"
       30) "ok"
       31) "master-host"
       32) "192.168.8.81"
       33) "master-port"
       34) "6379"
       35) "slave-priority"
       36) "100"
       37) "slave-repl-offset"
       38) "37976"
    127.0.0.1:26379> SENTINEL get-master-addr-by-name mymaster
    1) "192.168.8.81"
    2) "6379"


    故障群集转移测试
    [root@sentinel ~]# redis-cli -h 192.168.8.81 -p 6379 shutdown
    关闭master节点的redis服务,查看sentinel监控日志
    [25497] 20 Dec 13:48:51.510 # +sdown master mymaster 192.168.8.81 6379
    [25497] 20 Dec 13:48:51.510 # +odown master mymaster 192.168.8.81 6379 #quorum 1/1
    [25497] 20 Dec 13:48:51.510 # +new-epoch 3
    [25497] 20 Dec 13:48:51.510 # +try-failover master mymaster 192.168.8.81 6379
    [25497] 20 Dec 13:48:51.565 # +vote-for-leader c1a5ea6985be2f345f1439fd6e96994c8bf02d8e 3
    [25497] 20 Dec 13:48:51.565 # +elected-leader master mymaster 192.168.8.81 6379
    [25497] 20 Dec 13:48:51.565 # +failover-state-select-slave master mymaster 192.168.8.81 6379
    [25497] 20 Dec 13:48:51.632 # +selected-slave slave 192.168.8.82:6379 192.168.8.82 6379 @ mymaster 192.168.8.81 6379
    [25497] 20 Dec 13:48:51.632 * +failover-state-send-slaveof-noone slave 192.168.8.82:6379 192.168.8.82 6379 @ mymaster 192.168.8.81 6379
    [25497] 20 Dec 13:48:51.684 * +failover-state-wait-promotion slave 192.168.8.82:6379 192.168.8.82 6379 @ mymaster 192.168.8.81 6379
    [25497] 20 Dec 13:48:52.615 # +promoted-slave slave 192.168.8.82:6379 192.168.8.82 6379 @ mymaster 192.168.8.81 6379
    [25497] 20 Dec 13:48:52.615 # +failover-state-reconf-slaves master mymaster 192.168.8.81 6379
    [25497] 20 Dec 13:48:52.676 # +failover-end master mymaster 192.168.8.81 6379
    [25497] 20 Dec 13:48:52.676 # +switch-master mymaster 192.168.8.81 6379 192.168.8.82 6379
    [25497] 20 Dec 13:48:52.676 * +slave slave 192.168.8.81:6379 192.168.8.81 6379 @ mymaster 192.168.8.82 6379
    [25497] 20 Dec 13:48:57.712 # +sdown slave 192.168.8.81:6379 192.168.8.81 6379 @ mymaster 192.168.8.82 6379
    可以看到,master己成功切换至192.168.8.82,相应地192.168.8.81则成为192.168.8.82的slave
    [root@sentinel ~]# redis-cli -h 192.168.8.80 -p 26379 info Sentinel
    # Sentinel
    sentinel_masters:1
    sentinel_tilt:0
    sentinel_running_scripts:0
    sentinel_scripts_queue_length:0
    master0:name=mymaster,status=ok,address=192.168.8.82:6379,slaves=1,sentinels=1


    当手动重启192.168.8.81时,sentinel将其convert为slave
    [root@master ~]# /etc/init.d/redis start
    Starting Redis server...

    [25497] 20 Dec 13:58:42.556 # -sdown slave 192.168.8.81:6379 192.168.8.81 6379 @ mymaster 192.168.8.82 6379
    [25497] 20 Dec 13:58:52.557 * +convert-to-slave slave 192.168.8.81:6379 192.168.8.81 6379 @ mymaster 192.168.8.82 6379

  • 相关阅读:
    Linux下高并发socket最大连接数所受的各种限制
    Oracle DB 使用资源管理
    Oracle DB 资源管理
    C++ 封装私有堆(Private Heap)
    用宏实现 C++ Singleton 模式
    基于 crt debug 实现的 Windows 程序内存泄漏检测工具
    如何养成良好的 C++ 编程习惯 —— 内存管理
    OCP-1Z0-053-V12.02-643题
    Oracle DB 通过SQL 优化管理性能
    OCP-1Z0-052-V8.02-141题
  • 原文地址:https://www.cnblogs.com/lixuebin/p/10814451.html
Copyright © 2011-2022 走看看