redis主从复制和sentinel
redis 主从复制
一. 复制
Redis 的复制(replication)功能允许用户根据一个 Redis服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master),而通过复制创建出来的服务器复制品则为从服务器(slave)。主从服务器两者拥有相同的数据库数据:只要主从服务器之间的网络连接正常,主服务器就会一直将发生在自己身上的数据更新同步给从服务器,从而一直保证主从服务器的数据相同。
主从复制的结构.png
二. 目的
- 实现读写分离,扩展系统处理读请求的能力,同时分担master(主服务)的压力
- 主从备份,防止宕机,实现备份,如果master down掉了,后续可以补上来,防止数据丢失
- 任务分离,slave实现快照持久化,master实现aof日志持久化,分担备份压力
三. 主从通信过程
- Slave接入master之后申请同步
- Master通过rdb同步
- Slave同步的过程中,产生的变化用aof同步
- 之后所有的同步会使用“replicationFeedSlaves”来同步
四. 主从复制的环境搭建:基于windows
3台机器,1主2从
第一步 Master配置
- 关闭rdb(有slave帮忙分担这个工作)
- 开启/关闭aof:可要可不要,主服务打开了aof,slave上就要关闭aof。同理rdb也是一样的。
- 配置密码(可以选择):requrepass password;如果密码配置成功后,需要操作master需要使用use password 验证通过,slave的conf中也要配置 masterauth <master-password>
第二步 Slave1配置
- Copy conf文件:文件名中加入slave的端口号8380
- 修改pidfile:指定conf的地址(windows中没有参数,windows中需要在启动redis server的时候指定conf文件)
- 修改port 6380
- 开启rdb(很耗IO)
- 关闭aof(为什么不在salve上开启,是因为相对于master,slave上有延迟)
- 设置slaveof:slaveof localhost 6379:配置主服务器
- 配置是否只读:slave-read-only yes
第三步 slave2配置
- Copy conf文件:文件名中加入slave的端口号8381
- 修改pidfile:指定conf的地址(windows中没有该参数)
- 修改port 8381
- 关闭rdb(很耗IO)
- 关闭aof(和slave1一样的原因)
- 设置slaveof:slaveof localhost 6379
- 配置是否只读:slave-read-only yes
- 配置密码:requrepass passwd(如果master开启了密码的话)
第四步 启动redis server
# 后台启动
#注册服务:
redis-server.exe --service-install redis.conf --loglevel verbose --service-name redis6379
#启动服务:
redis-server --service-start
#停止服务:
redis-server --service-stop
#直接在cmd里面启动
redis-server.exe confpath
第五步 启动redis cli
$ redis-cli.exe -h 127.0.0.1 -p 6379
# info 命令:查看redis服务器的状态,这里主要关注Replication,可以看到角色信息,slave数量等信息
$ info
$ set name ht
$ get name
$ redis-cli.exe -h 127.0.0.1 -p 6380
$ info
# 下面有值,说明成功
$ get name
redis sentinel(哨兵)
在上面的文章中我们学习了主从复制的基础以及搭建流程,不出意外,我们都会有一个问题,就是关于主服务器下线了,怎么办?
方案1:手工修改slave的配置文件,启动后代替master
方案2:使用sentinel(哨兵),sentinel的工作是监听master与slave的状态,如果某slave失效,直接通知master去除该slave,如果master失效,按照slave优先级(可配置:slave-priority 100,数值越小有小鸡越高,0表示永远也不作为master),选取1个slave做new master,然后修改其他的slave->new master
哨兵的意思就是监控redis主,从数据库是否正常运行,主出现故障自动将从数据库转换为主数据库。
顾名思义,哨兵的作用就是监控redis系统的运行状况,它的功能包括
(1)监控主数据库和从数据库是否正常运行
(2)主数据库出现故障时自动将从服务器转换为主服务器,其他的从服务器指向新的主服务器。(故障转移)
认为master失效的条件:sentinel允许多个实例看守1个master,当N台sentinel都认为master失效,才正式失效
【注意】
- 一个sentinel可以监控任意多个服务器,以及被监视的主服务器属下的所有从服务器
- 同一个master可以被多个sentinel监控
实例步骤
- 1主1从1哨兵
- 配置sentinel的conf:新建conf文件,配置相关参数
- 启动master,slave
- 启动sentinel
- 让master下线,使用info查询主从的关系是否发生变化
- 启动5中已经下线的master
sentinel conf配置
实例:1主1从1哨兵,master 6379,slave 6380,sentinel 26379
#sentinel配置文件至少要包含一个监视配置选项和一个port端口配置,监视配置用于指定被监视主服务器的相关信息,
#1. port 26379 #不指定port,默认为26379
#2. sentinel monitor <name> <ip> <port> <quorum>
#name:用来监视主服务器设置的名字,多个监视主服务器的名字不可重复
#ip:主服务器的ip#
#port:主服务器的端口号
#quorum:确认这个主服务器已下线所需要的最少sentinel数量
#sentinel.conf
port 26379
sentinel monitor mymaster 127.0.0.1 6379 1 ,
sentinel down-after-milliseconds mymaster 30000 #可选: 多少毫秒后连接不到master认为断开
sentinel can-failover mymaster yes #可选:是否允许sentinel修改slave->master. 如为no,则只能监控,无权修改./
sentinel parallel-syncs mymaster 1 ,#可选:一次性修改几个slave指向新的new master.
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh ,#可选: 在重新配置new master,new slave过程,可以触发的脚本
redis server 运行:1主1从
redis-server.exe confpath
sentinel 运行
# cmd启动
redis-server.exe sentinel.conf --sentinel
# 作为windows服务运行
redis-server.exe --service-install sentinel.conf --sentinel --service-name sentinel26379
其它
卸载windows server命令:sc delete 服务名