redis主从复制和sentinel

字数 1201阅读 259

redis 主从复制

一. 复制

Redis 的复制(replication)功能允许用户根据一个 Redis服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master),而通过复制创建出来的服务器复制品则为从服务器(slave)。主从服务器两者拥有相同的数据库数据:只要主从服务器之间的网络连接正常,主服务器就会一直将发生在自己身上的数据更新同步给从服务器,从而一直保证主从服务器的数据相同。


主从复制的结构.png
二. 目的
  1. 实现读写分离,扩展系统处理读请求的能力,同时分担master(主服务)的压力
  2. 主从备份,防止宕机,实现备份,如果master down掉了,后续可以补上来,防止数据丢失
  3. 任务分离,slave实现快照持久化,master实现aof日志持久化,分担备份压力
三. 主从通信过程
  1. Slave接入master之后申请同步
  2. Master通过rdb同步
  3. Slave同步的过程中,产生的变化用aof同步
  4. 之后所有的同步会使用“replicationFeedSlaves”来同步
四. 主从复制的环境搭建:基于windows

3台机器,1主2从
第一步 Master配置

  1. 关闭rdb(有slave帮忙分担这个工作)
  2. 开启/关闭aof:可要可不要,主服务打开了aof,slave上就要关闭aof。同理rdb也是一样的。
  3. 配置密码(可以选择):requrepass password;如果密码配置成功后,需要操作master需要使用use password 验证通过,slave的conf中也要配置 masterauth <master-password>

第二步 Slave1配置

  1. Copy conf文件:文件名中加入slave的端口号8380
  2. 修改pidfile:指定conf的地址(windows中没有参数,windows中需要在启动redis server的时候指定conf文件)
  3. 修改port 6380
  4. 开启rdb(很耗IO)
  5. 关闭aof(为什么不在salve上开启,是因为相对于master,slave上有延迟)
  6. 设置slaveof:slaveof localhost 6379:配置主服务器
  7. 配置是否只读:slave-read-only yes

第三步 slave2配置

  1. Copy conf文件:文件名中加入slave的端口号8381
  2. 修改pidfile:指定conf的地址(windows中没有该参数)
  3. 修改port 8381
  4. 关闭rdb(很耗IO)
  5. 关闭aof(和slave1一样的原因)
  6. 设置slaveof:slaveof localhost 6379
  7. 配置是否只读:slave-read-only yes
  8. 配置密码: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失效,才正式失效

【注意】

  1. 一个sentinel可以监控任意多个服务器,以及被监视的主服务器属下的所有从服务器
  2. 同一个master可以被多个sentinel监控

实例步骤

  1. 1主1从1哨兵
  2. 配置sentinel的conf:新建conf文件,配置相关参数
  3. 启动master,slave
  4. 启动sentinel
  5. 让master下线,使用info查询主从的关系是否发生变化
  6. 启动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 服务名

推荐阅读更多精彩内容