Redis6的主从复制 哨兵模式(sentinel)—反客为主自动版

redis6的安装详情及用法详见 >>>> Linux系统下的Redis的安装以及使用

主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主

可以实现 读写分离,性能扩展 容灾快速恢复 等功能

环境:

centos7

主机1:127.0.0.1 6379

主机2:127.0.0.1 6380

主机3:127.0.0.1 6381

1、复制三份redis.conf文件

分别改名为redis6379.conf redis6380.conf redis6381.conf

2、分别修改以下配置文件的内容

include /myredis/redis.conf
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump6379.rdb
include /myredis/redis.conf
pidfile /var/run/redis_6380.pid
port 6380
dbfilename dump6380.rdb
include /myredis/redis.conf
pidfile /var/run/redis_6381.pid
port 6381
dbfilename dump6381.rdb

3、启动三台Redis服务器

[root@iZ2ze2rikqlh3ql1n2cw61Z bin]# kill -9 57468
[root@iZ2ze2rikqlh3ql1n2cw61Z bin]# ./redis-server /myredis/redis6379.conf 
[root@iZ2ze2rikqlh3ql1n2cw61Z bin]# ./redis-server /myredis/redis6380.conf 
[root@iZ2ze2rikqlh3ql1n2cw61Z bin]# ./redis-server /myredis/redis6381.conf

4、查看系统进程,看三台Redis是否启动成功

[root@iZ2ze2rikqlh3ql1n2cw61Z bin]# ps -ef | grep redis
root       58188       1  0 07:26 ?        00:00:00 ./redis-server *:6379
root       58194       1  0 07:26 ?        00:00:00 ./redis-server *:6380
root       58200       1  0 07:26 ?        00:00:00 ./redis-server *:6381
root       58209   58052  0 07:27 pts/0    00:00:00 grep --color=auto redis

5、查看三台主机运行情况

info replication #打印主从复制的相关信息

6379信息

[root@iZ2ze2rikqlh3ql1n2cw61Z bin]# ./redis-cli -p 6379
127.0.0.1:6379> info replication
NOAUTH Authentication required.
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:fbd16328dcd4296f8347b0b15934aced272f01b3
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

6380信息

[root@iZ2ze2rikqlh3ql1n2cw61Z bin]# ./redis-cli -p 6380
127.0.0.1:6380> auth 123456
OK
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:934a431bc633b5078ac1fc9fb890fca9b5ef6408
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

6381信息

[root@iZ2ze2rikqlh3ql1n2cw61Z 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:0
master_failover_state:no-failover
master_replid:8d00aa536b59c128813c348b35eced8d4486f09c
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

6、配从(库)不配主(库)

# slaveof  <ip><port> 成为某个实例的从服务器

在6380和6381上执行: slaveof 127.0.0.1 6379

# ----------执行后查看master----------
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:fbd16328dcd4296f8347b0b15934aced272f01b3
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
# ----------执行后查看slave6380----------
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:1
slave_read_repl_offset:1
slave_repl_offset:1
master_sync_total_bytes:-1
master_sync_read_bytes:0
master_sync_left_bytes:-1
master_sync_perc:-0.00
master_sync_last_io_seconds_ago:0
master_link_down_since_seconds:-1
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:934a431bc633b5078ac1fc9fb890fca9b5ef6408
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
# ----------执行后查看slave6381----------
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:1
slave_repl_offset:1
master_link_down_since_seconds:-1
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:8d00aa536b59c128813c348b35eced8d4486f09c
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
  • 在主机上写,在从机上可以读取数据

  • 在从机上写数据报错

  • 主机挂掉,重启就行,一切如初

  • 从机重启需重设:slaveof 127.0.0.1 6379(可以将配置增加到文件中。永久生效)

7、常用3招


7.1、一主二仆

停止一台从服务器(如6381)

[root@iZ2ze2rikqlh3ql1n2cw61Z ~]# /usr/local/bin/redis-server /myredis/redis6381.conf 
[root@iZ2ze2rikqlh3ql1n2cw61Z ~]# /usr/local/bin/redis-cli -p 6381
127.0.0.1:6381> info replication
# Replication
role:master   #再次启动,这里显示是主服务器,这是其中一个特点,并不会自动变成从服务器
connected_slaves:0
master_failover_state:no-failover
master_replid:68d55763c83f89a955286d7ce21d06123e42a2d3
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

通过这一步,我们知道了从服务器关闭后再次启动是一个独立的服务器,是一个主服务器,不会自动变成从服务器,如果要变成从服务器,我们需要继续下一步操作,也就是执行之前的slaveof操作。

将刚才重新启动的6381服务器变成从服务器

127.0.0.1:6381> slaveof 127.0.0.1 6379
OK
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_read_repl_offset:893
slave_repl_offset:893
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:7d5e934367c47fa167eb3d6642a85948c396cfdd
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:893
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:880
repl_backlog_histlen:14

再次查看服务器中的key,我们观察效果:

127.0.0.1:6381> keys *
1) "k1"
2) "k2"

我们发现和主节点上的key还有另外一个从服务器上的key是保持一致的。也就是从服务器重新启动后会把主服务器中的数据从头复制到从服务器上。

继续测试,如果主服务器挂掉了以后会怎么样?

经过测试,主服务器挂掉后,从服务器不会上位,还是会认之前的是大哥。

继续测试,如果主服务器重新启动后会怎么样?

经过测试,主服务器重启之后还是主服务器,也就是还是当大哥。

7.2、薪火相传

  • 上一个Slave可以是下一个slave的Master,Slave同样可以接收其他 slaves的连接和同步请求,那么该slave作为了链条中下一个的master, 可以有效减轻master的写压力,去中心化降低风险。

  • 用 slaveof <ip><port>

  • 中途变更转向:会清除之前的数据,重新建立拷贝最新的

  • 风险是一旦某个slave宕机,后面的slave都没法备份

  • 主机挂了,从机还是从机,无法写数据了

演示:主服务器6379同步给从服务器6380,从服务器同步给从服务器6381

#在6381上执行命令slaveof
127.0.0.1:6381> slaveof 127.0.0.1 6380
OK
127.0.0.1:6381> info replication
# Replication
role:slave    #还是从服务器
master_host:127.0.0.1
master_port:6380    #主服务器变成了6380
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_read_repl_offset:2615
slave_repl_offset:2615
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:7d5e934367c47fa167eb3d6642a85948c396cfdd
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2615
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:880
repl_backlog_histlen:1736

我们查看作为原主服务器的6379有几台从机?

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1    #只有一台6380
slave0:ip=127.0.0.1,port=6380,state=online,offset=2867,lag=0
master_failover_state:no-failover
master_replid:7d5e934367c47fa167eb3d6642a85948c396cfdd
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2867
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2867

7.3、反客为主

  • 当一个master宕机后,后面的slave可以立刻升为master,其后面的slave不用做任何修改。

  • 用 slaveof no one 将从机变为主机。

  • 测试当主服务器挂掉后,从服务器上位

127.0.0.1:6380> slaveof no one
OK
127.0.0.1:6380> info replication
# Replication
role:master    #之前是从服务器,现在变成了主服务器,小弟还是那个小弟6381
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=3371,lag=1
master_failover_state:no-failover
master_replid:fa8ff532f1d371ffc8618eb6edbd784f384d01c0
master_replid2:7d5e934367c47fa167eb3d6642a85948c396cfdd
master_repl_offset:3371
second_repl_offset:3358
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3371

注意:以上这个反客为主的操作是需要手动操作的,但是工作中运维人员这样操作的可能不大,因为比较耗费时间,如果能变成全自动的就好了。我们的办法就是用下面学习的哨兵模式

8、主从复制原理


Slave启动成功连接到master后会给主服务器发送一个sync(同步)命令(这一步是从服务器主动做的)

主服务器接到从服务器发送过来的同步消息,把主服务器数据进行持久化到rdb文件了,把rdb文件发送给从服务器,从服务器拿到rdb进行获取(这一步是主服务器主动做的)

每次主服务器进行写操作之后,和从服务器会进行数据同步(这一步是主服务器主动做的)

全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。

增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步

但是只要是重新连接master,一次完全同步(全量复制)将被自动执行

9、哨兵模式(sentinel)—反客为主自动版


反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。

9.1、调整为一主二仆的模式(6379带着6380,6381)

9.2、自定义的/myredis目录下新建sentinel.conf文件,名字绝不能错

9.3、配置哨兵,填写内容

#sentinel.conf文件的简易版
#其中mymaster为监控对象起的服务器名称, 1 为至少有多少个哨兵同意迁移的数量。 
sentinel monitor mymaster 127.0.0.1 6379 1
# 哨兵从master节点宕机后,等待多少时间(毫秒),认定master不可用。
# 默认30s,这里为了测试,改成10s
sentinel down-after-milliseconds mymaster 10000


#高配版
###普通配置
port 26379
# 保护模式关闭,这样其他服务起就可以访问此台redis
protected-mode no
# 哨兵模式是否后台启动,默认no,改为yes
daemonize yes
pidfile /var/run/redis-sentinel.pid
# log日志保存位置
logfile /usr/local/redis/sentinel/redis-sentinel.log
# 工作目录
dir /usr/local/redis/sentinel
 
###核心配置
# 核心配置。
# 第三个参数:哨兵名字,可自行修改。(若修改了,那后面涉及到的都得同步) 
# 第四个参数:master主机ip地址
# 第五个参数:redis端口号
# 第六个参数:哨兵的数量。比如2表示,当至少有2个哨兵发现master的redis挂了,
#               那么就将此master标记为宕机节点。
#               这个时候就会进行故障的转移,将其中的一个从节点变为master
sentinel monitor mymaster 192.168.217.151 6379 2

# master中redis的密码   如果有密码但是不写  哨兵监控不到
sentinel auth-pass mymaster 123456

# 哨兵从master节点宕机后,等待多少时间(毫秒),认定master不可用。
# 默认30s,这里为了测试,改成10s
sentinel down-after-milliseconds mymaster 10000

# 当替换主节点后,剩余从节点重新和新master做同步的并行数量,默认为 1
sentinel parallel-syncs mymaster 1

# 主备切换的时间,若在3分钟内没有切换成功,换另一个从节点切换
sentinel failover-timeout mymaster 180000

9.4、启动哨兵

/usr/local/bin
./redis-sentinel /myredis/sentinel.conf 
[root@iZ2ze2rikqlh3ql1n2cw61Z myredis]# /usr/local/bin/redis-sentinel /myredis/sentinel.conf 
416739:X 19 Oct 2022 21:56:09.750 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
416739:X 19 Oct 2022 21:56:09.750 # Redis version=6.2.7, bits=64, commit=00000000, modified=0, pid=416739, just started
416739:X 19 Oct 2022 21:56:09.750 # Configuration loaded
416739:X 19 Oct 2022 21:56:09.750 * monotonic clock: POSIX clock_gettime
416739:X 19 Oct 2022 21:56:09.750 # A key '__redis__compare_helper' was added to Lua globals which is not on the globals allow list nor listed on the deny list.
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 6.2.7 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 416739
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

416739:X 19 Oct 2022 21:56:09.754 # Sentinel ID is a58b60c40d7efd988a548f5f23995a15cedf8e16
416739:X 19 Oct 2022 21:56:09.754 # +monitor master mymaster 127.0.0.1 6379 quorum 1
416739:X 19 Oct 2022 21:56:09.754 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
416739:X 19 Oct 2022 21:56:09.757 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379

9.5、当主机挂掉,从机中选举产生新的主机

测试6379 shutdown

哪个从机会被选举为主机呢?根据优先级别:slave-priority

原主机重启后会变为从机。

9.6、复制延时(缺点)

由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。

9.3、故障恢复

新主登基:从所有的从服务挑选一个作为主服务,将其变为主服务,选择的条件依次是:

选择优先级靠前的(slave-priority 100,值越小优先级越高)

选择偏移量最大的(看所有从服务器中谁同步主服务器的数据量最接近就选谁)

选择runid最小的从服务(如果所有从服务器同步的值的数量一样多,那么就用这个方式选择)

群仆俯首:挑选出新的主服务之后sentinel向原主服务的从服务发送slaveof新主服务的命令,复制新的master

旧主俯首:当已下线的服务重新上线的时候,sentinel会向其发送slaveof命令,让其称为新主的从

优先级在redis.conf中默认:slave-priority 100(R670),值越小优先级越高

偏移量是指获得原主机数据最全的

每个redis实例启动后都会随机生成一个40位的runid

以上就是有关redis的主从复制以及哨兵模式的相关个人总结。亲测有效!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值