开心一笑
【鱼说:“我时时刻刻把眼睁开是为了在你身边不舍离开。”
水说:“我终日流淌不知疲倦是为了围绕你,好好把你抱紧。”
锅说:“都他妈快熟了还这么多废话。” 】
提出问题
如何一步一步利用Redis-Keepalived实现缓存服务热备方案???
解决问题
1.0 keepalived是什么
keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
1.1 Keepalived的原理介绍
什么是Keepalived呢?keepalived观其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生,那说到keepalived时不得不说的一个协议就是VRRP协议,可以说这个协议就是keepalived实现的基础,那么首先我们来看看VRRP协议.
1.2 VRRP协议
VRRP协议
学过网络的朋友都知道,网络在设计的时候必须考虑到冗余容灾,包括线路冗余,设备冗余等,防止网络存在单点故障,那在路由器或三层交换机处实现冗余就显得尤为重要,在网络里面有个协议就是来做这事的,这个协议就是VRRP协议,Keepalived就是巧用VRRP协议来实现高可用性(HA)的
VRRP协议有一篇文章写的非常好,大家可以直接看这里(记得认真看看哦,后面基本都已这个为基础的了)
帖子地址:http://bbs.ywlm.net/thread-790-1-1.html
只需要把服务器当作路由器即可!
在《VRRP协议》里讲到了虚拟路由器的ID也就是VRID在这里比较重要
keepalived完全遵守VRRP协议,包括竞选机制等等
1.3 Keepalived原理
keepalived也是模块化设计,不同模块复责不同的功能,下面是keepalived的组件
core check vrrp libipfwc libipvs-2.4 libipvs-2.6
- core:是keepalived的核心,复责主进程的启动和维护,全局配置文件的加载解析等
- check:负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置的解析包括LVS的配置解析
- vrrp:VRRPD子进程,VRRPD子进程就是来实现VRRP协议的
- libipfwc:iptables(ipchains)库,配置LVS会用到
- libipvs*:配置LVS会用到
注意,keepalived和LVS完全是两码事,只不过他们各负其责相互配合而已
1.4 Redis使用keeplived热备设计思路
当 Master 与 Slave 均运作正常时, Master负责服务,Slave负责Standby;
当 Master 挂掉,Slave 正常时, Slave接管服务,有写权限,同时关闭主从复制功能;
当 Master 恢复正常,则从Slave同步数据,同步数据之后关闭主从复制功能,恢复Master身份,同时Slave等待Master同步数据完成之后,恢复Slave身份。
然后依次循环。
1.5 keepalived的配置文件
参考资料:https://my.oschina.net/ydsakyclguozi/blog/515200
keepalived配置文件keepalived.conf , 里面主要包括以下几个配置区域,分别是:
- global_defs、
主要是配置故障发生时的通知对象以及机器标识
global_defs {
notification_email {
ay@ay.com
al@ay.com
...
}
notification_email_from alert@ay.com
smtp_server smtp.ay.com
smtp_connect_timeout 30
enable_traps
router_id host163
}
notification_email 故障发生时给谁发邮件通知。
notification_email_from 通知邮件从哪个地址发出。
smpt_server 通知邮件的smtp地址。
smtp_connect_timeout 连接smtp服务器的超时时间。
enable_traps 开启SNMP陷阱(Simple Network Management Protocol)。
router_id 标识本节点的字条串,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到。
- static_ipaddress、static_routes、
static_ipaddress和static_routes区域配置的是是本节点的IP和路由信息。如果你的机器上已经配置了IP和路由,那么这两个区域可以不用配置。其实,一般情况下你的机器都会有IP地址和路由信息的,因此没必要再在这两个区域配置。
static_ipaddress {
10.210.214.163/24 brd 10.210.214.255 dev eth0
...
}
static_routes {
10.0.0.0/8 via 10.210.214.1 dev eth0
...
}
- vrrp_script:用来做健康检查,当时检查失败时会将vrrp_instance的priority减少相应的值。
- vrrp_instance
vrrp_instance用来定义对外提供服务的VIP区域及其相关属性。
vrrp_rsync_group用来定义vrrp_intance组,使得这个组内成员动作一致。举个例子来说明一下其功能:
global_defs {
router_id redis130
}
vrrp_script chk_redis {
script "/etc/keepalived/scripts/redis_check.sh" ###监控脚本
interval 2 ###监控时间
}
vrrp_script chk_redis {
script "/etc/keepalived/scripts/redis_check.sh" ###监控脚本
interval 2 ###监控时间
weight -10
}
vrrp_instance VI_1 {
state MASTER ###设置为MASTER
interface eth0 ###监控网卡
nopreempt
virtual_router_id 51
priority 101 ###权重值
authentication {
auth_type PASS ###加密
auth_pass 1111 ###密码
}
track_script {
chk_redis ###执行上面定义的chk_redis
}
virtual_ipaddress {
192.168.184.131 ###VIP
}
notify_master /etc/keepalived/scripts/redis_master.sh
notify_backup /etc/keepalived/scripts/redis_backup.sh
notify_fault /etc/keepalived/scripts/redis_fault.sh
notify_stop /etc/keepalived/scripts/redis_stop.sh
}
notify_master/backup/fault :分别表示切换为主/备/出错时所执行的脚本。
notify :表示任何一状态切换时都会调用该脚本,并且该脚本在以上三个脚本执行完成之后进行调用,keepalived会自动传递三个参数($1 = "GROUP"|"INSTANCE",$2 = name of group or instance,$3 = target state of transition(MASTER/BACKUP/FAULT))。
state :可以是MASTER或BACKUP,不过当其他节点keepalived启动时会将priority比较大的节点选举为MASTER,因此该项其实没有实质用途。
interface :节点固有IP(非VIP)的网卡,用来发VRRP包。
virtual_router_id :取值在0-255之间,用来区分多个instance的VRRP组播。
nopreempt :允许一个priority比较低的节点作为master,即使有priority更高的节点启动。
- virtual_server
(注:也可以设置排抢占IP模式,即在主设备配置加上:nopreempt,这样宕掉的Master恢复后,保持Slave身份,不恢复Master身份)。
1.6 在keepalived+redis的使用过程中有四种情况
- 1 一种是keepalived挂了,同时redis也挂了,这样的话直接VIP飘走之后,是不需要进行redis数据同步的,因为redis挂了,你也无法去master上同步,不过会损失已经写在master上却还没同步到slave上面的这部分数据。
- 2 另一种是keepalived挂了,redis没挂,这时候VIP飘走后,redis的master/slave还是老的对应关系,如果不变化的话会把数 据写入redis slave中,从而不会同步到master上去,这就要借助监控脚本反转redis的master/slave关系。这时候就要预留一点时间进行数据同 步,然后反转master/slave。
- 3 还有一种是keepalived没挂,redis挂了,这时候根据监控脚本会检测到redis挂了,并且降低keepalived master的优先级,同样会导致VIP飘走,情况和第二种一样,也是需要进行数据同步,然后反转当前redis的master/slave关系的。
- 4 随后一种是keepalived没挂,redis也没挂,大吉大利啊,什么都不用操作。
本文的实验环境四种情况都适合,第一种是不需要同步数据的,脚本会默认去同步数据,但是其实是不会成功的。脚本主要是用来处理第二和第三种情况的。
读书感悟
来自惠特曼《草叶集》
- 哪里有土,哪里有水,哪里就长着草。
- 因寒冷而打颤的人,最能体会到阳光的温暖。经历了人生烦恼的人,最懂得生命的可贵。
- 我坐着,观望世界上所有的忧患,所有的压迫和耻辱....看着,听着,一声不响。
- 我无论生活在哪里,遇到任何意外都要保持自我平衡,面对黑夜,风暴,饥饿,嘲弄,事故,挫败,都要像树木和动物那样坚韧。
- 我听见了谈话者的谈话,关于始与终的谈话,可是我不谈论始与终。
- 无需与你交谈,我只需在一人独坐时,或是独自在夜间醒来时,想着你。 我会等待,从不怀疑会再次与你相遇。
我要专心。不错过你。
其他
如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎转载,点赞,顶,欢迎留下宝贵的意见,多谢支持!