02-Redis-3.2.3 Sentinel集群
1.Redis 的哨兵模式(Sentinel)为 Redis 提供了高可用。可以不用人为干预,自动提升 Slave 为 Master,从而实现自动故障转移。Sentinel 也提供了对 Redis 实例的监控、告警、为 Clients 提供配置服务等。
2.集群IP分配:
172.16.1.17 redis-node01 redis,sentinel 主 172.16.1.18 redis-node02 redis,sentinel 从 172.16.1.81 redis-node03 redis,sentinel 从
3.redis-node01主配置文件
[root@redis-node01 ~]# grep -Ev '^#|^$' /etc/redis/6379.conf bind 127.0.0.1 172.16.1.17 # 监听IP地址 protected-mode yes port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize yes # 后台运行模式 supervised no pidfile /var/run/redis_6379.pid # pid文件 loglevel notice logfile "/etc/redis/redis_6379.log" # 日志文件 databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump_6379.rdb # rdp快照文件 dir ./ slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no slave-priority 100 appendonly no appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes
4.redis-node02,redisnode03从服务配置
[root@redis-node02 ~]# grep -Ev '^#|^$' /etc/redis/6379.conf bind 127.0.0.1 172.16.1.18 protected-mode yes port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize yes supervised no pidfile /var/run/redis_6379.pid loglevel notice logfile "/etc/redis/redis_6379.log" databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump_6379.rdb dir ./ slaveof 172.16.1.17 6379 # 添加Master端的IP与端口 slave-serve-stale-data yes slave-read-only yes # 默认从服务器只读,不能写 repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no slave-priority 100 # 优先级配置,2个从服务器这个不要一样,数字小的优先取得master appendonly no appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes
5.在redis主服务器检查
[root@redis-node01 ~]# /usr/local/redis/bin/redis-cli -h 172.16.1.17 info replication # Replication role:master connected_slaves:2 slave0:ip=172.16.1.18,port=6379,state=online,offset=616898,lag=1 # 从服务器1 slave1:ip=172.16.1.81,port=6379,state=online,offset=616898,lag=1 # 从服务器2 master_repl_offset:616898 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:616897
6.在redis从从服务器复制状态
[root@redis-node02 redis]# /usr/local/redis/bin/redis-cli -h 172.16.1.18 info replication # Replication role:slave # 从服务器 master_host:172.16.1.17 # 主服务器IP master_port:6379 master_link_status:up # 状态up master_last_io_seconds_ago:3 master_sync_in_progress:0 slave_repl_offset:616926 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
7.redis从服务器配置sentinel
[root@redis-node02 redis]# cp /usr/local/src/redis-3.2.3/sentinel.conf /etc/redis/ [root@redis-node02 redis]# vim /etc/redis/sentinel.conf bind 172.16.1.18 # 绑定IP地址,一定要绑定,不然会失败!!! port 26379 # sentinel监听的端口 daemonize yes # 后台运行 logfile "/etc/redis/sentinel_log.log" # 日志文件 pidfile "/etc/redis/sentinel.pid" # pid文件 sentinel monitor mymaster 172.16.1.17 6379 1 # 主服务器信息,末尾数字n表示n个哨兵同时检测到主服务器挂了时,redis才会认为master挂掉并进行从服务器的切换,数字不能大于哨兵的个数,mymaster 可随意起名,但是要与下列的配置保持一致 sentinel down-after-milliseconds mymaster 30000 # 表示sentinel在多少毫秒后连接不到master认为master断开 sentinel parallel-syncs mymaster 1 # 表示一次性允许多少slave指向新的new master. 这里默认为1,如果该数值过大会导致新的master服务器IO剧增,保持默认1即可 sentinel client-reconfig-script mymaster /var/redis/reconfig.sh # 在重新配置new master,new slave过程,可以触发的脚本,可发邮件或者修改项目中的redis指向等
8.redis-node01,redis-node02启动sentinel
[root@redis-node02 redis]# /usr/local/redis/bin/redis-server /etc/redis/sentinel.conf --sentinel 或 [root@redis-node02 redis]# redis-sentinel sentinel.conf [root@redis-node02 redis]# lsof -i :26379 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME redis-sen 2534 root 4u IPv4 346081 0t0 TCP 172.16.1.18:26379 (LISTEN) redis-sen 2534 root 11u IPv4 346211 0t0 TCP 172.16.1.18:41863->172.16.1.81:26379 (ESTABLISHED) redis-sen 2534 root 12u IPv4 346213 0t0 TCP 172.16.1.18:26379->172.16.1.81:54196 (ESTABLISHED)
9.查看sentinel状态
[root@redis-node02 redis]# redis-cli -h 172.16.1.18 -p 26379 info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=172.16.1.81:6379,slaves=2,sentinels=2 # 2个sentinel节点
10.redis故障转移测试
[root@redis-node01 ~]# redis-cli -h 172.16.1.17 -p 6379 info replication # Replication role:master connected_slaves:2 slave0:ip=172.16.1.18,port=6379,state=online,offset=8077,lag=1 slave1:ip=172.16.1.81,port=6379,state=online,offset=7940,lag=1 master_repl_offset:8214 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:8213 [root@redis-node02 redis]# redis-cli -h 172.16.1.18 -p 6379 info replication # Replication role:slave master_host:172.16.1.17 master_port:6379 master_link_status:up master_last_io_seconds_ago:2 master_sync_in_progress:0 slave_repl_offset:26274 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 # 停掉redis-node01 [root@redis-node01 redis]# /etc/init.d/redis stop Stopping ... Redis stopped # 已经切换到1.81中 [root@redis-node02 redis]# redis-cli -h 172.16.1.18 -p 6379 info replication # Replication role:slave master_host:172.16.1.81 master_port:6379 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:7614 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 # 在redis-node03节点查看 [root@redis-node03 redis]# redis-cli -h 172.16.1.81 -p 6379 info replication # Replication role:master connected_slaves:1 slave0:ip=172.16.1.18,port=6379,state=online,offset=12938,lag=0 master_repl_offset:12952 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:12951
11.监控2个实例
port 26379 daemonize yes logfile "/var/log/redis/sentinel.log" #master 7000 sentinel monitor master-7000 127.0.0.1 7000 2 sentinel down-after-milliseconds master-7000 30000 sentinel parallel-syncs master-7000 1 sentinel failover-timeout master-7000 180000 #master 7001 sentinel monitor master-7001 127.0.0.1 7001 1 sentinel down-after-milliseconds master-7001 30000 sentinel parallel-syncs master-7001 1 sentinel failover-timeout master-7001 180000
参考文档:
http://676021.blog.51cto.com/666021/1834264
http://blog.163.com/a12333a_li/blog/static/87594285201304103257837/
http://www.cnblogs.com/wjoyxt/p/4242184.html
http://blog.csdn.net/lijunxian1013/article/details/51994254