计算机系统应用教程网站

网站首页 > 技术文章 正文

Docker下Redis哨兵集群模式搭建 redis 哨兵模式搭建

btikc 2024-10-14 08:47:05 技术文章 22 ℃ 0 评论

科普

Redis 支持的三种集群方案是什么???

什么是redis集群、哨兵、主从......回顾一下

  • 【redis主从】:是备份关系, 我们操作主库,数据也会同步到从库。 如果主库机器坏了,从库可以上。就好比你 D盘的数据丢了,但是你移动硬盘里边备份有。
  • 【redis哨兵】:哨兵保证的是HA(高可用),保证特殊情况故障自动切换,哨兵盯着你的“redis主从集群”,如果主库死了,它会告诉你新的老大是谁。
  • 【redis集群】:集群保证的是高并发,因为多了一些兄弟帮忙一起扛。同时集群会导致数据的分散,整个redis集群会分成一堆数据槽,即不同的key会放到不不同的槽中。

正文

下面咱们就在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=master
access_port=6379 #启动监听的端口
password=amaocl@123
data_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=slave
access_port=6379       #启动监听的端口
master_ip=10.40.35.35 #修改为master的ip
master_port=6379      #修改为master的端口
data_path=/data/redis/data
password=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的ip
master_port=6379 #master端口
role=sentinel
access_port=26379 #sentinel监听端口
quorum=2 #两台机器判定主被动下线后,就进行failover(故障转移)
password=amaocl@123
sentinel_conf_path=`pwd`/${role}_${access_port}.conf
 
cat << EOF > ${sentinel_conf_path}
port ${access_port}
daemonize no
pidfile /var/run/redis-sentinel.pid
logfile ""
dir /tmp
sentinel monitor  mymaster  ${master_ip} ${master_port} ${quorum}
sentinel auth-pass mymaster  ${password}
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 90000
sentinel deny-scripts-reconfig yes
protected-mode no
EOF
 
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三步的脚本重新执行一下(按顺序执行)

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表