要加入一个现有集群,您必须至少指定:
- 集群的名称
- 您要加入的集群中另一个节点的
host:port
JOIN CLUSTER posts AT '10.12.1.35:9312'
POST /cli -d "
JOIN CLUSTER posts AT '10.12.1.35:9312'
"
$params = [
'cluster' => 'posts',
'body' => [
'10.12.1.35:9312'
]
];
$response = $client->cluster->join($params);
utilsApi.sql('JOIN CLUSTER posts AT \'10.12.1.35:9312\'')
await utilsApi.sql('JOIN CLUSTER posts AT \'10.12.1.35:9312\'')
res = await utilsApi.sql('JOIN CLUSTER posts AT \'10.12.1.35:9312\'');
utilsApi.sql("JOIN CLUSTER posts AT '10.12.1.35:9312'");
utilsApi.Sql("JOIN CLUSTER posts AT '10.12.1.35:9312'");
utils_api.sql("JOIN CLUSTER posts AT '10.12.1.35:9312'", Some(true)).await;
{u'error': u'', u'total': 0, u'warning': u''}
{u'error': u'', u'total': 0, u'warning': u''}
{"total":0,"error":"","warning":""}
在大多数情况下,当只有一个复制集群时,上述信息就足够了。但是,如果您要创建多个复制集群,则还必须设置路径并确保目录可用。
JOIN CLUSTER c2 at '127.0.0.1:10201' 'c2' as path
节点通过从指定节点获取数据来加入集群,如果成功,它会更新所有其他集群节点的节点列表,就像通过ALTER CLUSTER ... UPDATE nodes手动完成一样。此列表用于在重启时将节点重新加入集群。
节点列表有两种:
1.cluster_<name>_nodes_set:用于在重启时将节点重新加入集群。它在所有节点上更新,方式与ALTER CLUSTER ... UPDATE nodes相同。JOIN CLUSTER命令会自动执行此更新。集群状态将此列表显示为cluster_<name>_nodes_set。
2. cluster_<name>_nodes_view:此列表包含所有用于复制的活动节点,无需手动管理。ALTER CLUSTER ... UPDATE nodes实际上将此节点列表复制到用于重启时重新加入的节点列表中。集群状态将此列表显示为cluster_<name>_nodes_view。
JOIN CLUSTER click_query 'clicks_mirror1:9312;clicks_mirror2:9312;clicks_mirror3:9312' as nodes
POST /cli -d "
JOIN CLUSTER click_query 'clicks_mirror1:9312;clicks_mirror2:9312;clicks_mirror3:9312' as nodes
"
$params = [
'cluster' => 'posts',
'body' => [
'nodes' => 'clicks_mirror1:9312;clicks_mirror2:9312;clicks_mirror3:9312'
]
];
$response = $client->cluster->join($params);
utilsApi.sql('JOIN CLUSTER click_query \'clicks_mirror1:9312;clicks_mirror2:9312;clicks_mirror3:9312\' as nodes')
await utilsApi.sql('JOIN CLUSTER click_query \'clicks_mirror1:9312;clicks_mirror2:9312;clicks_mirror3:9312\' as nodes')
res = await utilsApi.sql('JOIN CLUSTER click_query \'clicks_mirror1:9312;clicks_mirror2:9312;clicks_mirror3:9312\' as nodes');
utilsApi.sql("JOIN CLUSTER click_query 'clicks_mirror1:9312;clicks_mirror2:9312;clicks_mirror3:9312' as nodes");
utilsApi.Sql("JOIN CLUSTER click_query 'clicks_mirror1:9312;clicks_mirror2:9312;clicks_mirror3:9312' as nodes");
utils_api.sql("JOIN CLUSTER click_query 'clicks_mirror1:9312;clicks_mirror2:9312;clicks_mirror3:9312' as nodes", Some(true)).await;
{u'error': u'', u'total': 0, u'warning': u''}
{u'error': u'', u'total': 0, u'warning': u''}
{"total":0,"error":"","warning":""}
JOIN CLUSTER命令是同步工作的,一旦节点从集群中的其他节点接收到所有数据并与它们同步,命令就会完成。
JOIN CLUSTER操作可能会失败,并显示指示重复server_id的错误消息。当加入节点的server_id与集群中现有节点的server_id相同时,会发生这种情况。要解决此问题,请确保复制集群中的每个节点都有唯一的server_id。您可以在尝试加入集群之前,在配置文件的"searchd"部分将默认的server_id更改为唯一值。
Last modified: August 28, 2025
DELETE CLUSTER 语句会删除指定的集群及其 名称。一旦删除集群,它将从所有节点中移除,但其表保持完整并成为活动的本地非复制表。
DELETE CLUSTER click_query
POST /cli -d "DELETE CLUSTER click_query"
$params = [
'cluster' => 'click_query',
'body' => []
];
$response = $client->cluster()->delete($params);
utilsApi.sql('DELETE CLUSTER click_query')
await utilsApi.sql('DELETE CLUSTER click_query')
res = await utilsApi.sql('DELETE CLUSTER click_query');
utilsApi.sql("DELETE CLUSTER click_query");
utilsApi.Sql("DELETE CLUSTER click_query");
utils_api.Sql("DELETE CLUSTER click_query", Some(true)).await;
{u'error': u'', u'total': 0, u'warning': u''}
{u'error': u'', u'total': 0, u'warning': u''}
{"total":0,"error":"","warning":""}
Last modified: August 28, 2025
ALTER CLUSTER <cluster_name> ADD <table_name>[, <table_name>] 将一个或多个现有的本地表添加到集群中。接收ALTER查询的节点将表发送到集群中的其他节点。集群中其他节点上具有相同名称的所有本地表将被新表替换。
一旦表被复制,可以在任何节点上执行写入语句,但表名必须以集群名称前缀,例如 INSERT INTO <clusterName>:<table_name>。
ALTER CLUSTER click_query ADD clicks_daily_index
POST /cli -d "
ALTER CLUSTER click_query ADD clicks_daily_index
"
$params = [
'cluster' => 'click_query',
'body' => [
'operation' => 'add',
'table' => 'clicks_daily_index'
]
];
$response = $client->cluster()->alter($params);
utilsApi.sql('ALTER CLUSTER click_query ADD clicks_daily_index')
await utilsApi.sql('ALTER CLUSTER click_query ADD clicks_daily_index')
res = await utilsApi.sql('ALTER CLUSTER click_query ADD clicks_daily_index');
utilsApi.sql("ALTER CLUSTER click_query ADD clicks_daily_index");
utilsApi.Sql("ALTER CLUSTER click_query ADD clicks_daily_index");
utils_api.sql("ALTER CLUSTER click_query ADD clicks_daily_index", Some(true)).await;
{u'error': u'', u'total': 0, u'warning': u''}
{"total":0,"error":"","warning":""}
ALTER CLUSTER <cluster_name> DROP <table_name>[, <table_name>] 忘记一个或多个现有的表,这意味着它不会删除节点上的表文件,而是使它们变为无效,未复制的表。
一旦从集群中移除一个表,它就成为本地表,写入语句必须仅使用表名,例如 INSERT INTO <table_name>,而不需要集群前缀。
ALTER CLUSTER posts DROP weekly_index
POST /cli -d "
ALTER CLUSTER posts DROP weekly_index
"
$params = [
'cluster' => 'posts',
'body' => [
'operation' => 'drop',
'table' => 'weekly_index'
]
];
$response = $client->cluster->alter($params);
utilsApi.sql('ALTER CLUSTER posts DROP weekly_index')
await utilsApi.sql('ALTER CLUSTER posts DROP weekly_index')
res = await utilsApi.sql('ALTER CLUSTER posts DROP weekly_index');
utilsApi.sql("ALTER CLUSTER posts DROP weekly_index");
utilsApi.Sql("ALTER CLUSTER posts DROP weekly_index");
utils_api.sql("ALTER CLUSTER posts DROP weekly_index", Some(true)).await;
{u'error': u'', u'total': 0, u'warning': u''}
{u'error': u'', u'total': 0, u'warning': u''}
{"total":0,"error":"","warning":""}
Last modified: August 28, 2025
ALTER CLUSTER <cluster_name> UPDATE nodes 语句将每个节点内的指定集群中的节点列表更新为包括集群中的所有活动节点。有关节点列表的更多信息,请参见加入集群。
ALTER CLUSTER posts UPDATE nodes
POST /cli -d "
ALTER CLUSTER posts UPDATE nodes
"
$params = [
'cluster' => 'posts',
'body' => [
'operation' => 'update',
]
];
$response = $client->cluster()->alter($params);
utilsApi.sql('ALTER CLUSTER posts UPDATE nodes')
await utilsApi.sql('ALTER CLUSTER posts UPDATE nodes')
res = await utilsApi.sql('ALTER CLUSTER posts UPDATE nodes');
utilsApi.sql("ALTER CLUSTER posts UPDATE nodes");
utilsApi.Sql("ALTER CLUSTER posts UPDATE nodes");
utils_api.sql("ALTER CLUSTER posts UPDATE nodes", Some(true)).await;
{u'error': u'', u'total': 0, u'warning': u''}
{u'error': u'', u'total': 0, u'warning': u''}
{"total":0,"error":"","warning":""}
例如,当集群最初建立时,用于重新加入集群的节点列表是 10.10.0.1:9312,10.10.1.1:9312。此后,其他节点加入了集群,现在活动节点是 10.10.0.1:9312,10.10.1.1:9312,10.15.0.1:9312,10.15.0.3:9312。然而,用于重新加入集群的节点列表没有更新。
要纠正这一点,可以运行 ALTER CLUSTER ... UPDATE nodes 语句将活动节点列表复制到用于重新加入集群的节点列表。这样,用于重新加入集群的节点列表将包括集群中的所有活动节点。
两个节点列表都可以通过使用 集群状态 语句 (cluster_post_nodes_set 和 cluster_post_nodes_view) 查看。
要从复制集群中移除节点,请按照以下步骤操作:
- 停止节点
- 从已停止节点的
<data_dir>/manticore.json(通常是 /var/lib/manticore/manticore.json)中删除集群信息。
- 在集群中的其他节点上运行
ALTER CLUSTER cluster_name UPDATE nodes。
完成这些步骤后,其他节点将忘记已分离的节点,而已分离的节点将忘记集群。此操作不会影响集群中的表或已分离节点上的表。
Last modified: August 28, 2025