集群缩容

停用节点时,Hubble允许节点完成运行中的请求,拒绝任何新请求,并将所有范围副本和范围租约转移到该节点之外,以便可以安全地将其关闭。

注意事项:在停用某个节点之前,请确保其他节点可用于从该节点接管分片副本。如果没有其他可用节点,则停用过程将无限期地挂起。

删除单个活动节点(安全模式)

前提条件

为确保您的群集可以充分处理停用节点:

  • 一次仅停用一个节点,并且在停用每个节点之前,请确认没有重复不足或不可用的分片。

  • 如果您有一个正在挂起的停用节点,则可以重新启用该节点。

  • 如果可能,请保持节点运行而不是杀死它,因为挂起的停用过程可能导致问题,甚至数据丢失。

  • 确认有足够的节点来接管您要删除的节点的副本,请参阅上面的一些示例方案。

步骤1.停用之前检查节点

展示所有节点状态:

hubble node status --all --certs-dir certs --host <any address of nodes>
  id | address  | ... | is_available | is_live
+----+----------+ ... +--------------+---------+
   1 | h3:26257 | ... | true         | true
   3 | h2:26257 | ... | true         | true
   5 | h4:26257 | ... | true         | true
   6 | h1:26257 | ... | true         | true
(4 rows)

步骤2.退役并删除节点

SSH到运行该节点的计算机,并使用--decommission标志和其他必需标志执行hubble quit命令:

该命令区别于多节点退役的命令

hubble quit --decommission --certs-dir=certs --host=<address of node to remove>

然后,您将在退役状态更改时将其打印到stderr:

 id | is_live | replicas | is_decommissioning | is_draining  
+---+---------+----------+--------------------+-------------+
  5 |  true   |       73 |        true        |    false     
(1 row)

节点完全退役并停止后,您将看到一个确认:

 id | is_live | replicas | is_decommissioning | is_draining  
+---+---------+----------+--------------------+-------------+
  5 |  true   |        0 |        true        |    false     
(1 row)

No more data reported on target nodes. Please verify cluster health before removing the nodes.
ok

步骤3.停用后检查节点和群集

检查集群状态:

hubble node status --decommission --certs-dir certs --host <live node>
id | address  |...| is_available|is_live|gossiped_replicas|is_decommissioning|is_draining
---+----------+...+-------------+-------+-----------------+------------------+-----------
 1 | h3:26257 |...| true        |true   |               76|false             |false
 3 | h2:26257 |...| true        |true   |               76|false             |false
 5 | h4:26257 |...| false       |false  |                0|true              |true
 6 | h1:26257 |...| true        |true   |               76|false             |false

注意 id=5 的节点is_available,is_live,is_decommissioning和is_draining值其他节点的不同

同样,如果节点重新启动,它将不接受任何客户端连接,并且群集也不会重新平衡任何数据。为了使群集再次利用该节点,您必须重新调试它。

安全删除单个已停止节点

节点关闭5分钟后,Hubble会自动将节点上的分片副本和分片租约转移到可用的活动节点。但是,如果重新启动,群集将重新平衡副本与租约给它。

为了防止群集在数据恢复联机后将其重新平衡到死节点,请执行以下操作:

步骤1.识别已停止节点的ID

检查集群decommission状态:

hubble node status --decommission --certs-dir certs --host <live node>
id | address |...|is_available|is_live|gossiped_replicas|is_decommissioning|is_draining
---+---------+...+------------+-------+-----------------+------------------+-----------
 1 | h3:26257|...|true        |true   |               76|false             |false
 3 | h2:26257|...|true        |true   |               76|false             |false
 5 | h4:26257|...|true        |true   |               76|false             |false
 6 | h1:26257|...|false       |false  |                0|false             |true
(4 rows)

id=6的节点为观察宕机或者坏掉的节点,其is_available,is_live,is_decommissioning为false,is_draining为true;is_draining表示枯竭的不可用的,但是没有执行decommission

步骤2.将失效节点标记为已停用

SSH到集群中的任何活动节点,然后运行具有该节点ID的hubble node decommission命令以正式停用,以使该节点的执行正式退役的操作:

hubble node decommission <DeadNodeID> --certs-dir=certs --host=<address of live node>
例如 DeadNodeID=6
id | is_live | replicas | is_decommissioning | is_draining  
+---+---------+----------+--------------------+-------------+
  6 |  false  |        0 |        true        |    true      
(1 row)

No more data reported on target nodes. Please verify cluster health before removing the nodes.

同样,如果节点曾经重新启动,它将不接受任何客户端连接,并且群集也不会重新平衡任何数据。为了使群集再次利用该节点,您必须重新调试它。

删除多个节点

开始之前

确认有足够的节点来接管您要删除的节点的副本。请参阅上面的一些示例方案。

步骤1.确定要停用的节点的ID

检查集群状态

hubble node status --certs-dir certs --host <any address of nodes>
  id | address  |  ... | is_available | is_live
+----+----------+- ... +--------------+---------+
   1 | h3:26257 |  ... | true         | true
   2 | h2:26257 |  ... | true         | true
   3 | h1:26257 |  ... | true         | true
   4 | h4:26257 |  ... | true         | true
   5 | h5:26257 |  ... | true         | true

步骤2.停用节点

SSH到集群中的任何活动节点,并运行带有节点ID的hubble node decommission命令以正式停用

hubble node decommission 4 5 --certs-dir=certs --host=<address of live node>

然后,您将在退役状态更改时将其打印到stderr:

 id | is_live | replicas | is_decommissioning | is_draining  
+---+---------+----------+--------------------+-------------+
  4 |  true   |       18 |        true        |    false     
  5 |  true   |       16 |        true        |    false     
(2 rows)

节点完全停用后,您将看到一个确认:

 id | is_live | replicas | is_decommissioning | is_draining  
+---+---------+----------+--------------------+-------------+
  4 |  true   |        0 |        true        |    false     
  5 |  true   |        0 |        true        |    false     
(2 rows)

No more data reported on target nodes. Please verify cluster health before removing the nodes.

步骤4.停用后检查节点和群集

检查集群状态

hubble node status --decommission --certs-dir certs --host <any address of nodes>
id|address |...|is_available|is_live|gossiped_replicas|is_decommissioning|is_draining
--+--------+...+------------+-------+-----------------+------------------+-----------
 1|h3:26257|...| true       | true  |               76|false             |false
 2|h2:26257|...| true       | true  |               76|false             |false
 3|h1:26257|...| true       | true  |               76|false             |false
 4|h4:26257|...| true       | true  |               74|true              |false
 5|h5:26257|...| true       | true  |               75|true              |false

id=4,5的节点is_decommissioning为true

步骤5.删除退役的节点

在这一点上,尽管退役的节点处于活动状态,但是群集不会向其重新平衡任何数据,并且节点将不接受任何客户端连接。但是,要从群集中正式删除节点,您仍然需要停止它们。

对于每个停用的节点,通过SSH连接到运行该节点的计算机,然后执行hubble quit命令:

hubble quit --certs-dir=certs --host=<address of decommissioned node>
ok

检查集群状态

hubble node status --decommission --certs-dir certs --host <any address of nodes>
id|address |...|is_available|is_live|gossiped_replicas|is_decommissioning|is_draining
--+--------+...+------------+-------+-----------------+------------------+-----------
 1|h3:26257|...| true       | true  |               76|false             |false
 2|h2:26257|...| true       | true  |               76|false             |false
 3|h1:26257|...| true       | true  |               76|false             |false
 4|h4:26257|...| false      | false |               74|true              |true
 5|h5:26257|...| false      | false |               75|true              |true

重新调试节点(安全模式)

如果您不小心使任何节点退役,拥有导致进程挂起的退役节点,或者以其他方式希望退役节点作为活动成员重新加入群集,请执行以下操作:

步骤1.识别退役节点的ID

hubble node status --decommission --certs-dir certs --host <address of live node>
id|address |...|is_available|is_live|gossiped_replicas|is_decommissioning|is_draining
--+--------+...+------------+-------+-----------------+------------------+-----------
 1|h3:26257|...|true        |true   |               61|false             |false
 3|h2:26257|...|true        |true   |               61|false             |false
 5|h4:26257|...|true        |true   |                0|true              |false
 6|h1:26257|...|true        |true   |               61|false             |false

id=5的节点为退役节点

步骤2.重新调试节点

SSH到活动节点之一,并使用要重新调试的节点的ID执行hubble node recommission 命令:

hubble node recommission 5 --certs-dir=certs --host=<address of live node>
 id | is_live | replicas | is_decommissioning | is_draining  
+---+---------+----------+--------------------+-------------+
  5 |  false  |        0 |       false        |    true      
(1 row)
The affected nodes must be restarted for the change to take effect.

步骤3.重新启动重新使用的节点

SSH到具有重新调试的节点的每台计算机,并运行与最初启动该节点时相同的hubble启动命令,例如:

hubble start --certs-dir=certs --advertise-addr=<address of node to restart> --join=<address of node 1> --background

总结

停用节点要考虑表的表的分片副本数,只有节点数<所有表的最大分片副本数,才可以停用节点,且可停用的节点数=节点数-所有表的最大分片副本数;所有表的最大分片副本数=分片+分片的副本,SHOW ZONE CONFIGURATION FOR TABLE users; 会体现该users表的副本情况;即所有表中某个表的分片副本数=5,节点数=7,那么可停用2个节点,并且数据库会自动平衡停止的那2个节点的副本到其他节点上;当分片副本数=节点数时,无法停用节点,进行停用操作后,会标记被停用节点为“可疑”且无限期延迟,直至添加新的节点才可停用旧节点,关键要满足副本数的要求,这是分布式数据库架构的基本要求。