Redis主从同步
Redis的性能很好,但在某些情况下还是不能满足我们的需求,比如过多的用户进入主页,导致Redis被频繁访问,此时就存在大量的读操作。在一些秒杀场景中,一瞬间有成千上万的读请求到达Redis服务器,显然单靠一台Redis服务器是不够的。一些服务网站对安全性有较高的要求,当主服务器不能工作的时候,需要从服务器代替原来的主服务器,作为灾备,以保证系统可以正常运行。因此更多的时候我们希望读写分离,读写分离的前提是读操作远远比写操作频繁的多,如果把数据存放在多台服务器上那么就可以从多台服务器上读取数据,从而消除了单台服务器的压力,读写分离的技术已经广泛用于数据库中。
一、主从同步的概念
互联网系统一般是以主从架构为基础的,所谓主从架构的大致思路是:
-
在多台数据服务器中,只有一台主服务器,而主服务器只负责写入数据,不负责让外部程序读取数据。
-
存在多台从服务器,从服务器不写入数据,只负责同步主服务器的数据,并让外部程序读取数据。
-
主服务器在写入数据后,立刻将写入数据的命令发送给从服务器,从而使得主从数据同步。
-
应用程序可以随机读取某一台从服务器的数据,这样就分摊了读数据的压力。
-
当某台从服务器不能工作的时候,整个系统将不受影响,当主服务器不能工作的时候,可以方便地从从服务器中选取一台来当主服务器。
二、Redis主从同步配置
对Redis进行主从同步的配置分为主机和从机,主机是一台,而从机可以是多台。
首先,明确主机。当你能确定哪台机子是主机的时候,关键的两个配置是dir和dbfilename选项,dir的默认值是“./”,而dbfilename的默认值是“dump.rdb”。也就是说Redis默认采用当前目录的dump.rdb文件进行同步。
其次,在明确了从机之后,进行进一步的配置所要关注的只有slaveof这个配置选项。它的配置格式如下
slaveof server port
其中,server代表主机,port代表端口。当从机Redis服务重启时,就会同步对应主机的数据。当不想让从机继续复制主机的数据时,可以在从机的的Redis命令客户端发送slaveof no one命令,这样从机就不会再接收主机服务器的数据更新了。又或者原来主服务器无法工作,而你需要复制新的主机,这时执行slaveof server port就能让从机复制另外一台主机的数据了。
在实际的Linux环境中,配置文件redis.conf中还有一个bind配置,默认为127.0.0.1,也就是只允许本机访问,把它修改为0.0.0.0,其他服务器就能访问了。
三、Redis主从同步的过程
下面是文字描述:
(1)无论何时都要先保证主服务器的开启,开启主服务器后,从服务器通过命令或者重启配置项就能同步到主服务器。
(2)当从服务器启动时,会根据配置决定是否使用当前数据响应客户端,然后发送SYNC命令。当主服务器接收到同步命令后,就使用bgsave命令备份数据,但并不会拒绝客户端的写,而是把客户端的写命令缓存在缓冲区,从服务器在没收到主服务器的快照文件前, 根据配置决定使用现有数据响应客户端或者拒绝。
(bgsave命令是一个异步命令,也就是系统将启动另一个进程,把Redis的数据保存到对应的数据文件中。它和save命令最大的不同是不会阻塞客户端的写入。默认情况下,如果Redis执行bgsave命令失败,Redis将停止接受写操作,这样能让用户知道数据不能正确持久化到磁盘。)
(3)bgsave命令被主服务器执行完后,开始向从服务器发送备份文件,这个时候从服务器会丢弃所有现有命令,开始载入发送的快照文件。
(4)当主服务器发送完备份文件后,从服务器就会执行这些写入命令,此时就会把bgsave执行之后的缓冲区内的写命令发送给从服务器,从服务器完成备份文件解析,就开始正常接收命令。
(5)缓存区的命令发送完毕后,主服务器每执行一条写命令,就向从服务器发送该条写命令,保证主从同步。
只是在主服务器同步到从服务器的过程中,需要备份文件,所以在配置的时候,一般需要预留一些内存空间给主服务器,用以腾出空间执行备份命令。
还有可能出现多个从服务器同时向主服务器发送SYNC命令
如果出现多台同步,可能会出现频繁等待和频繁操作bgsave命令的情况,导致主机在较长时间性能不佳,这个时候可以考虑主从链进行同步的机制,以减少这种可能。