docker技术快速实现前后端项目的集群化⑦percona-mysql的pxc集群基于Haproxy的keevalived高可用方案...
docker技术快速实现前后端项目的集群化⑦Haproxy的keevalived高可用方案
整体规划架构:
haproxy01 负载均衡 172.18.0.7 的 8888端口作为状态监控端口,3306作为 pxc 集群反向代理的端口,上面运行了 keepalived 虚拟ip为 172.18.0.100,可以保证高可用
haproxy02 负载均衡 172.18.0.8 的 8888端口作为状态监控端口,3306作为 pxc 集群反向代理的端口,上面运行了 keepalived 虚拟ip为 172.18.0.100,如果master挂了,漂移过来,可以保证高可用
宿主机 10.11.0.218 上面运行的 keepalived 是和容器的 keepalived(172.30.0.100) 通讯
172.18.0.100 的 8888 端口 和 宿主机keepalived虚拟出的 10.11.0.218 的 8888 端口映射
172.18.0.100 的 3306 端口 和 宿主机 keepalived虚拟出的 10.11.0.218 的 3336 端口映射(3306已经分配给了之前的docker)
访问宿主机 10.11.0.218 8888端口就是映射到了容器的haproxy监控端
Keepvlived安装在ubuntu容器中
Ubuntu中给apt-get设置代理
进入docker-haproxy服务
docker exec -it h1 /bin/bash
编辑文件: /etc/apt/apt.conf
在您的apt.conf文件中加入下面这行(根据你的实际情况替换yourproxyaddress和proxyport)。
Acquire::http::Proxy "http://yourproxyaddress:proxyport";
Acquire::https::proxy "http://yourproxyaddress:proxyport";
Acquire::http::Proxy "http://10.11.0.148:808";
Acquire::https::proxy "http://10.11.0.148:808";
设置apt-get的代理
cd /etc/apt
echo 'Acquire::http::Proxy "http://10.11.0.148:808";' >> apt.conf
echo 'Acquire::https::proxy "http://10.11.0.148:808";' >> apt.conf
或者
cd /etc/apt/apt.conf.d
echo 'Acquire::http::Proxy "http://10.11.0.148:808";' >> proxy.conf
echo 'Acquire::https::proxy "http://10.11.0.148:808";' >> proxy.conf
# 系统升级,安装vim编辑器
# apt-get update
[email protected]:/etc/apt/apt.conf.d# apt-get install vim
# 安装keepalived和ping命令
apt-get install keepalived
apt-get install net-tools
apt-get install iputils-ping
keepalived搭建:
keepalived的实现是要在docker服务内创建,最后宿主机中也要创建实现docker内外的连接;
docker服务内创建,我们需要进入到该服务并安装keepalived
# 新建并写入一个keepalived的配置文件
vim /etc/keepalived/keepalived.conf
#取名为K1,可自定义
vrrp_instance VI_1 { #定义节点属性 state MASTER #定义虚拟网卡 interface eth0 #定义组vriid virtual_router_id 100 #定义权重 priority 100 #定义心跳检测时间1秒 advert_int 1 #定义组用户密码 authentication { auth_type PASS auth_pass 123456 } #定义docker内ip地址,必须要在和haproxy同一个网段 virtual_ipaddress { 172.18.0.100 } }
如果配置文件信息都是正确的,通过ip a命令会显示如当前docker服务有的网卡
Ping这个虚拟ip和宿主机网络是通的
最后,再新建一个haproxy再添加slave的keepalive,加入到master中,即完成负载均衡集群的搭建。
新建第二个haproxy容器的配置文件和第一个容器是一样的,需要注意的地方是,在docker run新建容器的时候,由于4001,4002端口和ip都被占用了,所以在run的时候要指定未使用的新端口和ip,比如4003,4004端口等等;
第二个keepalived的配置文件和第一个配置文件完全一样,如果想要分配不同的权重比列,只需要更改权重参数就可以了。
# 启动第二个haproxy取名为 h2
# docker run -it -d -p 4003:8888 -p 4004:3306 -v /data/haproxy02:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.0.8 haproxy
# docker exec -it h2 /bin/bash apt-get update apt-get install vim # apt-get install keepalived apt-get install net-tools apt-get install iputils-ping # vim /etc/keepalived/keepalived.conf vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 100 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 172.18.0.100 } } # service keepalived start
最后,本地宿主机安装keepalived进行外网路由:
宿主机操作:
安装keepalived
yum install -y keepalived
安装完后配置文件本省有自带的在,/etc/keepalived文件夹中,通过ftp替换掉这个配置文件
宿主机Kepalived配置文件信息:
# 进入容器h2,修改keepalived配置
[[email protected] keepalived]# cat /etc/keepalived/keepalived.conf
vrrp_instance VI_1 { state MASTER #这里是宿主机的网卡,可以通过ip a查看当前自己电脑上用的网卡名是哪个 interface eth0 #定义组vrid virtual_router_id 100 #定义权重 priority 100 #定义心跳检测时间3秒 advert_int 3 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { #这里是指定的一个宿主机上的虚拟ip,一定要和宿主机网卡在同一个网段,我的宿主机网卡ip是 10.11.0.218 ,所以指定虚拟ip是给的 218 10.11.0.218 } } #接受监听数据来源的端口,网页入口使用 virtual_server 10.11.0.218 8888 { delay_loop 3 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP #把接受到的数据转发给docker服务的网段及端口,由于是发给docker服务,所以和docker服务数据要一致 real_server 172.18.0.100 8888 { weight 1 } } #接受数据库数据端口,宿主机数据库端口是3306,所以这里也要和宿主机数据接受端口一致 virtual_server 10.11.0.218 3336 { delay_loop 3 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP #同理转发数据库给服务的端口和ip要求和docker服务中的数据在一个网段 real_server 172.18.0.100 3306 { weight 1 } }
配置完后,通过命令service keepalived start启动宿主机的KP,通过ip a查看网卡中是否出现定义的10.11.0.218 这个 IP地址,如果没有出现大多数是配置文件不正确。
通过ping 10.11.0.218 ip地址,发现能够ping通
切换到windows上,进入cmd ping宿主机90ip地址发现能ping通,通过浏览器输入
到此实现了外网访问的负载均衡集群搭建。
在此如果cmd能ping通90ip 而网页无法进入监听界面,问题出现在防火墙上,centos7默认防火墙是没有开启开启vrrp 协议,而keepalived用的是vrrp协议,所以要么让防火强开通vrrp协议,命令:
执行命令1
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface em1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
# 还需要对8888端口和3336端口放行
firewall-cmd --zone=public --add-port=8888/tcp --permanent
firewall-cmd --zone=public --add-port=3336/tcp --permanent
firewall-cmd --reload
或者直接关闭防火墙(实际需要关闭防火墙,不知道是否是因为我这里的环境原有)
systemctl stop firewalld.service
以上防火墙命令只针对于centos7的firewalld,其他防火墙或者linux版本可以自行百度让vrrp协议能够使用即能让网页进入到监听界面
数据库的备份
使用xtrabackup在容器中备份数据
过程:删除之前的一个pxc节点,然后重新启动这个容器,并且映射一个backup目录到宿主机,因为之前启动时是映射到宿主机的v1删除容器node01不会删除里面的数据
还原:
只能执行冷还原,没有热还原,因为正在生产的数据库会产生数据与还原的数据有冲突
Pxc集群的冷还原比较麻烦,步骤如下:
- 停用并删除老的pxc集群和所在的卷
- 启动新的集群节点node1
- 在node1中还原备份的数据
- 然后依赖node1重新部署新的pxc集群