步骤1
先要把主从模式搭建好 (我使用的是多虚拟机,多Docker模式下部署1主两从(3台机器,每台机器一个docker,每个机器上部署一个redis和sentinel),网络是手机热点)
主节点服务器的配置文件
bind 0.0.0.0
port 6379 daemonize yes
requirepass "1234" 以后以客户端进入Redis都要先输入密码auth “1234”
logfile "/usr/local/redis/log/master_redis1.log"
(注意一定要先创logfile对应的目录,否则启动会失败,因为不会自动生成目录)
dbfilename "xdclass1.rdb"
dir "/usr/local/redis/data" appendonly yes
appendfilename "appendonly1.aof"
masterauth "1234"
两个从节点的配置文件
bind 0.0.0.0
port 6380 daemonize yes
requirepass "1234" 以后以客户端进入Redis都要先输入密码auth “1234”
logfile "/usr/local/redis/log/salve_redis1.log"
(注意一定要先创logfile对应的目录,否则启动会失败,因为不会自动生成目录)
dbfilename "xdclass2.rdb"
dir "/usr/local/redis/data" appendonly yes
appendfilename "appendonly4.aof"
replicaof 192.168.xx,xx 6379 (改成自己的主节点IP和端口)
masterauth "1234"
步骤2 添加哨兵配置文件到容器对应目录中
(一个redis节点要对应一个Sentinel节点)(放在容器的 /usr/local/redis/conf中)
哨兵节点的配置文件(每个哨兵节点的配置文件信息类似,只要该具体的数值)
port 26381 #(不同哨兵配置文件只不同)
bind 0.0.0.0
daemonize yes
protected-mode no
pidfile "/var/run/redis-sentinel-1.pid"
logfile "/usr/local/redis/log/sentinel_26381.log" #(不同哨兵配置文件只不同)
#必须要先创建logfile对应的目录在容器中 mkdir /usr/local/redis/log否则,无法正常重启容器
dir "/tmp"
sentinel monitor mymaster 192.168.43.188 6380 2
sentinel down-after-milliseconds mymaster 5000
sentinel auth-pass mymaster 1234
sentinel failover-timeout mymaster 30000
sentinel announce-ip "192.168.43.47" #对外声明Sentinel的ip和端口 #(不同哨兵配置文件只不同)
sentinel announce-port 26381 #(不同哨兵配置文件只不同)
步骤3 启动主从模式的redis容器(先启动主)
docker run -d -p 6382:6382 -p 26379:26379 -v/myredis6.0/data:/data --name myredis_6.2.1_salve2 daff6a1e55d9
docker run -d -p 6380:6380 -p 26380:26380 -v/myredis6.0/data:/data --name myredis_6.2.1_salve2 daff6a1e55d9
docker run -d -p 6381:6381 -p 26381:26381 -v/myredis6.0/data:/data --name myredis_6.2.1_salve2 daff6a1e55d9
步骤4 修改主从节点的redis.conf中的端口号和对外声明redis的ip和端口
(因为有些端口号我们设置的不是6379,但是容器是先启动我们才能去改配置文件,可以去容器中修改,也可以直接去挂载目录中修改(宿主机挂载目录是随机生成的)) 还有announce-ip 和announce-port(对外声明redis的ip和端口)
步骤5重启容器(先启动主节点)并开启Sentinel,
(启动顺序: 主节点 Redis ➡ 从节点 Redis ➡ 启动Sentinel集群)
启动哨兵的命令
/usr/local/redis/bin/redis-server /usr/local/redis/conf/sentinel-1.conf --sentinel
步骤6 模拟主节点故障-实现故障转移
通过命令让,主节点 睡眠 60s
来模拟宕机
ddocker exec -it e0c40096d826 /bin/bash -c '/usr/local/redis/bin/redis-cli -a 1234 -p 6382 DEBUG sleep 70'ker exec -it 容器ID /bin/bash -c '/usr/local/redis/bin/redis-cli -a 1234 -p 6382 DEBUG sleep 70'
当出现故障转移时(即投票选举主从切换时)会去修改其他从节点的redis配置文件的replicaof
重新指定主节点的ip和端口,重新选举出来的主节点则会直接把之前的replicaof给去掉并且也会在各个节点Sentinel的配置文件中自动生成内容并且会修改sentinel monitor mymaster这个选项 如果之间挂的主机后来又连上去了肯定变成了从节点,此时它里面也会自动加上replicao
注意事项:
1 不仅要暴露redis端口,也要暴露sentinel的哨兵的端口,即容器启动时的端口映射要映射两个端口
2 为了让redis的哨兵能够发现和监测到从节点,我们一定要保证redis服务端口和容器的映射端口一致(即redis的端口设置为6380,那么映射的端口也一定相同为6380,不能为其他,否则redis哨兵启动后,从节点立马会被识别为sdown主观下线,那么Sentinel哨兵集群也没有意义了)
3 我们要修改redis配置文件中的announce-ip 和announce-port(对外声明redis的ip和端口)此外还要修改哨兵配置文件中的sentinel announce-ip,sentinel announce-port否则哨兵节点之间无法通信,哨兵节点与redis节点之间也无法通信(如果不加announce-ip 和announce-port)
4 如果我们关闭了机器(虚拟机),要完全重启Sentinel集群的话(即完全恢复到第一次搭建的情况)我们必须把最后一次选举出来的主节点的配置文件中的replicaof给加上并指定主节点的ip和端口(在467行的位置),因为之前故障转移重新选举出来的主节点会直接把之前的replicaof给去掉,此外还有其他从节点的replicaof要修改为当前的主节点的ip和端口。(如果之间挂的主机又连上去了肯定变成了从节点,此时它里面也会自动加上replicaof新的主节点IP端口,我们在重启的时候必须删掉即+#)并且把各个Sentinel的配置文件中,自动生成的部分给删掉并且修改里面的sentinel monitor mymaster,再按启动顺序: 主节点 Redis ➡ 从节点 Redis ➡ 启动Sentinel集群)重启 (以上操作前提是上一次关闭前做了故障转移)
最好把之前的日志文件也删除掉
关机顺序最好是先关掉从,再关主
(如果之间挂掉的机器又重连了,他的配置文件和对应的sentinel也会被sentinel修改)我们可以不必做上述的操作直接可以实现哨兵
哨兵模式的优缺点
哨兵模式的优点:
相比 主从模式,可以实现⾃动主从切换(故障转移),可⽤性更⾼
哨兵模式的缺点:
主从切换需要消耗一定的时间会丢失短暂数据(这时无法写和读)
主节点的写能⼒和存储能⼒受限
(还是只有主节点可以写,存储能力还是处于单节点,因为主节点存的数据和其他节点一模一样,主节点存不下了,也就无法继续写了,存储就达到了上限了,数据不是分片存储的)