1、复制的工作过程:
主库会给予pingcheck方式检查从库是否在线,如果在线则直接同步数据文件至服务端,从服务端也可以主动发送同步请求到主服务端,主库如果是启动了持久化功能时,会不断的同步数据到磁盘上,主库一旦受到从库的同步请求时,主库会将内存中的数据同步给从库,从库得到以后是保存在本地文件中(磁盘),而后则把文件装载到内存中完成数据重建,链式复制也同步如此,因为主是不区分是真正的主,还是另外一个的从

1、启用slave
2、slave会向master发送同步命令,请求主库上的数据,不论从是第一次连接,还是非第一次连接,master此时都会启动一个后台的子进程将数据快照保存在数据文件中,然后把数据文件发送给slave
3、slave收到数据文件以后会保存到本地,而后把文件重载装入内存

特点:
1、一个master可以有多个slave
2、支持链式复制(一个slave也可以是其他的slave的slave)
3、master以非阻塞方式同步数据至slave(master可以同时处理多个slave的读写请求,slave端在同步数据时也可以使用非阻塞方式)

2、启动复制功能:
(1)使用用户端启用:
在slave上:
 SLAVAOF   MASTER_IP  MASTER_PORT
例子:slaveof  192.168.80.100  6379

(2)使用配置文件/etc/redis.conf(在从库操作)
slaveof   192.168.80.100   6379
 
 在从库上查看:info


操作环境:

两台仅主机模式  192.168.80.181 主     192.168.80.182 从 


主从都安装redis   redis的安装:  https://blog.51cto.com/14188767/2354762

 

在从的里面,行末模式 /replica

redis主从架构(实现读写分离)

redis主从架构(实现读写分离)

redis主从架构(实现读写分离)

主从都开启redis服务


进入主的查看

redis主从架构(实现读写分离)

redis主从架构(实现读写分离)

进入从的查看

redis主从架构(实现读写分离)


3、其他相关配置:
slave-serve-stale-data  yes   #表示当主服务器不可以用时,则无法判定数据是否过期,此时从服务器仍然接收到读请求时,yes表示仍然响应(继续使用过期数据)
slave-read-only  yes   #启用slave时,该服务器是否为只读
repl-diskless-sync  no   #是否基于diskless机制进行sync操作,一般情况下如果disk比较慢
repl-diskless-sync-delay  5  #指定在slave下同步数据到磁盘的延迟时间,默认为5秒
slave-priority  100   #指定slave优先级
#min-slaves-to-write  3  #表示在主从复制模式当中,如果给主服务器配置了多个从服务器时,如果在从服务器少于3个时,那么主服务器将拒绝接收写请求。
#min-slaves-max-lag  10   #表示从服务器与主服务器的时差不能够相差10秒以上

注:如果master使用requirepass开启了认证功能,从服务器要使用masterauth来连入服务请求使用此密码进行认证

主从复制的问题:
有一主三从,如果主服务器掉线,那么所有写操作则无法执行,为了避免此情况发生,redis引入了sentinel(哨兵)机制


操作环境:

两台仅主机模式  192.168.80.181 主     192.168.80.182  192.168.80.183  从 

主从都安装redis   redis的安装:  https://blog.51cto.com/14188767/2354762


redis主从架构(实现读写分离)

使用sentinel实现主从架构高可用
1、sentinel的工作过程:
sentinel安装在另外的主机上,sentinel主机既能监控又能提供配置功能,向sentinel指明注redis服务器即可(仅监控主服务器),sentinel可以从主服务器中获取主从信息,并分辨从节点,sentinel可以监控当前整个主从服务器架构的工作状态,一旦发现master离线的情况,sentinel会从多个从服务器中选择并提升一个从节点成为主节点,当主节点被从节点取代以后,那么ip地址则发生了,客户端所连接之前的主节点ip则不无法连接,此时可以向sentinel发起查询请求,sentinel会告知客户端新的主节点的ip,所以sentinel是redis在主从架构中实现高可用的解决方法,sentinel为了误判和单点故障,sentinel也应该组织为集群,sentinel多个节点同时监控redis主从架构,一旦有一个sentinel节点发现redis的主节点不在线时,sentinel会与其他的sentinel节点协商其实的sentinel节点是否也为同样发现redis的主节点不在线的情况,如果sentinel的多个节点都发现redis的主节点都为离线的情况,那么则判定redis主节点为离线状态,以此方式避免误判,同样也避免了单点故障

优点:
用于管理多个redis服务实现HA
监控多个redis服务节点
自动故障转移

sentinel也是一个分布式系统,可以在一个架构中运行多个sentinel进程,多个进程之间使用"流言协议"接收Redis主节点是否离线,并使用“投票协议”是否实现故障转移,选择哪一个redis的从服务器称为主服务器

 启用sentinel
 redis-sentinel 可以理解为运行有着特殊代码的redis,redis自身也可以运行为sentinel,sentinel也依赖配置文件,用于保存sentinel不断收集的状态信息
 程序:
  redis-sentinel   /path/to/file.conf
  redis-server   /path/to/file.conf --sentinel

运行sentinel的步骤:
(1)服务器自身初始化(运行redis-server 中专用于sentinel功能的代码)
(2)初始化sentinel状态,根据给定的配置文件,初始化监控的master服务器列表
(3)创建连向master的连接

sentinel专用配置文件:/etc/redis-sentinel.conf


 操作:

redis主从架构(实现读写分离)

redis主从架构(实现读写分离)


配置:
vi /etc/redis/redis.conf    #主从配置文件基本一致
69行   bind 0.0.0.0    设置监听ip地址
92行   port 6379   监听端口,默认6379端口
158行  pidfile /var/redis/run/redis.pid     指定pid文件
263行  dir /var/redis/data     指定dump的目录
171行   logfile "/var/redis/log/redis.log"   指定日志文件
136行   daemonize yes    使得redis在background运行

从服务器配置多一行内容:
slaveof 192.168.80.181 6379

vi /etc/redis/sentinel.conf
bind  0.0.0.0
daemonize yes
protected-mode no
sentinel monitor mymaster 192.168.80.181 6379 1
监控自定义的主节点
sentinel down-after-milliseconds mymaster 1000
sentinel连接主节点超时时间

sentinel failover-timeout mymaster 5000
故障转移的超时时间

redis-sentinel /etc/redis/sentinel.conf  #启用sentinel

redis主从架构(实现读写分离)

redis主从架构(实现读写分离)



cd /usr/local/redis/bin/

redis主从架构(实现读写分离)

redis-sentinel  /etc/redis/sentinel.conf //开启

redis主从架构(实现读写分离)

redis主从架构(实现读写分离)

redis主从架构(实现读写分离)


现在测试主down掉了

redis主从架构(实现读写分离)

redis主从架构(实现读写分离)

sentinel可以监控当前整个主从服务器架构的工作状态,一旦发现master离线的情况,sentinel会从多个从服务器中选择并提升一个从节点成为主节点,当主节点被从节点取代以后,那么ip地址则发生了,客户端所连接之前的主节点ip则不无法连接,此时可以向sentinel发起查询请求,sentinel会告知客户端新的主节点的ip,所以sentinel是redis在主从架构中实现高可用的解决方法,sentinel为了误判和单点故障,sentinel也应该组织为集群