一、概念
1、主从复制的原理
(1)从服务器向主服务器发送SYNC命令
(2)主服务器收到SYNC命令后,执行BGSAVE命令,在后台生成RDB文件,使用缓冲区记录从现在开始执行的所有的写命令。
(3)当主服务器的BGSAVE命令执行完毕后,主服务器后将BGSAVE命令生成的RDB文件发送给从服务器,从服务器接收并载入这个RDB文件,将自己的数据库状态更新至主服务器执行BGSAVE命令时的数据库状态。
(4)主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行这些写命令,将自己的数据库状态更新至主服务器数据库当前所处的状态。
2、一般规则
从数据库一般是只读的,并接受主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。
3、主服务从服务的区别
一个服务器去复制另一个服务器的数据。被复制的服务器称为Master主服务,对主服务器进行复制的服务器称为Slave从服务器。
4、主从复制的优点
(1)为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成,来进行读写分离;
(2)Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。
(3)Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求。
(4)Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据。
5、主从复制的缺点
(1)Redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
(2)主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
(3)Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
二、搭建主从复制集群
1、主从复制主要有三种方式
(1)在配置文件中加入slaveof{masterHost}{masterPort}随着redis的启动生效。
(2)在redis-server启动命令之后加入--slaveof{masterHost}{masterPort}生效。
(3)直接使用命令:slaveof{masterHost}{masterPort}生效。
说明:本文操作使用第一种配置方式
2、服务节点说明
master(192.168.xxx.21): 主服务
slaves1(192.168.xxx.22): 从服务
slaves2(192.168.xxx.23) : 从服务
3、在master上搭建redis,并更改redis.conf一些主要配置
daemonize yes
port 6379
bind 192.168.xxx.21
requirepass 123456
4、将在master上搭建好的redis,复制到slaves1相同位置,并更改redis.conf主要配置
daemonize yes
port 6379
bind 192.168.xxx.22
requirepass 123456
#连接主机和端口号
slaveof master 6379
#设置连接的主机密码
masterauth 123456
5、将在master上搭建好的redis,复制到slaves2相同位置,并更改redis.conf主要配置
daemonize yes
port 6379
bind 192.168.xxx.23
requirepass 123456
#连接主机和端口号
slaveof master 6379
#设置连接的主机密码
masterauth 123456
三、测试
1、连接主服务并设置值
[root@master bin]# ./redis-server ./redis.conf
[root@master bin]# netstat -lnp | grep 6379
tcp 0 0 192.168.xxx.21:6379 0.0.0.0:* LISTEN 4065/./redis-server
[root@master bin]# ./redis-cli -h 192.168.xxx.21 -a 123456
192.168.xxx.21:6379> DBSIZE
(integer) 0
192.168.xxx.21:6379> set name zhangsanfeng
OK
192.168.xxx.21:6379> select 2
OK
192.168.xxx.21:6379[2]> set name zhangsan
OK
192.168.xxx.21:6379[2]>
2、连接从服务slaves1验证
[root@slaves1 bin]# netstat -lnp | grep 6379
[root@slaves1 bin]# ./redis-server ./redis.conf
[root@slaves1 bin]# ./redis-cli -h 192.168.xxx.22 -a 123456
192.168.xxx.22:6379> DBSIZE
(integer) 0
192.168.xxx.22:6379> DBSIZE
(integer) 1
192.168.xxx.22:6379> get name
"zhangsanfeng"
192.168.xxx.22:6379> select 2
OK
192.168.xxx.22:6379[2]> DBSIZE
(integer) 1
192.168.xxx.22:6379[2]> get name
"zhangsan"
192.168.xxx.22:6379[2]>
3、 连接从服务slaves2验证
[root@slaves2 bin]# netstat -lnp | grep 6379
[root@slaves2 bin]# ./redis-server ./redis.conf
[root@slaves2 bin]# ./redis-cli -h 192.168.xxx.23 -a 123456
192.168.xxx.23:6379> DBSIZE
(integer) 0
192.168.xxx.23:6379> DBSIZE
(integer) 1
192.168.xxx.23:6379> get name
"zhangsanfeng"
192.168.xxx.23:6379> select 2
OK
192.168.xxx.23:6379[2]> DBSIZE
(integer) 1
192.168.xxx.23:6379[2]> get name
"zhangsan"
192.168.xxx.23:6379[2]>