在第二篇中已经实现了数据库负载均衡中间件Haproxy的部署运行。

但当单台Haproxy出现问题时,数据库集群的负载均衡也就失效了。为了保证Haproxy的高可用,单台Haproxy也是不够的。

因此需要实现多台Haproxy的部署运行

(双机热备:指两台机器运行待命)。

 

一、Haproxy双机热备的实现思路

如果要实现两台Haproxy的双机热备,那么关键点是linux的虚拟ip技术和Keepalive技术。

1.1 虚拟ip

linux系统可以在一个网卡中定义多个ip地址,把这些ip地址分配给对应的程序。这些ip地址就叫做虚拟ip。

 

dockerswarm高可用 docker haproxy keepalived_服务器

2.2 利用Keepalived实现双机热备

在两台Haproxy的容器中各自安装好Keepalived之后,Keepalived运行时就会抢占虚拟ip。

抢到虚拟ip的keepalived所在的Haproxy做主服务器,没有抢到的叫做备用服务器。

 

主备之间会发送心跳检测,如果备用服务器发现它发送给主服务器上keepalived的心跳检测没有响应,

就意味着主服务器可能故障了,备用服务器上的keepalived就有权把虚拟ip抢到手。

因此我们不关心这个虚拟ip对应哪个Haproxy,一个Haproxy挂掉了,由另一个Haproxy来接替它的工作。

dockerswarm高可用 docker haproxy keepalived_docker_02

 

1.3 Haproxy双机热备架构图

dockerswarm高可用 docker haproxy keepalived_配置文件_03

如图例所示,172.18.0.15这个ip是Docker内部的虚拟ip,无法被外网访问,因此需要在宿主机上也安装Keepalived,

一个请求发送宿主机的ip,通过Keepalived被路由到Docker内的虚拟ip 172.18.0.15。

因为这个Docker的虚拟ip被某一个容器内的Keepalived所抢占,所以请求又会被转发到Haproxy上,

Haproxy最后通过其负载均衡技术将数据库请求发送到某个数据库节点。

 

二、在Haproxy容器内安装Keepalived

2.1 安装Keepalived

docker exec -it h1 bash      进入h1容器交互界面内部

如需退出交互界面使用exit命令,将不会停止容器运行同时退出容器交互界面。

apt-get update                    更新Haproxy容器内的apt-get工具(Haproxy镜像是通过unbutn创建的,unbutn上安装程序使用apt-ge指令,而不是centos的yum-install)

apt-get install keepalived     安装keepalived (因为下载源在国外,速度可能会较慢)

如图keepalived已安装成功:

dockerswarm高可用 docker haproxy keepalived_配置文件_04

2.2 编写keepalived的配置文件

vrrp_instance  VI_1 {
    state  MASTER
    interface  eth0
    virtual_router_id  51
    priority  100
    advert_int  1
    authentication {
        auth_type  PASS
        auth_pass  123456
    }
    virtual_ipaddress {
        172.18.0.201
    }
}

复制此处配置内容到新建一个keepalived.conf中。

将配置文件上传到启动haproxy容器h1时所指定的映射宿主机目录中,

h1与宿主机相映射的目录中就可以找到该配置文件了,

之后将配置文件copy到h1容器的/etc/keepalived/目录中

cp /usr/local/etc/haproxy/keepalived.conf /etc/keepalived/

如图: 

dockerswarm高可用 docker haproxy keepalived_服务器_05

(当然,也可以直接用vim直接编辑出配置文件,不过需要在容器内先安装vim命令)

2.3 keepalived配置文件详细说明

vrrp_instance  VI_1 {
    state  MASTER   #Keepalive的身份(MASTER为主服务,BACKUP为备用服务,抢占到ip的为主服务器,没有抢占到的自动降级为备用服务器)
    interface  eth0  #docker中虚拟ip使用到的docker内部网卡
    virtual_router_id  51  #虚拟路由标识,MASTER和BACKUP的虚拟路由标识必须一致。 标识可以是0~255之间任意值。
    priority  100   #硬件设备条件不同时采用的权重,MASTER权重要高于BACKUP,数字越大优先级越高。
    advert_int  1  #keepalived节点之间的心跳检测间隔,单位为秒,主备之间必须一致。
    authentication {   
        auth_type  PASS
        auth_pass  123456
    }  #心跳检测需要登录到keepalived节点内,登录使用的账号密码。主备必须用相同的密码才能正常通信。
    virtual_ipaddress {
        172.18.0.201
    }  #虚拟ip,该虚拟ip将被写入到上面的docker网卡ens33中,如数据库集群的网段是172.18.0.xxx,这里就定义个大一点的该网段的ip地址。由于是docker内部的虚拟ip,在docker内部能访问,出了docker是不能访问的。
}

2.4 运行keepalived

service keepalived start    启动keepalived服务

dockerswarm高可用 docker haproxy keepalived_服务器_06

尝试宿主机能否ping通keepalived占有的虚拟ip,能ping通就说明这个虚拟ip已经配置成功了:

dockerswarm高可用 docker haproxy keepalived_dockerswarm高可用_07

如若ping不通需检查配置是否正确,以及网络模式是否是桥接。

一开始我使用的网络模式是nat,无法ping通,改为桥接后重启linux可以ping通。

 

2.5 搭建第二个Haproxy节点h2

docker run -it -d -p 4003:8888 -p 4004:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.0.8 haproxy

运行上述命令,创建haproxy的h2容器,

注意宿主机4001和4002端口已经被h1映射所占用,要进行更换成别的端口。

以及容器名需更换,ip地址需更换。

之后重复如h1的keepalive安装步骤,在h2容器中安装keepalive及配置文件,运行并查看能否ping通虚机ip即可。

 

三、在宿主机内安装Keepalived

3.1 宿主机内安装Keepalived

Haproxy容器内的keepalive已经正常运行了,其抢占的虚拟ip也可以正常ping通了。

之后需要把该虚拟ip和宿主机的ip做映射,以使外部网络可以访问到该虚拟ip,需要在宿主机上也安装keepalived。

宿主机的linux是centos,所以安装命令有所不同:

yum install -y keepalived  

 

3.2 编写Keepalived配置文件

vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
       	192.168.132.150
    }
}


virtual_server 192.168.132.150 8888 {
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 172.18.0.201 8888 {
        weight 1
    }
}


virtual_server 192.168.132.150 3306 {
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 172.18.0.201 3306 {
        weight 1
    }
}

 

注意:

1. 如上配置中的virtual_server 192.168.132.150,这是我当前的宿主机的网段ip地址,需将配置中所有192.168.132.150改成自己使用的宿主机网段192.168.xxx.150

2. ipaddress查看自己连接宿主机的ip地址,查看ip地址对应的网卡名。把interface eth1一项修改成自己正确的宿主机网卡名。

3. copy到新建的keepalived.conf中,上传到宿主机keepalived的配置目录/etc/keepalived中即可。

 

3.3 启动宿主机keepalive服务

启动服务       service keepalived start

启动成功后,尝试ping宿主机供请求访问的ip       ping 192.168.132.150

dockerswarm高可用 docker haproxy keepalived_配置文件_08

 

3.4 进行测试

3.4.1 测试Haproxy监控服务

通过宿主机keepalived绑定的ip访问haproxy监控服务

dockerswarm高可用 docker haproxy keepalived_配置文件_09

注意,这次访问haproxy监控服务的ip192.168.132.150是宿主机keepalived所占有的虚拟ip,

keepalived通过这个虚拟ip192.168.132.150转发请求到docker的虚拟ip 172.18.0.201。

h1容器中的keepalived所在主服务器haproxy最后进行负载均衡请求分发。

 

这次访问的已经不是原本的未使用keepalived时的宿主机192.168.132.105的ip了(见第二章haproxy搭建),看起来还是访问haproxy监控服务,但实质上内部流程和之前已经完全不同。

 

3.4.2 测试数据库请求

使用ip 192.168.132.150新建数据库连接:

dockerswarm高可用 docker haproxy keepalived_服务器_10

可以正常连接,对stu表增加一条数据:

dockerswarm高可用 docker haproxy keepalived_服务器_11

打开DB2,可以看到BD2的数据库节点的表中也已经被同步了该数据:

dockerswarm高可用 docker haproxy keepalived_dockerswarm高可用_12

 

3.4.3 测试Haproxy双机热备的高可用性

docker stop h1     暂停运行h1容器

dockerswarm高可用 docker haproxy keepalived_配置文件_13

打开@192.168.132.150的数据库连接,再为student表插入一条新数据

dockerswarm高可用 docker haproxy keepalived_docker_14

查看DB3中student表,可以看到新数据已被同步:

dockerswarm高可用 docker haproxy keepalived_服务器_15

这就说明当haproxy容器h1挂掉后,h2还可以接替运行,双机热备的高可用性确实实现了。

 

3.5 暂停pxc集群的方法

停止集群服务是按照h2,h1,node5,node4,node3,node2,node1的顺序进行停止,

由于我使用的是VMWare虚拟机,pxc集群如果停止方式不正确,经常在下次启动虚拟机和服务的时候,可能出现pxc容器闪退的问题。

也可以采用将docker进程挂起的方式,等下次启动时恢复运行,docker那些容器都会恢复正常运行。

但是恢复运行时docker会无法获取网络,因此还需要设置一下网络,使docker进程恢复运行时能重新获取到网络。

 

vi /etc/sysctl.conf        在宿主机中编辑此配置文件

在此配置文件中增加 net.ipv4.ip_forward=1

dockerswarm高可用 docker haproxy keepalived_dockerswarm高可用_16

之后重启网络服务:

systemctl restart network

dockerswarm高可用 docker haproxy keepalived_服务器_17

这样就可以在虚拟机上去挂起linux的实例了,挂起只是休眠不是停止,之后重启电脑点击恢复运行即可:

dockerswarm高可用 docker haproxy keepalived_服务器_18

 

注意:在我关闭电脑几天后再次恢复运行时,出现了Naticat连接@192.168.132.150连接不上的问题。需要重启宿主机keepalived服务,service keepalived restart,即可恢复正常连接。