目录
1. 主从复制,读写分离
1.1 介绍
1.2 使用命令介绍
1.3 实现
1.4全量复制和增量复制
2.哨兵模式
1. 主从复制,读写分离
1.1 介绍
指的是将一台redis服务器中的数据复制到其他redis服务器,前者称为主机,后者称为从机,并且只能从主机复制数据到从机,从机不能复制给主机;主机主要负责写操作,从机则主要负责读操作,由于在日常应用中读操作频率较高,所以这样做可以减轻服务器的负担。
其作用有:
- 数据冗余:将主机中的数据复制给从机实现了数据的热备份,是持久化之外的一种数据冗余方式。
- 故障恢复:当主机出现故障时,可以利用从机中复制的数据实现快速的恢复。
- 负载均衡:主机主要提供写服务,从机主要提供读服务,读写分离可以让从机分担主机的负载,能够大大提高服务器的并发量。
- 高可用的基础:主从复制是哨兵和集群实施的基础,所以说是高可用的基础。
1.2 使用命令介绍
- info replication
查看当前服务器的信息,role为master代表当前服务器是主机,为slave表示从机;connected_slaves表示连接的从机数。
- slaveof 主机ip 端口号
用于给从机指定主机,使用该命令后其服务器信息的role自动变为slave,如果主从机在同一机器上则主机ip为127.0.0.1;只用配置从机即可,因为默认情况下所有服务器都是主机。不过使用命令slaveof配置从机这种主从关系是暂时的,需要修改从机的配置文件中的replication板块才是永久的。具体修改项见图片。
- slaveof no one
使用该命令可以手动使从机变为主机,一般在主机断开连接时使用,随后可以手动设置其他从机连接到这个主机上。要注意的是,如果原来的主机重新启动,这些从机不会自动连接到那个主机,这就相当于臣子的谋权篡位。可以这么理解:slaveof表示从属于,所以从属于no one就是不属于任何服务器,也就是变成主机了。
1.3 实现
由于只有一台服务器,所以通过在一台服务器上开启多个redis服务器来简单实现:
可以通过复制多份配置文件来分别用于主机和从机,每份配置文件的port、pidfile、logfile、dbfilename要修改进行区分,当然不同机器上搭建集群可以不用改。使用slaveof命令来演示,当配置好主机和从机后,从机将自动禁用写操作,只能执行读操作,并且主机更新的数据会自动复制到从机中。
首先准备一个主机和两个从机的配置文件,直接使用拷贝命令 cp redis.conf redis79.conf (80和81也是这样拷贝) 把默认配置文件复制3份,一个集群最基础也是一主二从:
然后分别配置:
主机的redis79.conf:
端口配置为6379,端口号是关键,端口号不同启动的服务器才是不同的服务器。
pidfile配置,用来存放主机进程的pid。
logfile配置,这是日志文件,通过区分日志文件防止三台服务器的日志都写到一个日志文件上(因为默认都是用的标准输出)。
dbfilename配置,这是rdb持久化的文件,通过区分快照文件防止三台服务器的快照信息存放在同一个文件上(因为默认的rdb文件都是dump.rdb)。
两台从机的配置文件按照主机的配置文件修改即可,只需要将6379都改成6380或6381。
然后开启三个窗口,分别使用配置文件6379.conf、6380.conf、6381.conf启动服务器,并通过redis-cli -p 6379、redis-cli -p 6380、redis-cli -p 6381分别连接到对应的服务器:
此时使用info replication命令可以查看到该服务器的replication板块的信息,以6379服务器为例:
然后让6379和6381两个服务器使用slaveof命令将这两个服务器变成6380的从机,由于是在同一个redis服务器上进行演示,所以地址就是本机的端口号为6380的服务器,所以使用的命令是slaveof 127.0.0.1 6380。
现在再使用info replication查看这三个服务器就会发现,6379和6381两个的role都变成了slave,也就是从机,而6380中显示连接到该服务器的从机数为2:
6379:
补充:
- master_link_status即为所属主机的在线状态,up表示主机正常运行,down表示主机已断开连接,断开连接可以是手动关闭主机,也可以是主机出现问题宕机了。
- slave_read_only即该从机是否仅支持读操作,1代表是,0代表否。因为redis默认从机只能进行读操作,只有主机才能进行写操作,所以默认情况下该值为1。 那如果该服务器既是一个服务器的从机又是另一个服务器的主机呢?答案也是仅能执行读操作,因为它有从机的身份,从机默认都是仅读。
6381:
6380:
这样一主二从的简易集群就搭建好了。 下面演示手动更换主机的过程:
先使用shutdown命令关闭6380服务器,然后在6379和6381服务器使用info replication命令就会发现它们的所属主机还是本机的6380服务器,但master_link_status变成了down,说明主机已经断开连接。以6379为例:
随后对6379服务器使用slaveof no one命令使其变为主机,并手动使用命令slaveof 127.0.0.1 6379让6381服务器变成其从机:
6381:
6379:
此时让6380重新连接,再对这三个服务器使用info replication命令就会发现,6380的从机连接数变成了0,6379仍是主机,6381仍是6379的从机。
1.4全量复制和增量复制
全量复制:主机将所有的数据收集之后传输给从机,全量复制发生在从机第一次连接主机或者重新连接主机的情况。
增量复制:主机仅将修改的数据传输给从机,增量复制发生在从机正常连接且主机执行了更新操作的情况。
2.哨兵模式
这是一种自动切换主机的故障恢复模式,由多个哨兵分别监视各个服务器,当一个哨兵监测到主机断开连接时,此时称为主观下线,还需要让其他哨兵检测这个主机的状态;当其他哨兵中认为这个主机断开连接的哨兵达到一定数量时,就会判定主机已经断开连接,这时就称之为客观下线。随后由某个哨兵发起投票,从正常工作的从机中选取一个作为主机,选取主机之后会通过发布订阅模式告诉其他从机连接到新的主机上。要注意的是,如果之前的主机重新连接成功,会被归并到新主机的从机中。
具体实现:
新建一个sentinel.conf配置文件,在其中加入:
sentinel monitor 哨兵名(自己命名) 主机ip 主机端口号 num
即可监控主机,最后的num代表需要有指定数量个哨兵同意切换才能切换主机 ;随后执行命令redis-sentinel sentinel.conf 就能开启哨兵模式了。
演示:
先对三个服务器使用slaveof no one变成主机以便演示哨兵模式,然后再开启一个新的窗口用于配置哨兵并开启哨兵模式:
在新窗口使用命令vim sentinel.conf即可创建哨兵的配置文件并进行配置:
随后执行命令redis-sentinel sentinel.conf开启哨兵模式,出现以下界面表示开启成功:
再让6379和6381两个服务器连接到6380使其变为6380的从机,此时哨兵界面就会弹出信息6380服务器增加了6379和6380两个从机(可能要等一小会儿,因为哨兵是每隔一定的时间去查看有无变动):
随后对6380使用shutdown命令使其断开连接,哨兵在监测到主机6380断开连接后便会自动选择剩下从机中的其中一个作为新主机,并自动让其他从机连接到这个新主机上(同样是需要等一会儿):
从上图中的两个"+slave"可以看出哨兵自动将6379和6380两个服务器归到了6381的从机中,也就是说哨兵在转换主机时,不仅将连接到原主机的所有从机归到了新主机的从机中,也将原主机归到了新主机的从机中。
这时对6379和6381使用info replication命令就会发现6381变成了主机,6379变成了它的从机(这里需要使用exit先退出再重新使用redis-cli命令连接一下):
6379:
6381:
这里或许有点疑问,上面我们说哨兵在转换主机时也会将原主机也就是6380归到新主机的从机中,但这里为什么6381的connected_slaves是1,并且只有6379这一个从机的信息呢?
这是因为这里仅显示的是在线的从机信息,6380服务器已经被我们shutdown了,所以没有显示出来。现在重新启动6380服务器,再使用info replication命令就会发现6380变成了6381的从机,6381的从机信息也发生了改变(重新开启服务器6380后需要等待哨兵检测到之后再使用info replication命令才能查看到相应的变化,因为哨兵是在检测到6380重新开启后才会自动执行将6380归到6381的从机的操作,毕竟处于关闭状态的服务器不能执行任何操作):
最后再来讲一下哨兵模式的优缺点:
优点:
- 哨兵模式是基于主从复制的,所以主从复制的优点哨兵模式都有。
- 主从可以切换,能够自动执行故障转移(也就是自动执行选举新主机并自动让从机连接到新主机等操作),系统的可用性更好。
- 哨兵模式就是主从复制的升级,由手动变为自动,更加健壮。
缺点:
- redis不容易在线扩容,集群容量一旦达到上限,再进行在线扩容就会十分麻烦。
- 哨兵模式的配置有很多选择,配置起来较为麻烦。上面只是演示了简易的哨兵模式,所以配置的很简单,实际上配置哨兵模式有很多参数可以配置: