Чтобы присоединиться к существующему кластеру, вы должны указать как минимум:
- имя кластера
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 перед заменой записывает прежние локальные данные auth вsearchd.log.authв виде JSON-резервной копии. В этой резервной копии есть соли и хэши учетных данных, поэтому храните журнал auth в секрете и обезличивайте его перед передачей. ЕслиJOIN CLUSTERне может получить пользователя кластера-источника, проверьте пользователя репликации и совпадение данных auth на узлах-источниках, а также ошибки аутентификации API вsearchd.log.authна узлах-источниках.
В большинстве случаев вышеуказанного достаточно, когда существует один кластер репликации. Однако, если вы создаете несколько кластеров репликации, вы также должны установить путь и убедиться, что каталог доступен.
- 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" вашего конфигурационного файла на уникальное значение перед попыткой присоединиться к кластеру.
Оператор 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_tablePOST /cli -d "
ALTER CLUSTER click_query ADD clicks_daily_table
"$params = [
'cluster' => 'click_query',
'body' => [
'operation' => 'add',
'table' => 'clicks_daily_table'
]
];
$response = $client->cluster()->alter($params);utilsApi.sql('ALTER CLUSTER click_query ADD clicks_daily_table')await utilsApi.sql('ALTER CLUSTER click_query ADD clicks_daily_table')res = await utilsApi.sql('ALTER CLUSTER click_query ADD clicks_daily_table');utilsApi.sql("ALTER CLUSTER click_query ADD clicks_daily_table");utilsApi.Sql("ALTER CLUSTER click_query ADD clicks_daily_table");utils_api.sql("ALTER CLUSTER click_query ADD clicks_daily_table", 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":""}Оператор ALTER CLUSTER <cluster_name> UPDATE nodes обновляет списки узлов на каждом узле в указанном кластере, чтобы включить все активные узлы кластера. Для получения дополнительной информации о списках узлов см. Присоединение к кластеру.
- SQL
- JSON
- PHP
- Python
- Python-asyncio
- javascript
- Java
- C#
- Rust
ALTER CLUSTER posts UPDATE nodesPOST /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":""}Если включены аутентификация и авторизация, команды ALTER CLUSTER ... UPDATE nodes, ALTER CLUSTER ... ADD и ALTER CLUSTER ... DROP используют сохраненного пользователя кластера. Чтобы изменить сохраненного пользователя кластера, выдайте новому пользователю право replication и выполните:
ALTER CLUSTER posts UPDATE user 'repl_user'
Новый сохраненный пользователь должен быть подготовлен с совпадающими данными аутентификации на узлах, которые будут участвовать в последующих операциях кластера. Эти операции завершатся сбоем, если сохраненный пользователь отсутствует, имеет другие данные аутентификации или лишится права replication.
Например, при первоначальном создании кластера список узлов, используемых для повторного присоединения к кластеру, был 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на любом другом узле.
После этих шагов другие узлы забудут об отсоединенном узле, а отсоединенный узел забудет о кластере. Это действие не повлияет на таблицы в кластере или на отсоединенном узле.
EXIT CLUSTER <cluster_name> — это онлайн-эквивалент описанного выше ручного процесса отсоединения. Он удаляет локальный узел из кластера репликации, сохраняет локальные таблицы нетронутыми в качестве обычных локальных таблиц, сохраняет локальную конфигурацию, а затем просит оставшиеся узлы обновить свои сохраненные списки узлов с помощью существующего механизма ALTER CLUSTER ... UPDATE nodes.
EXIT CLUSTER posts
Используйте EXIT CLUSTER, когда хотите отсоединить только текущий узел. Используйте DELETE CLUSTER, когда хотите удалить кластер со всех узлов.
EXIT CLUSTER разрешен только для работоспособного локального узла в первичном кластере. Если команда возвращает предупреждение, локальное отсоединение уже выполнено, но может потребоваться дополнительное завершение. В этом случае выполните ALTER CLUSTER <cluster_name> UPDATE nodes на любом оставшемся узле, чтобы завершить обновление оставшихся метаданных кластера.
Если после EXIT CLUSTER оставшаяся сторона превращается в чистый кластер из одного узла, она остаётся кластером репликации. После корректного завершения работы этот оставшийся узел можно запускать обычным образом, и он должен вернуться в состояние primary / synced; в этом случае для самого себя --new-cluster не нужен.