Перейти к содержанию

Развертывание кластера через Ansible

В данном разделе приведена информация по развертыванию кластера Picodata из нескольких инстансов, запущенных на разных серверах посредством роли picodata-ansible.

Требования к оборудованию и ПО

Для промышленной эксплуатации кластера следует учитывать базовые требования к оборудованию и программному обеспечению:

  • наличие подготовленных серверов с поддерживаемыми ОС на базе Linux (список см. https://picodata.io/download/)
  • минимальный расчет ресурсов на 1 инстанс (без учета ресурсов для ОС): 1 ядро ЦП, 64 МБ ОЗУ, 512 МБ дискового пространства

Установка роли

Установите роль из репозитория через ansible-galaxy:

ansible-galaxy install -f git+https://git.picodata.io/core/picodata-ansible.git

или создайте файл requirements.yml со следующим содержимым:

- src: https://git.picodata.io/core/picodata-ansible.git
  scm: git

и затем выполните команду:

ansible-galaxy install -fr requirements.yml

Создание директорий

В текущей директории создайте поддиректории — это нужно для отделения инвентарных файлов от сценариев (плейбуков):

mkdir {hosts,playbooks}

Создание инвентарного файла

Рассмотрим два сценария: простой кластер с единственным тиром и кластер из нескольких тиров. Пусть в распоряжении есть два сервера: 192.168.0.1 и 192.168.0.2.

Создайте инвентарный файл hosts/cluster.yml и наполните его в зависимости от нужного сценария содержанием ниже.

Простой кластер на нескольких серверах

cluster.yml
all:
  vars:
    install_packages: true                           # для установки пакета picodata из репозитория
    cluster_name: simple_cluster                     # имя кластера
    first_bin_port: 13301                            # начальный бинарный порт для первого инстанса (он же main_peer)
    first_http_port: 18001                           # начальный http-порт для первого инстанса для веб-интерфейса

    tiers:                                           # описание тиров
      default:                                       # имя тира (default)
        instances_per_server: 2                      # сколько инстансов запустить на каждом сервере этого тира

DC1:                                                 # имя датацентра (используется для failure_domain)
  hosts:                                             # далее перечисляем серверы в датацентре
    server-1:                                        # имя сервера в инвентарном файле (используется для failure_domain)
      ansible_host: 192.168.0.1                      # IP адрес или fqdn если не совпадает с предыдущей строкой
    server-2:                                        # имя сервера в инвентарном файле (используется для failure_domain)
      ansible_host: 192.168.0.2                      # IP адрес или fqdn если не совпадает с предыдущей строкой

Кластер из двух тиров на нескольких серверах

Пример инвентарного файла для 4-х серверов, расположенных в 3-х датацентрах (DC1, DC2 и DC3):

cluster.yml
all:
  vars:
    ansible_user: vagrant      # пользователь для ssh-доступа к серверам

    repo: 'https://download.picodata.io'  # репозиторий, откуда инсталлировать пакет picodata

    cluster_name: 'demo'           # имя кластера
    admin_password: '123asdZXV'    # пароль пользователя admin

    default_bucket_count: 23100    # количество бакетов в каждом тире (по умолчанию 30000)

    audit: false                   # состояние аудита (отключен)
    log_level: 'info'              # уровень отладки
    log_to: 'file'                 # вывод журнала в файлы (а не в journald)

    conf_dir: '/etc/picodata'         # директория для хранения конфигурационных файлов
    data_dir: '/var/lib/picodata'     # директория для хранения данных
    run_dir: '/var/run/picodata'      # директория для хранения sock-файлов
    log_dir: '/var/log/picodata'      # директория для журналов и файлов аудита
    share_dir: '/usr/share/picodata'  # директория для размещения служебных данных (плагинов)

    listen_address: '{{ ansible_fqdn }}'     # адрес, который будет слушать инстанс. Для IP указать {{ansible_default_ipv4.address}}
    pg_address: '{{ listen_address }}'       # адрес, который будет слушать PostgreSQL-протокол инстанса

    first_bin_port: 13301     # начальный бинарный порт для первого инстанса
    first_http_port: 18001    # начальный http-порт для первого инстанса для веб-интерфейса
    first_pg_port: 15001      # начальный номер порта для PostgreSQL-протокола инстансов кластера

    tiers:                         # описание тиров
      arbiter:                     # имя тира
        replicaset_count: 1        # количество репликасетов
        replication_factor: 1      # фактор репликации
        config:
          memtx:
            memory: 64M            # количество памяти, выделяемое каждому инстансу тира
        host_groups:
          - ARBITERS               # целевая группа серверов для установки инстанса

      default:                     # имя тира
        replicaset_count: 3        # количество репликасетов
        replication_factor: 3      # фактор репликации
        bucket_count: 16384        # количество бакетов в тире
        config:
          memtx:
            memory: 71M            # количество памяти, выделяемое каждому инстансу тира
        host_groups:
          - STORAGES               # целевая группа серверов для установки инстанса

    db_config:                     # параметры конфигурации кластера (см. https://docs.picodata.io/picodata/stable/reference/db_config)
      governor_auto_offline_timeout: 30
      iproto_net_msg_max: 500
      memtx_checkpoint_count: 1
      memtx_checkpoint_interval: 7200

    plugins:
      example:                                                  # плагин
        path: '../plugins/weather_0.1.0-ubuntu-focal.tar.gz'    # путь до пакета плагина
        config: '../plugins/weather-config.yml'                 # путь до файла с настройками плагина
        services:
          weather_service:
            tiers:                                                  # список тиров, в которые устанавливается сервис плагина
              - default                                             # указано значение по умолчанию (default)

DC1:                                # имя датацентра (failure_domain)
  hosts:                            # серверы в датацентре
    server-1-1:                     # имя сервера в инвентарном файле
      ansible_host: '192.168.19.21' # IP-адрес или fqdn если не совпадает с предыдущей строкой
      host_group: 'STORAGES'        # определение целевой группы серверов для установки инстансов

    server-1-2:                     # имя сервера в инвентарном файле
      ansible_host: '192.168.19.22' # IP-адрес или fqdn если не совпадает с предыдущей строкой
      host_group: 'ARBITERS'        # определение целевой группы серверов для установки инстансов

DC2:                                # имя датацентра (failure_domain)
  hosts:                            # серверы в датацентре
    server-2-1:                     # имя сервера в инвентарном файле
      ansible_host: '192.168.20.21' # IP-адрес или fqdn если не совпадает с предыдущей строкой
      host_group: 'STORAGES'        # определение целевой группы серверов для установки инстансов

DC3:                                # имя датацентра (failure_domain)
  hosts:                            # серверы в датацентре
    server-3-1:                     # имя сервера в инвентарном файле
      ansible_host: '192.168.21.21' # IP-адрес или fqdn если не совпадает с предыдущей строкой
      host_group: 'STORAGES'        # определение целевой группы серверов для установки инстансов

Изменение параметров роли

Параметры роли, используемые по умолчанию, располагаются в файле defaults/main.yml, их также можно переопределять в инвентарном файле.

Помимо параметров по умолчанию используется словарь tiers с указанием внутри:

  • имени тира (например router)
  • количества репликасетов (replicaset_count) или количества инстансов на каждом сервере (instances_per_server)
  • фактора репликации (replication_factor) для тира (по умолчанию равен 1)

Пример словаря tiers:

tiers:
  default:                     # имя тира default
    replicaset_count: 2        # количество репликасетов
    replication_factor: 3      # фактор репликации
    bucket_count: 16384        # количество бакетов в тире
    config:
      memtx:
        memory: 128M           # количество памяти, предоставляемое непосредственно на хранение данных

См также:

Расчет количества инстансов/репликасетов

В инвентарном файле для тиров можно указывать количество как репликасетов, так и инстансов на каждом сервере. При этом, в первом случае значение instances_per_server будет рассчитано автоматически. Если при расчете будет получено дробное значение, то роль остановится с ошибкой.

Если указаны оба параметра, то приоритет у instances_per_server

Количество репликасетов в кластере

replicaset_count = instances_per_server * SERVER_COUNT / replication_factor

Если при расчете вы получаете дробное число, значит количество серверов или фактор репликации подобраны некорректно и это необходимо исправить.

Количество инстансов на одном сервере

instances_per_server = replicaset_count * replication_factor / SERVER_COUNT

Аналогично, если при расчете вы получаете дробное число, значит количество серверов или фактор репликации подобраны некорректно и это необходимо исправить.

Создание плейбука

Для подключения роли создайте плейбук playbooks/picodata.yml, добавив в него следующее содержание:

picodata.yml
---
- name: Deploy picodata cluster
  hosts: all
  become: true

  tasks:

  - name: Import picodata-ansible role
    ansible.builtin.import_role:
      name: picodata-ansible

Установка кластера

Выполните установку кластера командой:

ansible-playbook -i hosts/cluster.yml playbooks/picodata.yml

При успешном окончании выполнения плейбука будет создан yaml-файл report.yml с перечислением всех инстансов и портов кластера.

Более подробно о доступных переменных в инвентарном файле можно узнать в git-репозитории роли.

См. также:

Управление кластером

Для управления кластером используйте теги роли, указав их после параметра -t.

Пример команды для удаления кластера:

ansible-playbook -i hosts.yml picodata.yml -t remove

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

ansible-playbook -i hosts.yml picodata.yml -t backup

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

ansible-playbook -i hosts.yml picodata.yml -t restore
Список поддерживаемых тегов
Имя Описание
deploy Установка кластера. Используется по умолчанию, если не указаны другие тэги
remove Удаление кластера
install_pkgs Установка пакета Picodata. Также используется при установке кластера
backup Создание резервной копии кластера
restore Восстановление из резервной копии кластера
restore_full Установка кластера и восстановление из резервной копии
genin Получить список инстансов в разбивке для каждого сервера (используется в других сценариях )
restart Перезапуск всех инстансов на всех серверах
plugins Установка и конфигурация плагинов
crash_dump Сбор файлов необходимых для анализа разработчиками в случае сбоя кластера
deploy_become, remove_become Используются для установки/удаления кластера в режиме rootless

Управление плагинами

C помощью роли picodata-ansible можно также добавлять в кластер плагины и их конфигурации. Для этого модифицируйте инвентарный файл hosts/cluster.yml, добавив в него блок plugins. Пример инвентарного файла, поддерживающего установку в кластер c одним тиром тестового плагина weather:

cluster.yml
all:
  vars:
    install_packages: true                           # для установки пакета picodata из репозитория
    cluster_name: simple_cluster                     # имя кластера
    first_bin_port: 13301                            # начальный бинарный порт для первого инстанса (он же main_peer)
    first_http_port: 18001                           # начальный http-порт для первого инстанса для веб-интерфейса

    tiers:                                           # описание тиров
      default:                                       # имя тира (default)
        bucket_count: 20000                          # сколько бакетов будет размещено на данном тире
        instances_per_server: 2                      # сколько инстансов запустить на каждом сервере этого тира

    plugins:                                         # описание плагинов
      example:                                       # имя плагина в Ansible (может не совпадать с именем в Picodata)
        path: '../plugins/weather_0.1.0.tar.gz'      # путь к архиву с плагином
        config: '../plugins/weather-config.yml'      # путь к файлу конфигурации плагина
        tiers:                                       # список тиров, на которых будет запущен плагин
          - default                                  # имя тира (default)


DC1:                                                 # имя датацентра (используется для failure_domain)
  hosts:                                             # далее перечисляем серверы в датацентре
    server-1:                                        # имя сервера в инвентарном файле (используется для failure_domain)
      ansible_host: 192.168.0.1                      # IP адрес или fqdn если не совпадает с предыдущей строкой
    server-2:                                        # имя сервера в инвентарном файле (используется для failure_domain)
      ansible_host: 192.168.0.2                      # IP адрес или fqdn если не совпадает с предыдущей строкой

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

См. также:

Модифицировать файл плейбука не требуется.

Выполните установку плагинов в кластер командой:

ansible-playbook -i hosts/cluster.yml playbooks/picodata.yml -t plugins

Примечание

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