暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

黑名单机制

SQL新手 2022-12-12
439

OBProxy 使用黑名单机制自适应处理 OBServer 错峰合并、升级、leader 切换、宕机、启动和停止等过程中的 OBServer 访问控制。

OBProxy 有宕机黑名单和活着不可用黑名单两种类型,可通过设置参数对黑名单进行管理。

通过黑名单可主要实现如下场景的访问控制:

  • 错峰合并时正在合并的 Zone 没有流量。

  • 集群升级时不能访问正在升级的 OBServer 或 Zone。

  • OBServer 宕机后,不再访问该 OBServer。

  • Partition 迁移后,不再访问迁移前的 OBServer。

  • 访问的 OBServer 不存在租户资源时重试。

  • OBServer 活不可用(内存超限、超时、OBServer 初始化和退出)时重试。

宕机黑名单

一旦检测到某台 OBServer 宕机或者因手工执行 stop server 命令使得该 OBServer 节点暂停对外提供服务时,则把这台 OBServer 加入宕机黑名单。这使得该应用不再访问该 OBServer,直到再次检测发现节点状态恢复正常时才会从黑名单中放出。

当 OBServer 节点状态是以下两种状态之一时,该 Server 被加入宕机黑名单:

  • 所在 OBServer 的 start_service_time 项值为 0。

  • 所在 OBServer 的 status 项值为 inactive。

活着不可用黑名单

活着不可用黑名单与宕机黑名单的区别在于,OBServer 的状态是暂时的或不确定的,所以每隔一段时间会进行重试,如果重试发现该 OBServer 恢复正常了,则将该 OBServer 放出黑名单。

当 OBServer 节点状态处于以下状态之一时,该 OBServer 被加入活着不可用黑名单:

  • 所在 Zone 正在做合并/升级。

  • 所在的 Server 正在做合并/升级。

  • OBServer 活着时的任何错误都会通过错误包形式返回,如果 OBServer 返回系统错误,比如:资源限制、连接数限制、系统内存超限、数据包校验出错、正在初始化、正在退出、OBServer response 超时、client connect 超时或者 OBProxy 等待超时等,该 OBServer 的活着不可用的计数加 1。如果 OBServer 在 N 秒内有 M 次活着不可用的失败计数,则将该 OBServer 加入活着不可用黑名单。

  • 错峰合并开始时,Root Service 会先更新内部表设置 Zone 的合并状态,然后将需要合并的 Zone 上的主都切换到其它的 Zone。OBProxy 周期性更新 Zone 状态表获取 Zone 状态,Zone 状态更新后,该 Zone 里的 OBServer 都会设置为活着不可用。在错峰合并过程中,正在合并的 Zone 的 OBServer 都处于活着不可用黑名单。

黑名单优先级

宕机黑名单 > 活着不可用黑名单( Zone 合并/升级 > OBServer 合并/升级 )。

强制访问黑名单中的 OBServer

所有可选择的 OBServer 都处于黑名单中时,会强制重试黑名单中的 OBServer。

黑名单的配置参数

  1. 在客户端中使用 root 用户登录集群的 sys 租户。

  2. 执行以下命令以查看 OBProxy 的配置参数。

    obclient> SHOW PROXYCONFIG;
    
  3. 运行 ALTER proxyconfig SET key=value 命令更新 OBProxy 的指定配置参数,配置项更新后会立即生效。

    与黑名单相关的配置参数描述如下表所示。

    配置项描述
    enable_congestion是否启用黑名单机制。默认开启,在黑名单机制运行出问题时,可以暂时关闭这个选项让 OBProxy 能够正常工作。
    congestion_failure_threshold设置当 OBServer 在 N 秒内出错几次则将该 Server 加入黑名单。该参数值小于 0 时,则所有在黑名单中的 Server 都会被放出黑名单。
    congestion_fail_window设置错误统计周期的时间(秒)。默认值 120 秒,如果在这个错误统计周期中错误次数超过了 congestion_failure_threshold 的值,则将该 OBServer 加入黑名单。该参数值也可以动态调整,一旦修改了该参数,当前错误统计计数会被清零,将重新按新的 fail window 从头开始统计错误次数。
    congestion_retry_interval设置被加入活着不可用黑名单的 Server 的重试周期,默认值 20 秒。
    min_keep_congestion_interval设置被加入黑名单的 Server,多长时间后才允许被放出黑名单。
    min_congested_connect_timeout设置客户端连接超时的值,当连接超时时则将 Server 加入活着不可用黑名单,默认值为10 s。

查看黑名单

可通过 show proxycongestion [all] [clustername] 语句查看所有 cluster 的黑名单信息。

  • 不指定可选项时,可显示所有 cluster 的黑名单信息。

  • 仅指定 all 时,可显示所有 cluster 的 OBServer 信息(包括黑名单中和非黑名单中的 OBServer 信息)。

  • 仅指定 clustername 时,可显示指定 cluster 的黑名单信息。

  • 同时指定 all 和 clustername 时,可显示指定 cluster 的 OBServer 信息。

示例如下:

obclient> show proxyinfo binary\G
*************************** 1. row ***************************
name: binary info
info: ObProxy-OceanBase 1.1.2-459.el6
version:RELEASE_6U
MD5:
REVISION:459-local-5ba2e3d33ea201fb675eb704627162a584485cdd
BUILD_TIME:Sep 29 2016 11:50:15
BUILD_FLAGS:-D__STDC_LIMIT_MACROS -D_OB_VERSION=1000 -D__STDC_CONSTANT_MACROS -D_NO_EXCEPTION -g -Wall -Werror -Wextra -Wunused-parameter -Wformat -Wconversion -Wno-invalid-offsetof -Wno-deprecated -fno-strict-aliasing -fno-omit-frame-pointer -mtune=generic -Wno-psabi -Wno-sign-compare -DGCC_52 -DUSE_POSIX_FALLOCATE -DSUPPORT_SSE4_2 -DHAVE_SCHED_GETCPU -DHAVE_REALTIME_COARSE -DOB_HAVE_EVENTFD -DHAVE_FALLOCATE -DHAVE_MINIDUMP
1 row in set

obclient> show proxycongestion;
*************************** 1. row ***************************
        cluster_name: ob1.jianhua.sjh
           zone_name: zone1
          zone_state: ACTIVE
           server_ip: xx.xxx.xx.x8:13201
        server_state: ACTIVE
     alive_congested: 0
last_alive_congested: 0
      dead_congested: 0
 last_dead_congested: 0
 stat_alive_failures: 0
  stat_conn_failures: 0
 conn_last_fail_time: 0
 conn_failure_events: 0
alive_last_fail_time: 0
alive_failure_events: 0
           ref_count: 1
*************************** 2. row ***************************
        cluster_name: ob1.jianhua.sjh
           zone_name: zone1
          zone_state: ACTIVE
           server_ip: xx.xx.xx.x7:13203
        server_state: ACTIVE
     alive_congested: 0
last_alive_congested: 0
      dead_congested: 0
 last_dead_congested: 0
 stat_alive_failures: 0
  stat_conn_failures: 0
 conn_last_fail_time: 0
 conn_failure_events: 0
alive_last_fail_time: 0
alive_failure_events: 0
           ref_count: 1
2 rows in set (0.00 sec)

obclient> show proxycongestion all\G
*************************** 1. row ***************************
        cluster_name: MetaDataBase
           zone_name: zone1
          zone_state: ACTIVE
           server_ip: xx.xx.xx.x8:13201
        server_state: ACTIVE
     alive_congested: 0
last_alive_congested: 0
      dead_congested: 0
 last_dead_congested: 0
 stat_alive_failures: 0
  stat_conn_failures: 0
 conn_last_fail_time: 0
 conn_failure_events: 0
alive_last_fail_time: 0
alive_failure_events: 0
           ref_count: 1
*************************** 2. row ***************************
        cluster_name: MetaDataBase
           zone_name: zone1
          zone_state: ACTIVE
           server_ip: xx.xx.xx.x7:13203
        server_state: ACTIVE
     alive_congested: 0
last_alive_congested: 0
      dead_congested: 0
 last_dead_congested: 0
 stat_alive_failures: 0
  stat_conn_failures: 0
 conn_last_fail_time: 0
 conn_failure_events: 0
alive_last_fail_time: 0
alive_failure_events: 0
           ref_count: 1
*************************** 3. row ***************************
        cluster_name: ob1.jianhua.sjh
           zone_name: zone1
          zone_state: ACTIVE
           server_ip: xx.xx.x.x8:13201
        server_state: ACTIVE
     alive_congested: 0
last_alive_congested: 0
      dead_congested: 0
 last_dead_congested: 0
 stat_alive_failures: 0
  stat_conn_failures: 0
 conn_last_fail_time: 0
 conn_failure_events: 0
alive_last_fail_time: 0
alive_failure_events: 0
           ref_count: 1
*************************** 4. row ***************************
        cluster_name: ob1.jianhua.sjh
           zone_name: zone1
          zone_state: ACTIVE
           server_ip: xx.xx.x.x7:13203
        server_state: ACTIVE
     alive_congested: 0
last_alive_congested: 0
      dead_congested: 0
 last_dead_congested: 0
 stat_alive_failures: 0
  stat_conn_failures: 0
 conn_last_fail_time: 0
 conn_failure_events: 0
alive_last_fail_time: 0
alive_failure_events: 0
           ref_count: 1
4 rows in set

obclient> show proxycongestion all "ob1.jianhua.sjh"\G
*************************** 1. row ***************************
        cluster_name: ob1.jianhua.sjh
           zone_name: zone1
          zone_state: ACTIVE
           server_ip: xx.xx.xx.x8:13201
        server_state: ACTIVE
     alive_congested: 0
last_alive_congested: 0
      dead_congested: 0
 last_dead_congested: 0
 stat_alive_failures: 0
  stat_conn_failures: 0
 conn_last_fail_time: 0
 conn_failure_events: 0
alive_last_fail_time: 0
alive_failure_events: 0
           ref_count: 1
*************************** 2. row ***************************
        cluster_name: ob1.jianhua.sjh
           zone_name: zone1
          zone_state: ACTIVE
           server_ip: xx.xx.xx.x7:13203
        server_state: ACTIVE
     alive_congested: 0
last_alive_congested: 0
      dead_congested: 0
 last_dead_congested: 0
 stat_alive_failures: 0
  stat_conn_failures: 0
 conn_last_fail_time: 0
 conn_failure_events: 0
alive_last_fail_time: 0
alive_failure_events: 0
           ref_count: 1
2 rows in set

说明

  • 当 dead_congested 、alive_congested 、is_zone_upgrading 、is_zone_merging 、is_server_upgrading 中的任意一个状态为 true 时,表示该 OBServer 已加入黑名单。

  • OBProxy 1.1.2 版本之前, clustername 不需要单引号或者双引号引起来,1.1.2 版本及之后,必须要用单引号或者双引号引起来。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论