尽管Redis的性能很好,但是有时候依旧满足不了应用的需要,比如过多的用户进入主页,导致Redis被频繁访问,此时就存在大量的读操作。
对于一些热门网站的某个时刻(比如促销商品的时候)每秒成千上万的请求是司空见惯的,这个时候大量的读操作就会到达Redis服务器,触发许许多多的操作,显然单靠一台Redis服务器是完全不够用的。
一些服务网站对安全性有较高的要求,当主服务器不能正常工作的时候,也需要从服务器代替原来的主服务器,作为灾备,以保证系统可以继续正常的工作。因此更多的时候我们更希望可以读/写分离,读/写分离的前提是读操作远远比写操作频繁得多,如果把数据都存放在多台服务器上那么就可以从多台服务器中读取数据,从而消除了单台服务器的压力,读/写分离的技术己经广泛用于数据库中了。
互联网系统一般是以主从架构为基础的,大概是:
※多态数据服务器中,只有一台主服务器,而主服务器只负责写入数据,不负责让外部程序读取数据。
※有多台从服务器,从服务器不写入数据,只负责同步主服务器的数据,并让外部程序读取数据。
※主服务器在写入数据后,即刻将写入数据的命令发送给从服务器,从而使得主从数据同步。
※应用程序可以随机读取一台从服务器的数据,即分摊了读数据的压力。
※从服务器不能工作时,整个系统不受影响;主服务器不能工作时,可以方便地在从服务器中选举一台当做主服务器。
主从同步机制示图:
可知,一个主服务器可以拥有多个从服务器,一个从服务器又可以拥有多个从服务器,如此下去,形成了强大的多级服务器集群架构。
主服务器用来写数据,从服务器用来读数据;
通过主从配置可以实现读/写分离;
主服务器和从服务器都是一个Redis实例(redis服务)
这个时候读数据就可以随机在从服务器上读取,当从服务器是多台的时候,那么单台服务器的压力就大大降低了,这十分有利于系统性能的提高,当主服务器出现不能工作的情况时,也可以切换为其中的一台从服务器继续让系统稳定运行,所以也有利于系统运行的安全性。当然由于Redis自身具备的特点,所以其也有实现主从同步的特殊方式。
搭建redis主服务和从服务可以在同一台虚拟机上搭建,也可以在不同的虚拟机上搭建,本人采用的后者。。
master:主服务器
slave1:从服务器
具体步骤如下:
【1】主服务器设置
查看主服务器IP地址
编辑redis配置文件#vi /etc/redis/redis.conf,绑定主服务器IP地址,不要写127.0.0.1
重启redis服务,查看redis服务,出现配置的IP地址以及默认端口号6379
【注意】启动redis客户端# ./redis-cli时,出现Connection refused问题
解决:
1.关闭防火墙 #systemctl stop firewalld #systemctl disable firewalld
2.重启redis服务,并查看redis.conf文件中是否注释掉bind 127.0.0.1
3.启动redis-cli方式不对,可使用 # ./redis-cli -h 192.168.72.134 -p 6379 如下图:
【2】从服务器设置
在从服务器slave1上,将安装好redis后,将redis.conf文件命名为slave1.conf,用作于从服务器的配置文件。
编辑slave1.conf配置文件---------#vi slave.conf
主要配置:从服务器ip和端口号、、主从复制(类似于双机备份)
这里使用的是两台CentOS7.2的虚拟机,所以ip不用动,端口号不能与主服务的端口号一致博主这里改的6378,slaveof 配置主服务的ip(也就是本地ip)端口号为6379
slave1的端口号:
slave1的IP地址:
slave1配置主服务器的ip、port:
启动从服务器:
【注意】启动redis客户端# ./slave1-cli时,出现Connection refused问题
【3】查看主/从服务器关系
master: #redis-cli -h 192.168.72.134 info Replication 命令查看master角色信息
观察可知,192.168.72.134这台机器,角色role为主服务器,与它连接的从服务器有一台,也就是192.168.72.139这台机器,而且从服务器目前状态是在线的。
slave1:#redis-cli -h 192.168.72.139 -p 6380 info Replication 命令查看slave1角色信息
观察可知,192.168.72.139这台机器,角色role为cong服务器,它的宿主机服务器192.168.72.134,port6379,开机状态。connected_slaves:0,表示这台从服务器的相连的从服务器数量0台。
【3】读/写分离测试
1)主服务器写入数据
2)从服务器查询键可以看到主服务器上写入的key1这个键,并且查询可读取到key1的值
3)从服务器使用写入数据,发现其并没有写入权限,仅仅有读的权限。
至此,一个简单的Redis主从同步示例配置完成。那么,回头看看,让我们思考一下Redis主从同步的原理。
从书上截取一张图,让我们来看一下Redis主从同步的过程原理。
【1】无论如何要先保证主服务器的开启,开启主服务器后,从服务器通过命令或者重启配置项可以同步到主服务器。
【2】当从服务器启动时,读取同步的配置,根据配置决定是否使用当前数据响应客户端,然后发送SYNC命令。当主服务器接收到同步命令的时候,就会执行bgsave命令备份数据,但是主服务器并不会拒绝客户端的读/写,而是将来自客户端的写命令写入缓冲区。从服务器未收到主服务器备份的快照文件的时候,会根据其配置决定使用现有数据响应客户端或者拒绝。
【3】当bgsave命令被主服务器执行完后,开始向从服务器发送备份文件,这个时候从服务器就会丢弃所有现有的数据,开始载入发送的快照文件。
【4】主服务器发送完备份文件后,从服务器就会执行这些写入命令。此时就会把bgsave行之后的缓存区内的写命令也发送给从服务器,从服务完成备份文件解析,就开始像往常一样,接收命令,等待命令写入。
【5】缓冲区的命令发送完成后,当主服务器执行一条写命令后,就同时往从服务器发送同步写入命令,从服务器就和主服务器保持一致了。而此时当从服务器完成主服务器发送的缓冲区命令后,就开始等待主服务器的命令了。
以上5步便是Redis主从同步的过程原理。
只是在主服务器同步到从服务器的过程中,需要备份文件,所以在配置的时候一般需要预留一些内存空间给主服务器,用以腾出空间执行备份命令。一般来说主服务器使用50%~65%的内存空间,以为主从复制留下可用的内存空间。
多从注解同步过程:
如果出现多台同步,可能会出现频繁等待和频繁操作bgsave命令的情况,导致主机在较长时间里性能不佳,这个时候我们会考虑主从链进行同步的机制,以减少这种可能。