docker搭建redis哨兵模式
3台阿里云ECS服务器 (Rocky Linux 9.6 64位)
·
1. 准备工作
3台阿里云ECS服务器 (Rocky Linux 9.6 64位)
2.安装docker(3台服务器同样操作)
2.1 安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
2.2 配置docker镜像加速地址并启动
([ -f /etc/docker/daemon.json ] || mkdir -p /etc/docker) && echo '{ "registry-mirrors" : [
"https://docker.1ms.run","https://docker.1panel.live","https://docker.xuanyuan.me","https://registry-1.docker.io"]}' > /etc/docker/daemon.json && sudo systemctl restart docker && sleep 1 && docker info | grep -A 4 "Registry Mirrors"
3. docker搭建一主二从
#################### 节点1 ####################
# 创建文件夹
mkdir -p /usr/local/redis/{conf,data}
# 创建配置文件redis.conf
vim /usr/local/redis/conf/redis.conf
# 允许远程访问
bind 0.0.0.0
# 服务监听端口
port 6379
# 是否以守护进程运行(与docker -d选项有冲突)
#daemonize yes
# 日志文件路径(未挂载的路径会出现权限问题)
logfile "/data/redis.log"
# 设置客户端连接密码
requirepass "123456"
# RDB快照文件名
dbfilename "node1.rdb"
#持久化策略, 10秒内有个1个key改动,执行快照
save 10 1
# 导出rdb数据库文件压缩字符串和对象,默认是yes,会浪费CPU但是节省空间
rdbcompression yes
# 导入时是否检查
rdbchecksum yes
# 是否开启AOF持久化模式
appendonly yes
# AOF文件名称
appendfilename "node1.aof"
# 同步方式 always | everysec | no
appendfsync everysec
# AOF重写期间是否同步
no-appendfsync-on-rewrite no
# 重写触发配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 加载AOF时如果有错如何处理
# yes表示如果AOF尾部文件出问题,写log记录并继续执行。no表示提示写入等待修复后写入
aof-load-truncated yes
# 若主节点设置了密码,从节点需通过此配置项提供密码
masterauth "123456"
# 拉取镜像并部署redis
docker run -d \
--name redis_node1 \
-v /usr/local/redis/data:/data \
-v /usr/local/redis/conf/redis.conf:/etc/redis/redis.conf \
-p 6379:6379 \
redis:7.0.12 \
redis-server /etc/redis/redis.conf
#################### 节点2 ####################
# 创建文件夹
mkdir -p /usr/local/redis/{conf,data}
# 创建配置文件redis.conf
vim /usr/local/redis/conf/redis.conf
# 允许远程访问
bind 0.0.0.0
# 服务监听端口
port 6379
# 是否以守护进程运行(与docker -d选项有冲突)
#daemonize yes
# 日志文件路径(未挂载的路径会出现权限问题)
logfile "/data/redis.log"
# 设置客户端连接密码
requirepass "123456"
# RDB快照文件名
dbfilename "node2.rdb"
#持久化策略, 10秒内有个1个key改动,执行快照
save 10 1
# 导出rdb数据库文件压缩字符串和对象,默认是yes,会浪费CPU但是节省空间
rdbcompression yes
# 导入时是否检查
rdbchecksum yes
# 是否开启AOF持久化模式
appendonly yes
# AOF文件名称
appendfilename "node2.aof"
# 同步方式 always | everysec | no
appendfsync everysec
# AOF重写期间是否同步
no-appendfsync-on-rewrite no
# 重写触发配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 加载AOF时如果有错如何处理
# yes表示如果AOF尾部文件出问题,写log记录并继续执行。no表示提示写入等待修复后写入
aof-load-truncated yes
# 若主节点设置了密码,从节点需通过此配置项提供密码
masterauth "123456"
# 配置当前实例为从节点,并指定主节点的IP和端口
slaveof 172.28.30.27 6379
# 拉取镜像并部署redis
docker run -d \
--name redis_node2 \
-v /usr/local/redis/data:/data \
-v /usr/local/redis/conf/redis.conf:/etc/redis/redis.conf \
-p 6379:6379 \
redis:7.0.12 \
redis-server /etc/redis/redis.conf
#################### 节点3 ####################
# 创建文件夹
mkdir -p /usr/local/redis/{conf,data}
# 创建配置文件redis.conf
vim /usr/local/redis/conf/redis.conf
# 允许远程访问
bind 0.0.0.0
# 服务监听端口
port 6379
# 是否以守护进程运行(与docker -d选项有冲突)
#daemonize yes
# 日志文件路径(未挂载的路径会出现权限问题)
logfile "/data/redis.log"
# 设置客户端连接密码
requirepass "123456"
# RDB快照文件名
dbfilename "node3.rdb"
#持久化策略, 10秒内有个1个key改动,执行快照
save 10 1
# 导出rdb数据库文件压缩字符串和对象,默认是yes,会浪费CPU但是节省空间
rdbcompression yes
# 导入时是否检查
rdbchecksum yes
# 是否开启AOF持久化模式
appendonly yes
# AOF文件名称
appendfilename "node3.aof"
# 同步方式 always | everysec | no
appendfsync everysec
# AOF重写期间是否同步
no-appendfsync-on-rewrite no
# 重写触发配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 加载AOF时如果有错如何处理
# yes表示如果AOF尾部文件出问题,写log记录并继续执行。no表示提示写入等待修复后写入
aof-load-truncated yes
# 若主节点设置了密码,从节点需通过此配置项提供密码
masterauth "123456"
# 配置当前实例为从节点,并指定主节点的IP和端口
slaveof 172.28.30.27 6379
# 拉取镜像并部署redis
docker run -d \
--name redis_node3 \
-v /usr/local/redis/data:/data \
-v /usr/local/redis/conf/redis.conf:/etc/redis/redis.conf \
-p 6379:6379 \
redis:7.0.12 \
redis-server /etc/redis/redis.conf
4. 验证一主二从
4.1 查看集群信息
登录ECS服务器,分别执行
# 进入容器内部
docker exec -it 容器ID /bin/bash
# 登录redis
redis-cli -h localhost -p 6379 -a 123456
# 查看集群信息
info replication

通过截图,得出以下结论:
- 主节点的 role 是 master,并记录二个从节点的信息
- 从节点的角色是 salve,并记录了主节点的信息
- 主节点的 ip 是 172.28.30.27,从节点的 ip 是 172.28.30.28、172.28.30.29
4.2 只有主节点可以写数据

通过截图,得出以下结论:
- 主节点写入数据会同步到从节点
- 只有主节点可以写入数据,从节点执行写操作就会抛出异常 (error) READONLY You can't write against a read only replica
5. 搭建sentinel集群
#################### 节点1 ####################
# 创建文件夹
mkdir -p /usr/local/sentinel
# 创建配置文件sentinel.conf
vim /usr/local/sentinel/sentinel.conf
port 26379
bind 0.0.0.0
pidfile "/var/run/sentinel-node1.pid"
logfile "/var/log/sentinel-node1.log"
dir "/tmp"
sentinel monitor mymaster 172.28.30.27 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel auth-pass mymaster 123456
sentinel failover-timeout mymaster 30000
# 拉取镜像并部署sentinel
docker run -d \
--name sentinel-node1 \
-v /usr/local/sentinel/sentinel.conf:/etc/redis/sentinel.conf \
-p 26379:26379 \
redis:7.0.12 redis-sentinel /etc/redis/sentinel.conf
#################### 节点2 ####################
# 创建文件夹
mkdir -p /usr/local/sentinel
# 创建配置文件sentinel.conf
vim /usr/local/sentinel/sentinel.conf
port 26379
bind 0.0.0.0
pidfile "/var/run/sentinel-node2.pid"
logfile "/var/log/sentinel-node2.log"
dir "/tmp"
sentinel monitor mymaster 172.28.30.27 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel auth-pass mymaster 123456
sentinel failover-timeout mymaster 30000
# 拉取镜像并部署sentinel
docker run -d \
--name sentinel-node2 \
-v /usr/local/sentinel/sentinel.conf:/etc/redis/sentinel.conf \
-p 26379:26379 \
redis:7.0.12 redis-sentinel /etc/redis/sentinel.conf
#################### 节点3 ####################
# 创建文件夹
mkdir -p /usr/local/sentinel
# 创建配置文件sentinel.conf
vim /usr/local/sentinel/sentinel.conf
port 26379
bind 0.0.0.0
pidfile "/var/run/sentinel-node3.pid"
logfile "/var/log/sentinel-node3.log"
dir "/tmp"
sentinel monitor mymaster 172.28.30.27 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel auth-pass mymaster 123456
sentinel failover-timeout mymaster 30000
# 拉取镜像并部署sentinel
docker run -d \
--name sentinel-node3 \
-v /usr/local/sentinel/sentinel.conf:/etc/redis/sentinel.conf \
-p 26379:26379 \
redis:7.0.12 redis-sentinel /etc/redis/sentinel.conf
6. 验证sentinel功能
6.1 停止主节点

node3(172.28.30.29)被选举为新的主节点
6.2 重启主节点

主节点重启,已经变成从节点了
6.3 重启后数据同步

在主节点(node1)停止期间,在新的主节点(node3)写入数据,当旧的主节点(node1)重启后,成功同步了在新的主节点(node3)中写入的数据
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)