为PXC集群引入Mycat并构建完整的高可用集群架构


在CentOS8下搭建PXC集群一文中,演示了如何从零开始搭建一个三节点的PXC集群。但是光搭建了PXC集群还不够,因为在实际的企业应用中,可能会存在多个PXC集群,每个集群作为一个数据分片存在。因此,在完整的架构下我们还需要为集群引入数据库中间件,以实现数据分片和负载均衡等功能。市面上有许多的数据库中间件,这些中间件主要分为两种类型,负载均衡型和数据切分型(通常数据切分型会具备负载均衡功能):负载均衡型中间件的作用:数据切分型中间件的作用:以下是对常见的中间件进行的一个比较:经过上一小节的介绍与比较,可以看出MyCat与ProxySQL是比较理想的数据库中间件。由于MyCat相对于ProxySQL功能更全面,普及率也更高一些,所以这里采用Mycat来做为PXC集群的中间件。关于Mycat的介绍与安装,可以参考我的另一篇Mycat 快速入门,这里就不再重复了。本小节主要介绍如何配置Mycat的数据切分功能,让Mycat作为前端的数据切分中间件转发SQL请求到后端的PXC集群分片中。因此,这里我搭建了两个PXC集群,每个集群就是一个分片,以及搭建了两个Mycat节点和两个Haproxy节点用于后面组建双机热备。如图:
各个节点的信息如下表:在每个分片里创建一个test库,并在该库中创建一张t_user表用作测试,具体的建表SQL如下:完成以上准备后,接着我们开始配置Mycat,如果你对Mycat的配置文件不了解的话,可以参考我另一篇文章:Mycat 核心配置详解,本文就不赘述了。1、编辑server.xml文件,配置Mycat的访问用户:2、编辑schema.xml文件,配置Mycat的逻辑库、逻辑表以及集群节点的连接信息:3、编辑rule.xml文件,修改mod-long分片算法的求模基数,由于只有两个集群作为分片,所以这里需要将基数改为2:完成以上三个文件的配置后,启动Mycat:启动完成后,进入Mycat中执行一条insert语句,测试下是否能将该SQL转发到正确的集群分片上。具体步骤如下:上面这条insert语句插入的是一条id1的记录,而我们采用的是对id列求模的分片算法,配置的求模基数为2。因此,根据id的值和求模基数进行求模计算的结果为:1 % 2 = 1。得出来的1就是分片的索引,所以正常情况下Mycat会将该insert语句转发到分片索引为1的集群上。根据schema.xml文件中的配置,索引为1的分片对应的集群是pxc-cluster2,即第二个PXC集群分片。接下来,我们可以通过对比这两个集群中的数据,以验证Mycat是否按照预期正确地转发了该SQL。从下图中可以看到,Mycat正确地将该insert语句转发到了第二个分片上,此时第一个分片是没有数据的:
接着我们再测试当id2时,Mycat是否能将该SQL转发到第一个分片上。具体的SQL如下:测试结果如图:
在完成以上的测试后,此时在Mycat上是能够查询出所有分片中的数据的:
上一小节的示例中,使用的就是主键求模切分,其特点如下:在Mycat 核心配置详解一文中,也介绍过枚举值切分算法。该算法相对于其他算法来说要用到一个额外的映射文件(mapFile),所以这里就针对该算法的使用进行一个简单的演示。需求:用户表中有一个存储用户所在区号的列,要求将该列作为分片列,实现让不同区号下的用户数据被分别存储到不同的分片中1、首先,在Mycat的rule.xml文件中,增加如下配置:2、在conf目录下创建area-hash-int.txt文件,定义区号与分片索引的对应关系:3、配置schema.xml,增加一个逻辑表,并将其分片规则设置为sharding-by-areafile:4、进入Mycat中执行热加载语句,该语句的作用可以使Mycat不用重启就能应用新的配置:完成以上配置后,我们来建个表测试一下,在所有的集群中创建t_customer表。具体的建表SQL如下:进入Mycat中插入一条area_id020的记录:根据映射文件中的配置,area_id020的数据会被存储到第一个分片中,如下图:
然后再插入一条area_id0763的记录:根据映射文件中的配置,area_id0763的数据会被存储到第二个分片中,如下图:
完成以上测试后,此时在Mycat中应能查询到所有分片中的数据:
当有关联的数据存储在不同的分片时,就会遇到表连接的问题,在Mycat中是不允许跨分片做表连接查询的。为了解决跨分片表连接的问题,Mycat提出了父子表这种解决方案。父子表规定父表可以有任意的切分算法,但与之关联的子表不允许有切分算法,即子表的数据总是与父表的数据存储在一个分片中。父表不管使用什么切分算法,子表总是跟随着父表存储。例如,用户表与订单表是有关联关系的,我们可以将用户表作为父表,订单表作为子表。当A用户被存储至分片1中,那么A用户产生的订单数据也会跟随着存储在分片1中,这样在查询A用户的订单数据时就不需要跨分片了。如下图所示:
了解了父子表的概念后,接下来我们看看如何在Mycat中配置父子表。首先,在s开发云主机域名chema.xml文件中配置父子表关系:childTable标签说明:完成以上配置后,让Mycat重新加载配置文件:接着在所有分片中创建t_orders表,具体的建表SQL如下:现在分片中有两个用户,id1的用户存储在第一个分片,id2的用户存储在第二个分片。此时,通过Mycat插入一条订单记录:由于该订单记录关联的是id1的用户,根据父子表的规定,会被存储至第一个分片中。如下图:
同样,如果订单记录关联的是id2的用户,那么就会被存储至第二个分片中:测试结果如下:
由于父子表的数据都是存储在同一个分片,所以在Mycat上进行关联查询也是没有问题的:
在以上小节的示例中,我们可以看到对后端数据库集群的读写操作都是在Mycat上进行的。Mycat作为一个负责接收客户端请求,并将请求转发到后端数据库集群的中间件,不可避免的需要具备高可用性。否则,如果Mycat出现单点故障,那么整个数据库集群也就无法使用了,这对整个系统的影响是十分巨大的。所以本小节将演示如何去构建一个高可用的Mycat集群,为了搭建Mycat高可用集群,除了要有两个以上的Mycat节点外,还需要引入Haproxy和Keepalived组件。其中Haproxy作为负载均衡组件,位于最前端接收客户端的请求并将请求分发到各个Mycat节点上,用于保证Mycat的高可用。而Keepalived则用于实现双机热备,因为Haproxy也需要高可用,当一个Haproxy宕机时,另一个备用的Haproxy能够马上接替。也就说同一时间下只会有一个Haproxy在运行,另一个Haproxy作为备用处于等待状态。当正在运行中的Haproxy因意外宕机时,Keepalived能够马上将备用的Haproxy切换到运行状态。Keepalived是让主机之间争抢同一个虚拟IP(VIP)来实现高可用的,这些主机分为Master和Backup两种角色,并且Master只有一个,而Backup可以有多个。最开始Master先获取到VIP处于运行状态,当Master宕机后,Backup检测不到Master的情况下就会自动获取到这个VIP,此时发送到该VIP的请求就会被Backup接收到。这样Backup就能无缝接替Master的工作,以实现高可用。引入这些组件后,最终我们的集群架构将演变成这样子:
Haproxy由于是老牌的负载均衡组件了,所以CentOS的yum仓库中自带有该组件的安装包,安装起来就非常简单。安装命令如下:配置Haproxy:由于配置了3306端口用于TCP转发,以及4001作为Haproxy监控界面的访问端口,所以在防火墙上需要开放这两个端口:完成以上步骤后,启动Haproxy服务:然后使用浏览器访问Haproxy的监控界面,初次访问会要求输入用户名密码,这里的用户名密码就是配置文件中所配置的:
登录成功后,就会看到如下页面:
Haproxy的监控界面提供的监控信息也比较全面,在该界面下,我们可以看到每个主机的连接信息及其自身状态。当主机无法连接时,Status一栏会显示DOWN,并且背景色也会变为红色。正常状态下的值则为UP,背景色为绿色。另一个Haproxy节点也是使用以上的步骤进行安装和配置,这里就不再重复了。Haproxy服务搭建起来后,我们来使用远程工具测试一下能否通过Haproxy正常连接到Mycat。如下:
连接成功后,在Haproxy上执行一些SQL语句,看看能否正常插入数据和查询数据:
我们搭建Haproxy是为了让Mycat具备高可用的,所以最后测试一下Mycat是否已具备有高可用性,首先将一个Mycat节点给停掉:此时,从Haproxy的监控界面中,可以看到mycat_01这个节点已经处于下线状态了:
现在集群中还剩一个Mycat节点,然后我们到Haproxy上执行一些SQL语句,看看是否还能正常插入数据和查询数据:
从测试结果可以看到,插入和查询语句依旧是能正常执行的。也就是说即便此时关掉一个Mycat节点整个数据库集群还能够正常使用,说明现在Mycat集群是具有高可用性了。实现了Mycat集群的高可用之后,我们还得实现Haproxy的高可用,因为现在的架构已经从最开始的Mycat面向客户端变为了Haproxy面向客户端。而同一时间只需要存在一个可用的Haproxy,否则客户端就不知道该连哪个Haproxy了。这也是为什么要采用VIP的原因,这种机制能让多个节点互相接替时依旧使用同一个IP,客户端至始至终只需要连接这个VIP。所以实现Haproxy的高可用就要轮到Keepalived出场了,在安装Keepalived之前需要开启防火墙的VRRP协议:然后就可以使用yum命令安装Keepalived了,需要注意Keepalived是安装在Haproxy节点上的:安装完成后,编辑keepalived的配置文件:配置说明:完成以上配置后,启动keepalived服务:当keepalived服务启动成功,使用ip addr命令可以查看到网卡绑定的虚拟IP:
另一个节点也是使用以上的步骤进行安装和配置,这里就不再重复了。以上我们完成了Keepalived的安装与配置,最后我们来测试Keepalived服务是否正常可用,以及测试Haproxy是否已具有高可用性。首先,在其他节点上测试虚拟IP能否正常ping通,如果不能ping通就需要检查配置了。如图,我这里是能正常ping通的:
常见的虚拟IP ping不通的情况:确认能够从外部ping通Keepalived的虚拟IP后,使用Navicat测试能否通过虚拟IP连接到Mycat:
连接成功后,执行一些语句测试能否正常插入、查询数据:
到此就基本没什么问题了,最后测试一下Haproxy的高可用性,将其中一个Haproxy节点上的keepalived服务给关掉:然后再次执行执行一些语句测试能否正常插入、查询数据,如下能正常执行代表Haproxy节点已具有高可用性:

相关推荐: SQL Server 2017 AlwaysOn AG 自动初始化(十一)

何时不使用自动种子设定在某些情况下,自动种子设定可能不是初始化次要副本的最优选择。 自动种子设定过程中,SQL Server 通过网络执行备份以进行初始化。 如果数据库非常大或者次要副本是远程副本,此过程会很缓慢。 在备份过程中,无法截断这些数据库的事务日志,…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 06/06 18:54
下一篇 06/06 18:54

相关推荐