1、为什么要搭建MySQL集群呢,首先来简单说一下单节点数据库的弊病
大型互联网程序用户群体庞大,所以架构必须要特殊设计;
单节点的数据库无法满足性能上的要求;
单节点的数据库没有冗余设计,无法满足高可用。
2、常见MySQL集群方案
- Repliaction 集群方案
- PXC 集群方案( Percona XtraDB Cluster )
1)Repliaction 集群方案
PXC方案在任何一个节点写入的数据都会同步到其他节点,数据双向同步的(在任何节点上都可以同时读写)。
2)Repliaction 集群方案
Replication方案只能在Master数据库进行写操作,在Slave数据库进行读操作。如果在Slave数据库中写入数据,Master数据库是不能知道的(单向同步的)。
3)PXC 数据的强一致性
PXC 采用同步复制,事务在所有集群节点要么同时提交,要么不提交。
当一个写入请求到达PXC集群中的一个 mysql(node1数据库) 数据库时,node1数据库会将该写入请求同步给集群中的其他所有数据库,等待所有数据库都成功提交事务后,node1节点才会将写入成功的结果告诉给 node1的客户端。
Replication 采用异步复制,无法保证数据的一致性。
当一个写入请求到达 Master数据库时,Master数据库执行写入操作,然后 Master 向客户端返回写入成功,同时异步的复制写入操作给 Slave数据库,如果异步复制时出现问题,从数据库将无法执行写入操作,而客户端得到的是写入成功。这也是弱一致性的体现。
3、搭建PXC的MySQL集群--数据强一致性
1)PXC集群安装介绍
Docker的镜像仓库中包含了PXC数据库的镜像,下载即可
https://hub.docker.com/r/percona/percona-xtradb-cluster/
2)安装PXC镜像
下载镜像
docker pull percona/percona-xtradb-cluster
#建议使用5.7.21PXC镜像
docker pull percona/percona-xtradb-cluster:5.7.21
#修改镜像名字,将镜像名字修改一下,便于使用
docker tag percona/percona-xtradb-cluster:5.7.21 pxc
#删除镜像
docker rmi percona/percona-xtradb-cluster:5.7.21
3)出于安全考虑,需要给PXC集群实例创建Docker内部网络
docker network create net1
docker network inspect net1
docker network rm net1
4)创建Docker卷
容器中的PXC节点映射数据目录的解决办法
docker volume create --name v1
5)创建PXC容器
只需要向PXC镜像传入运行参数就能创建出PXC容器
docker run -d\
--name node1\
-p 3306:3306\
-v v1:/var/lib/mysql\
-e MYSQL_ROOT_PASSWORD=abc123456\
-e CLUSTER_NAME=PXC\
-e XTRABACKUP_PASSWORD=abc123456\
--net net1\
--ip 172.18.0.2\
--privileged\
docker.io/percona/percona-xtradb-cluster:5.7.21
docker run -d\
--name node2\
-p 3307:3306\
-v v2:/var/lib/mysql\
-e MYSQL_ROOT_PASSWORD=abc123456\
-e CLUSTER_NAME=PXC\
-e XTRABACKUP_PASSWORD=abc123456\
-e CLUSTER_JOIN=node1\
--net net1\
--ip 172.18.0.3\
--privileged\
docker.io/percona/percona-xtradb-cluster:5.7.21
docker run -d\
--name node3\
-p 3308:3306\
-v v3:/var/lib/mysql\
-e MYSQL_ROOT_PASSWORD=abc123456\
-e CLUSTER_NAME=PXC\
-e XTRABACKUP_PASSWORD=abc123456\
-e CLUSTER_JOIN=node1\
--net net1\
--ip 172.18.0.4\
--privileged\
docker.io/percona/percona-xtradb-cluster:5.7.21
docker run -d\
--name node4\
-p 3309:3306\
-v v4:/var/lib/mysql\
-e MYSQL_ROOT_PASSWORD=abc123456\
-e CLUSTER_NAME=PXC\
-e XTRABACKUP_PASSWORD=abc123456\
-e CLUSTER_JOIN=node1\
--net net1\
--ip 172.18.0.5\
--privileged\
docker.io/percona/percona-xtradb-cluster:5.7.21
docker run -d\
--name node5\
-p 3310:3306\
-v v5:/var/lib/mysql\
-e MYSQL_ROOT_PASSWORD=abc123456\
-e CLUSTER_NAME=PXC\
-e XTRABACKUP_PASSWORD=abc123456\
-e CLUSTER_JOIN=node1\
--net net1\
--ip 172.18.0.6\
--privileged\
docker.io/percona/percona-xtradb-cluster:5.7.21
查看创建的5个pxc容器
4、数据库负载均衡
使用Haproxy做负载均衡,请求被均匀发给每个节点,单节点负载低,性能好。
Docker仓库中保存了Haproxy的镜像
docker pull haproxy
创建Haproxy配置文件,配置文件详情参考https://zhang.ge/5125.html
touch /home/soft/haproxy/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:8888
#访问协议
mode http
#URI相对地址
stats uri /dbs
#统计报告格式
stats realm Global\ statistics
#登陆帐户信息
stats auth admin:abc123456
#数据库负载均衡
listen proxy-mysql
#访问的IP和端口
bind 0.0.0.0:3306
#网络协议
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.18.0.2:3306 check weight 1 maxconn 2000
server MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000
server MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000
server MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000
server MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
创建容器
docker run -d\
-p 4001:8888\
-p 4002:3306\
-v /home/soft/haproxy:/usr/local/etc/haproxy\
--name h1\
--privileged\
--net=net1\
--ip=172.18.0.7\
docker.io/haproxy
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
配置完成之后,查看一下监控画面
http://192.168.0.103:4001/dbs
5、高可用方案
为什么要采用双机热备?单节点Haproxy不具备高可用,必须冗余设计。
利用Keepalived实现双机热备
Haproxy双机热备方案