Установка и использование платформы

Тонкая настройка платформы: настройка групп доступа к конфиденциальным данным

Если вы используете API-методы privacy для управления конфиденциальными данными, настройте параметры доступа к этим данным в конфигурационном файле ноды. Для этого предназначена секция privacy. Ниже представлен пример настройки с использованием БД PostgreSQL:

privacy {

  replier {
    parallelism = 10
    stream-timeout = 1 minute
    stream-chunk-size = 1MiB
  }

  synchronizer {
    request-timeout = 2 minute
    init-retry-delay = 5 seconds
    inventory-stream-timeout = 15 seconds
    inventory-request-delay = 3 seconds
    inventory-timestamp-threshold = 10 minutes
    crawling-parallelism = 100
    max-attempt-count = 24
    lost-data-processing-delay = 10 minutes
    network-stream-buffer-size = 10
  }

  inventory-handler {
    max-buffer-time = 500ms
    max-buffer-size = 100
    max-cache-size = 100000
    expiration-time = 5m
    replier-parallelism = 10
  }

  cache {
    max-size = 100
    expire-after = 10m
  }

  storage {
    vendor = postgres
    schema = "public"
    migration-dir = "db/migration"
    profile = "slick.jdbc.PostgresProfile$"
    upload-chunk-size = 1MiB
    jdbc-config {
      url = "jdbc:postgresql://postgres:5432/node-1"
      driver = "org.postgresql.Driver"
      user = postgres
      password = wenterprise
      connectionPool = HikariCP
      connectionTimeout = 5000
      connectionTestQuery = "SELECT 1"
      queueSize = 10000
      numThreads = 20
    }
  }

  service {
    request-buffer-size = 10MiB
    meta-data-accumulation-timeout = 3s
  }
}

Выбор базы данных

Перед изменением конфигурационного файла ноды выберите базу данных, которую планируете использовать для хранения конфиденциальных данных. Блокчейн-платформа Waves Enterprise поддерживает взаимодействие с БД PostgreSQL и Amazon S3.

PostgreSQL

Во время установки БД под управлением PostgreSQL вы создадите аккаунт для доступа к БД. Заданные при этом логин и пароль затем необходимо будет указать в конфигурационном файле ноды (в полях user и password блока storage секции privacy, подробнее см. раздел vendor = postgres).

Для использования СУБД PostgreSQL потребуется установка JDBC-интерфейса (Java DataBase Connectivity). При установке JDBC, задайте имя профиля. Это имя затем необходимо будет указать в конфигурационном файле ноды (в поле profile блока storage секции privacy, подробнее см. раздел vendor = postgres).

В целях оптимизации подключение к PostgreSQL может осуществляться через инструмент pgBouncer. В этом случае pgBouncer требует особой настройки, которая описана ниже в разделе storage-pgBouncer.

Amazon S3

При использовании Amazon S3 информация должна храниться на сервере Minio. В процессе установки сервера Minio вам будет предложено задать логин и пароль для доступа к данным. Эти логин и пароль затем необходимо будет указать в конфигурационном файле ноды (в полях access-key-id и secret-access-key, подробнее см. раздел vendor = s3).

После установки подходящей для вашего проекта СУБД измените блок storage секции privacy конфигурационного файла ноды, как описано ниже.

Блок storage

В блоке storage секции privacy укажите используемую вами СУБД в параметре vendor:

  • postgres – для PostgreSQL;

  • s3 – для Amazon S3.

Важно

Если вы не используете API-методы privacy, в параметре vendor укажите значение none и закомментируйте или удалите остальные параметры в секции privacy.

vendor = postgres

При использовании СУБД PostgreSQL блок storage секции privacy выглядит следующим образом:

storage {
  vendor = postgres
  schema = "public"
  migration-dir = "db/migration"
  profile = "slick.jdbc.PostgresProfile$"
  upload-chunk-size = 1MiB
  jdbc-config {
    url = "jdbc:postgresql://postgres:5432/node-1"
    driver = "org.postgresql.Driver"
    user = postgres
    password = wenterprise
    connectionPool = HikariCP
    connectionTimeout = 5000
    connectionTestQuery = "SELECT 1"
    queueSize = 10000
    numThreads = 20
   }
}

В блоке должны быть указаны следующие параметры:

  • schema – используемая схема взаимодействия между элементами в рамках БД; по умолчанию применяется схема public; если в вашей БД предусмотрена иная схема, то укажите ее название;

  • migration-dir – директория для миграции данных;

  • profile – имя профиля для доступа к JDBC, заданное при установке JDBC (см. раздел PostgreSQL);

  • upload-chunk-size – размер фрагмента данных, загружаемых с помощью REST API метода POST /privacy/sendLargeData или gRPC API метода SendLargeData;

  • url – адрес БД PostgreSQL; подробнее см. Поле url;

  • driver – имя драйвера JDBC, позволяющим Java-приложениям взаимодействовать с БД;

  • user – имя пользователя для доступа к БД; укажите логин созданного вами аккаунта для доступа к БД под управлением PostgreSQL;

  • password – пароль для доступа к БД; укажите пароль созданного вами аккаунта для доступа к БД под управлением PostgreSQL;

  • connectionPool – имя пула соединений, по умолчанию HikariCP;

  • connectionTimeout – время бездействия соединения до его разрыва (в миллисекундах);

  • connectionTestQuery – тестовый запрос для проверки соединения с БД; для PostgreSQL рекомендуется отправлять запрос SELECT 1;

  • queueSize – размер очереди запросов;

  • numThreads – количество одновременных подключений к БД.

Поле url

В поле url укажите адрес используемой БД в следующем формате:

jdbc:postgresql://<POSTGRES_ADDRESS>:<POSTGRES_PORT>/<POSTGRES_DB>

, где

  • POSTGRES_ADDRESS – адрес хоста PostgreSQL;

  • POSTGRES_PORT – номер порта хоста PostgreSQL;

  • POSTGRES_DB – наименование БД PostgreSQL.

Можно указать адрес БД вместе с данными аккаунта, используя параметры user и password:

privacy {
  storage {
    ...
    url = "jdbc:postgresql://yourpostgres.com:5432/[email protected]&password=7nZL7Jr41qOWUHz5qKdypA&sslmode=require"
    ...
    }
}

В этом примере user_privacy_node_0@company – имя пользователя, 7nZL7Jr41qOWUHz5qKdypA – его пароль. Также вы можете использовать команду sslmode=require для требования использования ssl при авторизации.

pgBouncer

Для оптимизации работы с базой данных PostgreSQL используется pgBouncer – инструмент, через который осуществляется подключение к базе данных PostgreSQL. pgBouncer настраивается в отдельном конфигурационном файле данного инструмента – pgbouncer.ini. В связи с тем, что pool_mode = transaction режим в настройке pgBouncer не поддерживает подготовленные операторы на стороне сервера, в целях предотвращения потери данных мы рекомендуем использовать pool_mode с session режимом в настройках файла pgbouncer.ini. При использовании сессионного режима следует задавать параметр server_reset_query со значением DISCARD ALL.

[pgbouncer]
pool_mode = session
server_reset_query = DISCARD ALL

Больше информации о работе сессионного режима с подготовленными операторами можно найти в официальной документации к pgBouncer.

vendor = s3

При использовании СУБД Amazon S3, блок storage секции privacy выглядит следующим образом:

storage {
  vendor = s3
  url = "http://localhost:9000/"
  bucket = "privacy"
  region = "aws-global"
  access-key-id = "minio"
  secret-access-key = "minio123"
  path-style-access-enabled = true
  connection-timeout = 30s
  connection-acquisition-timeout = 10s
  max-concurrency = 200
  read-timeout = 0s
  upload-chunk-size = 5MiB
}
  • url – адрес сервера Minio для хранения данных; по умолчанию, Minio использует порт 9000;

  • bucket – имя таблицы БД S3 для хранения данных;

  • region – название региона S3, значение параметра – aws-global;

  • access-key-id – идентификатор ключа доступа к данным; укажите логин для доступа к данным, который вы задали в процессе установки сервера Minio (см. раздел Amazon S3);

  • secret-access-key – ключ доступа к данным в хранилище S3; укажите пароль для доступа к данным, который вы задали в процессе установки сервера Minio (см. раздел Amazon S3);

  • path-style-access-enabled = true – путь к таблице S3 – неизменяемый параметр;

  • connection-timeout – период бездействия до разрыва соединения (в секундах);

  • connection-acquisition-timeout – период бездействия при установлении соединения (в секундах);

  • max-concurrency – максимальное число параллельных обращений к хранилищу;

  • read-timeout – период бездействия при чтении данных (в секундах);

  • upload-chunk-size – размер фрагмента данных, загружаемых с помощью REST API метода POST /privacy/sendLargeData или gRPC API метода SendLargeData.

Блок replier

В блоке replier секции privacy укажите параметры потоковой передачи конфиденциальных данных:

replier {
  parallelism = 10
  stream-timeout = 1 minute
  stream-chunk-size = 1MiB
}

В блоке должны быть указаны следующие параметры:

  • parallelism – максимальное количество параллельных задач обработки запросов конфиденциальных данных;

  • stream-timeout – максимальное время выполнения операции чтения потока данных (стрима);

  • stream-chunk-size – размер фрагмента данных при передаче данных в виде потока (стрима).

Блок inventory-handler

В блоке inventory-handler секции privacy укажите параметры сбора инвентаризационной информации (privacy inventory) конфиденциальных данных:

inventory-handler {
  max-buffer-time = 500ms
  max-buffer-size = 100
  max-cache-size = 100000
  expiration-time = 5m
  replier-parallelism = 10
}

В блоке должны быть указаны следующие параметры:

  • max-buffer-time – максимальное время накопления данных в буфере; по истечении указанного времени нода пакетно обрабатывает всю инвентаризационную информацию (privacy inventory);

  • max-buffer-size – максимальное количество инвентаризационной информации в буфере; когда лимит достигнут, нода пакетно обрабатывает всю инвентаризационную информацию;

  • max-cache-size – максимальный размер кэша инвентаризационной информации; используя этот кэш, нода выбирает только новую инвентаризационную информацию;

  • expiration-time – время, когда истекает срок действия элементов кэша (инвентаризационной информации);

  • replier-parallelism – максимальное количество параллельно выполняемых задач обработки запросов инвентаризационной информации.

Блок cache

В блоке cache секции privacy укажите параметры кэша ответов конфиденциальных данных:

cache {
  max-size = 100
  expire-after = 10m
}

Примечание

Большие файлы (файлы, загружаемые с помощью REST API метода POST /privacy/sendLargeData или gRPC API метода SendLargeData) не подлежат кешированию.

В блоке должны быть указаны следующие параметры кэша:

  • max-size – максимальное количество элементов;

  • expire-after – время, по истечении которого заканчивается срок действия элементов кэша, которые не получили доступ.

Блок synchronizer

В блоке synchronizer секции privacy укажите параметры синхронизации конфиденциальных данных:

synchronizer {
  request-timeout = 2 minute
  init-retry-delay = 5 seconds
  inventory-stream-timeout = 15 seconds
  inventory-request-delay = 3 seconds
  inventory-timestamp-threshold = 10 minutes
  crawling-parallelism = 100
  max-attempt-count = 24
  lost-data-processing-delay = 10 minutes
  network-stream-buffer-size = 10
}

В блоке должны быть указаны следующие параметры:

  • request-timeout – максимальное время ожидания ответа после запроса данных; значение по умолчанию – 2 minute;

  • init-retry-delay – пауза после неудачной попытки; с каждой попыткой задержка увеличивается на 4/3; значение по умолчанию – 5 seconds;

  • inventory-stream-timeout – максимальное время ожидания сетевого сообщения с инвентаризационной информацией (privacy inventory), т.е. подтверждения от конкретной ноды, что у нее есть определенные данные, и она может их предоставить для загрузки. По истечении этого таймаута нода опрашивает всех пиров (рассылает inventory-request), есть ли у них необходимые для загрузки данные; значение по умолчанию – 15 seconds;

  • inventory-request-delay – задержка после запроса инвентарных данных у пиров (inventory-request); значение по умолчанию – 3 seconds;

  • inventory-timestamp-threshold – параметр используется для принятия решения, отправлять ли PrivacyInventory сообщение при успешной синхронизации (загрузке) данных; значение по умолчанию – 10 minutes;

  • crawling-parallelism – максимальное количество параллельно выполняемых задач краулера – компонента, который собирает конфиденциальные данные у пиров; значение по умолчанию – 100;

  • max-attempt-count – количество попыток, которые предпримет краулер, прежде чем данные будут помечены как потерянные; значение по умолчанию – 24;

  • lost-data-processing-delay – задержка между попытками обработки очереди потерянных данных; значение по умолчанию – 10 minutes;

  • network-stream-buffer-size – максимальное количество фрагментов данных в буфере; когда указанное количество достигнуто, активируется обратное давление; значение по умолчанию – 10.

Поле inventory-timestamp-threshold

Нода отправляет пирам сообщение PrivacyInventory после того, как она загружает в своё приватное хранилище данные по определенному хэшу данных, то есть успешно проводит синхронизацию данных. Для хранения PrivacyInventory используется кэш, ограниченный по количеству объектов и времени их нахождения в кэше. В зависимости от значения параметра inventory-timestamp-threshold обработчик событий вставки данных принимает решение, нужно ли отправлять сообщение PrivacyInventory при загрузке данных. Обработчик сравнивает время транзакции (timestamp), которая соответствует данному хэшу данных, и текущее время на ноде. Если разница превышает значение параметра inventory-timestamp-threshold, то сообщения PrivacyIntentory не отправляются. Подобрав значение параметра inventory-timestamp-threshold можно избежать ситуации, когда нода, которая синхронизирует стейт с сетью, засоряет сеть лишними сообщениями PrivacyInventory.

Блок service

В блоке service секции privacy укажите параметры gRPC метода SendLargeData и REST метода POST /privacy/sendLargeData для отправки потока конфиденциальных данных.

service {
  request-buffer-size = 10MiB
  meta-data-accumulation-timeout = 3s
}

В блоке должны быть указаны следующие параметры:

  • request-buffer-size – максимальный размер буфера запроса; когда указанный размер достигнут, активируется обратное давление;

  • meta-data-accumulation-timeout – максимальное время, за которое должны быть обработаны метаданные при отправке данных через REST API метод POST /privacy/sendLargeData.