tair2.2 的使用与维护 faq
1 data server 和 config server 在启动的时候有什么顺序吗?
因为config server 需要检查data server的状态, 所以我们要求在系统启动的时候要先启动data server 后启动config server. 同样, 系统停止的时候要先停止config server 后停止data server.
2 group的配置文件里有些什么,如何使用的?
[group_1]
_build_diff_ratio
_build_strategy
_pos_mask
_min_data_server_count
_plugIns_list
_server_list=192.168.117.130:5191
_server_list=192.168.117.130:5192
_server_list=192.168.117.130:5193
_server_list=192.168.117.130:5194
———————————————
_min_data_server_count 这个参数是用来控制集群中最少要有多少data server的. 这是因为急群中一旦有data server宕掉, config server会启动迁移进程, 把原来这台机器的负载分散到其它机器上. 这样持续下去可能使得还活着的机器压力越来越大, 最后雪崩. 所以设置了这个参数. 当还活着的机器数少于这个数字的时候, config server不再build新的表, 不再做压力的分散了.
_build_strategy 这个参数目前有两个取值 1 和 2. 1表示在build表的时候采用负载优先的策略. 2表示build表的时候采用位置安全优先的策略
_build_diff_ratio 这个只有在位置优先策略的时候才起作用, 值是一个百分比. 具体含义在解释安全优先策略中说明
_pos_mask 这个是用来生成位置信息的, 具体生成的方法就是用serverid跟该值做与操作得到位置信息.
_plugIns_list 这个可以用来配置可用的插件
_server_list 这个是配置该group内的server的.
3 什么是负载优先策略, 什么是位置安全优先策略?
我们先看负载优先策略. 在一个组内有很多data server. 当采用负载优先策略的时候, config server会尽量的把桶均匀的分布到各个data server上. 所谓尽量是指在不违背下面的原则的条件下尽量负载均衡.
1 每个桶必须有COPY_COUNT份数据
2 一个桶的各份数据不能在同一台主机上
位置安全优先原则是说, 在不违背上面两个原则的条件下, 还要满足位置安全条件, 然后再考虑负载均衡. 位置信息的获取是通过 _pos_mask 计算得到. 一般我们通过控制 _pos_mask 来使得不同的机房具有不同的位置信息. 那么在位置安全优先的时候, 必须被满足的条件要增加一条, 一个桶的各份数据不能都位于相同的一个位置(不在同一个机房). 这里有一个问题, 假如只有两个机房, 机房1中有100台data server, 机房2中只有1台data server. 这个时候, 机房2中data server的压力必然会非常大. 于是这里产生了一个类似_min_data_server_count的控制参数 _build_diff_ratio. 当机房差异比率大于这个配置值时, config server也不再build新表. 机房差异比率是如何计出来的呢? 首先找到机器最多的机房, 不妨设使RA, data server数量是SA. 那么其余的data server的数量记做SB. 则机房差异比率=|SA – SB|/SA. 因为一般我们先上系统配置的COPY_COUNT是3. 在这个情况下, 不妨设只有两个机房RA和RB, 那么两个机房什么样的data server数量是均衡的范围呢? 当差异比率小于 0.5的时候是可以做到各台data server负载都完全均衡的.
这里有一点主意, 假设RA机房有机器6台,RB有机器3台. 那么差异比率 = 6 – 3 / 6 = 0.5. 这个时候如果进行扩容, 在机房A增加一台data server, 扩容后的差异比率 = 7 – 3 / 7 = 0.57. 也就是说, 只在机器数多的机房增加data server会扩大差异比率. 如果我们的_build_diff_ratio配置值是0.5. 那么进行这种扩容后, config server会拒绝在继续build新表.
4 一台data server宕机, 我把它重新启动起来, 它会继续工作吗?
这取决于这台data server宕机到重启所花的时间. config server有一个编译参数来设置这个时间. 如果宕机超过该时间, config server将不再认为该data server可用. 这个时候data server再启动也无法对外提供服务了. 这个设计的考虑是因为config server认定某个data server宕机后就要组织迁移数据. 由于某种原因, 一台data server反复的启动, 会带来反复的数据迁移. 所以config server一旦认定data server宕机, 即便该data server又恢复了服务能力, config server也不允许它提供服务, 除非有管理员现实的介入.
5 管理员如何显式的让config server把某data server加入集群呢?
方法是把这台data server加入到主config server的 group配置文件中. 如果这个data server已经在group的配置文件中了, 那么touch一下这个配置文件就可以了.
6 几个重要的编译参数
TAIR_SERVER_BUCKET_COUNT 桶个数. 这个参数一般大于data server数量10倍以上. TAIR_COPY_COUNT 每份数据在系统中存储的份数. TAIR_SERVER_DOWNTIME 这个参数用来控制config server认为data server宕机的条件. 比如这个参数配置成 4, 那么当一台data server连续4秒钟都没有向config server发送心跳时, config server就认为这台data server宕机. TAIR_POS_MASK 这个用来取位置信息, 用这个值对server_id做&运算就得到了位置信息. server_id是一个64位的整数, 后32位以网络字节序存储了ip地址. 比如当 TAIR_POS_MASK = 0xffff 这个值的时候, ip地址的前两个地址段将决定位置信息.
7 想升级data server程序要怎么做?
当data server程序停下来的时候, config server会启动迁移过程, 可是仅仅为了升级程序而导致系统大量迁移是不可接受的. 那么第一个简单的办法是先关闭所有的config server, 升级data server后再启动config server. 如果希望对client影响尽可能的小, 也可以采取以下方式, 先把_min_data_server_count 配置成当前data server的数量, 对于每台data server, kill掉老程序, 启动新程序. 这个时候即便config server发现data server宕机, 因为剩下的data server无法满足条件 _min_data_server_count, 所以config server也不会启动迁移过程. 等到所有的data server都升级好以后, touch以下group.conf就可以了. 但是这样做要注意一点, java client会询问config server哪些机器宕机, config server向java client告知宕机机器后, java client会选择不向宕机的data server发请求. 这可能造成一定范围的不可访问.