如何让你的程序支持HA?
关于HA以及OceanBase中HA的应用请参考前面的两篇博客: HA在OceanBase中的应用, OceanBase中主备Rootserver如何管理切换
实现程序支持HA,要点是能够检测到VIP是否飘到了自己的机器上。如何检测呢?主Server和备Server都需要开一个线程,在这个线程里只做一件事:检查本机IP是否与VIP一致,如果一致则说明VIP飘到了自己的机器上。
这里仔细一想是有问题的:本机IP改了,外面的Server如何得知变成了多少?如何和它保持通信?最简单的情况,一个SSH连接上去,结果它的IP变了,连接岂不是会断开?
怎么办呢?让我们先来补充一点基础知识。
(1) 一台计算机可以有多个网卡,每个网卡可以有一个自己的独立IP,对外呈现为多个IP
(2)可以把多个网卡绑定成一个虚拟网卡(bond),对外只呈现为一个IP
(3)每个网卡(物理网卡或虚拟网卡)都可以有一个或多个虚拟IP(VIP)
(4)每个虚拟IP对应一个虚拟设备,设备命名规则是网卡名+":"+数字编号。例如eth0的VIP设备名称为eth0:0,eth0:1,...bond0的VIP设备名称为bond0:0, bond0:1
为一个设备添加/删除一个虚拟IP的方法如下(以bond0为例):
const char *config_vip = "10.32.36.219";uint32_t vip = getAddr(config_vip); // 将ip字符串地址转成2进制地址while(true){ if (!isLocalAddr(vip, true)) { exit(0); // 自己不再是master,退出 }}