MySQL PXC集群搭建笔记 一

版权声明:原创转载请注明出处,谢谢 https://blog.csdn.net/qq_21108311/article/details/82223269

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

8.30

    上周公司DBA大牛出差让我在公司顶了一周,中间遇到一次问题,一张MySQL的表上存放链接数量超过2亿,使得前端调取短链超时报错,当时处理方案是给短链字段加了索引,加索引花了近两个小时,由于表一共只有四个字段且不会有统计操作,所以加索引的方式可以临时解决查询效率慢问题,这周闲下来准备尝试把这种业务用来做一个集群测试。

    MySQL的集群方式有多种,我公司采用的是MySQL cluster,由于没有足够的案例,本次学习方向选择了MySQL PXC集群,或许后期会学些MySQL replication集群,在此先记录一下PXC集群搭建以此巩固学习。

   为什么会搭建集群,集群是什么?在此之前我知道搭建一群的目的是为了性能更好,当我去深入了解后发现,集群更多的目的是容灾,其次才是性能。容灾,顾名思义是当发生灾难时候有冗余机制能够使得数据库正常运行。实际生产中mysql不可能是一个服务器上部署就完了的,因为一旦服务期宕机或是断网断电等等意外的发生,一个服务器模式会使得整个服务不可用,常见的就是404报错。这对企业生产来说是致命的,所以为了避免意外的发生,产生了集群概念,及我把数据放到多个服务器,当我一个服务器发生意外时,客户的访问会自动切换到其他正常的服务期。在此可能会有另一个疑惑,怎么切换呢?方式是什么呢?

    这里我先提下总体概念:

这是本次我准备搭建的MySQL集群方案,每个PXC都相当于一个独立的服务器,服务器和服务器之间的链接通过PXC软件服务进行强制性同步,保证了每个PXC数据库上的数据一致,如果数据更新不一致会导致整个sql执行失败从而不会更新数据库内容,上层的HA负载均衡是为了保证访问的时候自动分配访问数据库位置,毕竟我们搭建好4台服务器,如果不做负载均衡,大家都访问同一台服务器,那么性能就会太差了,通过HA服务自动分配访问人的数据调用所需服务器,所以负载均衡的目的是为了合理利用服务器性能,而数据的容灾都是在PXC上进行的,MySQL单表数据超过2000万后性能会进行明显的下降,所以为了避免数据量大而产生性能问题,进行了数据切分,数据切分的方式有很多种,而这里采用的是阿里的MYCAT进行数据切分,以上提到的MYCAT,HA,PXC都可已看作是软件的功能实现的,这样可以方便的理解数据库结构。

   当然这只是后端数据库优化结构,对于后端业务代码,前端代码等等,需要中间件等技术,此类后续再进行深入研究。

本次数据库集群的搭建,由于没有这么多的真实的电脑当作服务器来进行模拟搭建环境,采用虚拟机+docker的形式模拟多个服务器运行。

本次采用的配置:

8G内存+i5CPU

虚拟机配置:

2G内存+1核CPU+网络桥接模式

软件配置:

centos 7.4+ docker

具体虚拟机和docker安装不做过多记录。网络连接模式采用桥接的目的是为了在其他电脑上也能访问虚拟机,相关ip配置方法不做记录。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

9.2更新

今天下午把PXC集群成功的搭建运行,记录一下踩过的坑;

安装完docker,整个项目需要用到Java、PXC、haproxy镜像,MySQL集群基础只会用到PXC,所以要先pull,具体方法可以再PXC官网上复制pull命令;

在搭建的过程中,要注意以下几点:

1、目录的映射,卷方法映射

2、网段的设定

3、防火墙端口的设定

为了保证数据不会因为服务down掉而丢失数据,所以我们要把MySQL数据放到宿主机上,docker安装单独的MySQL服务映射方法之前我已经有分享过。这里接触了一个新的概念,卷(volume)映射。我的理解和正常映射的区别在于,数据映射的共享性,即多个不同的docker服务可以用同一套数据。具体可以百度了解。

9.3更新:昨天写卷的时候感觉自己概念还没有理清楚,今天特别查询学习了下。之前我有个docker安装MySQL的笔记上记录了需要映射本地文件夹到docker的MySQL服务中作为数据存储文件夹,其实映射的本地文件夹也是一个卷。docker服务想要绕开docker本身的文件存储机制,只有两种方案:1、docker卷 2、docker卷容器;这两种方案其实原理差不多,就是新建了一个卷空间,绕开docker服务本身的文件存储管理;新建卷的命令参数是 -v ;所以在之前安装mysql把本地文件夹映射到docker服务中用了-v命令;-v命令默认是docker volume,如果指定了本地文件夹,那么卷会直接用本地文件夹当作卷目录,如果没有指定本地文件夹,则需要执行create操作创建卷目录,所以在本文后面,我有命令去创建卷目录;docker创建或指定的卷目录默认是可读可写的,当然也可以指定读写权限,如只读权限需要在目录映射后面加io参数,如:-v /data/mysql:/var/lib.mysql:io ;其他权限方式可以百度命令,当然给到最高权限用 --privileged命令;docker卷容器的主要目的是实现docker多个服务之间的数据共享,可以看作是特殊的docker卷,而普通的docker卷只能单独指定的docker服务使用。这里不做docker卷容器记录,百度上有很多详解。

映射方法是,首先要在宿主机创建一个卷的目录:

docker volume create --name V1

这里我创建了一个名称叫V1的卷目录,这个目录是宿主机上的目录,之后通过docker run创建容器的时候,-e 命令映射到docker服务目录即可;

由于我们这里创建的是集群,所以要给定各个docker服务网段ip,创建命令是:

docker network create net1

这条命令是系统自动分配一个ip网段给到net1,当然我们也可以指定网段,命令是:

docker network create --subnet=172.168.0.0/24 net1

这里我指定了网段是172.168.0.0 名称是net1 ,长度是24位

查看创建好的网段信息命令是(卷信息也是inspect+卷名):

docker inspect net1

Linux自带防火墙firewall,具体防火墙操作百度很详细;

当设定好了卷目录,网段等,下载好了PXC镜像后,就可以创建容器服务了:

docker run -d -p 3306:3306 -v v1:/var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC 
-e XTRABACKUP_PASSWORD=123456 --privileged --name=node1 
--net=net1 --ip 172.168.0.2 pxc

这里的命令-d是指创建容器后后台运行,-p 映射端口, -v 映射文件夹, -e是设定数据库root账户密码, 之后设定cluster集群名称是PXC,集群验证密码,--privileged是映射卷的操作权限,这里代表给映射文件的最高权限,这个参数一定要带,否则可能映射不成功,之后取名容器服务叫node1,用的网段名称是net1,指定一个网段中的具体ip地址,运行镜像名称是pxc

在第一个镜像启动后我们最好等待两分钟,因为镜像启动很快但是mysql服务其实没有那么快,如果第一个镜像mysql服务没有起来我们就创建了第二个镜像并加入第一个镜像的节点组成一个集群,那么第二个服务会直接闪退,所以我们在运行后等两分钟在创建第二个镜像服务

第二个镜像服务命令:

docker run -d -p 3307:3306 -v v2:/var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC 
-e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1
--privileged --name=node2
--net=net1 --ip 172.168.0.3 pxc

这里和第一条命令不同点有,端口,卷,名称,ip地址,还多了一条加入第一个节点的join命令;

由于宿主机3306端口已经被第一个docker服务占用,避免冲突,第二个镜像我给的端口是3307,同理后面新建的服务端口都应该不同,每个服务有自己的卷,所以映射自己的券,在映射之前,首先要create卷出来,我们为了搭建集群,不是为了单独新建服务,所以我们多了一条join第一个服务的命令,并且要给到一个网段内ip不一样的地址

当我们都操作完后进行docker ps:

容器服务正常运行,这里我建了5个节点的集群;

通过本地客户端navicat链接mysql数据库,链接ip是宿主机ip,端口是使用的端口:

通过navicat链接5个节点,链接正常,在DB01上创建test database,刷新DB2 3 4 5,数据库正常同步到各个节点,在DB02中的test库中新建table test刷新DB01,DB01同步了table text,在05上insert一条数据,其他各个数据库正常同步,证实了本次搭建集群成功,PXC集群数据性是强一致性。

猜你喜欢

转载自blog.csdn.net/qq_21108311/article/details/82223269
今日推荐