目录
一、加入主节点的方式有很多,我们选择最简单的一种方式,手动。
如果有不懂得,私信我就行,十分欢迎交流
资源文件
redis哨兵集群脚本-Docker文档类资源-CSDN文库
一、准备工作
准备一台linux主机,我们在一台机子上部署六个节点来模拟集群,所以性能尽量高点
我给这台虚拟机配置了6c8g的性能。来进行集群模拟,系统用的是alpine-一个docker宿主机系统,没防火墙,端口配置比较方便,性能浪费少。用其他linux也可以
自己提前去准备
虚拟机安装xxxLinux系统
xxxLinux系统安装docker
我们默认大家都装好docker了
二、拉取redis镜像
docker pull redis
三、部署多个容器
咱们以配置文件形式启动docker的redis
没配置文件的话redis会以默认参数启动,而且后续不能更改参数,显然是不符合生产环境的。
批量部署脚本以下-----------将脚本存入.sh文件我不用教了吧
#批量部署 for port in $(seq 8001 8006); \ do \ mkdir -p /root/data/redis${port}/data mkdir -p /root/data/redis${port}/conf touch /root/data/redis${port}/conf/redis.conf cat << EOF >/root/data/redis${port}/conf/redis.conf #这里面是配置文件 port ${port} logfile "/data/redis${port}.log" pidfile "/data/redis${port}.pid" #关闭集群模式才能手动加入主从 #cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 cluster-announce-ip 192.168.5.242 cluster-announce-port ${port} cluster-announce-bus-port 1${port} appendonly yes #配置本机密码 requirepass 123456 #从节点配置主节点ip端口密码 #slaveof 192.168.5.242 8001 #配置主节点数据 #replicaof 192.168.5.242 8001 #配置同步验证密码主从或者集群用 masterauth 123456 EOF touch /root/data/redis${port}/data/sentinel.conf cat << EOF >/root/data/redis${port}/data/sentinel.conf #配置哨兵配置文件 # 自定义集群名,其中192.168.5.242 为 redis-master 的 ip,8001 为 redis-master 的端口,2 为最小投票数(因为有 3 台 Sentinel 所以可以设置成 2) port 2${port} # 禁止保护模式 protected-mode no #后台运行 daemonize yes logfile "/data/sentinel${port}.log" dir "/tmp" #多主节点配置多个 注意名字“mymaster1-2-3 ”每个主节点不可相同 sentinel monitor mymaster 192.168.5.242 8001 2 #多主节点配置多个 注意名字“mymaster1-2-3 ”每个主节点不可相同 sentinel down-after-milliseconds mymaster 30000 #多主节点配置多个 注意名字“mymaster1-2-3 ”每个主节点不可相同 sentinel parallel-syncs mymaster 1 #多主节点配置多个 注意名字“mymaster1-2-3 ”每个主节点不可相同 sentinel auth-pass mymaster redispwd #多主节点配置多个 注意名字“mymaster1-2-3 ”每个主节点不可相同 sentinel failover-timeout mymaster 180000 sentinel deny-scripts-reconfig yes #配置同步密码 #多主节点配置多个 注意名字“mymaster1-2-3 ”每个主节点不可相同 sentinel auth-pass mymaster 123456 EOF chmod 777 -f /root/data/redis${port}/* docker run -p ${port}:${port} -p 1${port}:1${port} -p 2${port}:2${port} --name redis-${port} \ -v /root/data/redis${port}/data:/data \ -v /root/data/redis${port}/conf/redis.conf:/etc/redis/redis.conf \ -d redis redis-server /etc/redis/redis.conf; \ done
简单讲一下,这是一个shell脚本,它的作用很简单,生成redis和哨兵的配置文件,并且创建docker容器分别是ip:8001-8006六个容器。
四、脚本讲解
如果想要明白原理还是看一下这个解释,大神可以不用看,
1、脚本循环
脚本定义了一个for循环,变量${port}从8001到8006,总计六次,创建六个容器以及配套配置文件
2、配置文件
在/root/data目录下按照端口不通创建了六套redis和哨兵的配置文件,包含服务端口8001,集群通信端口18001,哨兵通信端口28001,六个容器端口号依次递增,以及密码和同步密码123456,很简单的里面“#xxxx”是注释,创建结束后可以自己看一下配置文件我怎么写的注释、
最后给这几个文件夹配置权限为777,防止容器写文件权限出问题
3、创建docker容器
开放8001 18001 28001端口并映射redis.conf和/data文件夹,这里的/data文件夹是容器里redis服务存放配置和数据的地方映射进物理机方便保存查看数据和日志。
五、从节点加入主节点
一、加入主节点的方式有很多,我们选择最简单的一种方式,手动。
二、进入docker容器
docker exec -it redis-8001 /bin/bash
这里是进入redis-8001容器,-it保持一个伪终端,程序是bash,就进入节点了
进入后默认是/data目录,存放数据文件和配置文件
三、连接客户端
接着需要用客户端程序连接到redis服务才能进行操作
redis-cli -h 192.168.5.242 -p 8002 -a 123456
首先容器内自带了客户端程序,直接连接从节点8002,密码是123456,ip大家共用一个,成功进入redis。
四、设置主节点
SLAVEOF 192.168.5.242 8001
如果界面显示ok则成功将8001设为主节点
然后客户端连接到8003 8004 8005 8006一个个设8001为主节点
redis-cli -h 192.168.5.242 -p 8003 -a 123456 SLAVEOF 192.168.5.242 8001 exit redis-cli -h 192.168.5.242 -p 8004 -a 123456 SLAVEOF 192.168.5.242 8001 exit redis-cli -h 192.168.5.242 -p 8005 -a 123456 SLAVEOF 192.168.5.242 8001 exit redis-cli -h 192.168.5.242 -p 8006 -a 123456 SLAVEOF 192.168.5.242 8001 exit
六、重启并启动哨兵
for port in $(seq 8001 8006); \
do \
docker restart redis-${port}
echo "`redis-${port} `重启"
docker exec redis-${port} redis-sentinel /data/sentinel.conf
echo "哨兵启动"
done
哨兵的配置文件可以在上面回顾一下
哨兵端口为2800X,定义后台运行,data目录下输出日志然后就是主节点配置了,基本都一样
redis-sentinel /data/sentinel.conf
这个命令则是指定配置文件启动哨兵。
七、查看哨兵日志
首先进入主节点容器
docker exec -it redis-8001 /bin/bash
ls命令列出data文件夹下的文件
其中sentinel8001.log 是哨兵的日志
使用cat命令查看日志
cat sentinel8001.log
root@be33de043adf:/data# cat sentinel8001.log 26:X 30 Dec 2022 05:51:42.451 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 26:X 30 Dec 2022 05:51:42.451 # Redis version=7.0.7, bits=64, commit=00000000, modified=0, pid=26, just started 26:X 30 Dec 2022 05:51:42.451 # Configuration loaded 26:X 30 Dec 2022 05:51:42.452 * monotonic clock: POSIX clock_gettime 26:X 30 Dec 2022 05:51:42.452 * Running mode=sentinel, port=28001. 26:X 30 Dec 2022 05:51:42.458 * Sentinel new configuration saved on disk 26:X 30 Dec 2022 05:51:42.458 # Sentinel ID is 17b6f72bb0fd4811771d8d13c8e618081fa00237 26:X 30 Dec 2022 05:51:42.458 # +monitor master mymaster 192.168.5.242 8001 quorum 2 26:X 30 Dec 2022 05:51:46.150 * +sentinel sentinel 9d9270c598636d10a2b1fca7c46c65a6e826ff00 172.17.0.3 28002 @ mymaster 192.168.5.242 8001 26:X 30 Dec 2022 05:51:46.176 * Sentinel new configuration saved on disk 26:X 30 Dec 2022 05:51:47.688 * +sentinel sentinel 6df2c805c7b451011927699b89188e54b707d4de 172.17.0.4 28003 @ mymaster 192.168.5.242 8001 26:X 30 Dec 2022 05:51:47.693 * Sentinel new configuration saved on disk 26:X 30 Dec 2022 05:51:49.051 * +sentinel sentinel 9246ca494876e74e8a459a9344ef84cafda191c6 172.17.0.5 28004 @ mymaster 192.168.5.242 8001 26:X 30 Dec 2022 05:51:49.064 * Sentinel new configuration saved on disk 26:X 30 Dec 2022 05:51:50.727 * +sentinel sentinel f96c2c56fdf152308899d06f32c24611cc500f55 172.17.0.6 28005 @ mymaster 192.168.5.242 8001 26:X 30 Dec 2022 05:51:50.740 * Sentinel new configuration saved on disk 26:X 30 Dec 2022 05:51:52.330 * +sentinel sentinel 99f129b31e65e9aa72ffd8d7db8cf915ebf9e0d9 172.17.0.7 28006 @ mymaster 192.168.5.242 8001 26:X 30 Dec 2022 05:51:52.347 * Sentinel new configuration saved on disk 26:X 30 Dec 2022 05:52:02.564 * +slave slave 172.17.0.1:8003 172.17.0.1 8003 @ mymaster 192.168.5.242 8001 26:X 30 Dec 2022 05:52:02.574 * Sentinel new configuration saved on disk 26:X 30 Dec 2022 05:52:02.575 * +slave slave 172.17.0.1:8004 172.17.0.1 8004 @ mymaster 192.168.5.242 8001 26:X 30 Dec 2022 05:52:02.585 * Sentinel new configuration saved on disk 26:X 30 Dec 2022 05:52:02.585 * +slave slave 172.17.0.1:8005 172.17.0.1 8005 @ mymaster 192.168.5.242 8001 26:X 30 Dec 2022 05:52:02.596 * Sentinel new configuration saved on disk 26:X 30 Dec 2022 05:52:02.596 * +slave slave 172.17.0.1:8006 172.17.0.1 8006 @ mymaster 192.168.5.242 8001
分析日志我们不难看出,陆续节点以及哨兵都加入了哨兵集群中,并且主从分明。
八、模拟主节点下线
1、回到宿主机终端,使主节点停止运行
docker stop redis-8001
2、登录从节点查看哨兵日志
docker exec -it redis-8002 bash
查看哨兵日志
cat sentinel8002.log
很明显哨兵集群发现了8001主节点寄了,并推举出8005为新的主节点
我们将8001重启
docker restart redis-8001 echo "`redis-8001 `重启" docker exec redis-8001 redis-sentinel /data/sentinel.conf echo "哨兵启动"
后续日志中8001上线
但是新的主节点是8005,所以8001被哨兵集群安排为了从节点备用
中间ip变化是因为在同一台机子上,redis检测到docker的网络地址,智能的将自身地址切换成了docker内部网,如果容器使用host模式网络,就是真正的地址了
后续8005停掉,哨兵集群自动切换8003为主节点
九、批量删除
for port in $(seq 8001 8006); \
do \
docker stop redis-${port}
docker rm redis-${port}
rm -rf /root/data/redis${port}
done