Redis主从 && Sentinel哨兵

2019-04-29  本文已影响0人  流月汐志

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主从复制.jpg

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)

Redis Sentinel 架构结构图.jpg
上一篇下一篇

猜你喜欢

热点阅读