tair是taobao开发的一个Key/Value结构数据的解决方案,它默认支持基于内存和文件的两种存储方式,分别和我们通常所说的缓存(mdb)和持久化存储(fdb)对应。这里跟大家分享一下tair扩容过程中(增加内存,增加dataserver)应该注意的问题和一般步骤。
 一.扩容前准备
 1.在copy count>=2的情况下, 每次停止或者启动ds,cs(config server)都会按照对照表中的信息进行bucket在各个节点上的平衡分配。这就涉及到了quota值的变更,quota值用于限制总的数据size,每个key-value所占用的空间为所存储的数据(byte)与元数据之和。quota值的计算公式为:max(quota)<=ds(N)*shm/namespace(N)*copycount,当我们摘除一台ds进行内存升级后会存在quota值写满内存而导致tair集群停止工作的风险,因此,需要评估此项风险。
举个例子:假设我们的环境是6台ds,其中两台同时作为cs,现在我们要摘除其中1台ds进行内存的升级。假设我们的quota值是按照上面的计算公式进行计算得出,摘除后ds为5台,我们将进行如下的评估:先使用STAT命令(eg:sudo /opt/csr/tair-2.3/sbin/tairclient -c csserver1:5198 -c csserver2:port:5198 -g tair -l "stat" )查看已经使用的quota信息(stdout的最后一行usesize),然后使用quota数值*namespace(我们默认每个namespace设置的quota值是相同的)与之做差值后再除以摘除后ds节点数量。等到的这个数值即为每台机器上面最多可以使用的quota值,与可用shm做对比就可以得到我们想要的结果了。quota数值的调整是动态生效的。
另外一种计算方式是查看要升级ds的usesize,摘除后这些数据会迁移到其他机器上,理论上是均衡分配的。我们在估算一下摘除ds后的每台机器的usesize情况与可承载的最大quota值做比较,如果大于这个数值说明是有风险的。

二. 扩容
尽管tair集群的访问有一部分cs的无关性,保险起见还是按照ds,从cs,主cs这个顺序进行部署。一次可摘除ds数量 ds操作:我们可以直接kill掉ds进程,使用STAT查看ds信息状态,确定为dead态。然后关机做内存升级,此时可以使用cstmonitot ../data/data/serverTableName查看3种状态下的状态表是否完全一致(目前需要手工导成3份文件),完全一致说明bucket的重新分配完成了。还要注意观察其他ds上面的usesize的增长情况及shm的占用比是否符合预期。tair的服务情况是否正常(读写数据)也要check一下。没问题后就可以继续了。
cs的操作:先停止ds在停止cs,主cs停机后从cs会自动升级为主cs。如果我们不进行数据的删除或者不等待数据迁移的完毕就进行操作,可能会导致hash表混乱,只能重启整个tair集群,原有数据全部丢失,需要做全量更新索引。

三,扩容后处理
节点做好后,ds需要做几件事情:删除/dev/shm下文件,删除tair目录下data目录,更改slab_shm_size设置(更新后的shm大小,一定要改),更改/etc/fstab shm大小的设置,remount /dev/shm,启动ds,到cs机器上面touch group.conf,使用STAT查看ds状态是否alive及是否在进行bucket重新分配,等待3种状态表的信息一致。
cs操作是先启动ds,在启动cs,其他操作是类似ds的。
已知问题:
1.2.3版本的tair在ds内存不等量的情况下分配是有一些问题的,差异不会太大。
2.整个操作过程中都tair都可以进行对外服务,但是写入tair的数据会有几秒钟的失败,需要client端重试。
上面只是记录了我们线上的tair升级的大致步骤。对tair的使用和理解可能存在误区,欢迎大家指正与拍砖!

----归钟 0822