需求
1 确保应用程序app实现高可用,如果某个节点宕机,可以在其他节点上正常提供服务
2 不论是否切换节点,app对外的ip是唯一的
3 网关切换节点后,数据不可丢失
解决方案
用keepalived实现virtual ip,
用inotify监控文件变化,变化时,调用rsync做文件传输
keepalived
Keepalived的实现基础是VRRP协议,包括核心的MASTER竞选机制都是在VRRP协议所约定的。
VRRP是Virtual Router Redundancy Protocol(虚拟路由冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由的单点故障问题的,它能保证当个别节点宕机时,整个网络可以不间断地运行。
在keepalived服务工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用来告诉备Backup节点自己还活着。当主节点发生故障时,就无法发送心跳的消息了,备节点也因此无法继续检测到来自主节点的心跳了。于是就会调用自身的接管程序,接管主节点的IP资源和服务。当主节点恢复时,备节点又会释放主节点故障时自身接管的IP资源和服务,恢复到原来的备用角色。
rsync
rsync是一款开源,快速,多功能的可实现增量的本地或远程的数据镜像同步备份的优秀工具。适用于多个平台。从软件名称可以看出来是远程同步的意思(remote sync)。可使本地主机不同分区或目录之间及本地和远程两台主机之间的数据快速同步镜像,远程备份等功能。
rsync的命令格式可以为:
1)rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST 推送(因为SRC是本地)
2)rsync [OPTION]... [USER@]HOST:SRC DEST 拉取 (因为SRC是服务端)
3)rsync [OPTION]... SRC [SRC]... DEST 拷贝本地文件
4)rsync [OPTION]... [USER@]HOST::SRC [DEST]
5)rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
6) rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC[DEST]
rsync参数
============================================
-v, --verbose 详细模式输出
-r, --recursive 对子目录以递归模式处理
-l, --links 保留软链结
-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节
--bwlimit=100 //限速100KB/s,没有加这个选项,表示不限传输速度,与局域网的网速有关
…
============================================
Rsync的特性如下:
1)支持拷贝特殊文件如链接,设备等
2)可以有排除指定文件或目录同步的功能,相当于打包命令tar
3)可以保持原来文件或目录的权限,时间,软硬链接等所有属性均不改变。
4)可实现增量同步,即只同步发生变化的数据,因此数据传输效率更高
5)可以使用rcp,rsh,ssh等方式来配合传输文件,也可以通过直接的socker链接
6)支持匿名的或认证的进程模式传输,方便进行数据备份及镜像。
- 未限制同步文件大小
核心算法介绍:
假定在名为α和β的两台计算机之间同步相似的文件 A 与 B ,其中α对文件 A 拥有访问权,β对文件 B 拥有访问权。并且假定主机α与β之间的网络带宽很小。那么 rsync 算法将通过下面的五个步骤来完成:
1. β将文件 B 分割成一组不重叠的固定大小为 S 字节的数据块。最后一块可能会比 S 小。
2. β对每一个分割好的数据块执行两种校验:一种是 32 位的滚动弱校验,另一种是 128 位的 MD4 强校验。
3. β将这些校验结果发给α。
4. α通过搜索文件 A 的所有大小为 S 的数据块 ( 偏移量可以任选,不一定非要是 S 的倍数 ) ,来寻找与文件 B 的某一块有着相同的弱校验码和强校验码的数据块。这项工作可以借助滚动校验的特性很快完成。
5. α发给β一串指令来生成文件 A 在β上的备份。这里的每一条指令要么是对文件 B 经拥有某一个数据块而不须重传的证明,要么是一个数据块,这个数据块肯定是没有与文件 B 的任何一个数据块匹配上的。
rsync就是会同步我们指定的两端目录之间的数据,这个数据可以是特殊的数据。同步之前就先进行两端的数据的比对,只会同步两者之间不同的部分,并保留文件原本的属性。并且支持匿名的方式进行同步传输。所以rsync在备份,同步上就会较为快速。
Keepalived具体实现
Ubuntu系统自带工具,约0.5M,增量同步方式。源码编译出的安装程序大小为不到2M.下载的源码大小为885KB。源码下载地址:http://rsync.samba.org/
Keepalived官网:http://www.keepalived.org。通过官网可以下载到源码keepalived-2.0.15.tar.gz。大小为950KB。
从2.4版本开始,linux内核默认支持LVS(linux virtual server)。要使用LVS的能力,只需安装一个LVS的管理工具:ipvsadm。
(1.)安装
安装命令会安装3个工具:
sudo apt-get install keepalived
vrrp_instance VI_1{...}这是一个VRRP实例,里面定义了keepalived的主备状态、接口、优先级、认证和IP信息;state 定义了VRRP的角色,interface定义使用的接口,这里我的服务器用的网卡都是ens3,根据实际来填写,virtual_router_id是虚拟路由ID标识,一组的keepalived配置中主备都是设置一致,priority是优先级,数字越大,优先级越大,auth_type是认证方式,auth_pass是认证的密码。 virtual_ipaddress {...}定义虚拟IP地址,可以配置多个IP地址。
(3.)在master和back-up节点上启动keepalived
sudo /etc/init.d/keepalived start
(4.) 分别查看ip addr
Master:
Back-up:
两个节点上都出现了虚拟ip,这种情况是错误的,称为脑裂现象。正常的情况是back-up节点不出现虚拟ip
(5.) 解决脑裂现象
分别查看两个节点,是否收到了广播
sudo tcpdump -i ens3|grep VRRP
Master:
Back-up:
说明back-up节点没有收到master的广播,只收到了自己的。
查看back-up的iptables运行状态:
Sudo iptables -S
再查看master的iptables运行状态:
发现不是iptables的问题,back-up节点在windows系统上的VMWare安装的虚拟机,所以有windows10自带的防火墙。
这是一个原因,另一个原因是:router_id 路由标识没有设置成唯一的导致的。
所以,如果要预防脑裂,需要做到以下2点:
- 都在linux的虚拟机上,保证没有防火墙的干扰;
- 每台节点的router_id 路由标识必须设置成唯一的。
(6.)查看切换
将251节点的keepalived服务停止,查看241节点是否生成虚拟ip
sudo /etc/init.d/keepalived stop
back-up节点:
可以看到,切换后,back-up节点生成了虚拟ip.
在251上,启动keepalived服务,sudo /etc/init.d/keepalived start,分别查看251与241节点上的虚拟ip,发现是251节点生成了虚拟ip.
原理
http://m.elecfans.com/article/700023.html
配置及选举算法
https://www.cnblogs.com/pangguoping/p/5721517.html
具体实现
https://blog.51cto.com/superpcm/2095395
https://blog.csdn.net/weixin_30166297/article/details/78028537
https://www.cnblogs.com/dcrq/p/5642680.html
脑裂的解决方法
https://blog.51cto.com/13599730/2161622
https://www.cnblogs.com/cheyunhua/p/8717743.html
太长了。。。。rsync与inotify另外发一篇吧。