停用节点时,Hubble允许节点完成运行中的请求,拒绝任何新请求,并将所有范围副本和范围租约转移到该节点之外,以便可以安全地将其关闭。
注意事项:在停用某个节点之前,请确保其他节点可用于从该节点接管分片副本。如果没有其他可用节点,则停用过程将无限期地挂起。
为确保您的群集可以充分处理停用节点:
一次仅停用一个节点,并且在停用每个节点之前,请确认没有重复不足或不可用的分片。
如果您有一个正在挂起的停用节点,则可以重新启用该节点。
如果可能,请保持节点运行而不是杀死它,因为挂起的停用过程可能导致问题,甚至数据丢失。
确认有足够的节点来接管您要删除的节点的副本,请参阅上面的一些示例方案。
展示所有节点状态:
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)
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
检查集群状态:
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会自动将节点上的分片副本和分片租约转移到可用的活动节点。但是,如果重新启动,群集将重新平衡副本与租约给它。
为了防止群集在数据恢复联机后将其重新平衡到死节点,请执行以下操作:
检查集群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
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.
同样,如果节点曾经重新启动,它将不接受任何客户端连接,并且群集也不会重新平衡任何数据。为了使群集再次利用该节点,您必须重新调试它。
确认有足够的节点来接管您要删除的节点的副本。请参阅上面的一些示例方案。
检查集群状态
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
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.
检查集群状态
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
在这一点上,尽管退役的节点处于活动状态,但是群集不会向其重新平衡任何数据,并且节点将不接受任何客户端连接。但是,要从群集中正式删除节点,您仍然需要停止它们。
对于每个停用的节点,通过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
如果您不小心使任何节点退役,拥有导致进程挂起的退役节点,或者以其他方式希望退役节点作为活动成员重新加入群集,请执行以下操作:
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的节点为退役节点
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.
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个节点的副本到其他节点上;当分片副本数=节点数时,无法停用节点,进行停用操作后,会标记被停用节点为“可疑”且无限期延迟,直至添加新的节点才可停用旧节点,关键要满足副本数的要求,这是分布式数据库架构的基本要求。