基于docker搭建mysql的pxc集群+haproxy+keepalived的高可用(1️⃣)

搭建之前在我们先说说为什么要搭建这样的集群

(1)	那是因为单节点数据库服务器无法满足增长的读写请求;
(2)	单节点数据库服务器没有冗余设计,无法满足高可用特性;	

就拿2018年的双十一说吧,天猫的订单量忒大:2018天猫双11的交易额快速攀升中, 2分05秒交易额突破100亿元,26分03秒2018天猫双11全球狂欢节成交额超500亿元。1小时16分37秒,2018天猫双11全球狂欢节成交额超912亿元。想想都可怕,这么多。
那么问题来了,就凭你一个单节点数据库就能处理好交易额这么多的背后的数据吗?
所以就需要用mysql集群方案来解决了。

常见的mysql集群方案

基于docker搭建mysql的pxc集群+haproxy+keepalived的高可用(1️⃣)_第1张图片

Percona XtraDB Cluster 特性
同步复制,事务要么在所有节点提交或不提交
节点自动配置
在从服务器上并行应用事件,真正意义上的并行复制
多主复制,可以在任意节点进行写操作
数据一致性,不再是异步复制
Percona XtraDB Cluster完全兼容MySQL和Percona Server
	PXC的优点:
	①:实现mysql数据库集群架构的高可用性和数据的 强一致性。

	②:完成了真正的多节点读写的集群方案。

	③:改善了传统意义上的主从复制延迟问题,基本上达到了实时同步。

	④:新加入的节点可以自动部署,无须提供手动备份,维护起来很方便。

	⑤:由于是多节点写入,所以数据库故障切换很容易。



	PXC的缺点:

	①:新加入的节点开销大,需要复制完整的数据。采用SST传输开销太大。

	②:任何更新事务都需要全局验证通过,才会在每个节点库上执行。集群性能受限于			性能最差的节点,也就是经常说的短板效应。

	③:因为需要保证数据的一致性,所以在多节点并发写时,锁冲突问题比较严重。

	④:存在写扩大问题,所有的节点上都会发生些操作。

	⑤:只支持innodb存储引擎的表。

	⑥:没有表级别的锁定,执行DDL语句操作会把整个集群锁住,而且也 kill 不了(建议		使用Osc操作,即在线DDL)

	⑦:所有的表必须含有主键,不然操作数据时会报错

我们先搭建pxc集群

1️⃣首先我们先拉取镜像

docker pull percona/percona-xtradb-cluster

2️⃣我们给镜像改个名字他太长了

docker tag percona/percona-xtradb-cluster pxc

3️⃣现在我们创建一个内部网络,这个网段外部是无法直接访问的,可以通过Docker开放的端口供外部访问。

docker network create --subnet=172.18.0.0/16 net1

现在我们可以查看一下网络信息

docker inspect net1

基于docker搭建mysql的pxc集群+haproxy+keepalived的高可用(1️⃣)_第2张图片

4️⃣创建容器pxc节点(这里咱创建一个5节点的pxc集群)
(1)首先你得创建数据卷(将来给用户挂载mysql数据)

docker volume create v1
docker volume create v2
docker volume create v3
docker volume create v4
docker volume create v5
docker volume create --name backup 					将来用于热备

(2)查看数据卷创建是否成功

docker inspect volume ls

(3)创建pxc容器

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql -v backup:/data --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc
docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc
docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql -v backup:/data --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc
-d 后台启动 -p 3306:3306 端口映射
-e MYSQL_ROOT_PASSWORD=root 指定数据库密码 -e XTRABACKUP_PASSWORD=root 指定集群之间同步需要的密码
-e CLUSTER_NAME=PXC 指定集群名称 -v v1:/var/lib/mysql 把刚刚创建的数据卷挂载到mysql中
–name=node1 指定容器名称 –net=net1 指定网段

5️⃣然后客户端连接测试连接上node1创建一个数据库test然后再看其余节点有没有同步
基于docker搭建mysql的pxc集群+haproxy+keepalived的高可用(1️⃣)_第3张图片

现在测试联通,好我们在node1 中创建test数据库

基于docker搭建mysql的pxc集群+haproxy+keepalived的高可用(1️⃣)_第4张图片

然后我们在查看其余节点有没有同步(小伙成败在此一举)

基于docker搭建mysql的pxc集群+haproxy+keepalived的高可用(1️⃣)_第5张图片
OK,奈斯!!

基于docker搭建mysql的pxc集群+haproxy+keepalived的高可用(2️⃣)

你可能感兴趣的:(docker,mysql,环境搭建)