一步一步搭建Redis + Keepalived主从高可用之原理(一)

开心一笑

【鱼说:“我时时刻刻把眼睁开是为了在你身边不舍离开。”
水说:“我终日流淌不知疲倦是为了围绕你,好好把你抱紧。”
锅说:“都他妈快熟了还这么多废话。” 】

提出问题

《一步一步搭建Redis + Keepalived主从高可用之原理(一)》

如何一步一步利用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完全是两码事,只不过他们各负其责相互配合而已

《一步一步搭建Redis + Keepalived主从高可用之原理(一)》 原理图片

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

《一步一步搭建Redis + Keepalived主从高可用之原理(一)》 热备设计思路

(注:也可以设置排抢占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也没挂,大吉大利啊,什么都不用操作。
    本文的实验环境四种情况都适合,第一种是不需要同步数据的,脚本会默认去同步数据,但是其实是不会成功的。脚本主要是用来处理第二和第三种情况的。

读书感悟

来自惠特曼《草叶集》

  • 哪里有土,哪里有水,哪里就长着草。
  • 因寒冷而打颤的人,最能体会到阳光的温暖。经历了人生烦恼的人,最懂得生命的可贵。
  • 我坐着,观望世界上所有的忧患,所有的压迫和耻辱….看着,听着,一声不响。
  • 我无论生活在哪里,遇到任何意外都要保持自我平衡,面对黑夜,风暴,饥饿,嘲弄,事故,挫败,都要像树木和动物那样坚韧。
  • 我听见了谈话者的谈话,关于始与终的谈话,可是我不谈论始与终。
  • 无需与你交谈,我只需在一人独坐时,或是独自在夜间醒来时,想着你。 我会等待,从不怀疑会再次与你相遇。
    我要专心。不错过你。

其他

如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎转载,点赞,顶,欢迎留下宝贵的意见,多谢支持!

    原文作者:阿_毅
    原文地址: https://www.jianshu.com/p/e433978892b5
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞