Docker搭建redis集群(主从模式+哨兵模式)
首先拉取redis的镜像文件
docker pull redis
主从复制
1、准备redis.conf
配置文件
https://gitee.com/mirrors/redis/blob/6.2/redis.conf
2、修改以下内容
master节点
port 7001
# IP绑定,注释此行
# bind 127.0.0.1
pidfile /var/run/redis_7001.pid
logfile "/data/redis.log"
protected-mode no
replication 节点配置
slave1
# 如果同一台服务器上启动,注意修改为不同的端口
port 7002
logfile "/data/slave_1.log"
# 修改成 docker 容器内部的 ip地址
replicaof 172.17.0.8 7001
protected-mode no
slave2
# 如果同一台服务器上启动,注意修改为不同的端口
port 7003
logfile "/data/slave_2.log"
# 修改成 docker 容器内部的 ip地址
replicaof 172.17.0.8 7001
protected-mode no
查看docker容器ip地址的方法
docker inspect name | grep "IPAddress"
docker启动失败可以查看启动日志
docker logs -f -t --tail 20 name
3、分别启动master和slave节点
master
docker run -d --privileged=true --restart=always -p 7001:7001 \
-v /redis_cluster/redis7001/conf/redis.conf:/etc/redis/redis.conf \
-v /redis_cluster/redis7001/data:/data \
--name redis_master \
redis redis-server /etc/redis/redis.conf
- –restart=always:失败会一直重启。无论状态是如何,都重启容器
- –restart=no:容器退出时,不重启容器
- –restart=no-failure:10 表示最多重启10次
- –privileged=true:使用该参数,容器内的 root 拥有真正的 root 权限
slave1
docker run -d --privileged=true --restart=always -p 7002:7002 \
-v /redis_cluster/redis7002/conf/redis.conf:/etc/redis/redis.conf \
-v /redis_cluster/redis7002/data:/data \
--name redis_slave1 \
redis redis-server /etc/redis/redis.conf
slave2
docker run -d --privileged=true --restart=always -p 7003:7003 \
-v /redis_cluster/redis7003/conf/redis.conf:/etc/redis/redis.conf \
-v /redis_cluster/redis7003/data:/data \
--name redis_slave2 \
redis redis-server /etc/redis/redis.conf
4、测试
连接上master节点redis-cli,执行以下命令,可以看到有两个slave信息
172.17.0.8:7001> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.17.0.9,port=7002,state=online,offset=98,lag=0
slave1:ip=172.17.0.10,port=7003,state=online,offset=98,lag=1
master_failover_state:no-failover
master_replid:006f1ead9d06fdbc19a7481d66c6bb0e28d028e4
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:112
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:112
在master节点写入数据
172.17.0.8:7001> set str this-is-writed-by-master
OK
在slave查看
172.17.0.9:7002> get str
"this-is-writed-by-master"
172.17.0.10:7003> get str
"this-is-writed-by-master"
哨兵模式
1、准备sentinel.conf配置文件
https://gitee.com/mirrors/redis/blob/6.2/sentinel.conf
2、修改配置文件并复制到不同的redis配置目录下
#端口号(如果同一台服务器上启动,注意要修改为不同的端口)
port 27001/27002/27003
#监控的主redis服务器
sentinel monitor mymaster 172.17.0.8 7001 2
# 修改日志文件的路径
logfile "/data/sentinel.log"
3、启动 redis-sentinel 进程
sentinel1
docker run -d --name sentinel1 -p 27001:27001 \
-v /redis_cluster/redis7001/conf/sentinel.conf:/etc/sentinel.conf \
-v /redis_cluster/redis7001/data/:/data/ redis redis-sentinel /etc/sentinel.conf
sentinel2
docker run -d --name sentinel2 -p 27002:27002 \
-v /redis_cluster/redis7002/conf/sentinel.conf:/etc/sentinel.conf \
-v /redis_cluster/redis7002/data/:/data/ redis redis-sentinel /etc/sentinel.conf
sentinel3
docker run -d --name sentinel3 -p 27003:27003 \
-v /redis_cluster/redis7003/conf/sentinel.conf:/etc/sentinel.conf \
-v /redis_cluster/redis7003/data/:/data/ redis redis-sentinel /etc/sentinel.conf
4、服务测试
#进入sentinel节点
docker exec -it sentinel1 redis-cli -p 27001
#查看sentinel信息
127.0.0.1:27001> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.17.0.8:7001,slaves=2,sentinels=3
- 关闭master
- 执行上面主从复制中的测试模块,多次执行 info replication 查看信息发生的变化
- 或者监听哨兵配置的日志文件,可以实时看到其发生的变化
#断掉master节点
docker stop redis_master
#查看当前主节点信息
127.0.0.1:27001> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.17.0.9:7002,slaves=2,sentinels=3
可以看到master节点已经变成了7002