Docker 搭建 Redis 主从复制 + 哨兵集群
主从复制
在官网下载 redis.conf
配置文件,修改以下内容
修改配置文件
master 节点配置
port 6379
# IP绑定,注释此行
# bind 127.0.0.1
pidfile /var/run/redis_6379.pid
logfile "/data/redis.log"
replication 节点配置
# 如果同一台服务器上启动,注意修改为不同的端口
port 6380
logfile "/data/slave_1.log"
# 同一台服务器上要修改成 docker 容器内部的 ip地址
replicaof 172.17.0.2 6379
可以通过这个命令查看 master 节点容器内部的 IP 地址
docker inspect redis1 | grep "IPAddress"
启动容器
ubuntu@VM-16-6-ubuntu:/usr/local/redis/etc$ sudo docker run -d --privileged=true --restart=always -p 6379:6379 \
-v /usr/local/redis/etc/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis/data:/data \
--name redis1 \
redis redis-server /etc/redis/redis.conf
- --restart=always:失败会一直重启。无论状态是如何,都重启容器
- --restart=no:容器退出时,不重启容器
- --restart=no-failure:10 表示最多重启10次
- --privileged=true:使用该参数,容器内的 root 拥有真正的 root 权限
测试
查看容器是否正常运行
docker ps
##如正常运行就执行下面的验证,如总是不断的重启,这时就可以查看前面配置的日志文件了
##当然也可以直接用docker查看,但是有时候有些错误是看不到的,所以这时我们配置的日志文件就起到关键性的作用了
#进入主节点
##打开 redis 客户端
docker exec -it redis6 redis-cli -p 6379
ubuntu@VM-16-6-ubuntu:/usr/local/redis/etc$ sudo docker exec -it redis1 redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.17.0.4,port=6380,state=online,offset=14,lag=1
slave1:ip=172.17.0.3,port=6381,state=online,offset=14,lag=1
master_failover_state:no-failover
master_replid:c1080f8991b470afecf5776b24c071c3ddf2b73e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
127.0.0.1:6379> set hello codeman
OK
127.0.0.1:6379> get hello
"codeman"
127.0.0.1:6379> exit
ubuntu@VM-16-6-ubuntu:/usr/local/redis/etc$ sudo docker exec -it redis2 redis-cli -p 6380
127.0.0.1:6380> get hello
"codeman"
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:172.17.0.2
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_read_repl_offset:130
slave_repl_offset:130
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:c1080f8991b470afecf5776b24c071c3ddf2b73e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:130
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:130
127.0.0.1:6380> exit
ubuntu@VM-16-6-ubuntu:/usr/local/redis/etc$ sudo docker exec -it redis3 redis-cli -p 6381
127.0.0.1:6381> get hello
"codeman"
127.0.0.1:6381> exit
哨兵
修改配置文件
官网上找到当前版本对应的 sentinel.conf
配置文件,修改以下内容:
#端口号(如果同一台服务器上启动,注意要修改为不同的端口)
port 26379
#监控的主redis服务器
sentinel monitor mymaster 172.17.0.2 6379 2
# 修改日志文件的路径
logfile "/data/sentinel.log"
复制修改过的哨兵配置文件到各个服务器上
启动
ubuntu@VM-16-6-ubuntu:/usr/local/redis/etc$ sudo docker run -d --privileged=true --restart=always -p 26379:26379 \
-v /usr/local/redis/etc/sentinel_1.conf:/etc/redis/sentinel.conf \
-v /usr/local/redis/data/:/data/ \
--name sentinel1 \
redis redis-sentinel /etc/redis/sentinel.conf
- redis-sentinel /etc/redis/sentinel.conf : 指定配置文件启动 redis-sentinel 进程
ubuntu@VM-16-6-ubuntu:/usr/local/redis/etc$ sudo docker exec -it sentinel1 redis-cli -p 26379
127.0.0.1:26379> 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.2:6379,slaves=4,sentinels=3
127.0.0.1:26379> exit
服务测试
- 关闭master
- 执行上面主从复制中的测试模块,多次执行 info replication 查看信息发生的变化
- 或者监听哨兵配置的日志文件,可以实时看到其发生的变化
了解更多可扫码关注公众号