6.1.5 负载均衡
子表是Bigtable负载均衡的基本单位。Tablet Server定期向Master汇报状态,当状态检测时发现某个Tablet Server上的负载过重时,Master会自动对其进行负载均衡,即执行子表迁移操作。子表迁移分为两步:第一步请求原有的Tablet Server卸载子表;第二步选择一台负载较低的Tablet Server加载子表。Master发送命令请求原有的Tablet Server卸载子表,原有Tablet Server解除加在子表上的互斥锁,而新的Tablet Server加载子表时需要首先获取互斥锁。如果原有Tablet Server发生故障,新的Tablet Server需要等待原有Tablet Server加在子表上的互斥锁过期。子表迁移前原有的Tablet Server会对其执行Minor Compaction操作,将内存中的更新操作以SSTable文件的形式转储到GFS中,因此,负载均衡带来的子表迁移在新的Tablet Server上不需要回放操作日志。
子表迁移的过程中有短暂的时间需要停服务,为了尽可能减少停服务的时间,Bigtable内部采用两次Minor Compaction的策略。具体操作如下:
1)原有Tablet Server对子表执行一次Minor Compaction操作,操作过程中仍然允许写操作。
2)停止子表的写服务,对子表再次执行一次Minor Compaction操作。由于第一次Minor Compaction过程中写入的数据一般比较少,第二次Minor Compaction的时间会比较短。
由于Bigtable负载均衡的过程中会停一会读写服务,负载均衡策略不应当过于激进。负载均衡涉及的因素很多,Tablet Server通过心跳定时将读、写个数、磁盘、内存负载等信息发送给Master,Master根据负载计算公式计算出需要迁移的子表,然后放入迁移队列中等待执行。