最近,我们对免费和vip邮箱的地址簿进行了升级

 

实际上,主要是升级Mysql数据库

 

对一些表进行了分表(一个大表user_addr按userid进行hash分成若干个小表user_addr_x),分区(按照对应的进行range分区)处理

 

并把一部分数据(主要是最近联系人、临时联系人等信息)转移到Mongodb中存储

 

为了在升级期间,尽可能不影响用户的使用,在和DBA讨论后,使用了如下策略,基本上做到了无缝迁移:

 

  1. 新Mysql服务器Mysql2上启动一个实例,建立相关的表结构,并进行相应的分表和分区。
  2. 在Mysql2上新建一个触发器(根据user_addr表中插入的uid进行hash,确定小表的名字user_addr_x),把主表的数据同步到小表中。

  3. 从Mysql1上dump一份数据,通过一个小程序,将数据分别插入到Mysql2上对应的小表(user_addr_x)中。
  4. 把Mysql2作为Mysql1的一个Slave启动(经DBA测试,Master上普通表可以正常同步到Slave上对应的分区表),这样,用户修改的数据能即时同步到Mysql2对应的小表中。
  5. 准备新的应用程序,实现一个mysql的proxy层,根据uid来获取小表的表明,进而再执行其它的SQL语句。
  6. 新应用程序上线后,自动会往Mysql2中写入,此时断掉Mysql2和Mysql1的同步关系,把Mysql2作为主Master启动。

 

在迁移过程中,DBA还使用了Mysql的BlackHole存储引擎,主要因为Mysql1上还有其它的DB,而我们只需要同步地址簿的DB

 

于是,DBA将其它库表的引擎都设置成了BlackHole,这样,虽然会执行二进制log的sql,但实际上并不会把数据写入真正的DB

 

另外,分表之后,对于之前我们使用的自增字段,我们使用了Mysql的消息队列插件Q4M,从消息队列中获取一个id,然后作为主键插入到小表中

 

经过一段时间的使用,发现它还是比较稳定的,Q4M的使用参见我之前的文章“Mysql的消息队列插件Q4M