Replication (主从复制)
1. docker pull redis
2. docker run redis master
docker run -it -p 6370:6379 \
-v $(pwd)/redis-master.conf:/etc/redis/redis.conf \
-v $(pwd)/data:/data \
--name redis-master redis bash
### --appendonly yes开启持久化存储
docker run -d -p 6370:6379 \
-v /root/myredis/redis-master.conf:/etc/redis/redis.conf \
-v /root/myredis/data:/data \
--name redis-master redis \
redis-server /etc/redis/redis.conf --appendonly yes
3. docker run redis slave1
docker run -it -p 6371:6379 \
-v $(pwd)/redis-slave1.conf:/etc/redis/redis.conf \
-v $(pwd)/data:/data \
--name redis-slave1 redis bash
docker run -d -p 6371:6379 \
-v $(pwd)/redis-slave1.conf:/etc/redis/redis.conf \
--link redis-master:master \
--name redis-slave1 redis \
redis-server /etc/redis/redis.conf
4. docker run redis slave2
docker run -it -p 6372:6379 \
-v $(pwd)/redis-slave2.conf:/etc/redis/redis.conf \
-v $(pwd)/data:/data --name redis-slave2 redis bash
docker run -d -p 6372:6379 \
-v $(pwd)/redis-slave2.conf:/etc/redis/redis.conf \
--link redis-master:master \
--name redis-slave2 redis \
redis-server /etc/redis/redis.conf
主从测试
1. 查看所有运行的容器
[root@tyler myredis]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2d467545dff1 redis "docker-entrypoint.s…" 15 seconds ago Up 14 seconds 0.0.0.0:6372->6379/tcp redis-slave2
19d467dd6f02 redis "docker-entrypoint.s…" 50 seconds ago Up 50 seconds 0.0.0.0:6371->6379/tcp redis-slave1
8062fd7cc873 redis "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 0.0.0.0:6370->6379/tcp redis-master
[root@tyler myredis]#
2. 修改配置
# 到这步,我把两个从 redis 数据库 连接上了主 redis 数据库,配置文件中的 master ip 填写的 master(主机名) ,修改配置如下
bind 0.0.0.0
port 6379
replicaof master 6379
3. 测试结果
# 在 6370 存入一个值
127.0.0.1:6370> set name tyler
OK
127.0.0.1:6370>
# 在 6371 取这个值
127.0.0.1:6371> get name
"tyler"
127.0.0.1:6371>
# 在 6372 取这个值
127.0.0.1:6372> get name
"tyler"
127.0.0.1:6372>
4. 尝试在slave节点写入数据
127.0.0.1:6371> set age 18
(error) READONLY You can't write against a read only replica.
127.0.0.1:6371>
5. 目前架构

Redis Sentinel
1、准备配置文件
port 26379<26380|26381>
logfile "/tmp/sentinel.log"
sentinel monitor mymaster master 6379 2
# Default is 3 minutes.
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 1800
2、创建三个 sentinel
docker run -d -p 26379:26379 \
-v $(pwd)/sentinel01.conf:/etc/redis/sentinel.conf \
--link redis-master:master \
--name redis-sentinel01 redis:latest \
redis-sentinel /etc/redis/sentinel.conf
docker run -d -p 26380:26380 \
-v $(pwd)/sentinel02.conf:/etc/redis/sentinel.conf \
--link redis-master:master \
--name redis-sentinel02 redis:latest \
redis-sentinel /etc/redis/sentinel.conf
docker run -d -p 26381:26381 \
-v $(pwd)/sentinel03.conf:/etc/redis/sentinel.conf \
--link redis-master:master \
--name redis-sentinel03 redis:latest \
redis-sentinel /etc/redis/sentinel.conf
3、启动关联成功检查
# 挂载的配置文件结尾会自动生成,关联到的 sentinel && redis
sentinel config-epoch mymaster 1
sentinel leader-epoch mymaster 1
sentinel known-replica mymaster 172.17.0.2 6379
sentinel known-replica mymaster 172.17.0.4 6379
sentinel known-sentinel mymaster 172.17.0.7 26381 b60aa97dd73c072109914fbd89b7f49a0402308c
sentinel known-sentinel mymaster 172.17.0.6 26380 05e77020b08088c2054401ae1f33f2a8308989f3
sentinel current-epoch 1
# sentinel的日志
1:X 14 Feb 2019 07:43:06.173 # +monitor master mymaster 172.17.0.2 6379 quorum 2
1:X 14 Feb 2019 07:43:06.173 * +slave slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.2 6379
1:X 14 Feb 2019 07:43:06.180 * +slave slave 172.17.0.5:6379 172.17.0.5 6379 @ mymaster 172.17.0.2 6379
1:X 14 Feb 2019 07:43:27.304 * +sentinel sentinel 05e77020b08088c2054401ae1f33f2a8308989f3 172.17.0.6 2
1:X 14 Feb 2019 07:43:27.304 * +sentinel sentinel 05e77020b08088c2054401ae1f33f2a8308989f3 172.17.0.6 26380 @ mymaster 172.17.0.2 6379
1:X 14 Feb 2019 07:43:45.408 * +sentinel sentinel b60aa97dd73c072109914fbd89b7f49a0402308c 172.17.0.7 26381 @ mymaster 172.17.0.2 6379
4、故障转移测试
# 停止 master 节点
docker stop redis-master
5、 查看 sentinel 日志
1:X 14 Feb 2019 07:45:26.791 # +sdown master mymaster 172.17.0.2 6379 (检测到主观不可用)
1:X 14 Feb 2019 07:45:26.879 # +new-epoch 1
1:X 14 Feb 2019 07:45:26.881 # +vote-for-leader 05e77020b08088c2054401ae1f33f2a8308989f3 1 (推选 sentinel leader)
1:X 14 Feb 2019 07:45:27.884 # +odown master mymaster 172.17.0.2 6379 #quorum 3/2 (投票多数判定,客观不可用)
1:X 14 Feb 2019 07:45:27.884 # Next failover delay: I will not start a failover before Thu Feb 14 07:45:31 2019
1:X 14 Feb 2019 07:45:27.966 # +config-update-from sentinel 05e77020b08088c2054401ae1f33f2a8308989f3 172.17.0.6 26380 @ mymaster
172.17.0.2 6379 (sentinel leader 更新 配置文件)
1:X 14 Feb 2019 07:45:27.966 # +switch-master mymaster 172.17.0.2 6379 172.17.0.5 6379 (切换172.17.0.2 --> 172.17.0.5 为 master)
1:X 14 Feb 2019 07:45:27.968 * +slave slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.5 6379 (切换*.0.4 为 .0.5 的 slave)
1:X 14 Feb 2019 07:45:27.968 * +slave slave 172.17.0.2:6379 172.17.0.2 6379 @ mymaster 172.17.0.5 6379 (切换.0.2 为 .0.5 的 slave)
1:X 14 Feb 2019 07:45:31.002 # +sdown slave 172.17.0.2:6379 172.17.0.2 6379 @ mymaster 172.17.0.5 6379 (检测到.0.4 为主观不可用)
6、 启动原 master 节点
docker start redis-master
7、 查看 sentinel 日志
1:X 14 Feb 2019 07:46:59.274 # -sdown slave 172.17.0.2:6379 172.17.0.2 6379 @ mymaster 172.17.0.5 6379
1:X 14 Feb 2019 07:47:09.260 * +convert-to-slave slave 172.17.0.2:6379 172.17.0.2 6379 @ mymaster 172.17.0.5 6379
8、 架构 (3sentinel + 1master + 2slave)

网友评论