Redis基于keepalived的高可用实现
方案拓扑图

测试方案
1. 手动关闭AppM keepalived进程确认keepalived主从变化,AppS1是否变更为主
2. 开启keepalived,手动关闭 AppM redis进程确认ipvsadm ip池是否剔除AppM
3. 开启AppM redis进程,确认AppM是否变更为主
环境准备
服务器信息

配置服务器host
在Manager机器上配置好hosts后通过ansible下发到所有应用服务器

# ansible app -m copy -a "src=/etc/hosts dest=/etc/hosts owner=root group=root mode=0644 backup=yes"
//抽查对应服务器确认host无误后继续
安装配置keepalived
//安装keepalived ipvsadm
# ansible app -m command -a 'yum install keepalived ipvsadm -y'
//分发配置文件
# ansible AppM -m copy -a 'src=/data/ansible/config/keepalived/keepalived.conf-redis-Mrds dest=/etc/keepalived/keepalived.conf backup=yes' # ansible apps -m copy -a 'src=/data/ansible/config/keepalived/keepalived.conf-redis-Srds dest=/etc/keepalived/keepalived.conf backup=yes'
//登录AppS2
AppS3修改priority值
//运行keepalived
# ansible app -m command -a 'service keepalived restart' # ansible app -m command -a 'pidof keepalived'

//ip池

测试
1. 手动关闭AppM keepalived进程确认keepalived主从变化,AppS1是否变更为主


a> Vip资源已切换至AppS1,但同时我们也发现redis主从并没有切换
2. 开启keepalived,手动关闭 AppM redis进程确认ipvsadm ip池是否剔除AppM

3. 开启AppM redis进程,确认AppM是否变更为主

Redis会立刻同步服务到ip池
小总
a> Keepalived相对heartbeat要轻量简单,ipvsadm也由keepalived协助完成
b> Keepalived的redis应用场景需多master且mater互为同步,或
c> Keepalived的响应速度极快,异常进程或实例恢复后都能迅速发现并实施既定措施
d> 想通过redis自带的sentinel和keepalived结果会有些难度,也不建议
附件
keepalived.conf-redis-Srds
global_defs {
notification_email {
lisongtao@ihuilian.com
}
notification_email_from sa@ihuilian.com
smtp_server smtp.exmail.qq.com
smtp_connect_timeout 30
router_id LVS_DEVEL ##自定义的字符串
}
###在哪里找到自定义配置规范
#vrrp_script chk_nginx_down { #定义可以手动控制状态的脚本
# script "killall -0 nginx"
# interval 1 #检查时间间隔
# weight - 13 #如果检测失败,优先级-13
#}
vrrp_script chk_redis_down { #定义可以手动控制状态的脚本
script "killall -0 redis-server"
interval 1 #检查时间间隔
weight -2 #如果检测失败,优先级-13
}
vrrp_instance VI_1 {
state BACKUP ###MASTER/BACKUP必须大写,且当MASTER恢复时,会自动恢复为MASTER状态
interface eth0
virtual_router_id 51 ###同一个vrrp使用相同的vrrp,整个vrrp内唯一
priority 99 ###数字越大优先级越高,且要MASTER要高于SLAVE,和sentinel恰好相反...>O<
advert_int 1 ###Timeout时长秒为单位
authentication { ###MASTER和SLAVE密码相同方可正常通信
auth_type pass
auth_pass huilian
}
virtual_ipaddress { ###每个地址占一行,不能指定子网掩码,与lvs客户端设定的VIP一致
192.168.1.200
#192.168.200.17
#192.168.200.18
}
###跟global_defs中定义的vrrp_script chk_nginx_down对应
#track_script { #引用定义的脚本
# chk_nginx_down
#}
track_script { #引用定义的脚本
chk_redis_down
}
#notify_master "/etc/keepalived/notify.sh master"
#notify_backup "/etc/keepalived/notify.sh backup"
#notify_fault "/etc/keepalived/notify.sh fault"
}
virtual_server 192.168.1.200 6379{ ###IP和vrrp_instance中定义的vip需一致,IP PORT
delay_loop 6 ###健康检查时间/秒
#lb_algo wlc ###负载均衡调度算法,常用rr/wlc
lb_algo rr ###负载均衡调度算法,常用rr/wlc
lb_kind DR ###负载均衡转发规则, DR,NAT,TUN3
nat_mask 255.255.255.0
#persistence_timeout 50 ###会话保持时长
protocol TCP ###协议类型转发
real_server 192.168.1.36 6379{ ###real server IP PORT
weight 1 ###数值越大,权重越大
TCP_CHECK {
connect_timeout 1 #表示3秒无响应,则超时
nb_get_retry 3 #表示重试次数
delay_before_retry 3 #表示重试间隔
connect_port 6379 #表示重试间隔
}
}
real_server 192.168.1.37 6379{
weight 1 ###数值越大,权重越大
TCP_CHECK {
connect_timeout 1 #表示3秒无响应,则超时
nb_get_retry 3 #表示重试次数
delay_before_retry 3 #表示重试间隔
connect_port 6379 #表示重试间隔
}
}
real_server 192.168.1.38 6379{
weight 1 ###数值越大,权重越大
TCP_CHECK {
connect_timeout 1 #表示3秒无响应,则超时
nb_get_retry 3 #表示重试次数
delay_before_retry 3 #表示重试间隔
connect_port 6379 #表示重试间隔
}
}
real_server 192.168.1.39 6379{
weight 1 ###数值越大,权重越大
TCP_CHECK {
connect_timeout 1 #表示3秒无响应,则超时
nb_get_retry 3 #表示重试次数
delay_before_retry 3 #表示重试间隔
connect_port 6379 #表示重试间隔
}
}
}
keepalived.conf-redis-Mrds
global_defs {
notification_email {
lisongtao@ihuilian.com
}
notification_email_from sa@ihuilian.com
smtp_server smtp.exmail.qq.com
smtp_connect_timeout 30
router_id LVS_DEVEL ##自定义的字符串
}
###在哪里找到自定义配置规范
#vrrp_script chk_nginx_down { #定义可以手动控制状态的脚本
# script "killall -0 nginx"
# interval 1 #检查时间间隔
# weight - 13 #如果检测失败,优先级-13
#}
vrrp_script chk_redis_down { #定义可以手动控制状态的脚本
script "killall -0 redis-server"
interval 1 #检查时间间隔
weight -2 #如果检测失败,优先级-13
}
vrrp_instance VI_1 {
state MASTER ###MASTER/BACKUP必须大写,且当MASTER恢复时,会自动恢复为MASTER状态
interface eth0
virtual_router_id 51 ###同一个vrrp使用相同的vrrp,整个vrrp内唯一
priority 100 ###数字越大优先级越高,且要MASTER要高于SLAVE,和sentinel恰好相反...>O<
advert_int 1 ###Timeout时长秒为单位
authentication { ###MASTER和SLAVE密码相同方可正常通信
auth_type pass
auth_pass huilian
}
virtual_ipaddress { ###每个地址占一行,不能指定子网掩码,与lvs客户端设定的VIP一致
192.168.1.200
#192.168.200.17
#192.168.200.18
}
###跟global_defs中定义的vrrp_script chk_nginx_down对应
#track_script { #引用定义的脚本
# chk_nginx_down
#}
track_script { #引用定义的脚本
chk_redis_down
}
#notify_master "/etc/keepalived/notify.sh master"
#notify_backup "/etc/keepalived/notify.sh backup"
#notify_fault "/etc/keepalived/notify.sh fault"
}
virtual_server 192.168.1.200 6379{ ###IP和vrrp_instance中定义的vip需一致,IP PORT
delay_loop 6 ###健康检查时间/秒
#lb_algo wlc ###负载均衡调度算法,常用rr/wlc
lb_algo rr ###负载均衡调度算法,常用rr/wlc
lb_kind DR ###负载均衡转发规则, DR,NAT,TUN3
nat_mask 255.255.255.0
#persistence_timeout 50 ###会话保持时长
protocol TCP ###协议类型转发
real_server 192.168.1.36 6379{ ###real server IP PORT
weight 1 ###数值越大,权重越大
TCP_CHECK {
connect_timeout 1 #表示3秒无响应,则超时
nb_get_retry 3 #表示重试次数
delay_before_retry 3 #表示重试间隔
connect_port 6379 #表示重试间隔
}
}
real_server 192.168.1.37 6379{
weight 1 ###数值越大,权重越大
TCP_CHECK {
connect_timeout 1 #表示3秒无响应,则超时
nb_get_retry 3 #表示重试次数
delay_before_retry 3 #表示重试间隔
connect_port 6379 #表示重试间隔
}
}
real_server 192.168.1.38 6379{
weight 1 ###数值越大,权重越大
TCP_CHECK {
connect_timeout 1 #表示3秒无响应,则超时
nb_get_retry 3 #表示重试次数
delay_before_retry 3 #表示重试间隔
connect_port 6379 #表示重试间隔
}
}
real_server 192.168.1.39 6379{
weight 1 ###数值越大,权重越大
TCP_CHECK {
connect_timeout 1 #表示3秒无响应,则超时
nb_get_retry 3 #表示重试次数
delay_before_retry 3 #表示重试间隔
connect_port 6379 #表示重试间隔
}
}
}
下章节预告:
twemproxy + keepalived 实现redis的分布式高可用
原创文章,作者:stanley,如若转载,请注明出处:http://www.178linux.com/703

