前言

环境: centos7.9

介绍

我们知道redis一共有3中集群模式,1、主从模式。2、哨兵模式。3、Cluster模式。
主从模式是redis中最为简单的redis集群模式,其主要工主从复制,这类似于mysql的主从复制;redis主数据库可以执行读写功能,而redis从数据库只能执行读功能,当redis主数据库数据发生变化,会自动同步到从数据库,主数据库为master,从数据库为slave,一个master可以有多个slave,一个slave只能有一个master,slave挂了,重新启动会从master同步数据,master挂了,服务器只能进行读功能,不能执行写功能,直到master重新启动同步数据后,才能提供写服务。

主从复制原理

redis 的主从复制分为两部分操作:同步(SYNC)和 命令传播(command propagate)

同步(SYNC)用来将从服务器的状态 更新到 和主服务器 一致。简单来说就是从服务器主动获取 主服务器的数据。保持数据一致。具体实现是,主服
务器收到SYNC命令后,生成RDB快照文件,然后发送给从服务器。
命令传播 (command propagate)用于在主服务器数据被修改后,主从不一致,为了让从服务器保持和主服务器状态一致,而做的命令传播。简单来说
就是主服务器收到客户端修改数据命令后,数据库数据发生变化,同时将命令缓存起来,然后将缓存命令发送到从服务器,从服务器通过载入缓存命令来
达到主从数据一致。这就是所谓的命令传播。
为什么需要有同步和命令传播的两种复制操作: 当只有同步操作时候,那么在从服务器向主服务器发送SYNC命令时候,主服务器在生成RDB快照文件时
候,仍然会收到客户端的命令修改数据状态,这部分数据如果不能传达给从服务器,那么就会出现主从数据不一致的现象。这时候就出现了命令传播,主服
务器收到从服务器的SYNC命令后,生成RDB快照文件同时,将此段时间内收到的命令缓存起来,然后使用命令传播的操作发送从服务器。来达到主从数据一
致。

主从复制原理图

在这里插入图片描述

redis主从复制优缺点

优点:

1、主从复制结构具有读写分离,提高效率、数据备份,提供多个副本等优点;
2、主从复制期间master和slave都是非阻塞方式,仍然可用。

缺点:

1、master宕机期间,需要手动切换主机,同时会有部分数据不能及时同步从服务器,造成数据不一致(需要人工手动介入)
2、slave宕机后,多个slave恢复后,大量的SYNC同步会造成master IO压力倍增(可以手动规避启动时间)
3、主从模式不具备自动容错和恢复功能,主节点故障,集群则无法进行工作,可用性比较低。

搭建redis主从

首先:搭建redis主数据库,即master,搭建方法请参考https://blog.csdn.net/MssGuo/article/details/114283015,这里不在赘诉。
redis.conf配置文件要注意2个参数:

#表示监听本机哪个网卡地址,因为我们要让slave能连接master,所以让redis监听在一个外部网卡而不仅仅是127.0.0.1
bind 192.168.118.133
#设置密码
requirepass 123456  	

设置slave从服务器:
同理,正常搭建一个redis实例之后,修改redis.conf配置文件。主要修改下面这些参数:

vim redis.conf						#编辑配置文件
/REPLICATION						#在命令行模式下搜索REPLICATION,这段就是配置主从复制的,5.0之前的版本叫SLAVE
replicaof 192.168.118.133 6379		#找到replicaof参数,这个是配置master IP和端口的,5.0之前的版本叫slaveof
masterauth 123456					#如果master设置了密码,还要配置master的密码,这样slave才能连的上master
replica-read-only yes				#slave只读,默认就是只读,保持默认即可,主从模式下master读写,slave只读

验证

master和slave都配置完成之后,重启redis。下面进行验证:

#登陆master进行查看
[root@node1 bin]# ./redis-cli  -h 192.168.118.133 -p 6379
192.168.118.133:6379> info Replication									#查看Replication这一段
# Replication
role:master																#角色为master
connected_slaves:1														#表示已有一个slave连接
slave0:ip=192.168.118.132,port=6379,state=online,offset=126,lag=1		#slave的信息
master_failover_state:no-failover
master_replid:1a577c4192b8d65f87d299f7e8c7eba53b821cb3
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:126
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:126
192.168.118.133:6379> 
192.168.118.133:6379> set name "xiaoming"								#插入一个数据,等下看看slave有没有成功同步
OK
192.168.118.133:6379> get name
"xiaoming"
192.168.118.133:6379> 
#登陆slave
[root@node1 bin]# ./redis-cli  -h 192.168.118.132 -p 6379			
192.168.118.132:6379> auth 123456
OK
192.168.118.132:6379> info Replication								#查看Replication这一段
# Replication
role:slave															#角色为slave
master_host:192.168.118.133											#对应的master主是192.168.118.133
master_port:6379													#对应的master主的端口
master_link_status:up												#主的状态是up表示存活,down表示挂了
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_read_repl_offset:494
slave_repl_offset:494
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:1a577c4192b8d65f87d299f7e8c7eba53b821cb3
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:494
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:494
192.168.118.132:6379> keys *										#查看有哪些键
1) "name"															#有一个叫name的键
192.168.118.132:6379> get name										#查看name键数据,与主的一样,说明已经正常从master同步过来了
"xiaoming"
192.168.118.132:6379> 

192.168.118.132:6379> set sex "man"		#往从写入数据测试,报错了,因为从是只读的,replica-read-only yes参数设置了从只读
(error) READONLY You can't write against a read only replica.
192.168.118.132:6379> 

主挂了,怎么办

普通的主从模式,当主数据库崩溃时,需要手动切换从数据库成为主数据库:
1、在从数据库中使用SLAVE NO ONE命令将从数据库提升成主数据继续服务。
2、启动之前崩溃的主数据库,然后使用SLAVEOF命令将其设置成新的主数据库的从数据库,即可同步数据。

注意:以上2点说的在命令行输入命令切换角色都是临时生效,redis重启之后还是会去读redi.conf配置文件,所以修改redis.conf文件才能使主从角色永久生效。

1、修复master,等master修复成功后,主从复制集群就能正常了

192.168.118.133:6379> shutdown save					#关掉master,模拟master挂掉
not connected> 

192.168.118.132:6379> info Replication
# Replication
role:slave
master_host:192.168.118.133
master_port:6379
master_link_status:down								#备显示master已down
......
192.168.118.132:6379> 

#此时,修复master节点后重新启动master,slave就会继续复制master数据,主从恢复正常

2、临时手动指定slave为新的master角色继续提供服务(不建议)

注:对一个从redis节点服务器执行命令 slaveof no one 将使得这个从redis节点服务器关闭复制功能,从redis节点服务器转变回主redis节点服务
器,原来同步所得的数据集不会被丢弃。
注意:命令 slaveof no one只是临时生效,需要修改redis.conf配置文件将slave的配置取消掉

192.168.118.132:6379> slaveof no one								#关闭主从
192.168.118.132:6379> info Replication
# Replication
role:master															#角色变回主了
connected_slaves:0
master_failover_state:no-failover
master_replid:bf72cbaba7ec480e4d1c518234d3c0c15eb35b54
master_replid2:1a577c4192b8d65f87d299f7e8c7eba53b821cb3
master_repl_offset:6934
second_repl_offset:6935
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:6934
192.168.118.132:6379> 

#注意:在命令行配置slaveof no one只是让从服务器临时关闭复制功能,从redis节点服务器转变回主redis节点服务器,重启redis之后又变回slave
# 了,所以需要修改redis.conf配置文件将slave的配置删掉。
#修复原来的主,修改redis.conf配置文件,指定自己是从,配置主的ip和端口,以及主的密码等参数

总结

1、redis的主从复制很简单,配置好master之后,下面这样简单配置slave即可:

vim redis.conf						#编辑配置文件
/REPLICATION						#在命令行模式下搜索REPLICATION,这段就是配置主从复制的,5.0之前的版本叫SLAVE
replicaof 192.168.118.133 6379		#找到replicaof参数,这个是配置master IP和端口的,5.0之前的版本叫slaveof
masterauth 123456					#如果master设置了密码,还要配置master的密码,这样slave才能连的上master
replica-read-only yes				#slave只读,默认就是只读,保持默认即可,主从模式下master读写,slave只读

2、一个master可以带多个slave,master是读写,slave只读;
3、当master挂掉之后,集群就挂了,因为slave并不能自动提升为master。
4、主从复制原理:

redis 的复制分为两部分操作:同步(SYNC)和 命令传播(command propagate);
同步(SYNC)用来将从服务器的状态 更新到 和主服务器 一致。白话文解释就是从服务器主动获取 主服务器的数据。保持数据一致。具体实现是,主服
务器收到SYNC命令后,生成RDB快照文件,然后发送给从服务器。
命令传播 (command propagate)用于在主服务器数据被修改后,主从不一致,为了让从服务器保持和主服务器状态一致,而做的命令传播。白话文解
释就是主服务器收到客户端修改数据命令后,数据库数据发生变化,同时将命令缓存起来,然后将缓存命令发送到从服务器,从服务器通过载入缓存命令来
达到主从数据一致。这就是所谓的命令传播。
为什么需要有同步和命令传播的两种复制操作: 当只有同步操作时候,那么在从服务器向主服务器发送SYNC命令时候,主服务器在生成RDB快照文件时
候,仍然会收到客户端的命令修改数据状态,这部分数据如果不能传达给从服务器,那么就会出现主从数据不一致的现象。这时候就出现了命令传播,主服
务器收到从服务器的SYNC命令后,生成RDB快照文件同时,将此段时间内收到的命令缓存起来,然后使用命令传播的操作发送从服务器。来达到主从数据一
致。

5、redis主从复制,当master挂掉,整个集群就挂掉了,slave不会主动变成主,只有当master修复重启之后,主从复制又能正常了;
可以手动进行角色切换,即在master挂掉期间,临时手动指定slave为新的master角色继续提供服务,但不太建议,还不如修复原来的master。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐