7.1.2 扩容
MySQL Sharding集群一般按照用户id进行哈希分区,这里面存在两个问题:
1)集群的容量不够怎么办?
2)单个用户的数据量太大怎么办?
对于第1个问题,MySQL Sharding集群往往会采用双倍扩容的方案,即从2台服务器扩到4台,接着再扩到8台……,依次类推。
假设原来有2个dbgroup,第一个dbgroup的主机为A0,备机为A1,第二个dbgroup的主机为B0,备机为B1。按照用户id哈希取模,结果为奇数的用户分布在第一个dbgroup,结果为偶数的用户分布在第二个dbgroup。常见的一种扩容方式如下:
1)等待A0和B0的数据同步到其备服务器,即A1和B1。
2)停止写服务,等待主备完全同步后解除A0与A1、B0与B1之间的主备关系。
3)修改中间层的映射规则,将哈希值模4等于1的用户数据映射到A1,哈希值模4等于3的用户数据映射到B1。
4)开启写服务,用户id哈希值模4等于0、1、2、3的数据将分别写入到A0、A1、B0、B1。这就相当于有一半的数据分别从A0、B0迁移到A1、B1。
5)分别给A0、A1、B0、B1增加一台备机。
最终,集群由2个dbgroup变为4个dbgroup。可以看到,扩容过程需要停一小会儿服务,另外,扩容进行过程中如果再次发生服务器故障,将使扩容变得非常复杂,很难做到完全自动化。
对于第2个问题,可以在应用层定期统计大用户,并且将这些用户的数据按照数据量拆分到多个dbgroup。当然,定期维护这些信息对应用层是一个很大的代价。