利用Docker搭建Mysql 5.7强一致性集群解决方案实战

前言

最近一周在学习Docker技术,以前工作中用过Docker,K8S,实质上对于Docker 的认知只停留在是一种容器技术,对于Docker网络,宿主机目录挂载等内容只停留在使用上,并没有什么本质上的认知。本篇文章旨在利用Docker解决一个需求:部署一个Mysql集群,集群数据强一致性。

拓展:Mysql 高可用,弱一致性集群搭建解决方案之:Replication

搭建Mysql集群,首先想到的是Replication解决方案。如下图:
在这里插入图片描述Replication 原理如上图所示:集群中一台Mysql 执行事务成功,事务提交之后同步到集群其他的Mysql中,但是如果这个过程有延迟或者同步数据失败,就会导致集群中数据不一致的情况出现。Replication提供高可用的解决方案,强一致性方面并不是特别突出,但是这种方案并不是没有可用的地方,比如说在一些论坛系统,评论信息等强一致要求不高的地方。

主角:Mysql强一致集群搭建解决方案:percona-xtradb-cluster

由于Replication的缺点特别明显,在一些需要强一致性的场景并不适合,比如说订单系统,需要高度强一致,Replication就显得有些鸡肋。但是,总有一些“好事者”来解决这个问题。因此,今天的主角就是percona-xtradb-cluster-Mysql强一致集群搭建解决方案。percona-xtradb-cluster是Docker hub 上一个开源的Mysql 强一致性集群搭建镜像,利用这个镜像,可以快速的搭建Mysql集群。

实操:percona-xtradb-cluster

0. 实战之前要思考三个问题,我将围绕这个三个问题,搭建集群
1. 网络怎么做?
2. 数据库持久化怎么做?
3. 容器如何启动?

1. 首先要有一个Docker环境

在这里插入图片描述

2. 宿主机建一个网段

这个操作需要对网络,docker网络有一定的知识储备,建网段就是为了让docker mysql集群之间通过名字互相联通,所以要公用一个网段。

docker network create --subnet=172.18.0.0/24 pxc-net

在这里插入图片描述

3. Mysql 持久化存储

Mysql 运行,数据不做持久化的情况下,数据是存储在container 中的,假如不小心误删了这个 container,那么数据库中的数据将会全部丢失。对docker有了解的就知道,docker 有持久化机制,我们可以把mysql内部的数据存储持久化到宿主机或者别的地方,在误删的情况下,重新创建实例,也能恢复以前的数据。因此我们要创建三个持久化 volume(集群实例三台)

docker volume create --name v1
docker volume create --name v2
docker volume create --name v3

在这里插入图片描述

4. 获取percona-xtradb-cluster Image

我们都是有经验的开发人员,很明显我们要去 DockerHub上搜索这个镜像,拉取我们需要的mysql版本,在此感谢“好事者”的贡献,谢谢。

docker pull percona/percona-xtradb-cluster:5.7.21
// 打标签纯粹是为了名字好写。没有别的意义。
docker tag percona/percona-xtradb-cluster:5.7.21 pxc

在这里插入图片描述
在这里插入图片描述

5. 启动

docker run -d -p 3301:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=U@erN0me -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=U@erN0me --privileged --name=node1 --net=pxc-net --ip 172.18.0.2 pxc
docker run -d -p 3302:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=U@erN0me -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=U@erN0me --privileged --name=node2 -e CLUSTER_JOIN=node1 --net=pxc-net --ip 172.18.0.3 pxc
docker run -d -p 3303:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=U@erN0me -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=U@erN0me --privileged --name=node3 -e CLUSTER_JOIN=node1 --net=pxc-net --ip 172.18.0.4 pxc

在这里插入图片描述
参数解析:

  1. -v v1:/var/lib/mysql : 了解mysql image 的 Dockerfile 文件的应该知道,里面是把数据存储到了容器内部的/var/lib/mysql 目录。所以我们要把这个目录持久化道v1
  2. -p 3301:3306 : mysql容器 3306端口映射到宿主机的3301端口
  3. -e MYSQL_ROOT_PASSWORD=U@erN0me : 设置mysql 登陆密码
  4. -e CLUSTER_NAME=PXC :设置集群名字
  5. -e XTRABACKUP_PASSWORD=U@erN0me :设置集群互相同步的密码
  6. –privileged : 容器权限
  7. –name=node1 : 容器名字
  8. –net=pxc-net : 容器网络,pxc-net 是自建的网络
  9. –ip 172.18.0.2 : 指定容器ip地址
  10. -e CLUSTER_JOIN=node1 : 我们是先启动第一台mysql node1 ,要想实现node2,node3 和node1之间的同步,甚至是三者之间的互相同步,需要使用CLUSTER_JOIN 这个参数,把他们连接起来,所以node2,node3 启动命令比node1多了这个参数。如果没有这个参数,那么就部署的就不是集群。

客户端验证

利用数据库客户端工具,例如 Navicat 连接这个三台mysql,在任意一个节点上建一个test 库,库里建一个test表,刷新另外两个节点,会看到数据已经同步。至此,mysql 集群已经搭建完毕!
在这里插入图片描述

原创文章 29 获赞 81 访问量 1万+

猜你喜欢

转载自blog.csdn.net/cuixhao110/article/details/105572868