redis主从复制及切换

现在我的系统用redis做缓存服务器,redis是一个单点,当一台机器岩机的时候,redis的服务完全停止,这时就会影响其他服务的正常运行,所以我们要做的是redis主从复制及主动切换,这就是redis集群的概念

 

首先介绍下怎么样做redis主备切换,需要用到redis的sentinel做一个主从切换的集群管理。redis主从服务(1个master,多个salve),然后通过redis官方的监控工具Sentinel(哨兵),对每个节点进行监控,实现自动故障迁移,即master死掉,将salve升级为master。基本原理是:心跳机制+投票裁决。

 

Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:

监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。

提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过API 向管理员或者其他应用程序发送通知。

自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时,Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreementprotocols)来决定是否执行自动故障迁移,以及选择哪个从服务器作为新的主服务器。

虽然 Redis Sentinel 释出为一个单独的可执行文件 redis-sentinel, 但实际上它只是一个运行在特殊模式下的 Redis 服务器, 你可以在启动一个普通 Redis 服务器时通过给定 --sentinel 选项来启动Redis Sentinel 。

 环境准备:10.161.47.168 6380 主

            10.161.47.168 6381 从

      Sentinel :10.161.47.168 26380

备注:若是3台不同的机器,首先要保证内网端口互通。

主从复制配置

主redis配置文件可以不动

从redis配置文件需要添加:slaveof 10.161.47.1686380
   若master配置了密码则slave也要配置相应的密码参数否则无法进行正常复制的,添加:masterauth mstpassword 
 验证一:redis-cli -h 10.161.47.168 -p 6380 info replication
         redis-cli -h 10.161.47.168 -p 6381 info replication
看到如下图显示,说明配置成功:
# redis-cli -h 10.161.47.168 -p 6380 info replication
# Replication
role:slave
master_host:10.161.47.168
master_port:6381
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:13544
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
 
# redis-cli -h 10.161.47.168 -p 6381 info replication   
# Replication
role:master
connected_slaves:1
slave0:ip=10.161.47.168,port=6380,state=online,offset=14841,lag=0
master_repl_offset:14841
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:14840
                              

  验证二:可以在主redis插入数据测试,看看从redis可不可以查看

 

主备切换

 需要配置sentinel ,在redis的安装目录下有sentinel的配置文件,我们备份一下,在进行编辑。

vim /etc/redis/sentinel_26380.conf

 

##redis-0

##sentinel实例之间的通讯端口

port 26380
daemonize yes  守护进程启动
logfile "/var/log/redis/sentinel.log"
sentinel monitor master1 10.161.47.168 6380 2
      #配置master名、ip、port、需要多少个sentinel才能判断[客观下线
sentinel down-after-milliseconds master1 30000      #配置sentinel向master发出ping,最大响应时间、超过则认为主观下线
sentinel parallel-syncs master1 1                   
#配置在进行故障转移时,运行多少个slave进行数据备份同步(越少速度越快)
sentinel failover-timeout master1 180000            #配置当出现failover时下一个sentinel与上一个sentinel对[同一个master监测的时间间隔](最后设置为客观下线)
 

#master2  可以添加多组主从的redis监听

特殊配置:

min-slaves-to-write 1

min-slaves-max-lag 10

通过上面的配置,当一个redis是master时,如果它不能向至少一个slave写数据(上面的min-slaves-to-write指定了slave的数量),它将会拒绝接受客户端的写请求。由于复制是异步的,master无法向slave写数据意味着slave要么断开连接了,要么不在指定时间内向master发送同步数据的请求了(上面的min-slaves-max-lag指定了这个时间)。

配置文件配置好之后,启动 redis-sentinel /etc/redis/sentinel_26380.conf

查看日志:+slave slave 10.161.47.168:6381 10.161.47.168 6381 @ master-210.161.47.168 6380

  验证主备切换:

  1首先查看redis-cli -p 26380 info Sentinel

  显示:# Sentinel

sentinel_masters:1

sentinel_tilt:0

sentinel_running_scripts:0

sentinel_scripts_queue_length:0

master0:name=master-2,status=ok,address=10.161.47.168:6380,slaves=1,sentinels=1

可以看到6380端口为master。

现在关闭master节点,即kill掉master进程

2 查看sentinel服务,发现端口6381升级为master节点,这时sentinel完成故障自动切换。

redis-cli -p 26380 info Sentinel

# Sentinel

sentinel_masters:1

sentinel_tilt:0

sentinel_running_scripts:0

sentinel_scripts_queue_length:0

master0:name=master-2,status=ok,address=10.161.47.168:6381,slaves=1,sentinels=1

3、 启动刚才被shutdown的6380服务并查看,发现它变成了slave服务

   redis-cli -h 10.161.47.168 -p 6380 inforeplication

# Replication

role:slave

master_host:10.161.47.168

master_port:6381

master_link_status:up

master_last_io_seconds_ago:2

master_sync_in_progress:0

slave_repl_offset:13544

slave_priority:100

slave_read_only:1

connected_slaves:0

master_repl_offset:0

repl_backlog_active:0

repl_backlog_size:1048576

repl_backlog_first_byte_offset:0

repl_backlog_histlen:0

 

到此主从复制切换就做好了。

 

每个Sentinel实例都执行的定时任务

1. 每个Sentinel 以每秒钟一次的频率向它所知的主服务器、从服务器以及其他 Sentinel 实例发送一个 PING 命令。

2. 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值,那么这个实例会被 Sentinel 标记为主观下线。 一个有效回复可以是:+PONG 、 -LOADING 或者-MASTERDOWN 。

3. 如果一个主服务器被标记为主观下线, 那么正在监视这个主服务器的所有Sentinel 要以每秒一次的频率确认主服务器的确进入了主观下线状态。

4. 如果一个主服务器被标记为主观下线, 并且有足够数量的 Sentinel (至少要达到配置文件指定的数量)在指定的时间范围内同意这一判断,那么这个主服务器被标记为客观下线。

5. 在一般情况下, 每个 Sentinel 会以每10 秒一次的频率向它已知的所有主服务器和从服务器发送 INFO 命令。 当一个主服务器被 Sentinel 标记为客观下线时, Sentinel 向下线主服务器的所有从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。

6. 当没有足够数量的 Sentinel 同意主服务器已经下线, 主服务器的客观下线状态就会被移除。当主服务器重新向 Sentinel 的 PING 命令返回有效回复时,主服务器的主管下线状态就会被移除。

 

服务日志说明

Sentinel服务启动后会打印一些相关日志信息,以下是相关日志特殊字符说明:

+reset-master <instance details> :主服务器已被重置。

+slave <instance details> :一个新的从服务器已经被 Sentinel 识别并关联。

+failover-state-reconf-slaves <instancedetails> :故障转移状态切换到了reconf-slaves 状态。

+failover-detected <instance details>:另一个 Sentinel 开始了一次故障转移操作,或者一个从服务器转换成了主服务器。

+slave-reconf-sent <instance details>:领头(leader)的 Sentinel 向实例发送了 SLAVEOF 命令,为实例设置新的主服务器。

+slave-reconf-inprog <instancedetails> :实例正在将自己设置为指定主服务器的从服务器,但相应的同步过程仍未完成。

+slave-reconf-done <instance details>:从服务器已经成功完成对新主服务器的同步。

-dup-sentinel <instance details> :对给定主服务器进行监视的一个或多个 Sentinel 已经因为重复出现而被移除 —— 当 Sentinel 实例重启的时候,就会出现这种情况。

+sentinel <instance details> :一个监视给定主服务器的新 Sentinel 已经被识别并添加。

+sdown <instance details> :给定的实例现在处于主观下线状态。

-sdown <instance details> :给定的实例已经不再处于主观下线状态。

+odown <instance details> :给定的实例现在处于客观下线状态。

-odown <instance details> :给定的实例已经不再处于客观下线状态。

+new-epoch <instance details> :当前的纪元(epoch)已经被更新。

+try-failover <instance details> :一个新的故障迁移操作正在执行中,等待被大多数 Sentinel 选中(waiting to be elected bythemajority)。

+elected-leader <instance details> :赢得指定纪元的选举,可以进行故障迁移操作了。

+failover-state-select-slave <instancedetails> :故障转移操作现在处于select-slave 状态 ——Sentinel 正在寻找可以升级为主服务器的从服务器。

no-good-slave <instance details> :Sentinel操作未能找到适合进行升级的从服务器。Sentinel 会在一段时间之后再次尝试寻找合适的从服务器来进行升级,又或者直接放弃执行故障转移操作。

selected-slave <instance details> :Sentinel 顺利找到适合进行升级的从服务器。

failover-state-send-slaveof-noone<instance details> :Sentinel 正在将指定的从服务器升级为主服务器,等待升级功能完成。

failover-end-for-timeout <instancedetails> :故障转移因为超时而中止,不过最终所有从服务器都会开始复制新的主服务器(slaves willeventually be configured to replicate with the newmaster anyway)。

failover-end <instance details> :故障转移操作顺利完成。所有从服务器都开始复制新的主服务器了。

+switch-master <master name><oldip> <oldport><newip> <newport> :配置变更,主服务器的IP 和地址已经改变。 这是绝大多数外部用户都关心的信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值