一步一步搭建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完全是两码事,只不过他们各负其责相互配合而已
原理图片
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也没挂,大吉大利啊,什么都不用操作。
    本文的实验环境四种情况都适合,第一种是不需要同步数据的,脚本会默认去同步数据,但是其实是不会成功的。脚本主要是用来处理第二和第三种情况的。

读书感悟

来自惠特曼《草叶集》

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

其他

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容