haproxy
大约 5 分钟
配套仓库地址:https://gitee.com/orangbus/mysql-cluster
安装
docker pull haproxy
配置文件
配置文件名:haproxy.cfg
可参考:https://zhangge.net/5125.html
#configure haproxy.cfg
global
#工作目录
chroot /usr/local/etc/haproxy
#日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
log 127.0.0.1 local5 info
#守护进程运行
daemon
defaults
log global
mode http
#日志格式
option httplog
#日志中不记录负载均衡的心跳检测记录
option dontlognull
#连接超时(毫秒)
timeout connect 5000
#客户端超时(毫秒)
timeout client 50000
#服务器超时(毫秒)
timeout server 50000
#监控界面
listen admin_stats
#监控界面的访问的IP和端口
bind 0.0.0.0:1080
#访问协议
mode http
#URI相对地址
stats uri /admin
#统计报告格式
stats realm Global\ statistics
#登陆帐户信息
stats auth admin:admin666
#数据库负载均衡
listen proxy-mysql
#访问的IP和端口
bind 0.0.0.0:3320
#网络协议
mode tcp
#负载均衡算法(轮询算法)
#轮询算法:roundrobin
#权重算法:static-rr
#最少连接算法:leastconn
#请求源IP算法:source
balance roundrobin
#日志格式
option tcplog
#在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测
option mysql-check user haproxy
server MySQL_1 172.28.0.2:3306 check weight 1 maxconn 2000
server MySQL_2 172.28.0.3:3306 check weight 1 maxconn 2000
server MySQL_3 172.28.0.4:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
创建容器
docker run -it -d
-p 4001:8888 -p 4002:3306
-v /${pwd}/config/haproxy:/user/local/haproxy
--name haproxy --privileged
--net=net1 # 这里的网络需要和docker-pxc集群的网络是一样的,这样才能通信
haproxy
// 进入haproxy容器启动haproxy
haproxy -f paht/to/haproxy.cfg
haproxy连接
Port:4002
web:8888
心跳检测
创建一个没有权限的用户,用于haproxy的心跳检测使用
CREATE USER 'haproxy'@'%' identified BY '';
数据库热备份
xtrabackup
备份数据卷
docker volume create backup
停止某个节点
docker stop node1
删除这个容器
docker rm node1
虽然删除了这个容器,但是这个容器的数据库我们已经做了持久化存储了,当我们在重新启动一个容器加入到pxc集群的时候,只需要指定之前的node1的数据卷,name之前的数据依旧是存在的
docker run -d
-p 3306:3306
-e MYSQL_ROOT_PASSWORD=123456
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=123456
-v v1:/var/lib/mysql # 指定之前删除的那个容器的数据款
-v backup:/data # 新增的备份数据卷
--privileged
-e CLUSTER_JOIN=node2 # 加入到pxc集群里面的任意一个节点
--name=node1 --net=net1
--ip=172.18.0.2 pxc
安装xtraback
在容器中安装备份工具
apt-get intall percona-xtrabackup-24
备份数据
innobackupex --user=root --password=123456 /data/back/full
数据还原
先删除之前的pxc集群,重新新建一个pxc集群
rm -rf /var/lib/mysql/*
提交为执行完的事务
innobackupex --user=root --password=123456 --apple-back /data/baclup/full/2021-01-01
冷备份
innobackupex --user=root --password=123456 --copy-back /data/baclup/full/2021-01-01
keepalived
haproxy安装
apt-get update
apt-get install keeplived
配置文件
/etc/keepalived/keepalived.conf
主服务
备用
启动
service keepalived start
负载均衡-HAProxy
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案,包括Twitter,Reddit,StackOverflow,GitHub在内的多家知名互联网公司在使用。HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。
3.5.1 安装HAProxy
//下载依赖包
yum install gcc vim wget
//上传haproxy源码包
//解压
tar -zxvf haproxy-1.6.5.tar.gz -C /usr/local
//进入目录、进行编译、安装
cd /usr/local/haproxy-1.6.5
make TARGET=linux31 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
mkdir /etc/haproxy
//赋权
groupadd -r -g 149 haproxy
useradd -g haproxy -r -s /sbin/nologin -u 149 haproxy
//创建haproxy配置文件
mkdir /etc/haproxy
vim /etc/haproxy/haproxy.cfg
3.5.2 配置HAProxy
配置文件路径:/etc/haproxy/haproxy.cfg
#logging options
global
log 127.0.0.1 local0 info
maxconn 5120
chroot /usr/local/haproxy
uid 99
gid 99
daemon
quiet
nbproc 20
pidfile /var/run/haproxy.pid
defaults
log global
mode tcp
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5s
clitimeout 60s
srvtimeout 15s
#front-end IP for consumers and producters
listen rabbitmq_cluster
bind 0.0.0.0:5672
mode tcp
#balance url_param userid
#balance url_param session_id check_post 64
#balance hdr(User-Agent)
#balance hdr(host)
#balance hdr(Host) use_domain_only
#balance rdp-cookie
#balance leastconn
#balance source //ip
balance roundrobin
server node1 127.0.0.1:5673 check inter 5000 rise 2 fall 2
server node2 127.0.0.1:5674 check inter 5000 rise 2 fall 2
listen stats
bind 172.16.98.133:8100
mode http
option httplog
stats enable
stats uri /rabbitmq-stats
stats refresh 5s
启动HAproxy负载
/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
//查看haproxy进程状态
ps -ef | grep haproxy
访问如下地址对mq节点进行监控
http://172.16.98.133:8100/rabbitmq-stats
代码中访问mq集群地址,则变为访问haproxy地址:5672
docker-compose
version: "3.5"
networks:
pxc:
driver: bridge
volumes:
data:
driver: local
services:
node1:
image: perconalab/percona-xtradb-cluster:5.7
container_name: "${node_name}"
privileged: true
ports:
- "${port}:3306"
environment:
- MYSQL_ROOT_PASSWORD=${password}
- CLUSTER_NAME=PXC_ClUSTER
- XTRABACKUP_PASSWORD=${password}
volumes:
- ${node1_data}:/var/lib/mysql:rw
networks:
- pxc
node2:
image: perconalab/percona-xtradb-cluster:5.7
container_name: "node2"
privileged: true
environment:
- MYSQL_ROOT_PASSWORD=${password}:wq
- CLUSTER_NAME=PXC_ClUSTER
- XTRABACKUP_PASSWORD=${password}
- CLUSTER_JOIN=${node_name}
volumes:
- ${node2_data}:/var/lib/mysql:rw
ports:
- "3307:3306"
depends_on:
- node1
networks:
- pxc
node3:
image: perconalab/percona-xtradb-cluster:5.7
container_name: "node3"
privileged: true
environment:
- MYSQL_ROOT_PASSWORD=${password}
- CLUSTER_NAME=PXC_ClUSTER
- XTRABACKUP_PASSWORD=${password}
- CLUSTER_JOIN=${node_name}
volumes:
- ${node3_data}:/var/lib/mysql:rw
ports:
- "3308:3306"
depends_on:
- node2
networks:
- pxc
ha:
image: haproxy:1.9.3
container_name: haproxy
ports:
- 4001:4001
- 4002:4002
volumes:
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
links:
- node1
- node2
- node3
networks:
- pxc
# 数据库账号密码
password=admin666
port=3306
node_name=node1
# 数据保存位置
node1_data=./data/node1
node2_data=./data/node2
node3_data=./data/node3
haproxy.cfg配置文件
#configure haproxy.cfg
global
#工作目录
chroot /usr/local/etc/haproxy
#日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
log 127.0.0.1 local5 info
#守护进程运行
daemon
defaults
log global
mode http
#日志格式
option httplog
#日志中不记录负载均衡的心跳检测记录
option dontlognull
#连接超时(毫秒)
timeout connect 5000
#客户端超时(毫秒)
timeout client 50000
#服务器超时(毫秒)
timeout server 50000
#监控界面
listen admin_stats
#监控界面的访问的IP和端口
bind 0.0.0.0:4001
#访问协议
mode http
#URI相对地址
stats uri /admin
#统计报告格式
stats realm Global\ statistics
#登陆帐户信息
stats auth admin:admin666
#数据库负载均衡
listen proxy-mysql
#访问的IP和端口
bind 0.0.0.0:4002
#网络协议
mode tcp
#负载均衡算法(轮询算法)
#轮询算法:roundrobin
#权重算法:static-rr
#最少连接算法:leastconn
#请求源IP算法:source
balance roundrobin
#日志格式
option tcplog
#在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测
option mysql-check user haproxy
server MySQL_1 node1:3306 check weight 1 maxconn 2000 # 服务器名称+端口(3306,不是映射端口)
server MySQL_2 node2:3306 check weight 1 maxconn 2000
server MySQL_3 node3:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka