Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Patroni failure stories, or How to crash yout P...

Patroni failure stories, or How to crash yout PostgreSQL cluster

Slides from my talk at Highload++ conference 2019 Moscow

Alexey Lesovsky

November 07, 2019

Transcript

74 slides
  1. Про докладчика Linux system administrator PostgreSQL database administrator Data Egret,

    2014 — now Linux, виртуализация, контейнеры, мониторинг, репликация и т.п.
  2. О чем доклад В postgres нет «HA» из HA» из

    ко» из коробки Patroni решает вопрос «HA» из HA» из ко» Иногда случаются проблемы разной степени тяжести Расскажу, с чем сталкивались мы у наших клиентов Как диагностировали, что подкрутили в итоге
  3. Чего НЕ будет в докладе Не будет: • Инструкций по

    установке • Примеров конфигураций • Историй, основанных на чужом опыте • Проблем за пределом Patroni и PostgreSQL
  4. Disclaimer Все рассмотренные истории являются результатом собственного опыта, восстановленые по

    постмортемам. За давностью времени часть деталей либо подзабылась, либо просто не была исследована в ходе спешной починки.
  5. Перед тем, как начать Patroni: • Шаблон для построения HA»

    из ко • Агентская служба, init-системасистема для postgres • Хранит «состояние кластера» в DCS • Автофайловер включен по умолчанию • ... есть много других вещей
  6. Перед тем, как начать Основная задача Patroni — хорошо делать

    автофайловер * - Patroni не должен следить за оборудованием, слать нотификации в слак, делать сложные вещи по потенциальному предотвращению аварий и т.п.
  7. Когда произошел файловер? Первым делом интересует сам файловер В какое

    время он произошел: Когда начался? Когда закончился? Все события делятся на «HA» из до», «HA» из во время» и «HA» из после файловера»
  8. Когда произошел файловер? pgdb-2 patroni: INFO: promoted self to leader

    by acquiring session lock pgdb-2 patroni: WARNING: Loop time exceeded, rescheduling immediately. pgdb-2 patroni: INFO: Lock owner: pgdb-2; I am pgdb-2 pgdb-2 patroni: INFO: updated leader lock during promote pgdb-2 patroni: server promoting pgdb-2 patroni: INFO: cleared rewind state after becoming the leader pgdb-2 patroni: INFO: Lock owner: pgdb-2; I am pgdb-2
  9. Почему произошел файловер? Что случилось со старым мастером? pgdb-2 patroni:

    patroni.utils.RetryFailedError: 'Exceeded retry deadline' pgdb-2 patroni: ERROR: Error communicating with DCS pgdb-2 patroni: INFO: demoted self because DCS is not accessible and i was a leader pgdb-2 patroni: WARNING: Loop time exceeded, rescheduling immediately.
  10. Что предшествовало файловеру? pgdb-2 patroni: ERROR: touch_member ... python trace

    pgdb-2 patroni: socket.timeout: timed out pgdb-2 patroni: During handling of the above exception, another exception occurred: ... python trace pgdb-2 patroni: raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) pgdb-2 patroni: urllib3.exceptions.ReadTimeoutError: HTTPConnectionPool(host='127.0.0.1', port=8500): Read timed out. (read timeout=3.3333333333333335) pgdb-2 patroni: During handling of the above exception, another exception occurred: ... python trace pgdb-2 patroni: raise MaxRetryError(_pool, url, error or ResponseError(cause)) pgdb-2 patroni: urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='127.0.0.1', port=8500): Max retries exceeded with url: /v1/kv/service/pgdb/members/pgdb-2?acquire=19598b72-c0d5-f066-5d24-09c1a9ad61ee&dc=maindb (Caused by ReadTimeoutError("HTTPConnectionPool(host='127.0.0.1', port=8500): Read timed out. (read timeout=3.3333333333333335)",)) pgdb-2 patroni: INFO: no action. i am the leader with the lock pgdb-2 patroni: WARNING: Loop time exceeded, rescheduling immediately.
  11. Все вернулось, как было pgdb-2 patroni: INFO: promoted self to

    leader by acquiring session lock pgdb-2 patroni: WARNING: Loop time exceeded, rescheduling immediately. pgdb-2 patroni: INFO: Lock owner: pgdb-2; I am pgdb-2 pgdb-2 patroni: INFO: updated leader lock during promote pgdb-2 patroni: server promoting pgdb-2 patroni: INFO: cleared rewind state after becoming the leader pgdb-2 patroni: INFO: Lock owner: pgdb-2; I am pgdb-2
  12. Ложная сработка? Или не ложная? Нагрузка на диски: тяжелый запрос

    по IO, временные файлы, автовакуумы, миграции, бэкап и т. п. Нагрузка на CPU: много запросов, новый релиз и т.п.
  13. Домашнее задание Любая серьезная нагрузка влияет на работу с DCS

    Вынести DCS на отдельные узлы Возможно пересмотреть параметры ttl, loop_wait, retry_timeout
  14. 2

  15. Похожая история с DCS maindb-1 patroni: ERROR: get_cluster maindb-1 patroni:

    Traceback (most recent call last): ... python trace maindb-1 patroni: RetryFailedError: 'Exceeded retry deadline' maindb-1 patroni: ERROR: Error communicating with DCS maindb-1 patroni: INFO: closed patroni connection to the postgresql cluster maindb-1 patroni: INFO: postmaster pid=214121 ... ... maindb-1 patroni: INFO: demoted self because DCS is not accessible and i was a leader maindb-1 patroni: WARNING: Loop time exceeded, rescheduling immediately. Когда и почему произошел файловер?
  16. Старый мастер становится репликой maindb-1 patroni: INFO: Lock owner: maindb-2;

    I am maindb-1 maindb-1 patroni: INFO: does not have lock maindb-1 patroni: INFO: running pg_rewind from maindb-2 maindb-1 patroni: INFO: running pg_rewind from user=postgres host=192.168.11.18 port=5432 ... maindb-1 patroni: servers diverged at WAL location 1FA/A38FF4F8 on timeline 6 maindb-1 patroni: rewinding from last common checkpoint at 1FA/A38FF450 on timeline 6 maindb-1 patroni: INFO: Lock owner: maindb-2; I am maindb-1 maindb-1 patroni: INFO: running pg_rewind from maindb-2 in progress maindb-1 patroni: Done!
  17. Ищем первое место, где что-системато начинает идти не так maindb-1

    patroni: INFO: Lock owner: maindb-1; I am maindb-1 maindb-1 patroni: INFO: no action. i am the leader with the lock maindb-1 patroni: INFO: Lock owner: maindb-1; I am maindb-1 maindb-1 patroni: INFO: no action. i am the leader with the lock maindb-1 patroni: INFO: Lock owner: maindb-1; I am maindb-1 maindb-1 patroni: INFO: no action. i am the leader with the lock Что предшествовало файловеру?
  18. Cоседи по consul-системакластеру стали сомневаться в вашем существовании maindb-2 consul[11581]:

    serf: EventMemberFailed: maindb-1 192.168.11.19 maindb-2 consul[11581]: [INFO] serf: EventMemberFailed: maindb-1 192.168.11.19 maindb-2 consul[11581]: memberlist: Suspect maindb-1 has failed, no acks received maindb-2 consul[11581]: [INFO] memberlist: Suspect maindb-1 has failed, no acks received Они сомневаются в существовании и других соседей тоже... И вы тоже сомневаетесь... Что предшествовало файловеру?
  19. consul-системаагент испытывает сложности с коммуникацией maindb-1 consul: memberlist: Suspect lbs-4

    has failed, no acks received maindb-1 consul: [ERR] yamux: keepalive failed: i/o deadline reached maindb-1 consul: yamux: keepalive failed: i/o deadline reached maindb-1 consul: [ERR] consul: "KVS.List" RPC failed to server 192.168.11.115:8300: rpc error making call: EOF maindb-1 consul: [ERR] http: Request GET /v1/kv/service/sam_prod/?recurse=1, error: rpc error making call: EOF from=192.168.11.19 maindb-1 consul: [ERR] consul: "KVS.List" RPC failed to server 192.168.11.115:8300: rpc error making call: EOF maindb-1 consul: [ERR] http: Request GET /v1/kv/service/sam_prod/?recurse=1, error: rpc error making call: EOF from=192.168.11.19 maindb-1 consul: [ERR] consul: "Coordinate.Update" RPC failed to server 192.168.11.115:8300: rpc error making call: EOF maindb-1 consul: [ERR] agent: Coordinate update error: rpc error making call: EOF maindb-1 consul: [ERR] http: Request GET /v1/kv/service/sam_prod/?recurse=1, error: rpc error making call: EOF from=192.168.11.19 maindb-1 consul: consul: "KVS.List" RPC failed to server 192.168.11.115:8300: rpc error making call: EOF maindb-1 consul: http: Request GET /v1/kv/service/sam_prod/?recurse=1, error: rpc error making call: EOF from=192.168.11.19 maindb-1 consul: consul: "KVS.List" RPC failed to server 192.168.11.115:8300: rpc error making call: EOF maindb-1 consul: http: Request GET /v1/kv/service/sam_prod/?recurse=1, error: rpc error making call: EOF from=192.168.11.19 maindb-1 consul: consul: "Coordinate.Update" RPC failed to server 192.168.11.115:8300: rpc error making call: EOF maindb-1 consul: agent: Coordinate update error: rpc error making call: EOF maindb-1 consul: http: Request GET /v1/kv/service/sam_prod/?recurse=1, error: rpc error making call: EOF from=192.168.11.19 Что предшествовало файловеру?
  20. Чинить сеть Еще варианты: • Отключить consul-системапроверки — checks: []

    • Перепроверить raft_multiplier • renice -n -10 consul • Не использовать consul? • Пересмотреть значения параметров ttl, loop_wait, retry_timeout Домашнее задание
  21. 3

  22. $ patronictl list +-----------------+-------------------------+--------------+--------+---------+-----------+ | Cluster | Member | Host

    | Role | State | Lag in MB | +-----------------+-------------------------+--------------+--------+---------+-----------+ | patroni_cluster | pg01.dev.zirconus.local | 10.202.1.101 | | running | 0.0 | | patroni_cluster | pg03.dev.zirconus.local | 10.202.1.103 | Leader | running | 0.0 | +-----------------+-------------------------+--------------+--------+---------+-----------+
  23. Почему произошел файловер? Мастер pg02 не смог обновить мастер-системаключ: pg02

    patroni[1425]: ERROR: failed to update leader lock Pg02 patroni[1425]: INFO: demoted self because failed to update leader lock in DCS pg02 patroni[1425]: WARNING: Loop time exceeded, rescheduling immediately. pg02 patroni[1425]: INFO: Lock owner: None; I am pg02.dev.zirconus.local pg02 patroni[1425]: INFO: not healthy enough for leader race pg02 patroni[1425]: INFO: starting after demotion in progress
  24. Пока все по плану мастером становится db03 pg03 patroni[9648]: INFO:

    promoted self to leader by acquiring session lock pg03 patroni[9648]: server promoting pg03 patroni[9648]: INFO: cleared rewind state after becoming the leader
  25. А что со старым мастером? pg02, решив стать репликой, начал

    с перемотки журнала транзакций pg02 patroni[1425]: INFO: running pg_rewind from pg03 pg02 patroni[1425]: INFO: running pg_rewind from user=postgres host=10.202.1.103 port=5432 ... pg02 patroni[1425]: servers diverged at WAL location 33F/68E6AD10 on timeline 28 pg02 patroni[1425]: could not open file "/data/pgdb/11/pg_wal/0000001C0000033F00000059": No such file or directory pg02 patroni[1425]: could not find previous WAL record at 33F/59FFE368 pg02 patroni[1425]: Failure, exiting pg02 patroni[1425]: ERROR: Failed to rewind from healty master: pg03 pg02 patroni[1425]: WARNING: Postgresql is not running.
  26. Почему не оказалось журналов? Новый мастер сделал чекпоинт и переименовал

    часть старых сегментов на будущее LOG: checkpoint complete: wrote 62928 buffers (16.0%); 0 WAL file(s) added, 0 removed, 23 recycled; write=12.872 s, sync=0.020 s, total=13.001 s; sync files=16, longest=0.009 s, average=0.001 s; distance=520220 kB, estimate=520220 kB
  27. Домашнее задание Слоты репликации Мастер при переходе в реплику удаляет

    слоты + WA» из коL Подняли wal_keep_segments Актуально и для продолжительных maintenance
  28. 4

  29. Все начинается с файловера Production-системабаза Происходит файловер Проверили кластер, всё

    и все на месте Продуктовая команда сообщает, что в базе не хватает данных Идем смотреть...
  30. Когда произошел файловер? pgdb-1 patroni[17836]: INFO: promoted self to leader

    by acquiring session lock pgdb-1 patroni[17836]: server promoting pgdb-1 patroni[17836]: INFO: cleared rewind state after becoming the leader pgdb-1 patroni[17836]: INFO: Lock owner: pgdb-1; I am pgdb-1
  31. Когда произошел файловер? Cтарый мастер после перезагрузки запускает Patroni Patroni

    запускает Postgres Включает Postgres в качестве реплики Часть WA» из коL отматывается pg_rewind
  32. Что там со старым мастером? pgdb-2 patroni[4149]: INFO: running pg_rewind

    from pgdb-1 pgdb-2 patroni[4149]: Lock owner: pgdb-1; I am pgdb-2 pgdb-2 patroni[4149]: Deregister service pgdb/pgdb-2 pgdb-2 patroni[4149]: running pg_rewind from pgdb-1 in progress pgdb-2 patroni[4149]: running pg_rewind from user=replica host=10.10.1.31 port=5432 ... pgdb-2 patroni[4149]: servers diverged at WAL location 0/5AD1BFD8 on timeline 66 pgdb-2 patroni[4149]: rewinding from last common checkpoint at 0/59DD1070 on timeline 66 pgdb-2 patroni[4149]: Done!
  33. Считаем потери pgdb-2 patroni[4149]: INFO: Local timeline=66 lsn=0/5BDA8EB8 pgdb-2 patroni[4149]:

    INFO: master_timeline=67 ... pgdb-2 patroni[4149]: servers diverged at WAL location 0/5AD1BFD8 on timeline 66 postgres=# select pg_wal_lsn_diff('0/5BDA8EB8','0/5AD1BFD8'); pg_wal_lsn_diff ----------------- 17354464
  34. Домашнее задание Всегда ли нам нужен автозапуск? maximum_lag_on_failover • Не

    realtime • Риск «HA» из потеряшек» остается: • В худшем случае: maximum_lag_on_failover + ttl • В среднем случае: maximum_lag_on_failover + (loop_wait / 2) Хорошая новость — в «HA» из потеряшках» могут быть WA» из коL от фоновых процессов
  35. maximum_lag_on_failover pgdb-1 patroni[6202]: INFO: Lock owner: None; I am pgdb-1

    pgdb-1 patroni[6202]: INFO: not healthy enough for leader race pgdb-1 patroni[6202]: INFO: changing primary_conninfo and restarting in progress ... pgdb-1 patroni[6202]: INFO: following a different leader because i am not the healthiest node pgdb-1 patroni[6202]: INFO: following a different leader because i am not the healthiest node pgdb-1 patroni[6202]: INFO: following a different leader because i am not the healthiest node pgdb-1 patroni[6202]: INFO: following a different leader because i am not the healthiest node pgdb-1 patroni[6202]: INFO: following a different leader because i am not the healthiest node
  36. 5

  37. Диски [COMMIT] LOG: duration: 1138.868 ms statement: COMMIT ... []

    WARNING: autovacuum worker started without a worker entry ... [SELECT] LOG: temporary file: path "base/pgsql_tmp/pgsql_tmp11247.983", size 532996096 ...
  38. md/raid10:md2: sde3: rescheduling sector 351273392 blk_update_request: I/O error, dev sde,

    sector 64404728 md/raid10:md2: sde3: rescheduling sector 63161592 blk_update_request: I/O error, dev sde, sector 64404760 ... md2 : active raid10 sda3[0] sdc3[2] sdd3[3] sdb3[1] sdh3[7] sdf3[5] sdg3[6] 15623340032 blocks super 1.2 512K chunks 2 near-copies [8/7] [UUUUUUU_] bitmap: 58/59 pages [232KB], 131072KB chunk
  39. 6

  40. Старый мастер не мог стать нормальной репликой Далее весь разбор

    согласно пост-системамортему Кластер-системасимулянт
  41. Локальный ад на мастере, коммиты длятся по 1-система2-система3 секунды 14:48:55.601

    [COMMIT] LOG: duration: 1478.118 ms statement: COMMIT 14:48:56.287 [COMMIT] LOG: duration: 1290.203 ms statement: COMMIT 14:48:56.287 [COMMIT] LOG: duration: 1778.465 ms statement: COMMIT 14:48:56.287 [COMMIT] LOG: duration: 1778.449 ms statement: COMMIT
  42. Обрывы соединений 14:48:58.078 [idle in transaction] LOG: could not send

    data to client: Broken pipe 14:48:58.078 [idle] LOG: could not send data to client: Broken pipe 14:48:58.078 [idle] FATAL: connection to client lost 14:48:58.107 [idle in transaction] FATAL: connection to client lost
  43. Ожидания и блокировки разной степени тяжести 14:49:26.929 [UPDATE waiting] LOG:

    process 4298 acquired ExclusiveLock on tuple (2,10) of relation 52082 of database 50587 after 52487.463 ms 14:49:26.929 [UPDATE waiting] STATEMENT: UPDATE sessions SET lastaccess='1565005714' WHERE sessionid=... 14:49:27.929 [UPDATE waiting] LOG: process 4298 still waiting for ShareLock on transaction 364118337 after 1000.088 ms 14:49:27.929 [UPDATE waiting] DETAIL: Process holding the lock: 4294. Wait queue: 4298. 14:49:27.929 [UPDATE waiting] CONTEXT: while locking tuple (7,60) in relation "sessions" 14:49:27.929 [UPDATE waiting] STATEMENT: UPDATE sessions SET lastaccess='1565005714' WHERE sessionid=...
  44. В общем, явно проблемы с дисками 14:49:04.766 [SELECT] LOG: using

    stale statistics instead of current ones because stats collector is not responding ... 14:48:06.067 [SELECT] LOG: temporary file: path "base/pgsql_tmp/pgsql_tmp10554.1495", size 145616368 14:49:18.278 [SELECT] LOG: temporary file: path "base/pgsql_tmp/pgsql_tmp10554.4197", size 2396890 ...
  45. immediate shutdown request 14:49:34.102 MSK 5335 @ from [] LOG:

    received immediate shutdown request 14:49:34.689 [authentication] WARNING: terminating connection because of crash of another server process 14:49:34.689 [authentication] DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory
  46. Patroni не писал в лог довольно долго — 54 секунды

    За это время одна из реплик сделала «HA» из promote» pgsql03 patroni: 14:48:25,000 INFO: Lock owner: pgsql03; I am pgsql03 pgsql03 patroni: 14:48:25,013 INFO: no action. i am the leader with the lock pgsql03 patroni: 14:48:37,159 INFO: Lock owner: pgsql03; I am pgsql03 pgsql03 patroni: 14:49:31,155 WARNING: Exception hened during processing of request from 10.1.0.12 pgsql03 patroni: 14:49:31,297 WARNING: Exception hened during processing of request from 10.1.0.11 pgsql03 patroni: 14:49:31,298 WARNING: Exception hened during processing of request from 10.1.0.11
  47. Собственно, сам promote pgsql01 patroni: 14:48:57,136 INFO: promoted self to

    leader by acquiring session lock pgsql01 patroni: server promoting pgsql01 patroni: 14:48:57,214 INFO: cleared rewind state after becoming the leader pgsql01 patroni: 14:49:05,013 INFO: Lock owner: pgsql01; I am pgsql01 pgsql01 patroni: 14:49:05,023 INFO: updated leader lock during promote
  48. вторая реплика честно пыталась переконфигурироваться pgsql02 patroni: 14:48:57,124 INFO: Could

    not take out TTL lock pgsql02 patroni: 14:48:57,137 INFO: following new leader after trying and failing to obtain lock pgsql02 patroni: 14:49:05,014 INFO: Lock owner: pgsql01; I am pgsql02 pgsql02 patroni: 14:49:05,025 INFO: changing primary_conninfo and restarting in progress pgsql02 patroni: 14:49:15,011 INFO: Lock owner: pgsql01; I am pgsql02 pgsql02 patroni: 14:49:15,014 INFO: changing primary_conninfo and restarting in progress pgsql02 patroni: 14:49:25,011 INFO: Lock owner: pgsql01; I am pgsql02 pgsql02 patroni: 14:49:25,014 INFO: changing primary_conninfo and restarting in progress pgsql02 patroni: 14:49:35,011 INFO: Lock owner: pgsql01; I am pgsql02 pgsql02 patroni: 14:49:35,014 INFO: changing primary_conninfo and restarting in progress
  49. В это время на старый мастер прилетел тот самый immediate

    Реплика аварийно перезапускается и начинает recovery Recovery прерывается, т.к. старый мастер в это время выключался 14:49:34.293 [idle] LOG: received replication command: IDENTIFY_SYSTEM WARNING: terminating connection because of crash of another server process DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory. 14:49:35.232 FATAL: could not receive data from WAL stream: server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. 14:49:35.232 LOG: record with incorrect prev-link 142D46/315602C at 14CF/CF38C160 14:49:35.305 FATAL: could not connect to the primary server: FATAL: the database system is shutting down 14:49:40.241 FATAL: could not connect to the primary server: FATAL: the database system is shutting down
  50. После recovery репликация не смогла запуститься 14:50:14.024 [] LOG: record

    with incorrect prev-link 142D46/315602C at 14CF/CF38C160 14:50:14.028 [] LOG: fetching timeline history file for timeline 72 from primary server 14:50:14.104 [] FATAL: could not start WAL streaming: ERROR: requested starting point 14CF/CF000000 on timeline 71 is not in this server's history DETAIL: This server's history forked from timeline 71 at 14CF/CEC32E40. 14:50:14.104 [] LOG: new timeline 72 forked off current database system timeline 71 before current recovery point 14CF/CF38C160
  51. Patroni запустил реплику, реплика работает, но есть лаг +-----------------+----------+--------------+--------+---------+-----------+ |

    Cluster | Member | Host | Role | State | Lag in MB | +-----------------+----------+--------------+--------+---------+-----------+ | patroni_cluster | pgsql01 | 10.2.200.151 | Leader | running | 0.0 | | patroni_cluster | pgsql02 | 10.2.200.152 | | running | 9153.0 | | patroni_cluster | pgsql03 | 10.2.200.153 | | running | 0.0 | +-----------------+----------+--------------+--------+---------+-----------+
  52. Postgres каждые 5 секунд сообщает об ошибке 14:50:44.143 FA» из

    коTA» из коL: could not start WA» из коL streaming: ERROR: requested starting point 14CF/watchdoCF000000 on timeline 71 is not in this server's history DETA» из коIL: This server's history forked from timeline 71 at 14CF/watchdoCEC32E40. 14:50:44.143 LOG: new timeline 72 forked off current database system timeline 71 before current recovery point 14CF/watchdoCF38C160
  53. Через 30 минут приходит админ, рестартует Patroni на реплике Cнова

    идет recovery, и даже база открылась 15:14:13.511 LOG: consistent recovery state reached at 14CF/A3F657B0 15:14:13.511 LOG: database system is ready to accept read only connections
  54. Репликация запустилась 15:14:17.072 LOG: record with incorrect prev-link 142D46/315602C at

    14CF/CF38C160 15:14:17.077 LOG: started streaming WAL from primary at 14CF/CF000000 on timeline 72 15:14:17.536 LOG: invalid record length at 14CF/CF38C160: wanted 24, got 1 и через минуту отвалилась 15:15:27.823 FATAL: terminating walreceiver process due to administrator command 15:15:27.895 LOG: invalid record length at 14CF/CF38C160: wanted 24, got 1 15:15:27.895 LOG: invalid record length at 14CF/CF38C160: wanted 24, got 1
  55. Еще раз рестартим Patroni, база открывается на том же месте

    15:17:33.553 LOG: consistent recovery state reached at 14CF/A3F657B0 15:17:33.554 LOG: database system is ready to accept read only connections
  56. стартует репликация, но позиция уже раньше, хм… 15:17:37.299 LOG: invalid

    contrecord length 5913 at 14CF/CEFFF7B0 15:17:37.304 LOG: started streaming WAL from primary at 14CF/CE000000 on timeline 72 и снова останавливается, причем сообщение уже другое 15:18:12.208 FATAL: terminating walreceiver process due to administrator command 15:18:12.240 LOG: record with incorrect prev-link 60995000/589DF000 at 14CF/CEFFF7B0 15:18:12.240 LOG: record with incorrect prev-link 60995000/589DF000 at 14CF/CEFFF7B0
  57. Рестартуем снова, база открывается на том же месте 15:21:25.135 LOG:

    consistent recovery state reached at 14CF/A3F657B0 15:21:25.135 LOG: database system is ready to accept read only connections
  58. Запускаем пару чекпоинтов с идеей подвинуть историю чуть вперед Репликация

    запускается уже с другого места и больше не рвется 15:22:43.727 LOG: invalid record length at 14D1/BCF3610: wanted 24, got 0 15:22:43.731 LOG: started streaming WAL from primary at 14D1/B000000 on timeline 72
  59. Patroni может отработать, как надо, но это не гарантия, что

    все хорошо После файловера нужно перепроверить, что все действительно ок Домашнее задание
  60. Мониторинг о том, что произошел файловер После каждого файловера проверяем

    кластер • количество реплик • лаг репликации • ошибки в логах Автоматика может успешно отработать, но при этом объекты автоматики могут находиться в полурабочем состоянии Нужно уметь чинить руками Иметь в виду при эксплуатации Patroni
  61. Когда произошел файловер? Это точка отсчета до и после •

    Файловер имеет два timestamp — начало и конец Почему произошел файловер? Ищем по логам первые события, когда что-системато пошло не так: • Логи patroni • Логи postgres • Логи DCS • Логи системы Этапы диагностики
  62. Patroni, на мой взгляд, лучшее что есть сегодня Рекомендую ли

    я Patroni? Определенно, да Хотите больше интересных историй? https://github.com/zalando/patroni/issues Спасибо Zalando, A» из коlexander Kukushkin, Oleksii Kliukin и всем контрибьюторам Послесловие

More Decks by Alexey Lesovsky

Other Decks in Programming