Конфигурация высоконагруженных систем: различия между версиями

Материал из Юпитер-8
Строка 35: Строка 35:
==Изменение конфигурации==
==Изменение конфигурации==
Необходимо внести ряд изменений в файл /etc/postgresql/14/main/postgresql.conf<br>
Необходимо внести ряд изменений в файл /etc/postgresql/14/main/postgresql.conf<br>
1. Если кластер был перенесёт то необходимо изменить строку '''''data_directory = '/var/lib/postgresql/14/main'''''' на '''''data_directory = '/mnt/postgresql/14/main'''''' - в нашем случае.
===Общие настройки===
1. Если кластер был перенесёт, то необходимо изменить строку '''''data_directory = '/var/lib/postgresql/14/main'''''' на '''''data_directory = '/mnt/postgresql/14/main'''''' - в нашем случае.<br>
2. Чтобы уменьшить риск взлома СУБД, рекомендуется использовать '''''listen_addresses = 'localhost''''''<br>
3. '''''max_connections = 1800''''' - максимальтое число разрешенных подключений.<br>
4. '''''password_encryption = md5''''' - шифрование, которое будет использоваться.<br>
5. '''''shared_buffers = 2GB''''' - Задаёт объём памяти, который будет использовать сервер баз данных для буферов в разделяемой памяти. Рекомендуется использовать 25% от общего объема ОЗУ, но на практике необходимо подбирать в зависимости от общей нагрузки. При увеличении shared_buffers обычно требуется соответственно увеличить max_wal_size, чтобы растянуть процесс записи большого объёма новых или изменённых данных на более продолжительное время.<br>
6. '''''temp_buffers = 512MB''''' - Задаёт максимальное число временных буферов для каждого сеанса. По умолчанию объём временных буферов составляет восемь мегабайт (1024 буфера).<br>
7. '''''work_mem = 256MB''''' - Задаёт объём памяти, который будет использоваться для внутренних операций сортировки и хеш-таблиц, прежде чем будут задействованы временные файлы на диске.<br>
8. '''''maintenance_work_mem = 2GB''''' - Задаёт максимальный объём памяти для операций обслуживания БД.<br>
9. '''''shared_memory_type = mmap''''' - Выбирает механизм разделяемой памяти, используя который сервер будет работать с основной областью общей памяти, содержащей общие буферы PostgreSQL и другие общие данные. Параметр доступен с PostgreSQL 12.<br>
10. '''''dynamic_shared_memory_type = sysv''''' - Выбирает механизм динамической разделяемой памяти, который будет использовать сервер.<br>
11. '''''min_dynamic_shared_memory = 1024MB''''' - Когда для общей разделяемой памяти используются огромные страницы, новым параметром min_dynamic_shared_memory при запуске сервера можно выделить область динамической разделяемой памяти для параллельно выполняемых запросов. Параметр доступен с PostgreSQL 14.<br>
12. '''''max_files_per_process = 300''''' - Задаёт максимальное число файлов, которые могут быть одновременно открыты каждым серверным подпроцессом. Значение по умолчанию — 1000 файлов.<br>
13. '''''effective_io_concurrency = 100''' - Задаёт допустимое число параллельных операций ввода/вывода, которое говорит postgresql о том, сколько операций ввода/вывода могут быть выполнены одновременно. На низкопроизводительных дисках рекомендуется указывать '''5''' и меньше.<br>
14. '''''max_worker_processes = 4''''' - Задаёт максимальное число фоновых процессов, которое можно запустить в текущей системе. Этот параметр можно задать только при запуске сервера. Значение по умолчанию — 8.<br>
15. '''''max_parallel_maintenance_workers = 4''''' - Задаёт максимальное число рабочих процессов, которые могут запускаться одной служебной командой.<br>
16. '''''wal_buffers = 16MB''''' - Объём разделяемой памяти, который будет использоваться для буферизации данных WAL, ещё не записанных на диск. Значение по умолчанию, равное -1, задаёт размер, равный 1/32 (около 3%) от shared_buffers, но не меньше, чем 64 КБ и не больше, чем размер одного сегмента WAL (обычно 16 МБ).<br>
17. '''''checkpoint_completion_target = 0.9''''' - Задаёт целевое время для завершения процедуры контрольной точки, как коэффициент для общего времени между контрольными точками.<br>
18. '''''max_wal_size = 4GB''''' - Максимальный размер, до которого может вырастать WAL между автоматическими контрольными точками в WAL.<br>
19. '''''min_wal_size = 1GB''''' - Пока WAL занимает на диске меньше этого объёма, старые файлы WAL в контрольных точках всегда перерабатываются, а не удаляются.<br>
20. '''''effective_cache_size = 4GB''''' - Определяет представление планировщика об эффективном размере дискового кеша, доступном для одного запроса. Это представление влияет на оценку стоимости использования индекса; чем выше это значение, тем больше вероятность, что будет применяться сканирование по индексу, чем ниже, тем более вероятно, что будет выбрано последовательное сканирование.<br>
===Настройка логирования===
1. '''''log_destination = 'stderr'''''' - PostgreSQL поддерживает несколько методов протоколирования сообщений сервера: stderr, csvlog и syslog. На Windows также поддерживается eventlog. В качестве значения log_destination указывается один или несколько методов протоколирования, разделённых запятыми. По умолчанию используется stderr. Параметр можно задать только в конфигурационных файлах или в командной строке при запуске сервера.<br>
2. '''''logging_collector = on''''' - Параметр включает сборщик сообщений (logging collector). Это фоновый процесс, который собирает отправленные в stderr сообщения и перенаправляет их в журнальные файлы.<br>
3. '''''log_directory = '/mnt/postgresql/logs/14'''''' - путь куда записывать лог-файлы. Для пользователя postgres должно быть разрешение на запись.<br>
4. '''''log_filename = 'postgresql-%a.log'''''' - название файл-лога. '''%a''' - указывает, что файлы формируются по длям недели.<br>
5. '''''log_rotation_age = 1d''''' - файлы обновляются каждый день.<br>
6. '''''log_rotation_size = 10MB''''' - файлы обновляются при достижении размера в 10MB.<br>
===Управление транзакциями===
1. '''''statement_timeout = 120000''''' - Задаёт максимальное время выполнения оператора (в миллисекундах), начиная с момента получения сервером команды от клиента, по истечении которого оператор прерывается. Устанавливать значение statement_timeout в postgresql.conf без особой необходимости не рекомендуется, так как это повлияет на все сеансы.<br>
2. '''lock_timeout = 120000''' - Задаёт максимальную длительность ожидания (в миллисекундах) любым оператором получения блокировки таблицы, индекса, строки или другого объекта базы данных. Устанавливать значение lock_timeout в postgresql.conf без особой необходимости не рекомендуется, так как это повлияет на все сеансы.<br>
3. '''''idle_in_transaction_session_timeout = 120000''''' - Завершать любые сеансы, в которых открытая транзакция простаивает дольше заданного (в миллисекундах) времени. Это позволяет освободить все блокировки сеанса и вновь задействовать слот подключения; также это позволяет очистить кортежи, видимые только для этой транзакции.<br>

Версия от 13:01, 25 апреля 2024

В случаях, когда СПИ "Юпитер-КРОС" должна обрабатывать информацию, приходящую от большого количества приборов(порядка 10000) необходимо внести изменения в настройку ОС, СУБД PostgreSQL и изменить ряд параметров в конфигурации smpo-server.

Операционная система

Для ведомственных подразделений рекомендуется использовать ОС Astra Linux Smolensk 1.7
Указанные здесь настройки применимы для ОС семейства Linux:

  • Для повышения стабильности обработки сетевых обращений рекомендуется внести следующие изменения в файл /etc/sysctl.conf
fs.file-max = 1000000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.udp_mem = 8388608 12582912 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
vm.swappiness=5
vm.vfs_cache_pressure = 1000
  • После внесения изменений необходимо, выполнить команду, которая позволит ядру ОС пересчитать новые параметры
sudo sysctl -p

СУБД PostgreSQL

В связи с тем, что СУБД PostgreSQL 9.6 поддерживается только в ОС Astra Linux Smolensk 1.6, а версии 10 и 11 более не поддерживаются, в ОС Astra Linux Smolensk 1.7 рекомендуется подключить или скачать образ расширенного репозитория ОС и установить СУБД PostgreSQL 14. Так как комплекс работает с большим количеством данных, рекомендуется использовать отдельный диск для работы СУБД.
Данные рекомендации основываются на имперических исследованиях и проверены на типовых конфигурациях АРМ тип 2 и серверных решениях. В качестве платформ использовались компьютеры со следующей конфигурацией:
- процессор Intel® Core i5-11400 @ 2.6GHz
- ОЗУ 32 GB
- SSD 180 GB - Операционная система AstraLinux Smolensk 1.7 Update 5
- SSD 250 GB - кластер базы данных. Диск смонтирован в /mnt/postgresql
- SATA 1TB - резервные копии баз данных, логирование работы КРОС, пакеты для установки ПО. Диск смонтирован в /mnt/hdd
- Эмулятор работы приборов - 10000 приборов

Создание нового кластера PostgreSQL

Перед началом, необходимо остановить работу СУБД:

sudo systemctl stop postgresql

1. Для переноса кластера можно воспользоваться копированием/переносом данных из /var/lib/postgresql/14/main в /mnt/postgresql/14/main.

  • Скорее всего при копировании/переносе данных изменится владелец, поэтому необходимо его сменить:
sudo chown -R postgres:postgres /mnt/postgresql
  • Так же,возможно придётся изменить права:
sudo chmod -R 700 /mnt/postgresql

2. Можно создать новый кластер:

sudo -u postgres initdb --locale ru_RU.UTF-8 -E UTF8 -D '/mnt/postgresql/14/main'

Изменение конфигурации

Необходимо внести ряд изменений в файл /etc/postgresql/14/main/postgresql.conf

Общие настройки

1. Если кластер был перенесёт, то необходимо изменить строку data_directory = '/var/lib/postgresql/14/main' на data_directory = '/mnt/postgresql/14/main' - в нашем случае.
2. Чтобы уменьшить риск взлома СУБД, рекомендуется использовать listen_addresses = 'localhost'
3. max_connections = 1800 - максимальтое число разрешенных подключений.
4. password_encryption = md5 - шифрование, которое будет использоваться.
5. shared_buffers = 2GB - Задаёт объём памяти, который будет использовать сервер баз данных для буферов в разделяемой памяти. Рекомендуется использовать 25% от общего объема ОЗУ, но на практике необходимо подбирать в зависимости от общей нагрузки. При увеличении shared_buffers обычно требуется соответственно увеличить max_wal_size, чтобы растянуть процесс записи большого объёма новых или изменённых данных на более продолжительное время.
6. temp_buffers = 512MB - Задаёт максимальное число временных буферов для каждого сеанса. По умолчанию объём временных буферов составляет восемь мегабайт (1024 буфера).
7. work_mem = 256MB - Задаёт объём памяти, который будет использоваться для внутренних операций сортировки и хеш-таблиц, прежде чем будут задействованы временные файлы на диске.
8. maintenance_work_mem = 2GB - Задаёт максимальный объём памяти для операций обслуживания БД.
9. shared_memory_type = mmap - Выбирает механизм разделяемой памяти, используя который сервер будет работать с основной областью общей памяти, содержащей общие буферы PostgreSQL и другие общие данные. Параметр доступен с PostgreSQL 12.
10. dynamic_shared_memory_type = sysv - Выбирает механизм динамической разделяемой памяти, который будет использовать сервер.
11. min_dynamic_shared_memory = 1024MB - Когда для общей разделяемой памяти используются огромные страницы, новым параметром min_dynamic_shared_memory при запуске сервера можно выделить область динамической разделяемой памяти для параллельно выполняемых запросов. Параметр доступен с PostgreSQL 14.
12. max_files_per_process = 300 - Задаёт максимальное число файлов, которые могут быть одновременно открыты каждым серверным подпроцессом. Значение по умолчанию — 1000 файлов.
13. effective_io_concurrency = 100 - Задаёт допустимое число параллельных операций ввода/вывода, которое говорит postgresql о том, сколько операций ввода/вывода могут быть выполнены одновременно. На низкопроизводительных дисках рекомендуется указывать 5 и меньше.
14. max_worker_processes = 4 - Задаёт максимальное число фоновых процессов, которое можно запустить в текущей системе. Этот параметр можно задать только при запуске сервера. Значение по умолчанию — 8.
15. max_parallel_maintenance_workers = 4 - Задаёт максимальное число рабочих процессов, которые могут запускаться одной служебной командой.
16. wal_buffers = 16MB - Объём разделяемой памяти, который будет использоваться для буферизации данных WAL, ещё не записанных на диск. Значение по умолчанию, равное -1, задаёт размер, равный 1/32 (около 3%) от shared_buffers, но не меньше, чем 64 КБ и не больше, чем размер одного сегмента WAL (обычно 16 МБ).
17. checkpoint_completion_target = 0.9 - Задаёт целевое время для завершения процедуры контрольной точки, как коэффициент для общего времени между контрольными точками.
18. max_wal_size = 4GB - Максимальный размер, до которого может вырастать WAL между автоматическими контрольными точками в WAL.
19. min_wal_size = 1GB - Пока WAL занимает на диске меньше этого объёма, старые файлы WAL в контрольных точках всегда перерабатываются, а не удаляются.
20. effective_cache_size = 4GB - Определяет представление планировщика об эффективном размере дискового кеша, доступном для одного запроса. Это представление влияет на оценку стоимости использования индекса; чем выше это значение, тем больше вероятность, что будет применяться сканирование по индексу, чем ниже, тем более вероятно, что будет выбрано последовательное сканирование.

Настройка логирования

1. log_destination = 'stderr' - PostgreSQL поддерживает несколько методов протоколирования сообщений сервера: stderr, csvlog и syslog. На Windows также поддерживается eventlog. В качестве значения log_destination указывается один или несколько методов протоколирования, разделённых запятыми. По умолчанию используется stderr. Параметр можно задать только в конфигурационных файлах или в командной строке при запуске сервера.
2. logging_collector = on - Параметр включает сборщик сообщений (logging collector). Это фоновый процесс, который собирает отправленные в stderr сообщения и перенаправляет их в журнальные файлы.
3. log_directory = '/mnt/postgresql/logs/14' - путь куда записывать лог-файлы. Для пользователя postgres должно быть разрешение на запись.
4. log_filename = 'postgresql-%a.log' - название файл-лога. %a - указывает, что файлы формируются по длям недели.
5. log_rotation_age = 1d - файлы обновляются каждый день.
6. log_rotation_size = 10MB - файлы обновляются при достижении размера в 10MB.

Управление транзакциями

1. statement_timeout = 120000 - Задаёт максимальное время выполнения оператора (в миллисекундах), начиная с момента получения сервером команды от клиента, по истечении которого оператор прерывается. Устанавливать значение statement_timeout в postgresql.conf без особой необходимости не рекомендуется, так как это повлияет на все сеансы.
2. lock_timeout = 120000 - Задаёт максимальную длительность ожидания (в миллисекундах) любым оператором получения блокировки таблицы, индекса, строки или другого объекта базы данных. Устанавливать значение lock_timeout в postgresql.conf без особой необходимости не рекомендуется, так как это повлияет на все сеансы.
3. idle_in_transaction_session_timeout = 120000 - Завершать любые сеансы, в которых открытая транзакция простаивает дольше заданного (в миллисекундах) времени. Это позволяет освободить все блокировки сеанса и вновь задействовать слот подключения; также это позволяет очистить кортежи, видимые только для этой транзакции.