[经验分享] MySQL如何在主从模式之间自由应变

作者: 邓伟
2016-12-23
715
原创

众所周知,MySQL支持主从模式也就是使用一台MySQL服务器作为主服务器,再用一台或多台MySQL服务器充当从服务器,主、从服务器作为一个整体参与到应用之中。


【主从模式的三大优点】

支持读写分离,降低数据库负荷。

通常情况下,会使用主服务器对数据进行更新、删除和新建等操作,而将查询工作落到从库头上。

异地灾备。 

可以将主服务器上的数据同步到异地从服务器上,极大地提高了数据安全性。

提高数据库系统的可用性。

数据库的复制功能实现了主服务器与从服务器间的数据同步,一旦主服务器出了故障,从服务器立即担当起主服务器的角色,保障系统持续稳定运作。



【主从切换原理—论从服务器的自我修养】


在生产环境中,稳定运行是首要准则,但天有不测风云,一不小心就搞出主机宕机的状况,此时主从切换显得尤为重要。

要想知道应对MySQL主从切换的,首先我们得了解主从切换到底是怎么一回事?过程中到底发生了什么?下面我们就来一探究竟。

不想当将军的士兵不是好士兵,作为主服务器的跟班,从服务器也期望着有朝一日拥有主服务器的地位。但是,从服务器要想逆袭做主,不单单需要一个机会,更重要的是,如何能把握住到来的机会

从服务器对主服务器是崇拜的,他会刻意模仿主服务器的行为,希冀以此促进自己的成长。


完美复制数据更改
从服务器为了与主服务器的数据保持一致,他需要重现主服务器的数据更改过程,那他如何做到呢?

原来主服务器有个好习惯,把所有的数据更改信息记录到日志文件Binlog中,那从服务器只要拿到这本秘籍,就能复制出与主服务器一模一样的数据信息了。从服务器会主动向主服务器发送一个请求,想要获得Binlog的记录信息。

当然,主服务器也是慷慨的,会满足下属的合理要求,将Binlog信息全无保留的发送给从服务器,从服务器接收到这一宝贵的信息之后,立马记录到自己的小本本——RelayLog文件中,然后仔细研读这些信息,使这些操作得以重现,最后也要仿照领导,建立属于自己的Binlog文件,保存好自身的数据更改信息。


运用神奇的GTID
要知道主服务器在Binlog中存放了大量信息,而从服务器显然只需求缺少的那部分Binlog信息,那该怎么办?

主、从商量之后,决定给每条Binlog信息都添加一个双方都认识的自增编号,让主服务器中所有的Binlog信息有序排列,这样在从服务器下一次请求时,只需告诉主服务器我现在使用的Binlog编号是多少,主服务器就明白哪些信息是从服务器需要的了。

这个编号我们将它命名为GTID(Global Transaction ID),作为一个全局事务的ID,必须保证其全局唯一性,每台MySQL服务器都会有属于自己的服务器ID,称之为server_uuid,而每一条Binlog信息都以事务为单位,也拥有相应的事务ID,称之为transaction_id,我们将两者相结合就产生了GTID,即GTID=server_uuid:transaction_id

我们也许会好奇,主、从服务器之间是如何约定这个神奇的GTID的,这就要谈谈GTID在主、从服务器间的交互了。当主服务器上成功执行并提交了一个事务的时候,主服务器会为这个事务分配一个尚不存在的最小的非0序号,也就是transaction_id,从而生成GTID。

从服务器会将请求到的Binlog信息放到自己的Relay-log中,在应用这条Binlog时,会对该条Binlog的GTID值加一个特权,表明从服务器执行的下一个事务必须使用这一GTID值,而从服务器将要执行的就是请求到的Binlog中的事务行为,这样就保证了全局环境中同一个事务的GTID不变。

也就是说GTID足以标明全局中的每条Binlog信息,这就带来了另一大好处,从服务器不会把同一条Binlog信息重复执行,保证数据复制的正确性。

从服务器怀揣着翻身做主的梦,恪尽职守,然而现实太残酷,上演了一幕壮志未酬身先死,是的,从服务器宕机了。我们当然会将从服务器拯救回来,但这需要时间啊,在这段宝贵的时间里,主服务器是不会停止前进的脚步的,Binlog信息仍在持续增加,那么重获新生的从服务器又该如何快速追上主服务器的步伐?

幸好有GTID的存在,能让从服务器立马明白自己和主服务器的差距,从正确的点位开始追赶,用不了多久,就又与主服务器数据一致了。


成功上位

看到从服务器这么努力,主服务器深受感动,决定与从服务器来次身份互换,让从服务器过过做主的瘾,同时也能考察下从服务器是否具备做主的能力。身份调换之前,主服务器会对表上锁,保证调换期间,不会写进新的数据。

从服务器先停止从服务器IO线程,此期间,会应用完RelayLog中的所有信息,保证主、从数据完全一致。接下来,主、从服务器都会把自身的Binlog文件清除掉,建立起新的Binlog文件,再将之前两者的交互信息删干净,此时,可以重新建立主从连接了,从服务器俨然成为新一代主服务器,而原主服务器也解开之前的表锁,担起了从服务器的角色,事实证明,这是一次完美的试炼。

一路披荆斩棘的前行,有一天,从服务器的机会终于到来,主服务器宕机了,是时候退位让贤了,这时的从服务器完全有能力承担主服务器的职责, 此刻,我们称其为新的主服务器。一个合格的主服务器要有从服务器搭配才行,我们再给他配个小弟。到这里,一个新的主、从组合诞生,继续维持着系统的平稳运行。


至此我们已经清楚MySQL主从切换的核心就是GTID,无论主从实例如何切换,只要牢牢把握住GTID的特性,就能以不变应万变!


版权所有 侵权必究

如需转载请联系

0571-28829811