Проблема стабильности работы distributed configuration store (DCS)
Проблема может заключаться в:
- работе Linux
- работе контроллера IO
- работе диска
Поскольку, в общем случае, мало что можно сделать с контроллером и диском, то обратим внимание на работу Linux.
etcd
https://etcd.io/docs/v3.5/op-guide/hardware/#disks
A slow disk will increase etcd request latency and potentially hurt cluster stability.
https://etcd.io/docs/v3.5/tuning/#disk
best effort, highest priority
$ sudo ionice -c2 -n0 -p $(pgrep -a etcd | awk '{ print $1 }')
https://habr.com/ru/company/oleg-bunin/blog/489206/
Проблема 1. СУБД и DCS на одном кластере
zookeeper
Анализ лога zookeeper:
Вывод утилиты ioping (замеряет latency диска каждую секунду) работавшей параллельно:
В cgroup v1 контроллер io не регулирует буферизованный ввод-вывод.
cgroup v2
https://docs.kernel.org/admin-guide/cgroup-v2.html
cgroup is a mechanism to organize processes hierarchically and distribute system resources along the hierarchy in a controlled and configurable manner.
По умолчанию cgroup v2 работает в ALT Linux 10, Ubuntu 22.04 LTS
ALT Linux 10
# ls -la /sys/fs/cgroup/critical.slice/ | grep 'io\.'
-rw-r--r-- 1 root root 0 Dec 11 09:33 io.bfq.weight
-rw-r--r-- 1 root root 0 Dec 11 09:33 io.latency
-rw-r--r-- 1 root root 0 Dec 11 09:33 io.low
-rw-r--r-- 1 root root 0 Dec 11 09:33 io.max
-rw-r--r-- 1 root root 0 Dec 11 09:33 io.pressure
-r--r--r-- 1 root root 0 Dec 11 09:33 io.stat
-rw-r--r-- 1 root root 0 Dec 11 09:33 io.weight
Ubuntu 22.04 LTS
# ls -la /sys/fs/cgroup/critical.slice/ | grep 'io\.'
-rw-r--r-- 1 root root 0 Dec 12 11:27 io.max
-rw-r--r-- 1 root root 0 Dec 12 11:27 io.pressure
-rw-r--r-- 1 root root 0 Dec 12 11:27 io.prio.class
-r--r--r-- 1 root root 0 Dec 12 11:26 io.stat
-rw-r--r-- 1 root root 0 Dec 12 11:26 io.weight
Настройки осуществляются по
https://www.freedesktop.org/software/systemd/man/systemd.resource-control.html
sed -i '/^\[Service\]/a Delegate=cpu memory io' /lib/systemd/system/etcd.service
sed -i '/^\[Service\]/a Slice=critical.slice' /lib/systemd/system/etcd.service
sed -i '/^\[Service\]/a Delegate=cpu memory io' /lib/systemd/system/patroni.service
sed -i '/^\[Service\]/a Slice=pgcluster.slice' /lib/systemd/system/patroni.service
sed -i '/^\[Service\]/a Slice=user.slice' /lib/systemd/system/pgagent.service
sed -i '/^\[Service\]/a Slice=user.slice' /lib/systemd/system/pgbouncer.service
sed -i '/^\[Service\]/a Slice=user.slice' /lib/systemd/system/pgpool.service
mkdir -p /etc/systemd/system/patroni.service.d
echo '[Service]' > /etc/systemd/system/patroni.service.d/cpu.conf
echo 'CPUQuota=80%' >> /etc/systemd/system/patroni.service.d/cpu.conf
# postgres+patroni должны оставить cpu для etcd, pgagent, pgbouncer, pgpool
# вот как бы ещё оставить cpu для самого patroni. чтобы postgres съедал не всё
df -hT | grep -v 'squashfs\|tmpfs\|overlay'
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 ext4 32G 2.9G 27G 10% /
/dev/mapper/postgresql_wal_vg-pg_wal ext4 5.9G 369M 5.2G 7% /pg_wal
/dev/mapper/dcs_vg-dcs ext4 3.9G 124M 3.6G 4% /dcs
/dev/mapper/postgresql_data_vg-pg_data xfs 8.0G 129M 7.9G 2% /pg_data
mkdir -p /etc/systemd/system/etcd.service.d
echo '[Service]' > /etc/systemd/system/etcd.service.d/cpu.conf
echo 'IODeviceLatencyTargetSec=/dev/mapper/dcs_vg-dcs 50ms' >> /etc/systemd/system/etcd.service.d/cpu.conf
# непонятно, будет ли это работать так, как предполагается
# возможно, это зависит от железа
# возможно, придётся подбирать IOReadBandwidthMax, IOWriteBandwidthMax для postgresql
systemctl daemon-reload
systemctl restart etcd.service
systemctl restart patroni
patronictl list
patronictl switchover
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 32G 0 disk
└─sda1 8:1 0 32G 0 part /
sdb 8:16 0 8G 0 disk
└─sdb1 8:17 0 8G 0 part
└─postgresql_data_vg-pg_data 253:1 0 8G 0 lvm /pg_data
sdc 8:32 0 6G 0 disk
└─sdc1 8:33 0 6G 0 part
└─postgresql_wal_vg-pg_wal 253:0 0 6G 0 lvm /pg_wal
sdd 8:48 0 4G 0 disk
└─sdd1 8:49 0 4G 0 part
└─dcs_vg-dcs 253:2 0 4G 0 lvm /dcs
sr0 11:0 1 3.7G 0 rom
cgget -r io.latency /critical.slice/etcd.service
/critical.slice/etcd.service:
io.latency: 8:48 target=50000
cgget -r cpu.max /pgcluster.slice/patroni.service
/pgcluster.slice/patroni.service:
cpu.max: 80000 100000
systemd-cgls --full --no-pager | grep -v color | grep 'slice\|service\|postgres'
-.slice
├─pgcluster.slice
│ └─patroni.service …
│ ├─ 7655 /usr/bin/postgres -D /var/lib/pgsql/data --config-file=/var/lib/pgsql/data/postgresql.conf --listen_addresses=0.0.0.0 --port=5434 --cluster_name=alt-cls --wal_level=replica --hot_standby=on --max_connections=100 --max_wal_senders=10 --max_prepared_transactions=0 --max_locks_per_transaction=64 --track_commit_timestamp=off --max_replication_slots=10 --max_worker_processes=8 --wal_log_hints=on
│ ├─ 7656 postgres: alt-cls: logger
│ ├─ 7658 postgres: alt-cls: checkpointer
│ ├─ 7659 postgres: alt-cls: background writer
│ ├─ 7660 postgres: alt-cls: stats collector
│ ├─ 7667 postgres: alt-cls: clsadmin postgres 127.0.0.1(56510) idle
│ ├─ 7692 postgres: alt-cls: walsender clsreplica 172.27.172.147(55702) streaming 0/1E047BD8
│ ├─ 7703 postgres: alt-cls: walwriter
│ ├─ 7704 postgres: alt-cls: autovacuum launcher
│ ├─ 7705 postgres: alt-cls: archiver last was 00000014000000000000001E.partial
│ ├─ 7706 postgres: alt-cls: logical replication launcher
│ ├─ 7726 postgres: alt-cls: pgagent pgedb 127.0.0.1(56544) idle
│ └─ 7782 postgres: alt-cls: walsender clsreplica 172.27.172.148(49720) streaming 0/1E047BD8
├─critical.slice
│ └─etcd.service …
├─user.slice
│ ├─pgpool.service
│ ├─user-0.slice
│ │ └─user@0.service …
│ ├─pgagent.service
│ └─pgbouncer.service
└─system.slice
├─systemd-udevd.service
├─chronyd.service
├─systemd-journald.service
├─sshd.service
├─crond.service
├─nslcd.service
├─systemd-userdbd.service
├─rpcbind.service
├─nscd.service
├─postfix.service
├─alteratord.service
├─dbus.service
├─system-getty.slice
│ └─getty@tty1.service
└─systemd-logind.service
Почитать
https://habr.com/ru/company/redhatrussia/blog/423051/
https://habr.com/ru/company/redhatrussia/blog/424367/
https://habr.com/ru/company/redhatrussia/blog/425803/
https://habr.com/ru/company/redhatrussia/blog/427413/
https://habr.com/ru/company/redhatrussia/blog/429064/
https://habr.com/ru/company/redhatrussia/blog/430748/
Замечание
Установка и использование ioping
apt-get install moreutils ioping
# dnf config-manager --set-enabled powertools
# dnf -y install moreutils ioping
timeout 60 ioping /dev/sda1 | ts '[%FT%T%z]' | tee /var/log/ioping.log
- запускает на 60 секунд ioping с логированием в файл