Docker搭建MySQL数据库集群——(三)Keepalive+Haproxy实现数据库负载均衡的高可用

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

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

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

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

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

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

1.1 虚拟ip

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

2.2 利用Keepalived实现双机热备

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

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

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

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

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

1.3 Haproxy双机热备架构图

如图例所示,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已安装成功:

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/

如图: 

(当然,也可以直接用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服务

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

如若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及配置文件,运行即可。

三、在宿主机内安装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

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

注意,这次访问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监控服务,但实质上内部流程和之前已经完全不同。

发布了25 篇原创文章 · 获赞 4 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_41570691/article/details/105734736