keepalived实现redis主备切换

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
日志服务 SLS,月写入数据量 50GB 1个月
简介:

试验目标:

1:主redis发生故障时,从redis自动切换为主redis

2:主redis恢复正常后,自动降级为从redis

 

 

试验环境:

     redis192.168.189.138 

     redis192.168.189.131

         VIP192.168.189.123

主从redis均安装了keepalivedredisredis已配置好主从。Redis端口44444。

 

 

1:制作redis监控与主备切换脚本:

 Redis监控脚本:(监控redis是否正常)

1
2
3
4
5
6
7
8
9
10
11
12
# cat /usr/local/scripts/redis_monitor.sh
#!/bin/bash    
ALIVE=$( /home/usr/local/redis/bin/redis-cli  -h 192.168.189.138 -p 44444 PING)
if  "$ALIVE"  == "PONG"  ];  then
echo  $ALIVE
exit  0
else
echo  $ALIVE
killall -9 keepalived
service network restart
exit  1
fi


 redis_master脚本:(用于从redis切换成主redis

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# cat /usr/local/scripts/redis_master.sh
#!/bin/bash
REDISCLI= "/home/usr/local/redis/bin/redis-cli -h 192.168.189.138 -p 44444 "
LOGFILE= "/home/usr/local/redis/var/keepalived-redis-state.log"
echo  "[master]"  >>$LOGFILE
date  >> $LOGFILE
echo  "Being master...." >> $LOGFILE 2>&1
echo  "Run SLAVEOF cmd ..." >> $LOGFILE
#指定自己为131的slave
$REDISCLI SLAVEOF 192.168.189.13144444 >> $LOGFILE  2>&1
#延迟10秒,用于数据同步
sleep  10                                      
echo  "Run SLAVEOF NO ONE cmd..."  >> $LOGFILE
#解除自己的slave状态,成为master
$REDISCLI SLAVEOF NO ONE >>$LOGFILE 2>&1


 Redis_backup脚本:(用于主redis切换成从redis

1
2
3
4
5
6
7
8
9
10
# cat /usr/local/scripts/redis_backup.sh
#!/bin/bash
REDISCLI= "/home/usr/local/redis/bin/redis-cli -h 192.168.189.138 -p 44444"
LOGFILE= "/home/usr/local/redis/var/keepalived-redis-state.log"
echo  "[backup]"  >>$LOGFILE
date  >> $LOGFILE
echo  "Being slave...." >> $LOGFILE 2>&1
sleep  15
echo  "Run SLAVEOF cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF 192.168.189.13144444 >> $LOGFILE  2>&1


以上是主redis上的脚本,从redis上的脚本只要更改脚本中相应的IP

 


2:配置keepalived

 主节点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# cat /usr/local/keepalived/etc/keepalived/keepalived.conf
global_defs {
  router_id LVS_DEVEL
}
vrrp_script redis_monitor {                ------监控脚本
  script "/usr/local/scripts/redis_monitor.sh"
  interval 2 
  weight 2 
}
vrrp_instance VI_1{ 
  state BACKUP                     --------状态同备用节点一致,为BACKUP
  interface eth0
  virtual_router_id 51 
  mcast_src_ip 192.168.189.138
  nopreempt                      ----------设置不抢占IP
  priority 100                   ----------优先级
  advert_int 1
  authentication {
  auth_type PASS
  auth_pass password_123
}
  track_script {
  redis_monitor                   -------与上面的监控脚本一致
}
  virtual_ipaddress {
  192.168.189.123
  }
  notify_master /usr/local/scripts/redis_master .sh   -------keepalived切换为master时运行
  notify_backup /usr/local/scripts/redis_backup .sh   -------keepalived切换为slave时运行
}


 从节点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# cat /usr/local/keepalived/etc/keepalived/keepalived.conf
! Configuration File  for  keepalived
  
global_defs {
  router_id LVS_DEVEL
}
vrrp_script redis_monitor{
  script "/usr/local/scripts/redis_monitor.sh"
  interval 2 
  weight 2 
}
  
vrrp_instance VI_1{ 
  state BACKUP                     ----------与主节点一致,BAKCUP
  interface eth0
  virtual_router_id 51 
  mcast_src_ip 192.168.189.131
  priority 99                     -----优先级小于主节点
  advert_int 1 
  authentication {
  auth_type PASS
  auth_pass password_123
}
  track_script {
  redis_monitor 
}
  virtual_ipaddress {
  192.168.189.123
  }
notify_master /usr/local/scripts/redis_master .sh
notify_backup /usr/local/scripts/redis_backup .sh
}


 

3:开启rediskeepalived

1
2
# /usr/local/redis/bin/redis-server /home/usr/local/redis/etc/redis.conf
# /usr/local/keepalived/sbin/keepalived -D -f /usr/local/keepalived/etc/keepalived/keepalived.conf


 

4:观察测试

 启动redis-server后,可以看到138主机抢占了VIP123,并且redis角色为Master

wKioL1dsnzeySe3YAAAYhenpztE563.png

wKioL1dsnzfQB7bfAAAbr--Osl4448.png

 131主机没抢占到123IPredis角色为Slave

wKioL1dsn3_B1rh4AAAZuHBzfG0297.png

 

 主节点上配置数据,查看从节点是否同步。

 主:

wKiom1dsn5uiN4yfAAAlvnCxEsw296.png

 从:

wKioL1dsn6OzTj6xAAATAlIVV-w690.png

 以上可看出主备数据同步正常。

 

 1,关闭主redis,查看从节点是否抢占IP,从redis是否变为主redis

 #/home/usr/local/redis/bin/redis-cli -h 192.168.189.138 -p 44444 shutdown

 查看从节点日志:

wKioL1dsn8bgu26eAACsz-sQkXA663.png

 以上日志显示131节点抢占到了IP123,成为keepalived主节点。

wKioL1dsn-zjQmeeAAAgg_V8PuU595.png

 以上日志显示131节点的redis角色变为Master

 

 查看131redis角色状态:

wKiom1dsoB_jU556AAAY_kLHMrw901.png

 131redis已经成功从slave变为master

 

 2,恢复138原主节点的redis状态,测试原来的主redis是否会自动降级为slave

 在主节点上重新开启keepalived,redis(注意要先开启redis,再开启keepalived)。

1
2
# /home/usr/local/redis/bin/redis-server /home/usr/local/redis/etc/redis.conf
# /usr/local/keepalived/sbin/keepalived -D -f /usr/local/keepalived/etc/keepalived/keepalived.conf

 查看138节点日志:

wKioL1dsoTOAUvHAAAC9Odo-qh4584.png 可以看到keepalived原主节点自动进入BACKUP状态,并未抢占123VIP

wKioL1dsoVDgYHLnAAARQOP9mYY680.png

 Redis角色也自动变更为Slave

 

 查看主备redis角色:

wKiom1dsoXPhLBB7AAAaJqjsXaU677.png

wKiom1dsoXTydtWKAAAZLcb7Kkk651.png 

 试验目标完成!










本文转自 icenycmh 51CTO博客,原文链接:http://blog.51cto.com/icenycmh/1792494,如需转载请自行联系原作者
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
4月前
|
NoSQL Redis C++
c++开发redis module问题之对于写命令,进行主备复制和写AOF,如何解决
c++开发redis module问题之对于写命令,进行主备复制和写AOF,如何解决
|
缓存 移动开发 NoSQL
php结合redis实现高并发下的抢购、秒杀功能的实例
php结合redis实现高并发下的抢购、秒杀功能的实例
254 0
|
NoSQL Redis
Redis学习4:List数据类型、拓展操作、实现日志等
注意点:对存储空间的顺序进行分析!
Redis学习4:List数据类型、拓展操作、实现日志等
|
存储 NoSQL Redis
Redis学习3:hash类型操作、拓展操作、实现购物等
首先可以理解成一个redis里面有一个小的redis。同时要注意引入了一个field的名字。
Redis学习3:hash类型操作、拓展操作、实现购物等
|
缓存 NoSQL 安全
2021年你还不会Shiro?----10.使用redis实现Shiro的缓存
上一篇文章已经总结了使用ehCache来实现Shiro的缓存管理,步骤也很简单,引入依赖后,直接开启Realm的缓存管理器即可。如果使用Redis来实现缓存管理其实也是一样的,我们也是需要引入redis的依赖,然后开启缓存传入自定义的redis的缓存管理器就行。区别是我们需要为自定义的redis缓存管理器提供自定义的缓存管理类。这个缓存管理类中需要使用到redisTemplate模板,这个模板我们也是需要自己定义。
269 0
2021年你还不会Shiro?----10.使用redis实现Shiro的缓存
|
NoSQL Java 关系型数据库
浅谈Redis实现分布式锁
浅谈Redis实现分布式锁
|
存储 NoSQL 关系型数据库
「Redis」事务实现机制
Redis事务实现机制
569 0
|
消息中间件 设计模式 NoSQL
异步结果通知实现——基于Redis实现,我这操作很可以
前段时间,我在内存中实现了一个简单异步通知框架。但由于没有持久化功能,应用重启就会导致数据丢失,且不支持分布式和集群。今天这篇笔记,引入了 Redis 来解决这些问题,以下是几点理由: 数据结构丰富,支持 List、Sorted Set 等 具有持久化功能,消息的可靠性能得到保证 高可用性,支持单机、主从、集群部署 项目中已使用,接入成本更低 基于 Redis 实现延时队列也有几种方法,展开详细讲讲。
|
NoSQL 前端开发 PHP
thinkphp+redis实现秒杀功能
thinkphp+redis实现秒杀功能
255 0
thinkphp+redis实现秒杀功能
|
存储 NoSQL 安全
分布式锁中-基于 Redis 的实现如何防重入
分布式锁中-基于 Redis 的实现如何防重入
256 0
分布式锁中-基于 Redis 的实现如何防重入