要创建一个复制集群,您至少必须为其设置名称。
如果您正在创建单个集群或第一个集群,则可以省略path选项。在这种情况下,将使用data_dir选项作为集群路径。但是,对于所有后续的集群,您必须指定path,并且该路径必须可用。还可以设置nodes选项以列出集群中的所有节点。
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
CREATE CLUSTER posts
CREATE CLUSTER click_query '/var/data/click_query/' as path
CREATE CLUSTER click_query '/var/data/click_query/' as path, 'clicks_mirror1:9312,clicks_mirror2:9312,clicks_mirror3:9312' as nodesPOST /cli -d "
CREATE CLUSTER posts
"
POST /cli -d "
CREATE CLUSTER click_query '/var/data/click_query/' as path
"
POST /cli -d "
CREATE CLUSTER click_query '/var/data/click_query/' as path, 'clicks_mirror1:9312,clicks_mirror2:9312,clicks_mirror3:9312' as nodes
"$params = [
'cluster' => 'posts',
]
];
$response = $client->cluster()->create($params);
$params = [
'cluster' => 'click_query',
'body' => [
'path' => '/var/data/click_query/'
]
]
];
$response = $client->cluster()->create($params);
$params = [
'cluster' => 'click_query',
'body' => [
'path' => '/var/data/click_query/',
'nodes' => 'clicks_mirror1:9312,clicks_mirror2:9312,clicks_mirror3:9312'
]
]
];
$response = $client->cluster()->create($params);utilsApi.sql('CREATE CLUSTER posts')
utilsApi.sql('CREATE CLUSTER click_query \'/var/data/click_query/\' as path')
utilsApi.sql('CREATE CLUSTER click_query \'/var/data/click_query/\' as path, \'clicks_mirror1:9312,clicks_mirror2:9312,clicks_mirror3:9312\' as nodes')await utilsApi.sql('CREATE CLUSTER posts')
await utilsApi.sql('CREATE CLUSTER click_query \'/var/data/click_query/\' as path')
await utilsApi.sql('CREATE CLUSTER click_query \'/var/data/click_query/\' as path, \'clicks_mirror1:9312,clicks_mirror2:9312,clicks_mirror3:9312\' as nodes')res = await utilsApi.sql('CREATE CLUSTER posts');
res = await utilsApi.sql('CREATE CLUSTER click_query \'/var/data/click_query/\' as path');
res = await utilsApi.sql('CREATE CLUSTER click_query \'/var/data/click_query/\' as path, \'clicks_mirror1:9312,clicks_mirror2:9312,clicks_mirror3:9312\' as nodes');utilsApi.sql("CREATE CLUSTER posts");
utilsApi.sql("CREATE CLUSTER click_query '/var/data/click_query/' as path");
utilsApi.sql("CREATE CLUSTER click_query '/var/data/click_query/' as path, 'clicks_mirror1:9312,clicks_mirror2:9312,clicks_mirror3:9312' as nodes");utilsApi.Sql("CREATE CLUSTER posts");
utilsApi.Sql("CREATE CLUSTER click_query '/var/data/click_query/' as path");
utilsApi.Sql("CREATE CLUSTER click_query '/var/data/click_query/' as path, 'clicks_mirror1:9312,clicks_mirror2:9312,clicks_mirror3:9312' as nodes");utils_api.sql("CREATE CLUSTER posts", Some(true)).await;
utils_api.sql("CREATE CLUSTER click_query '/var/data/click_query/' as path", Some(true)).await;
utils_api.sql("CREATE CLUSTER click_query '/var/data/click_query/' as path, 'clicks_mirror1:9312,clicks_mirror2:9312,clicks_mirror3:9312' as nodes", Some(true)).await;如果启用了认证和授权,实际生效的复制用户必须对集群目标具有 replication 权限。你可以在 CREATE CLUSTER 语句中指定该用户:
GRANT replication ON 'posts' TO 'repl_user';
CREATE CLUSTER posts 'repl_user' AS user;
如果未指定用户,则该语句会使用当前会话用户,并在成功创建后将其存储为集群用户。
在其他启用了认证的节点加入或管理该集群之前,请先在这些节点上为已存储的集群用户配置匹配的认证数据和 replication 权限。
要加入一个现有集群,您必须至少指定:
- 集群的名称
- 您要加入的集群中另一个节点的
host:port
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
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":""}如果启用了身份验证和授权,有效的复制用户必须具备 replication 权限。你可以在 JOIN CLUSTER 语句中指定该用户:
GRANT replication ON 'posts' TO 'repl_user';
JOIN CLUSTER posts AT '10.12.1.35:9312' 'repl_user' AS user;
加入节点和捐赠节点必须使用同一个用户,且其存储的身份验证数据必须匹配。仅仅在每个节点上分别创建相同的用户名和密码还不够,因为存储的身份验证数据可能不同。
如果未指定用户,则会使用当前会话用户执行加入操作。成功加入后,存储的集群用户将从捐赠集群元数据中获取。
注意:启用身份验证时,成功执行
JOIN CLUSTER会用捐赠集群的身份验证数据替换加入节点上的所有本地身份验证数据。如果身份验证日志级别为info或更高,Manticore 会在替换前将之前的本地认证数据以 JSON 备份形式写入searchd.log.auth。这份备份包含盐值和凭据哈希,因此请妥善保管认证日志,不要公开分享,分享前务必脱敏。如果JOIN CLUSTER无法获取捐赠方用户,请检查捐赠节点上的复制用户和匹配的认证数据,并查看捐赠节点上的searchd.log.auth,确认是否存在 API 身份验证失败。
在大多数情况下,当只有一个复制集群时,上述信息就足够了。但是,如果您要创建多个复制集群,则还必须设置路径并确保目录可用。
- SQL
- JSON
JOIN CLUSTER c2 at '127.0.0.1:10201' 'c2' as pathPOST /sql?mode=raw -d "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。
当节点位于不同的网段或数据中心时,可以显式设置nodes选项。这可以最小化节点间的流量,并利用网关节点进行数据中心间的互通。以下代码使用nodes选项加入现有集群。
注意: 使用此语法时,集群的
cluster_<name>_nodes_set列表不会自动更新。要更新它,请使用ALTER CLUSTER ... UPDATE nodes。
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
JOIN CLUSTER click_query 'clicks_mirror1:9312;clicks_mirror2:9312;clicks_mirror3:9312' as nodesPOST /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更改为唯一值。
DELETE CLUSTER 语句会删除指定的集群及其 名称。一旦删除集群,它将从所有节点中移除,但其表保持完整并成为活动的本地非复制表。
如果只需分离当前节点并让集群的其余部分继续运行,请改用 EXIT CLUSTER。请参阅 管理复制节点。
如果已启用身份验证和授权,DELETE CLUSTER 会使用已存储的集群用户。该用户必须在参与节点上具有匹配的身份验证数据,并且对集群目标拥有 replication 权限。
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
DELETE CLUSTER click_queryPOST /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":""}ALTER CLUSTER <cluster_name> ADD <table_name>[, <table_name>] 将一个或多个现有的本地表添加到集群中。接收ALTER查询的节点将表发送到集群中的其他节点。集群中其他节点上具有相同名称的所有本地表将被新表替换。
一旦表被复制,可以在任何节点上执行写入语句,但表名必须以集群名称前缀,例如 INSERT INTO <clusterName>:<table_name>。
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
ALTER CLUSTER click_query ADD clicks_daily_indexPOST /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>,而不需要集群前缀。
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
ALTER CLUSTER posts DROP weekly_indexPOST /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":""}