# Добавление узлов

В данном разделе приведена информация о добавлении новых узлов в
существующий кластер Picodata.

## Идентификация кластера {: #cluster_traits }

Для идентификации кластера Picodata используется его [имя]. Данный
параметр задается администратором и используется только при
[первоначальной сборке] кластера. Впоследствии, при добавление к
работающему кластеру новых инстансов, указание имени кластера
игнорируется.

См. также:

- [Файл конфигурации](../reference/config.md#config_file_description)

## Идентификация узлов {: #instance_traits }

Узел — логическая единица кластера, представленная на программном
уровне [инстансом] (экземпляром приложения) Picodata.

Инстанс может быть идентифицирован по:

- [имени][instance_name] — удобочитаемому параметру, который задается
  администраторов при запуске инстанса и в дальнейшем может быть изменен
  (например, при перезапуске инстанса)
- [идентификатору][`_pico_instance`] — уникальному ключу в формате [UUID], который
  автоматически присваивается инстансу в момент присоединения к кластеру
  и в дальнейшем не может быть изменен

Имена и идентификаторы инстансов кластера содержатся в системной таблице
[`_pico_instance`].

[имя]: ../reference/cli.md#run_cluster_name
[инстансом]: ../overview/glossary.md#instance
[UUID]: https://en.wikipedia.org/wiki/Universally_unique_identifier
[`_pico_instance`]: ../architecture/system_tables.md#_pico_instance
[первоначальной сборке]: ../overview/glossary.md#bootstrap

## Обязательные параметры {: #essentials }

Для того, чтобы добавить инстанс к существующему кластеру, необходимо:

- знать [имя кластера] (предполагается, что оно известно администратору)
- знать [адрес] одного из действующих узлов кластера

[имя кластера]: ../reference/cli.md#run_cluster_name
[адрес]: ../reference/cli.md#run_peer

Указанные два параметра являются обязательными: без них подключение к
существующему кластеру невозможно.

## Дополнительные параметры {: #extras }

Дополнительно рекомендуется задать значения некоторых необязательных
параметров:

- [имя][instance_name] добавляемого инстанса
- его [рабочую директорию]
- его [сетевой адрес]

[instance_name]: ../reference/cli.md#run_instance_name
[рабочую директорию]: ../reference/cli.md#run_instance_dir
[сетевой адрес]: ../reference/cli.md#run_iproto_listen

Имя используется для удобства и быстрой идентификации инстанса. Если имя
не дать, то оно будет сгенерировано автоматически в момент добавления в
кластер на основе [`raft_id`] инстанса.

[`raft_id`]: ../architecture/system_tables.md#_pico_instance

Имя инстанса задается один раз и не может быть изменено в
дальнейшем (например, оно постоянно сохраняется в снапшотах инстанса). В
кластере нельзя иметь два инстанса с одинаковым именем — пока инстанс
живой, другой инстанс сразу после запуска получит ошибку при добавлении
в кластер. Тем не менее, имя можно повторно использовать, если
предварительно [исключить](node_expel.md#expel) первый инстанс с таким
именем из кластера.

## Использование файлов конфигурации {: #config_file }

При запуске инстанса можно использовать как непосредственно одну
команду, в которой указаны необходимые параметры, так и [файл
конфигурации](deploy.md#simple_cluster_config) инстанса. Последний
способ более предпочтителен, так как позволяет удобнее контролировать
параметры запуска. Файл конфигурации удобен для хранения как глобальных
параметров, которые впоследствии не будут меняться, так и динамических,
которые можно впоследствии переопределить.

Предположим, что имеется ранее запущенный кластер с двумя [тирами][tier]
`compute` и `storage`, как описано в разделе [Создание
кластера](deploy.md#multi_tier_cluster). Добавим к нему еще один инстанс
для хранения данных. Для этого подготовим конфигурационный файл инстанса со
следующим содержанием:

???+ example "storage-3.yml"
    ```yaml
    cluster:
      name: multi_tier_cluster
      tier:
        compute:
          replication_factor: 1
          bucket_count: 1500
          can_vote: true
        storage:
          replication_factor: 2
          bucket_count: 1500
          can_vote: false

    instance:
      tier: storage
      instance_dir: './storage-3'
      peer:
      - 127.0.0.1:3301

      iproto_listen: '0.0.0.0:3304'
      iproto_advertise: '127.0.0.1:3304'
      http_listen: '0.0.0.0:8084'
      pg:
        listen: '0.0.0.0:5435'
        advertise: '127.0.0.1:5435'

      memtx:
        memory: 1024M
    ```

Далее запустим инстанс в отдельном окне терминала:

```shell
picodata run --config storage-3.yml
```

!!! note "Примечание"
    Если указанная в параметре `instance_dir` директория не
    существует, она будет создана автоматически.

## Ограничения {: #limitations }

При добавлении узла к существующему кластеру нельзя переопределить
список [тиров][tier] и [фактор репликации]. Данные параметры задаются только
при [создании кластера](deploy.md).

[tier]: ../overview/glossary.md#tier
[фактор репликации]: ../overview/glossary.md#replication_factor

## Проверка присоединения {: #check }

После успешного присоединения к кластеру новый инстанс появится в выводе
команды [`picodata status`]. Дополнительно проверим состояние инстанса в
таблице [`_pico_instance`]:

```sql
(admin) sql> SELECT "name","current_state" FROM _pico_instance;
+-------------+---------------+
| name        | current_state |
+=============================+
| "compute_1" | ["Online", 1] |
|-------------+---------------|
| "storage_1" | ["Online", 1] |
|-------------+---------------|
| "storage_2" | ["Online", 1] |
|-------------+---------------|
| "storage_3" | ["Online", 1] |
+-------------+---------------+
(4 rows)
```

Проверим состояние репликасета:

```sql
(admin) sql> SELECT * FROM _pico_replicaset;
+-----------+-----------------------+---------------------+--------------------+---------+--------+---------------+-----------+----------------------+----------------------+------------------+
| name      | uuid                  | current_master_name | target_master_name | tier    | weight | weight_origin | state     | current_config_versi | target_config_versio | promotion_vclock |
|           |                       |                     |                    |         |        |               |           | on                   | n                    |                  |
+==============================================================================================================================================================================================+
| compute_1 | a5db2a1e-2ab1-49a2-b5 | compute-1           | compute-1          | compute | 1      | auto          | ready     | 1                    | 1                    | {}               |
|           | e3-911be0e6ca1a       |                     |                    |         |        |               |           |                      |                      |                  |
|-----------+-----------------------+---------------------+--------------------+---------+--------+---------------+-----------+----------------------+----------------------+------------------|
| storage_1 | fee5e3f0-57e1-41d6-b4 | storage_1_1         | storage_1_1        | storage | 1      | auto          | ready     | 2                    | 2                    | {}               |
|           | bb-9e13fd261a83       |                     |                    |         |        |               |           |                      |                      |                  |
|-----------+-----------------------+---------------------+--------------------+---------+--------+---------------+-----------+----------------------+----------------------+------------------|
| storage_2 | 31aebae8-83e7-4642-81 | storage_2_1         | storage_2_1        | storage | 0      | auto          | not-ready | 1                    | 1                    | {}               |
|           | bc-4148bce814de       |                     |                    |         |        |               |           |                      |                      |                  |
+-----------+-----------------------+---------------------+--------------------+---------+--------+---------------+-----------+----------------------+----------------------+------------------+
(3 rows)
```

[`picodata status`]: ../reference/cli.md#status

В данном случаем вновь созданный репликасет остается незаполненным, т.к.
фактор репликации 2, а мы создали только один новый инстанс, поэтому для
заполнения репликасета создайте инстанс `storage-4` аналогичным
способом.

См. также:

- [Удаление узлов](node_expel.md)
