redis主从配置
节点部署介绍
10.0.129.13 | master |
10.0.129.14 | slave |
10.0.129.15 | slave |
1.1 三台节点拉取使用镜像
docker pull redis:7.0.4
1.2 编辑主从配置文件和哨兵配置文件
# 三台节点都执行以下操作
创建目录
mkdir /usr/local/redis
mkdir /usr/local/redis/conf
注意!!!!! 配置文件的注释会导致启动失败 记得把注释删除 这里只进行说明
#添加redis配置文件
cat >> /usr/local/redis/redis.conf << 'EOF'
bind 0.0.0.0
# 指定的端口
port 6379
daemonize no
logfile /data/redis.log
# 持久化文件存储位置
dir /data
dbfilename redis.rdb
save 900 1
save 300 10
save 60 10000
masterauth 123456
#从节点连接master的密码
requirepass 123456
appendonly yes
cluster-enabled no
EOF
##添加哨兵模式的配置文件
cat >> /usr/local/redis/conf/sentinel.conf << 'EOF'
port 26379
daemonize yes
sentinel monitor mymaster 10.0.129.13 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel auth-pass mymaster 123456
EOF
1.3 启动容器
###三台节点启动容器
docker run --network=host --privileged=true --name redis-test \
-v /usr/local/redis/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis/conf:/data/conf -v /usr/local/redis/data:/data \
-d --restart=always redis:7.0.4 redis-server /etc/redis/redis.conf
1.4 修改主从
这里我们用10.0.129.13节点为主
# 在14,15节点进行以下配置
# 进入容器
docker exec -it redis-test /bin/bash
# 进入redis
redis-cli -a 123456
# 执行以下命令配置主从
127.0.0.1:6379> SLAVEOF 10.0.129.13 6379
OK
## 查看
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:10.0.129.13
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_read_repl_offset:154
slave_repl_offset:154
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:69755d2dbd809f2515b69bf651904ee8beb9abdb
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:154
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:155
repl_backlog_histlen:0
1.5 查看主库是否配置完成
# 改操作在13节点操作
# 进入容器
docker exec -it redis-test /bin/bash
# 进入redis
redis-cli -a 123456
# 可以看到13节点的角色是master从节点分别是10.0.129.15,10.0.129.14这两个
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.0.129.15,port=6379,state=online,offset=168,lag=0
slave1:ip=10.0.129.14,port=6379,state=online,offset=168,lag=0
master_failover_state:no-failover
master_replid:69755d2dbd809f2515b69bf651904ee8beb9abdb
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:168
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:168
1.6 主从验证
##这里我们做一下验证set一个值
127.0.0.1:6379> set test 111
OK
127.0.0.1:6379> get test
"111"
### 然后在14和15节点进行查看,能查看到就证明主从配置的没有问题
127.0.0.1:6379> get test
"111"
#### 需要注意的是从库没有写的权限只有读的权限 这里我们在从库验证也是不可行的
127.0.0.1:6379> set test 2
(error) READONLY You can't write against a read only replica.
2.redis哨兵模式配置
2.1. 我们在1.3的步骤已经配置过哨兵模式需要的配置文件所以我们直接启动以下命令启动即可
注意:以下操作在三台节点都要操作
进入容器
docker exec -it redis-test /bin/bash
###执行启动命令 这里我们挂载到容器的 /data/conf/sentinel.conf所以启动命令也要写绝对路径
redis-sentinel /data/conf/sentinel.conf
#查看宿主机端口是否存在
[root@tcs-10-0-129-13 /usr/local/redis]# netstat -ltnup | grep 6379
tcp 0 0 0.0.0.0:26379 0.0.0.0:* LISTEN 173542/redis-sentin
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 3349415/redis-serve
tcp6 0 0 :::26379 :::* LISTEN 173542/redis-sentin
2.2. 查看集群信息
redis-cli -p 26379
# 检查 sentinel 实例是否正常(反馈结果为 PONG)
PING
# 列出所有被监视的主服务
SENTINEL masters
#列出指定主库,所有的从服务
SENTINEL slaves mymaster
#返回给定名字的主服务器的 IP 地址和端口号。
SENTINEL get-master-addr-by-name mymaster
# 查看哨兵监控信息
info sentinel
2.3 哨兵模式验证
这里我们先查看一下 三个节点的角色
## 10.0.129.13节点 master
127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.0.129.15,port=6379,state=online,offset=491414,lag=0
slave1:ip=10.0.129.14,port=6379,state=online,offset=491428,lag=0
master_failover_state:no-failover
master_replid:1f717cc3c592a03d6640a94379b32af5e2c8d3e3
master_replid2:3dd35ad02135e84ef669e0db9f6962e31050696a
master_repl_offset:491428
second_repl_offset:314267
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:48063
repl_backlog_histlen:443366
127.0.0.1:6379>
## 10.0.129.14节点 slave
127.0.0.1:6379> info Replication
# Replication
role:slave
master_host:10.0.129.13
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_read_repl_offset:512529
slave_repl_offset:512529
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:1f717cc3c592a03d6640a94379b32af5e2c8d3e3
master_replid2:3dd35ad02135e84ef669e0db9f6962e31050696a
master_repl_offset:512529
second_repl_offset:314267
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:155
repl_backlog_histlen:512375
## 10.0.129.15节点 slave
127.0.0.1:6379> info Replication
# Replication
role:slave
master_host:10.0.129.13
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_read_repl_offset:512529
slave_repl_offset:512529
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:1f717cc3c592a03d6640a94379b32af5e2c8d3e3
master_replid2:3dd35ad02135e84ef669e0db9f6962e31050696a
master_repl_offset:512529
second_repl_offset:314267
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:155
repl_backlog_histlen:512375
##现在 我们把10.0.129.13节点上的master给停掉
docker stop redis-test
## 从10.0.129.14这个节点观察 10.0.129.13上master是down的状态 开始重新选举master
127.0.0.1:6379> info Replication
# Replication
role:slave
master_host:10.0.129.13
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:549945
slave_repl_offset:549945
master_link_down_since_seconds:4 #重新选举的时间默认是30秒
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:1f717cc3c592a03d6640a94379b32af5e2c8d3e3
master_replid2:3dd35ad02135e84ef669e0db9f6962e31050696a
master_repl_offset:549945
second_repl_offset:314267
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:155
repl_backlog_histlen:549791
##过30秒后查看 这个时候10.0.129.15节点成了新的master
127.0.0.1:6379> info Replication
# Replication
role:slave
master_host:10.0.129.15
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_read_repl_offset:568097
slave_repl_offset:568097
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:3d58451be92519ed581d61cc654ea7f676a32ed9
master_replid2:1f717cc3c592a03d6640a94379b32af5e2c8d3e3
master_repl_offset:568097
second_repl_offset:549946
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:155
repl_backlog_histlen:567943
## 从10.0.129.15 节点查看是否成为master 这里看到15节点重被选举成功 证明我们的哨兵模式配置成功
127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.129.14,port=6379,state=online,offset=594393,lag=1
master_failover_state:no-failover
master_replid:3d58451be92519ed581d61cc654ea7f676a32ed9
master_replid2:1f717cc3c592a03d6640a94379b32af5e2c8d3e3
master_repl_offset:594393
second_repl_offset:549946
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:594379
2.4 启动13节点的容器重新加入集群
##启动容器
docker start redis-test
###查看从15节点上查看13节点是否加入集群, 这里可以看出13也正常加入集群
127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.0.129.14,port=6379,state=online,offset=612522,lag=1
slave1:ip=10.0.129.13,port=6379,state=wait_bgsave,offset=0,lag=0
master_failover_state:no-failover
master_replid:3d58451be92519ed581d61cc654ea7f676a32ed9
master_replid2:1f717cc3c592a03d6640a94379b32af5e2c8d3e3
master_repl_offset:612659
second_repl_offset:549946
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:612645
2.5 注意当有节点挂掉退集群时,重新加入集群后容器内的启动哨兵的命令也需要重新执行
redis-sentinel /data/conf/sentinel.conf