本文介绍Redis集群。
1. 概述
我们知道,单台机器的性能是有限,随着用户越来越多,因此需要多台服务器联合提供服务。对于数据库也是,需要搭建集群。针对Redis服务器,一般情况下主要用于读数据,另外,针对读写分离,搭建的集群主要分为读服务器(slave,从服务器,大量)和写服务器(master,主服务器,少量),即主写从读。之后,服务器之间会同步数据,不会影响为客户提供服务。
1.1 主从复制
主服务器更新后根据配置和策略,自动同步到从服务器,Master以写为主,Slave以读为主。
1.2 案例:一主二从
即搭建三台Redis服务。为了简单起见,这里在一台主机上以不同的配置信息启动三次(如监听不同的端口号等等)
提供三分Redis配置文件(三份文件不同的有:端口号、pidfile、日志文件、持久化文件),并启动redis。
登录客户端,并分别查看三台Redis服务在集群中的主从角色:
info replication
。(注意,此时还没有设置集群,但是会默认有角色。)如下图所示,可以看到,三台服务都是master,没有从机,都是可读可写。并且三台Redis互相独立,互不影响。在其中一台服务上写数据,其他两台不会有数据。设置主从关系。6379做master可读可写(一般情况下只用写),6380、6381做slave只读。
在6380、6381上执行:
slaveof ip port
,即本服务从属于指定ip上的指定port上的服务。6379主机不需要做任何修改。(其实从机也可以有从机。即一台主机可以有两个角色,既是主机,也是从机。但是只要有从机角色,就不能写数据。)为了方便观察,此时先在6379上设置一条数据,之后再执行上述命令。可以看到,执行命令后,三台主机的主从角色发生了变化,并且数据进行了同步。
一旦主从关系确定,会自动把主机上已有的数据同步复制到从库,这种全部复制称为全量复制。之后,在6379上写数据,会自动将新添加的数据复制到从服务器上面。这种复制称为增量复制。
读写分离。
此时再从服务器上写数据,可以看到提示,此主机已经是readOnly了,即从服务器只读不写,而主服务器可写可读(一般用于写)。
主机宕机
作为主机,肯定会存在宕机的风险。那么master主服务器宕机了,从服务器是什么情况呢?经测试,从服务器处于原地待命的状况,即只读不写,且数据不再更新了。可以认为仍然提供读服务。
主机恢复
master主服务恢复后。三台服务的主从关系仍然和正常保持一样,一切恢复正常。
从机宕机
从机宕机后,查看主从信息,仅仅是主机中的slave数量发生了变化,其他从机不变。
从机恢复
从机恢复后,从机变成了独立的master主机,需要重新设置主从关系才能恢复原状。
主机宕机,从机上位
前面提到过,主机宕机了,此时集群相当于不提供写服务了,这是不合理的。可以设置从机上位,临时作为master主服务。
- 从机断开原来的主从关系:
slaveof no one
- 重新设置其他从机的主从关系,设置从属于上述主机。
注意,因为主机宕机后,整个集群的数据都不会再写入了,所以任何从机上的数据都是全部数据,所以任何一台从机做主机均可。
- 从机断开原来的主从关系:
主机修好,作为从机隶属于上面上位的主机
直接在主机上配置从属关系即可。
1.3 总结
一台主机可以配置多台从机,一台从机又可以配置多台从机,从而形成一个庞大的集群架构。主要是为了减轻单台主机的压力。缺点是增加了服务间的延迟,数据备份较大,硬盘开销较大。
1.4 复制原理
1.4.1 全量复制
slave启动成功连接到master后会发送一个sync命令;Master接收到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,master将传送整个数据文件到slave,以完成一次完全同步;slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
只要是重新连接master,一次全量复制将被自动执行。
1.4.2 增量复制
Master将所有新收集到的修改命令依次传给slave,完成同步。
1.5 Redis哨兵模式
上面的集群中主机宕机之后其实是存在问题的。首先是不知道什么时候宕机,不可能运维人员时刻监控;另外,宕机之后,不可能把服务停掉,用户那边可不管你宕不宕机,只看你能不能提供服务,而手动重新设置主从关系则比较麻烦。因此,Redis提供了哨兵模式。该哨兵可监控指定的集群,并自动化重选从机升级为主机,重新布置主从关系。
步骤如下所示:
搭建集群(步骤和上面一样)
提供哨兵配置文件(sentinel.conf)
内容为:
sentinel monitor dc-redis ip port 1
。sentinel为命令,monitor表示监控监控的意思,dc-redis为哨兵名称(自定义)。后面依次表示哨兵监控主服务的ip地址、端口号、得到哨兵的投票数(当哨兵投票数大于或等于此数时切换主从关系,当监控的主机宕机后,程序会自动启动,对所有从机进行投票,当从机的投票数最先达到这个数的从机,上位为主机)。输入Linux命令:
redis-sentinel 哨兵配置文件名
。
主机宕机后,可发现哨兵自动对从机投票,并上位从机。另外,如果原来主机恢复后,哨兵自动将其从属于新主机。
启动命令后的界面如下所示,可看到当前的主机以及从机:
主机宕机后,发生如下所示,可以看到,6381端口服务称为新的主机:
原始主机恢复后,哨兵将其作为从机隶属于新主机。
1.6 小节
Redis的主从复制最大的缺点就是延迟,主机负责写,从机负责备份,这个过程有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重。并且从机数量的增加也会使这个问题更加严重。
2. 备注
参考B站《动力节点》。