说明
- Redis-11-Redis主从复制
- 包含Redis主从复制的特点、注意事项、主从复制的原理、主从复制的模式、哨兵模式(sentinel)
- 官方文档:https://redis.io/documentation
- Redis命令参考:http://redisdoc.com/
核心概念
》Redis主从复制的特点?
- 读写分离
- Redis主从复制都是一主多从,要多主就需要集群实现
- 容灾快速恢复
》本案例搭建环境描述
- 本案例简单搭建一主二从
- 在同一台机器中使用3个不同的端口模拟三个Redis服务
- 原本的6379端口不受影响也不在本案例操作范围内
》注意事项
- 主从复制中的从服务器默认只有读权限,一般也都是这样的
》主从复制的原理
- 从服务启动后,向主服务发送数据同步请求
- 主服务收到从服务同步请求后,将数据持久化到rdb,然后将rdb文件发送给从服务(全量复制)
- 从服务收到主服务发送过来的rdb后,以之进行数据初始化
- 后续主服务所有写操作,主服务都会同步发送给从服务(增量复制)
》主从复制的模式
- 一主多从
- 基本模式,一个主服务剩下的全部作为从服务
- 薪火相传
- 一代一代往下继承,比如:A <- B <- C
- 反客为主
- 当主服务挂掉后,可以将从服务设置为主服务,但是只能通过动态命令实现,无法通过修改配置方式实现。要实现自动需要结合下面的哨兵模式
- 命令:
127.0.0.1:6382> slaveof no one
》哨兵模式(sentinel)
- 什么是哨兵模式?
- 反客为主的自动版
- 哨兵模式的原理?
- 启动一个服务专门用来监听Redis,该服务由Redis官方提供,与redis-server同级目录
- 当监控到主机挂掉以后,会自动切换一台从服务为主服务,并把原先的主服务变为从服务,当原先的主服务启动后将会作为从服务
- 选择从服务作为主服务的优先级判断条件
- 根据从服务的配置文件:
replica-priority 100
,这个值越小优先级越高 - 数据偏移量越大优先级越高(偏移量指数据同步最全的)
- runid越小优先级越高
- 根据从服务的配置文件:
- 哨兵模式结合代码使用?
- 使用Redis连接池,连接哨兵模式配置文件中定义的IP、端口
- 注意:连接的是哨兵服务,而不是Redis服务
操作步骤
》先正常开启三个Redis服务端
- 新建目录:/root/redisSlave,并进入该目录
- 在当前目录下创建数据存储目录:data
- 将默认配置文件redis.conf复制一份到该目录
- 新建三个配置文件:redis6381.conf、redis6382.conf、redis6383.conf
[root@192 ~]# cd /root/redisSlave [root@192 redisSlave]# mkdir data [root@192 redisSlave]# ll total 76 drwxr-xr-x 2 root root 6 Jan 9 17:55 data -rw-r--r-- 1 root root 103 Jan 9 17:53 redis6381.conf -rw-r--r-- 1 root root 103 Jan 9 17:53 redis6382.conf -rw-r--r-- 1 root root 103 Jan 9 17:53 redis6383.conf -rw-r--r-- 1 root root 61813 Jan 9 17:21 redis.conf
- 配置文件内容如下
[root@192 redisSlave]# more redis6381.conf include ./redis.conf port 6381 pidfile /var/run/redis6381.pid dbfilename dump6381.rdb dir ./data [root@192 redisSlave]# more redis6382.conf include ./redis.conf port 6382 pidfile /var/run/redis6382.pid dbfilename dump6382.rdb dir ./data [root@192 redisSlave]# more redis6383.conf include ./redis.conf port 6383 pidfile /var/run/redis6383.pid dbfilename dump6383.rdb dir ./data
- 配置文件内容如下
- 分别启动三个Redis服务
# 启动6381 [root@192 redisSlave]# /usr/local/redis/bin/redis-server ./redis6381.conf 44407:C 09 Jan 2022 17:59:51.059 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 44407:C 09 Jan 2022 17:59:51.060 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=44407, just started 44407:C 09 Jan 2022 17:59:51.060 # Configuration loaded # 启动6382 [root@192 redisSlave]# /usr/local/redis/bin/redis-server ./redis6382.conf 44429:C 09 Jan 2022 18:00:11.818 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 44429:C 09 Jan 2022 18:00:11.818 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=44429, just started 44429:C 09 Jan 2022 18:00:11.818 # Configuration loaded # 启动6383 [root@192 redisSlave]# /usr/local/redis/bin/redis-server ./redis6383.conf 44437:C 09 Jan 2022 18:00:15.680 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 44437:C 09 Jan 2022 18:00:15.680 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=44437, just started 44437:C 09 Jan 2022 18:00:15.680 # Configuration loaded # 查看状态(6379是默认的,不用管) [root@192 redisSlave]# ps -ef |grep redis root 1845 1 0 Jan07 ? 00:05:39 /usr/local/redis/bin/redis-server *:6379 root 44408 1 0 17:59 ? 00:00:00 /usr/local/redis/bin/redis-server *:6381 root 44430 1 0 18:00 ? 00:00:00 /usr/local/redis/bin/redis-server *:6382 root 44438 1 0 18:00 ? 00:00:00 /usr/local/redis/bin/redis-server *:6383 root 44458 1803 0 18:00 pts/0 00:00:00 grep --color=auto redis
- 使用客户端连接Redis服务进行测试,三个端口都能连接即可。
[root@192 redisSlave]# /usr/local/redis/bin/redis-cli -p 6381 127.0.0.1:6381>
- 查看主从复制信息,命令:info replication
127.0.0.1:6381> info replication # Replication role:master connected_slaves:0 master_replid:6c47a5c58d4b536ab60c65539b04e562686dec4c master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0
role:master
:表示本机作为主服务connected_slaves:0
:表示连接的从服务器数量
》绑定三个Redis服务,开启主从复制
》》实现方式一:动态命令(slaveof )绑定主从复制关系(适用于Redis没有密码的情况)
- 分别在从服务器上执行以下命令进行绑定(以6382为例)
[root@192 redisSlave]# /usr/local/redis/bin/redis-cli -p 6382 127.0.0.1:6382> slaveof 192.168.3.241 6381 OK
- 注意:这种方式,如果重启从服务,那么原先配置的主从复制关系就失效了
- 注意:重启主服务,原先的主从复制关系不变
》》实现方式二:修改配置文件绑定主从复制关系(适用于Redis有密码情况)
- 分别修改从服务器配置文件(以6382为例)
[root@192 redisSlave]# cat redis6382.conf include ./redis.conf port 6382 pidfile /var/run/redis6382.pid dbfilename dump6382.rdb dir ./data # 主从复制关联主服务器IP和端口 replicaof 192.168.3.241 6381 # 主从复制关联主服务器Redis密码 masterauth 123456
- 修改完重启Redis服务,查看主从复制信息
# 连接主服务器,并查看 [root@192 redisSlave]# /usr/local/redis/bin/redis-cli -p 6381 127.0.0.1:6381> auth 123456 OK 127.0.0.1:6381> info replication # Replication role:master connected_slaves:2 slave0:ip=192.168.3.241,port=6382,state=online,offset=56,lag=1 slave1:ip=192.168.3.241,port=6383,state=online,offset=56,lag=1 master_replid:be633cdf584be908844294ddf2a67cfbb2217db7 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:56 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:56 # 连接从服务器,并查看(以6382为例) [root@192 redisSlave]# /usr/local/redis/bin/redis-cli -p 6382 127.0.0.1:6382> auth 123456 OK 127.0.0.1:6382> info replication # Replication role:slave master_host:192.168.3.241 master_port:6381 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:1134 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:be633cdf584be908844294ddf2a67cfbb2217db7 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:1134 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:1134
- 注意:这种方式,重启从服务,依旧是原先的主从复制关系,因为配置文件是重新加载了
- 注意:重启主服务,原先的主从复制关系不变
》开启哨兵模式
-
新建哨兵配置文件:sentinel.conf
[root@192 redisSlave]# ll total 80 drwxr-xr-x 2 root root 66 Jan 10 12:47 data -rw-r--r-- 1 root root 103 Jan 9 17:53 redis6381.conf -rw-r--r-- 1 root root 209 Jan 10 02:03 redis6382.conf -rw-r--r-- 1 root root 209 Jan 10 02:03 redis6383.conf -rw-r--r-- 1 root root 61813 Jan 9 17:21 redis.conf -rw-r--r-- 1 root root 45 Jan 10 16:07 sentinel.conf # 配置文件内容如下 [root@192 redisSlave]# cat sentinel.conf # 哨兵监控主机信息 sentinel monitor myMaster 192.168.3.241 6381 1 # 哨兵监控主机的密码(如果没密码忽略这行) sentinel auth-pass myMaster 123456 # 哨兵服务后台启动(配置稳定后可以开启后台) # daemonize yes
- 配置文件说明:
- sentinel monitor <主机别名> <端口> <至少几个哨兵同意迁移>
- sentinel auth-pass <主机别名> <密码>
- 配置文件说明:
-
启动一个哨兵服务
[root@192 redisSlave]# /usr/local/redis/bin/redis-sentinel ./sentinel.conf 79386:X 10 Jan 2022 16:48:13.552 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 79386:X 10 Jan 2022 16:48:13.552 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=79386, just started 79386:X 10 Jan 2022 16:48:13.552 # Configuration loaded ...... 79386:X 10 Jan 2022 16:48:13.553 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 79386:X 10 Jan 2022 16:48:13.555 # Sentinel ID is 431ce25764c7cac5f9504729c89c3eff496ba4b3 79386:X 10 Jan 2022 16:48:13.555 # +monitor master myMaster 192.168.3.241 6381 quorum 1 79386:X 10 Jan 2022 16:48:13.556 * +slave slave 192.168.3.241:6383 192.168.3.241 6383 @ myMaster 192.168.3.241 6381 79386:X 10 Jan 2022 16:48:13.557 * +slave slave 192.168.3.241:6382 192.168.3.241 6382 @ myMaster 192.168.3.241 6381
- 通过哨兵服务的启动日志,你可以清晰的看到主从复制服务信息
-
当你启动哨兵服务以后,哨兵服务会自动重写你的配置文件,就像下边这样:
[root@192 redisSlave]# cat sentinel.conf sentinel myid b28d162eff8336dbd397caf6e4d5521ea5fcb925 sentinel deny-scripts-reconfig yes daemonize yes # Generated by CONFIG REWRITE port 26379 dir "/root/redisSlave" protected-mode no sentinel monitor myMaster 192.168.3.241 6381 1 sentinel auth-pass myMaster 123456 sentinel config-epoch myMaster 0 sentinel leader-epoch myMaster 0 sentinel known-replica myMaster 192.168.3.241 6382 sentinel known-replica myMaster 192.168.3.241 6383