分享好友 最新动态首页 最新动态分类 切换频道
Tair的桶分布策略介绍及新的机器级位置安全优先策略实现
2024-12-28 22:46

  Tair在其intro wiki 上介绍了其现有的桶分布策略:

  程序提供了两种生成分配表的策略, 一种叫做负载均衡优先, 一种叫做位置安全优先。

  负载均衡优先

  当采用负载优先策略的时候, config server会尽量的把桶均匀的分布到各个data server上. 所谓尽量是指在不违背下面的原则的条件下尽量负载均衡. 1 每个桶必须有COPY_COUNT份数据 2 一个桶的各份数据不能在同一台主机上;

  位置安全优先

  位置安全优先原则是说, 在不违背上面两个原则的条件下, 还要满足位置安全条件, 然后再考虑负载均衡. 位置信息的获取是通过 _pos_mask(参见安装部署文档中关于配置项的解释) 计算得到. 一般我们通过控制 _pos_mask 来使得不同的机房具有不同的位置信息. 那么在位置安全优先的时候, 必须被满足的条件要增加一条, 一个桶的各份数据不能都位于相同的一个位置(不在同一个机房).

  wiki上还针对位置安全优先策略进行了进一步的补充:

  “这里有一个问题, 假如只有两个机房, 机房1中有100台data server, 机房2中只有1台data server. 这个时候, 机房2中data server的压力必然会非常大. 于是这里产生了一个控制参数 _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新表.”

 

  我们在生产环境中使用时,起初使用的是负载均衡优先,对应的配置文件group.conf中的_build_stategy=1。但是在线上环境中,为了充分利用磁盘IO,经常会在同一台服务器上跑多个dataserver(一个磁盘对应一个dataserver),而通过cst_monitor查看桶分布表,发现wiki中提到的必须遵守的原则“2 一个桶的各份数据不能在同一台主机上”并没有得到满足,只是保证了同一个桶的各份数据不落在同一个dataserver上。这样有一个很严重的问题,如果某台服务器宕机了,就非常有可能导致一个桶的主备bucket都无法对外服务,导致config server拒绝build新的桶分布表(内存级的可能就丢数据了,磁盘级的会造成落在该台服务器上的所有的桶都会写失败)。

     

      这是个很严重的问题,我们首先想到的是复用默认的“位置安全优先策略”,将group.conf中的_pos_mask设成4294967295(0xFFFFFFFF),这样每一台机器都会被认为是不同的位置。但是在使用中发现,程序并没有按照我们预想的那样在多个机器之间分散主备bucket,而是拒绝建表。查看了建表策略的代码table_builder2.cpp 发现这个策略只适合于两个位置,即适用于集群在两个机房间的负载均衡,并不适合更多位置(>=3)的位置安全,我们简单的针对机器ip做mask是无效的。

     

      接下来,我们考虑自己实现一个新的位置安全策略,但仔细看了负载均衡优先策略的代码table_builder1.cpp 后,发现可以通过修改table_builder1的代码,实现我们想要的机器级位置安全策略。

      默认的负载均衡优先策略代码,在不同的consider级别下考虑了如下条件(is_this_node_ok()):

      1.主bucket在各实例上分布均匀;

      2.当前主备bucket在实例上分布均匀;

      3.在建表主备bucket在备实例上分布均匀;

      4.主备不在同一个实例上;

      5.主备不在同一个position上(port:ip&mask);

      负载均衡优先策略共有四个consider级别(CONSIDER_ALLCONSIDER_POSCONSIDER_BASECONSIDER_FORCE),以此考虑4个级别,满足的条件逐渐放松,直到可以成功建表。四个不同的CONSIDER级别分别满足的条件如下:

      CONSIDER_ALL: 1, 2, 4, 5

      CONSIDER_POS: 1, 3, 4, 5

      CONSIDER_BASE: 1, 3, 4

      CONSIDER_FORCE: 1, 4

      可见,默认的策略优先满足的是3(均衡),而非5(postion安全)。这样问题就很简单了,只需要把CONSIDER_BASE满足的条件由1、3、4改成1、4、5,就可以实现我们需要的机器级的位置安全优先策略,同时兼顾机器级别的负载均衡(需要自行保证不同机器的dataserver数尽量均衡,同时group.conf的_pos_mask设成4294967295)。

      给出如下patch:

最新文章
腾讯电脑管家 v16最新版
腾讯电脑管家是国内首款集成“杀毒+管理”2合1功能的免费网络安全软件。 腾讯电脑管家官网宣称它包含“杀毒、实时防护、漏洞修复、系统清理、电脑加速、软件管理”等功能。截止目前,腾讯电脑管家历史装机量达3.5亿,帮助1亿网民,修复6600
优秀员工交流会活动方案范文
优秀员工交流会活动方案范文(通用16篇)  随着集团规模的不断扩大,员工数量的持续增加,为了使新员工能尽快适应新的工作环境,更好的发挥工作的主动性与积极性;同时使老员工也能尽快熟悉新员工,帮助新员工提高工作效率,另外这也是一
百度和吉利发布联合声明,给爆雷的极越汽车兜底
大家好,最近极越汽车爆雷的事情闹得沸沸扬扬,其背后的两大股东百度控股和吉利控股,终于在今日下午发布了联合声明。只不过内容并非是要挽救汽车,而是两大公司一起收拾烂摊子。咱们先来看看这份联合声明:可以看见,和吉利先是指出极越汽
江特电机(002176.SZ):公司电机可以运用到机器人身上
格隆汇12月11日丨江特电机(002176.SZ)于投资者互动平台表示,公司电机可以运用到机器人身上。伺服电机是为机器人提供动力的核心部件,公司全资子公司米格电机是专业生产伺服电机的公司,产量位居国内前列,其生产的伺服电机产品已广泛应用
樟木头网站推广公司分享如何丰富网页内容
增加网站流量是一个综合性的任务,涉及多个方面的策略和优化。以下是一些具体且有效的方法:一、搜索引擎优化(SEO)(1)关键词优化: 进行深入的关键字研究,找出与网站内容相关且搜索量高的关键词。在标题、内容、元描述和URL中合理使用
百度蜘蛛池出租:神马蜘蛛池租用选哪家?揭秘高效SEO推广的秘密武器
本文目录导读:了解神马蜘蛛池的作用神马蜘蛛池租用选哪家推荐神马蜘蛛池租用服务商随着互联网的不断发展,搜索引擎优化(SEO)已成为企业提升品牌知名度、扩大市场份额的重要手段,而神马蜘蛛池作为一种高效的SEO推广工具,受到了广大企业
谷歌SEO对比:1月新博客为何胜过1年旧博客,Onpage因素解析?
在SEO这片浩瀚的海洋中,我时常被各种现象所吸引,尤其是那些看似不合常理却又真实存在的案例。比如,一个仅建立1个月的新博客,在谷歌搜索中的排名竟然超过了一个运营了1年的老博客。这背后,Onpage SEO的因素究竟起到了怎样的作用?带着
大语言模型 AI 辅助编码使用过程体验报告(Github Copilot、Cursor)
在过去一周多的时间里,我在 ChatGPT 的协助下,生成了做一个简单编辑器的产品文档、技术方案文档,然后在这个基础上,进行程序的编码。为了更全面地感受 AI IDE 对研发过程的影响,我特意选择了一个我
朋友圈被领导点赞成认定加班证据,公司赔了1.8万
【朋友圈被领导点赞成认定加班证据,公司赔了1.8万】12月10日,据上海市总工会:小杨于2016年3月与北京某科贸有限公司签订了期间为2016年3月至2019年3月的劳动合同。2018年7月11日,小杨申请7月16日休年假,部门主管以“7月为公司走店重要
相关文章
推荐文章
发表评论
0评