MySQL集群的搭建

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双机热备方案

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章