centos 7.3
三台机器:
192-168-1-103 10.36.8.223 主 sentinel
192-168-1-102 10.36.8.109 从 sentinel
192-168-1-104 10.36.8.108 从 sentinel
安装:
yum -y install redis
cp /etc/redis.conf{,.bak}
cp /etc/redis-sentinel.conf{,.bak}
redis配置:
主:
bind 0.0.0.0 #绑定地址
protected-mode no
port 6379 #端口
daemonize yes #以守护进程的方式在后台启动
pidfile "/var/run/redis_6379.pid" #进程文件
loglevel notice #日志等级
logfile "/var/log/redis/redis.log" #日志输出位置
dbfilename "dump.rdb" #持久化方式
dir "/var/lib/redis" #保存位置
masterauth "123456" #主从做切换时认证需要用到,当此节点成为主节点是有用,所以所有节点都配置
requirepass "123456" #本地认证密码
从:多加一个这个配置
slaveof 10.36.8.222 6379
启动:
systemctl start redis.service
验证:
netstat -tnlp
redis-cli -a 123456 info replication #查看主从状态信息
[root@host-192-168-1-103 ~]# redis-cli -p 6379 -a 123456 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.36.8.109,port=6379,state=online,offset=125452,lag=0
slave1:ip=10.36.8.108,port=6379,state=online,offset=125313,lag=1
master_repl_offset:125452
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:125451
redis-sentinel配置:
protected-mode no
daemonize yes
bind 0.0.0.0
port 26379
dir "/tmp"
sentinel monitor mymaster 10.36.8.222 6379 2 #mymaster作为master的别名,后面绑定master的ip和端口,2根据节点数来设置,这里表示当超过两个节点都同意master断了才通过
sentinel auth-pass mymaster 123456 #需要监听master的状态,所以放在上面的后面,不然不知道mymaster是谁,同时监听master需要认证
logfile "/var/log/redis/sentinel.log"
sentinel down-after-milliseconds mymaster 10000 如果10秒内master8000没有响应,就认为SDOWN
sentinel failover-timeout mymaster 15000
#所有节点配置都一样
启动:
systemctl start redis-sentinel.service
验证:
如果日志报
7634:X 17 Apr 11:37:46.176 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
7634:X 17 Apr 11:37:46.176 # Sentinel ID is 36585ad02dec7a6cf5abeb499758abab3e330b98
7634:X 17 Apr 11:37:46.176 # +monitor master mymaster 10.36.8.222 6379 quorum 2
7634:X 17 Apr 11:38:16.232 # +sdown master mymaster 10.36.8.222 6379
一般是是认证失败
sentinel auth-pass mymaster 123456 必须写在 sentinel monitor mymaster 10.36.8.222 6379 2 之后
不然 主机mymaster别名不能释义
7634:X 17 Apr 11:56:50.150 # User requested shutdown...
7634:X 17 Apr 11:56:50.150 # Sentinel is now ready to exit, bye bye...
这个可以通过sentinel是否启动以及两种日志来来排查
netstat -tnlp
tail -300f /var/log/messages
redis-sentinel /etc/redis-sentinel
若成功:
[root@host-192-168-1-103 ~]# redis-cli -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=10.36.8.222:6379,slaves=2,sentinels=3
查看配置有变动:
[root@host-192-168-1-103 ~]# grep -v -E "^#|^$" /etc/redis-sentinel.conf
protected-mode no
daemonize yes
bind 0.0.0.0
port 26379
dir "/tmp"
sentinel myid 36585ad02dec7a6cf5abeb499758abab3e330b98 #生产的节点id
sentinel monitor mymaster 10.36.8.222 6379 2
sentinel notification-script mymaster /tmp/ceshi.sh
sentinel auth-pass mymaster 123456
sentinel config-epoch mymaster 0
logfile "/var/log/redis/sentinel.log"
sentinel leader-epoch mymaster 0
#redis节点的信息
sentinel known-slave mymaster 10.36.8.109 6379
sentinel known-slave mymaster 10.36.8.108 6379
#redis-sentinel节点信息
sentinel known-sentinel mymaster 192.168.1.102 26379 a9498fa128582873584d985b92ec4fe2fa9e1196
sentinel known-sentinel mymaster 192.168.1.104 26379 3cb4035f5564cbb8274914f1db5c0ca0bee2f940
sentinel current-epoch 0
down掉主10.36.8.222:
systemctl stop redis.service
[root@host-192-168-1-103 ~]# redis-cli -a 123456 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.36.8.108,port=6379,state=online,offset=546968,lag=1
slave1:ip=10.36.8.109,port=6379,state=online,offset=546968,lag=0
master_repl_offset:546968
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:546967
[root@host-192-168-1-103 ~]#
[root@host-192-168-1-103 ~]# systemctl stop redis.service
[root@host-192-168-1-103 ~]# redis-cli -a 123456 info replication
Could not connect to Redis at 127.0.0.1:6379: Connection refused
redis-sentinel在配置的时间内有指定的节点数同意时会重新选举
797:X 17 Apr 16:29:29.065 # +sdown master mymaster 10.36.8.222 6379
797:X 17 Apr 16:29:29.145 # +odown master mymaster 10.36.8.222 6379 #quorum 2/2
797:X 17 Apr 16:29:29.145 # +new-epoch 7
797:X 17 Apr 16:29:29.145 # +try-failover master mymaster 10.36.8.222 6379
797:X 17 Apr 16:29:29.157 # +vote-for-leader 3cb4035f5564cbb8274914f1db5c0ca0bee2f940 7
797:X 17 Apr 16:29:29.291 # 36585ad02dec7a6cf5abeb499758abab3e330b98 voted for 3cb4035f5564cbb8274914f1db5c0ca0bee2f940 7
797:X 17 Apr 16:29:29.298 # +elected-leader master mymaster 10.36.8.222 6379
797:X 17 Apr 16:29:29.298 # +failover-state-select-slave master mymaster 10.36.8.222 6379
797:X 17 Apr 16:29:29.384 # +selected-slave slave 10.36.8.109:6379 10.36.8.109 6379 @ mymaster 10.36.8.222 6379
797:X 17 Apr 16:29:29.384 * +failover-state-send-slaveof-noone slave 10.36.8.109:6379 10.36.8.109 6379 @ mymaster 10.36.8.222 6379
797:X 17 Apr 16:29:29.457 * +failover-state-wait-promotion slave 10.36.8.109:6379 10.36.8.109 6379 @ mymaster 10.36.8.222 6379
797:X 17 Apr 16:29:29.692 # +promoted-slave slave 10.36.8.109:6379 10.36.8.109 6379 @ mymaster 10.36.8.222 6379
797:X 17 Apr 16:29:29.692 # +failover-state-reconf-slaves master mymaster 10.36.8.222 6379
797:X 17 Apr 16:29:29.745 * +slave-reconf-sent slave 10.36.8.108:6379 10.36.8.108 6379 @ mymaster 10.36.8.222 6379
797:X 17 Apr 16:29:30.403 # -odown master mymaster 10.36.8.222 6379
797:X 17 Apr 16:29:30.506 * +slave-reconf-inprog slave 10.36.8.108:6379 10.36.8.108 6379 @ mymaster 10.36.8.222 6379
797:X 17 Apr 16:29:31.543 * +slave-reconf-done slave 10.36.8.108:6379 10.36.8.108 6379 @ mymaster 10.36.8.222 6379
797:X 17 Apr 16:29:31.595 # +failover-end master mymaster 10.36.8.222 6379
797:X 17 Apr 16:29:31.595 # +switch-master mymaster 10.36.8.222 6379 10.36.8.109 6379
797:X 17 Apr 16:29:31.595 * +slave slave 10.36.8.108:6379 10.36.8.108 6379 @ mymaster 10.36.8.109 6379
797:X 17 Apr 16:29:31.595 * +slave slave 10.36.8.222:6379 10.36.8.222 6379 @ mymaster 10.36.8.109 6379
由上日志可以指定新的master是10.36.8.109
注意点,所有Redis.conf 当中masterauth以及requirepass得提前设置好,sentinel切换的时候只会修改slaveof、sentinel monitor mymaster以及添加从节点和sentinel节点
如果认证没有提前设置,主节点down掉之后,重新选举的新主节点,其它从节点会因为无法认证通过而失败
从10.36.8.108 查看的信息:
[root@host-192-168-1-104 ~]# redis-cli -a 123456 info replication
# Replication
role:slave
master_host:10.36.8.222
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:551027
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
[root@host-192-168-1-104 ~]# redis-cli -a 123456 info replication
# Replication
role:slave
master_host:10.36.8.109
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:23113
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
当down掉的节点挂掉重新启动时,会重新以slave的加入
vip 漂移
开启配置
vim /etc/redis-sentinel.conf
sentinel client-reconfig-script mymaster /var/redis/notify_mymaster.sh
chmod +x /var/redis/notify_mymaster.sh
#!/usr/bin/env bash
Master_Ip=$6 #master地址
Local_Ip="10.36.8.108"
Vip="10.36.8.223"
NetMask="24"
Interface="eth0"
if [[ $Master_Ip == $Local_Ip ]];
then
/usr/sbin/ip addr add ${Vip}/${NetMask} dev ${Interface} #将VIP绑定到该服务器上
/usr/sbin/arping -q -c 3 -A ${Vip} -I ${Interface} #arp抑制
else
/usr/sbin/ip addr del ${Vip}/${NetMask} dev ${Interface} #将VIP从该服务器上删除
exit 0
fi
exit 1
第一次配置得手动指定VIP地址
ip addr add 10.36.8.223/24 dev eth0
arping -q -c 3 -A 10.36.8.223 -I eth0