科普
Redis 支持的三种集群方案是什么???
![ce08cbdb4c1eab1fdd091d4904605599.png](https://i-blog.csdnimg.cn/blog_migrate/d8fa7f039a09c99fa74cecdc36428898.jpeg)
what?
什么是redis集群、哨兵、主从......回顾一下
- 【redis主从】:是备份关系, 我们操作主库,数据也会同步到从库。 如果主库机器坏了,从库可以上。就好比你 D盘的数据丢了,但是你移动硬盘里边备份有。
![fb6dfac39dc32c23a892a5f79803a17c.png](https://i-blog.csdnimg.cn/blog_migrate/689299bbbab4bd426ad847286cecf51b.jpeg)
主从原理
- 【redis哨兵】:哨兵保证的是HA(高可用),保证特殊情况故障自动切换,哨兵盯着你的“redis主从集群”,如果主库死了,它会告诉你新的老大是谁。
![89c1ac7834a0586d24f36b290f1440e1.png](https://i-blog.csdnimg.cn/blog_migrate/b14f8664adfa05fb8821a314e4b34441.jpeg)
哨兵模式
![482d1c8f4fe11f930be26d2a444d83fb.png](https://i-blog.csdnimg.cn/blog_migrate/b031cc97b9bb444d2c8a259a38db71ba.jpeg)
多哨兵模式
- 【redis集群】:集群保证的是高并发,因为多了一些兄弟帮忙一起扛。同时集群会导致数据的分散,整个redis集群会分成一堆数据槽,即不同的key会放到不不同的槽中。
![e3f7fd9ee8117c469777b83558846bf5.png](https://i-blog.csdnimg.cn/blog_migrate/fc3c8611e221134157c276465f3304c9.jpeg)
集群
正文
下面咱们就在docker下搭建一下哨兵模式吧:
注意:redis集群不支持docker的端口映射模式,网络模式必须指定为host,--net=host
环境:
三台机器,一主两从,三个哨兵
master: xxxxx
slave1: xxxxx
slave2: xxxxx
- 1. master上执行redis_master.sh
- 2. slave1和slave2分别执行redis_slave.sh
- 3. master、slave1、slave2上执行redis_sentinel.sh
- 4. 验证主从同步
- 5. 验证高可用,slave自动切换为master
- 6. 还原master
1.Redis master脚本
#!/bin/bash#redis master 重启脚本 role=masteraccess_port=6379 #启动监听的端口password=amaocl@123data_path=/data/redis/data function restart_master_redis() { container_name=redis-${access_port}-${role} docker kill $container_name || echo "ok" docker rm $container_name || echo "ok" docker run --name redis-${access_port}-${role} --net=host --restart=always -v ${data_path}:/data -d redis:5.0.10 redis-server --port ${access_port} --appendonly yes --requirepass ${password} --masterauth ${password} --protected-mode no }restart_master_redis
2.slave1和slave2分别执行redis_slave.sh
#!/bin/bash role=slaveaccess_port=6379 #启动监听的端口master_ip=10.40.35.35 #修改为master的ipmaster_port=6379 #修改为master的端口data_path=/data/redis/datapassword=amaocl@123 function restart_slave_redis() { container_name=redis-${access_port}-${role} docker kill $container_name || echo "ok" docker rm $container_name || echo "ok" docker run --name redis-${access_port}-${role} --net=host --restart=always -v ${data_path}:/data -d redis:5.0.10 redis-server --port ${access_port} --appendonly yes --requirepass ${password} --masterauth ${password} --protected-mode no --replicaof ${master_ip} ${master_port} }restart_slave_redis
3.master、slave1、slave2上执行redis_sentinel.sh
#!/bin/bash#redis sentinel 重启脚本 master_ip=xx.xx.xx.xx #master的ipmaster_port=6379 #master端口role=sentinelaccess_port=26379 #sentinel监听端口quorum=2 #两台机器判定主被动下线后,就进行failover(故障转移)password=amaocl@123sentinel_conf_path=`pwd`/${role}_${access_port}.conf cat << EOF > ${sentinel_conf_path}port ${access_port}daemonize nopidfile /var/run/redis-sentinel.pidlogfile ""dir /tmpsentinel monitor mymaster ${master_ip} ${master_port} ${quorum}sentinel auth-pass mymaster ${password}sentinel down-after-milliseconds mymaster 30000sentinel parallel-syncs mymaster 1sentinel failover-timeout mymaster 90000sentinel deny-scripts-reconfig yesprotected-mode noEOF function restart_sentinel_redis() { #启动前删除 container_name=redis-${access_port}-${role} docker kill $container_name || echo "ok" docker rm $container_name || echo "ok" docker run --name redis-${access_port}-${role} --net=host --volume=${sentinel_conf_path}:/usr/local/etc/redis/sentinel.conf --restart=always -d redis:5.0.10 redis-sentinel /usr/local/etc/redis/sentinel.conf}restart_sentinel_redis
4. 验证主从同步
1. 在master上连接到redis新建一个key,去其他slave上查看是否有相应的key生成 ,若有证明主从正常,否则同步异常
set test hello-world
2. 删除测试key
del test
5. 验证高可用,slave自动切换为master
1. 停止master的容器,(不是停止哨兵的容器)
docker stop master的容器id
2. 连接到其他两台slave上的redis,执行info 查看当前的master是哪台机器,是否有有台机器变成了master, 若无证明哨兵异常,需要排查
6. 还原master
master已经自动其他机器
若第五步正常,将1、2、 3三步的脚本重新执行一下(按顺序执行)