当前位置: 首页 > 科技观察

老司机带你在MySQL领域“大吉大利,晚上吃鸡”

时间:2023-03-22 12:51:00 科技观察

老司机带你去MySQL领域“大吉大利,晚上吃鸡”。“吃鸡”啊!想必很多老手也玩过,所以肯定知道绝地求生中有一把叫做AWM的枪。这把枪的伤害是132点,爆头是330,三级爆头就算是致命的,如果没有防弹衣或者防弹衣破损的话,一枪打死你。是本游戏最强的狙击手×××,足足是98K的两倍。那么MySQL领域有这么厉害的“枪”吗?答案是一定有!但是老张先问你一个问题。当你设置MySQL复制的时候,你还在进行备份和恢复,你还在进行changemastertoslavedatabase操作吗?如果是这样,那么你真的落后了。本章介绍MySQL官方推荐的高可用集群方案MySQLGroupReplication。缩写:MGR(组复制)。是官方推出的基于Paxos协议的状态机复制,彻底解决了传统异步半同步复制无法保证数据一致性的问题。也让MySQL数据库覆盖了更广泛的领域,彻底打开了互联网金融行业的大门。2016年12月,MySQLGroupReplication在MySQL5.7.17发布第一个GA版本。但是直接在生产环境中使用还是比较有风险的。建议等它越来越成熟后再真正投入使用。随着MySQL8.0版本即将与我们见面,再加上官方逐渐成熟的高可用集群GroupReplication方案,到时候就看谁还是我们MySQL的对手了,一网打尽!MySQL数据库是作者的信仰,爱你无怨无悔。MGR组复制的原理首先说一下什么叫组复制。组复制是一种可用于实现容错系统的技术。复制组是一组通过消息传递相互交互的服务器。复制组由多个服务器成员组成,如下图中的master1、master2、master3,所有成员独立完成自己的事务。当客户端首次发起更新事务时,首先在本地执行事务,执行完成后,会发起事务的commit操作。在实际提交之前,需要将生成的复制写集广播并复制给其他成员。如果冲突检测成功,则该组决定事务可以提交,其他成员可以申请,否则回滚。最终,这意味着所有组成员都以相同的顺序接收相同的交易集。因此,组内成员以相同的顺序应用相同的修改,保证组内的数据强一致性。MGR组复制模式组复制可以在两种模式下运行。单主模式下,组复制具有自动选主的功能。每次只有一个服务器成员接受更新,其他成员只提供读服务。在多主模式下运行时,所有服务器成员可以同时接受更新,没有主从之分,成员角色完全平等。默认情况下,组复制是单主模式,我们可以通过设置参数group_replication_single_primary_mode=off使其成为多主模式。本章的实战部分是在多主模式下搭建MGR复制。MGR特性介绍完成了真正的多节点读写集群解决方案。基于原生复制和Paxos协议的组复制技术,并以插件形式提供,实现数据强一致性由于多节点读写,故障转移切换变得更容易添加和删除节点,自动完成数据同步和内部更新群信息操纵。增强的可扩展性虽然在MGR的多主模式下,受限于无法支持串行隔离级别和外键级联操作。而且在目前的MySQL版本中,DDL语句操作无法回滚,导致MGR无法对DDL语句进行数据冲突检查。因此,在MGR中并发执行DDL语句存在隐患。但这些都无法阻挡MGR的发布所带来的开启新时代的意义。让我们共同期待这款追求极致完美的MySQL数据库,未来更加美好。MGR简介搭建实际环境:这里准备三个节点,数据库版本使用MySQL5.7.17数据库IP地址数据库版本信息主机名Server-id192.168.56.101MySQL-5.7.17node21013306192.168.56.102MySQL-5.7。17node31023306192.168.56.103MySQL-5.7.17proxysql1033306实战第一步:在三个节点上安装MySQL5.7。(此步骤省略,详见本书第一部分第二章)实际步骤2:在三个节点上设置hostname和ip地址的映射关系。实际步骤3:在三个节点上创建复制账户,命令如下:GRANTREPLICATIONSLAVEON*.*TO'repl'@'192.168.56.%'IDENTIFIEDBY'123456';实战第四步:分别在三个节点上安装GR插件,命令如下INSTALLPLUGINgroup_replicationSONAME'group_replication.so';组件安装完成后,显示结果:root@db13:23:[(none)]>showplugins;实战第五步:在三个节点上配置各自的集群参数文件,配置完成后重启数据库。192.168.56.101parameterfileconfigurationdisplay:(剩下两个节点同理)GroupReplicationserver_id=1013306gtid_mode=ONenforce_gtid_consistency=ONmaster_info_repository=TABLErelay_log_info_repository=TABLEbinlog_checksum=NONElog_slave_updates=ONlog_bin=binlogbinlog_format=ROWtransaction_write_set_extraction=XXHASH64loose-group_replication_group_name='1f2cee29-f9a2-11e7-8cbb-08002783b39d'loose-group_replication_start_on_boot=offloose-group_replication_local_address='node2:33061'loose-group_replication_group_seeds='node2:33061,node3:33062,proxysql:33063'loose-group_replication_bootstrap_group=offloose-group_replication_single_groupen_offprimary_groupupdate_everywhere_checks=true关键参数详情:(必须记住这些)MGR必须开启GTID功能gtid_mode=ON,enforce_gtid_consistency=ONMGR在当前MySQL版本中,必须设置binlog_checksum=none,binlog_format=rowMGR需要多源复制功能,因此,需要将主从库之间的信息记录到表中,设置master_info_repository=TABLE和relay_log_info_repository=TABLEMGR开启主键信息收集功能:transaction_write_set_extraction=XXHASH64MGR禁用参数group_replication_single_primary_mode构建多主模式.如果构建单主体模型,请保留默认参数。group的名字需要在MGR中设置,group_replication_group_name是通过selectuuid()生成的。MGR中本地成员的地址由参数group_replication_local_address决定。在这个例子中,当前节点是node2。后一个端口是每个节点需要一个独立的tcp端口号,节点间通过这个端口号进行通信。MGR中其他成员的地址由参数group_replication_group_seeds决定。MGR采用多主模式时,需要设置参数group_replication_single_primary_mode=off(默认为单主模式)。同时需要设置参数group_replication_enforce_update_everywhere_checks=true。目的是做多主模式的极限检测。注意:要加载到参数文件中,需要在每个参数前加上loose。这里再次强调一个参数group_replication_auto_increment_increment。该参数表示一个自增属性,默认值为7。我们需要保证每个成员的值都相同,建议该参数的设置大于组内成员数尽量多一些,方便后面集群的扩展。实际步骤6:启动192.168.56.101上第一个节点的MGR集群服务。命令如下:CHANGEMASTERTOMASTER_USER='repl',MASTER_PASSWORD='123456'FORCHANNEL'group_replication_recovery'(MGR需要这个异步复制通道来实现新节点加入集群时自动从其他节点复制数据的目的,不需要手动指定从哪个节点复制,master_host和master_port信息。两者都是自动完成的)SETGLOBALgroup_replication_bootstrap_group=ON;(执行初始化操作,只有第一个节点需要这一步)STARTGROUP_REPLICATION;启动成功后,查看节点状态信息。命令如下SELECT*FROMperformance_schema.replication_group_members;关闭初始化操作命令如下:SETGLOBALgroup_replication_bootstrap_group=off;注意:replication_group_members表中MEMBER_STATE字段的状态为ONLINE,然后执行close初始化命令。实际步骤7:启动192.168.56.102上第二个节点的mgr集群服务。命令如下CHANGEMASTERTOMASTER_USER='repl',MASTER_PASSWORD='123456'FORCHANNEL'group_replication_recovery';setglobalgroup_replication_allow_local_disjoint_gtids_join=ON;STARTGROUP_REPLICATION;启动成功后查看节点状态信息。命令如下SELECT*FROMperformance_schema.replication_group_members;实战第8步:在192.168.56.103上启动第三个节点的mgr集群服务。命令如下CHANGEMASTERTOMASTER_USER='repl',MASTER_PASSWORD='123456'FORCHANNEL'group_replication_recovery';setglobalgroup_replication_allow_local_disjoint_gtids_join=ON;STARTGROUP_REPLICATION;启动成功后查看节点状态信息。命令如下:SELECT*FROMperformance_schema.replication_group_members;可以看到启动成功后,三个成员的状态都是ONLINE,证明已经开始正常工作了。真正可以实现多节点读写操作。以上就是MGR多主模式的原理和构建过程的介绍。我们要有能力去学习新知识,多实践,多实践,从中得到它的真谛,感受MySQL带给我们的简单快乐!以后会发布更多的技术文章,大家多多交流!