SlideShare a Scribd company logo
Новые
технологии
репликации в
PostgreSQL
Александр Алексеев
Коротко о себе
Для кого этот доклад
● Вы считаете, что репликация — это непостижимо сложно;
● Вы думаете, что масштабироваться можно только горизонтально;
● Вы никогда не настраивали физическую и/или логическую репликацию в
PostgreSQL;
● Вы не знаете, как настроить фейловер;
● Вы хотели бы узнать, что нового здесь появилось у PostgreSQL в
последнее время;
● Вы ищете идею для проекта =);
Чего в нем не будет
● Скучного пересказа документации на тему, что именно писать в
конфигах. То есть доклад, скорее, обзорный;
● Для заинтересованных в конце приводятся ссылки на дополнительные
материалы.
Небольшое отступление о железе
● В AWS инстанс x1.32xlarge (128 vCPU, 1952 Mb памяти, 2 x 1920 Mb SSD)
стоит 9603$ в месяц [1];
● SSD на 1 Тб стоит от ~20 000 рублей [2].
[1]: https://aws.amazon.com/ec2/pricing/on-demand/
[2]: Samsung MZ-75E1T0BW, https://market.yandex.ru/product/11929060
Репликация
Мастер
(Лидер)
Реплика
(Фоловер,
Слейв)
Зачем это нужно
● Распределение нагрузки
○ OLTP: на чтение ходим в реплики
○ OLAP: тяжелая аналитика на отдельной реплике
○ Снятие бэкапа с отдельной реплики
● Фейловер / High Availability
○ Бывает ручной и автоматический
● Отложенная репликация
● Не заменяет резервное копирование!
Потоковая (или физическая) репликация
● В сущности, заключается в передаче WAL по сети;
● Асинхронная
○ Быстро, но можно потерять данные;
● Синхронная
○ Медленнее (в рамках ДЦ не намного), но надежнее. Желательно иметь две реплики;
● Бывает еще каскадной (надо же было упомянуть об этом на каком-то
слайде).
Fun facts!
Потоковая репликация:
● Не работает между разными архитектурами;
● Не работает между разными версиями PostgreSQL [1].
[1] Согласно https://simply.name/ru/upgrading-postgres-to-9.4.html типичное
время даунтайма при обновлении версии составляет несколько минут.
Логическая репликация
● Начиная с PostgreSQL 10 — из коробки;
● Старые подходы: Slony, Londiste, pglogical;
○ Не рекомендуются, потому что медленные и/или плохо работают.
Зачем нужен еще один вид репликации?
● Репликация части данных, не всего подряд;
● Обновление без даунтайма;
● На реплике можно использовать временные таблицы, да и вообще
писать все что угодно, в т.ч. в реплицируемые таблицы;
● Одна реплика может тянуть данные с двух мастеров;
● В теории — можно изобразить multimaster;
● И другие сценарии, когда физическая репликация не подошла.
Fun facts!
● Схема таблиц на мастере и на реплике может различаться;
● Может отличаться порядок столбцов;
● Реплика может иметь дополнительные nullable-столбцы;
● НО мастер не может иметь больше столбцов, чем реплика, даже если в
этих столбцах всегда NULL.
Ограничения логической репликации
● Реплицируемые таблицы должны иметь primary key;
● DDL, TRUNCATE и sequences не реплицируются;
● Поддержка триггеров реализована не до конца [1].
[1]: https://postgr.es/m/20171009141341.GA16999@e733.localdomain
Logical decoding
$ pg_recvlogical --slot=myslot --dbname=eax --user=eax 
--create-slot --plugin=test_decoding
$ pg_recvlogical --slot=myslot --dbname=eax --user=eax --start -f -
BEGIN 560
COMMIT 560
BEGIN 561
table public.test: INSERT: k[text]:'aaa' v[text]:'bbb'
COMMIT 561
Logical decoding: JSON
● Есть больше одного стороннего расширения...
● … но на сегодня все сломаны на 10-ке [1][2] :(
[1]: https://github.com/eulerto/wal2json/issues/33
[2]: https://github.com/posix4e/jsoncdc/issues/77
Фейловер
● Ручной
○ Имеет смысл, когда серверов БД не много (~10 штук);
○ Кстати, сейчас не проблема купить машину с сотнями Гб памяти и несколькими Тб
места на диске;
● Автоматический
○ Может иметь смысл, когда вы приближаетесь к масштабам Google.
Решения для настройки автофейловера
● Физическая репликация
○ Своими велосипедами на Python ;)
○ Repmgr
○ Patroni
○ Stolon (нравится мне больше всего)
● Логическая репликация
○ Еще не написали :(
Stolon
Коротко о главном:
● Разрабатывается с 2015 года компанией Sorint.lab
● Написан на Go
● Полагается на Consul или etcd
● Умеет интегрироваться с Kubernetes
● Настраивается быстро и просто
● Корректно обрабатывает любые падения машин и нетсплиты
Stolon: как это работает?
Fun facts!
● Stolon направляет и чтение, и запись в мастер. Но есть воркэраунд [1];
● Использует Consul или etcd чисто как key-value, в частности, не знает
про поддержку Consul’ом DNS.
[1]: https://github.com/sorintlab/stolon/issues/132
Consul
Коротко о главном:
● Разрабатывается HashiCorp, подарившей миру Packer и Vagrant;
● Написан на языке Go, использует протокол Raft;
● Решение для service discovery, как ZooKeeper или etcd;
● Распределенное key-value хранилище с REST-интерфейсом;
● Имеет CAS, встроенный мониторинг, локи, подписки на обновления, …;
● Умеет отдавать информацию о сервисах по DNS;
● Тестируется Jepsen’ом [1].
[1]: https://www.consul.io/docs/internals/jepsen.html
Fun facts!
● У Consul есть красивый веб-интерфейс с информацией о
зарегистрированных сервисах;
● Поверх него (ровно как и поверх Cassandra или Couchbase) можно
довольно легко написать выбор лидера, используя подход под
названием leader lease [1].
[1]: http://eax.me/go-leader-election/
synchronous_commit
● synchronous_commit = off
○ Не ждем записи в WAL, можно потерять часть последних изменений
○ В отличие от fsync = off не приведет к неконсистентности базы
● synchronous_commit = on
○ Ждем подтверждения записи в WAL — свой и синхронной реплики
● synchronous_commit = remote_write
○ Аналогично on, но не дожидаемся fsync() на реплике
● synchronous_commit = local
○ Не ждем записи на реплике, пишем только локально
● synchronous_commit = remote_apply ( >= 9.6 )
○ Ждем, когда данные попадут в WAL реплики и применятся к данным
Fun fact!
● synchronous_commit можно менять не только в postgresql.conf, но и в
рамках сессии с помощью команды SET.
synchronous_standby_names
● synchronous_standby_names = ‘*’
○ Ждем подтверждения от одной любой реплики
● synchronous_standby_names = ANY 2(node1,node2,node3);
○ Коммит на кворум
○ Появилось в версии 10
● Другие варианты [1] не очень полезны.
[1]: https://www.postgresql.org/docs/current/static/runtime-config-replication.html
Что осталось за кадром
● Шардинг и решардинг
○ Реализуемы при помощи логической репликации и словаря на базе Consul;
● Распределенные транзакции
○ Percolator-like-транзакции достаточно просто реализуемы;
○ Дают snapshot isolation, возможна аномалия write skew;
○ Подойдет для большинства приложений, в частности Oracle только SI и предлагает;
○ Важно! Нужно использовать и при записи, и при чтении;
● Готовых решений нет, или я про них не знаю
● Если вам повезет, то никогда не придется всем этим заниматься
● Кое-какие подробности — http://eax.me/sharding/
Дополнительные материалы
● https://www.postgresql.org/docs/10/static/index.html
● https://www.consul.io/
● https://github.com/sorintlab/stolon/
● https://raft.github.io/
● https://jepsen.io/
● https://kubernetes.io/
● + есть статьи на http://eax.me/
Вопросы и ответы.
● a.alekseev@postgrespro.ru
● https://twitter.com/afiskon

More Related Content

What's hot (20)

PDF
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Ontico
 
PDF
Хранение данных на виниле / Константин Осипов (tarantool.org)
Ontico
 
PDF
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Ontico
 
PDF
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Ontico
 
PPTX
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Ontico
 
PPTX
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
Ontico
 
PDF
Highload на GPU, опыт Vinci / Олег Илларионов (ВКонтакте)
Ontico
 
PDF
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Ontico
 
PDF
Benchmarking PostgreSQL in Linux and FreeBSD
Alex Chistyakov
 
PDF
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
Nikolay Samokhvalov
 
PDF
Современная операционная система: что надо знать разработчику / Александр Кри...
Ontico
 
PDF
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Ontico
 
PDF
Вячеслав Бахмутов
CodeFest
 
PPTX
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Ontico
 
PDF
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
Ontico
 
PDF
Twisted Framework - сетевые приложения в Python
Andrey Smirnov
 
PPTX
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
Ontico
 
PDF
My talk at Highload++ 2015
Alex Chistyakov
 
PDF
Anton Turetckii "What does it take to build a host?"
Fwdays
 
PDF
RootConf 2015
Evgeny Uskov
 
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Ontico
 
Хранение данных на виниле / Константин Осипов (tarantool.org)
Ontico
 
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Ontico
 
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Ontico
 
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
Ontico
 
Highload на GPU, опыт Vinci / Олег Илларионов (ВКонтакте)
Ontico
 
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Ontico
 
Benchmarking PostgreSQL in Linux and FreeBSD
Alex Chistyakov
 
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
Nikolay Samokhvalov
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Ontico
 
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Ontico
 
Вячеслав Бахмутов
CodeFest
 
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Ontico
 
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
Ontico
 
Twisted Framework - сетевые приложения в Python
Andrey Smirnov
 
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
Ontico
 
My talk at Highload++ 2015
Alex Chistyakov
 
Anton Turetckii "What does it take to build a host?"
Fwdays
 
RootConf 2015
Evgeny Uskov
 

Similar to Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgres Professional) (20)

PDF
Новые технологии репликации данных в PostgreSQL - Александр Алексеев
Aleksander Alekseev
 
PDF
Перевод новостного приложения на БД PostgreSQL
Dmitry Kremer
 
PDF
PostgreSQL в высоконагруженных проектах
Alexey Vasiliev
 
PDF
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Ontico
 
PDF
PostgreSQL: вчера, сегодня, завтра, Олег Бартунов, Postgres Professional, Мо...
it-people
 
PDF
Дмитрий Кремер, МИА «Россия сегодня» (РИА Новости). «Построение новостного we...
Mail.ru Group
 
PDF
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
Nikolay Samokhvalov
 
PDF
Streaming replication in practice
Alexey Lesovsky
 
PDF
Максим Богук. Postgres-XC
PostgreSQL-Consulting
 
PPTX
Что такое Postgresql (Максим Богук)
Ontico
 
PDF
История небольшого успеха с PostgreSQL – Владимир Бородин
Yandex
 
PPTX
PostgreSQL. Стильно. Модно. Молодёжно
Vladislav Bezverhiy
 
PDF
PostgreSQL Streaming Replication
Alexey Lesovsky
 
PDF
SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
SECON
 
PDF
Building the Enterprise infrastructure with PostgreSQL as the basis for stori...
PavelKonotopov
 
PDF
Postgresql v509
luis perez
 
PDF
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Ontico
 
PDF
Hacking PostgreSQL. Обзор исходного кода
Anastasia Lubennikova
 
PDF
Абак Пресс
it-people
 
PDF
PG Day'14 Russia, PostgreSQL в avito.ru, Михаил Тюрин
pgdayrussia
 
Новые технологии репликации данных в PostgreSQL - Александр Алексеев
Aleksander Alekseev
 
Перевод новостного приложения на БД PostgreSQL
Dmitry Kremer
 
PostgreSQL в высоконагруженных проектах
Alexey Vasiliev
 
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Ontico
 
PostgreSQL: вчера, сегодня, завтра, Олег Бартунов, Postgres Professional, Мо...
it-people
 
Дмитрий Кремер, МИА «Россия сегодня» (РИА Новости). «Построение новостного we...
Mail.ru Group
 
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
Nikolay Samokhvalov
 
Streaming replication in practice
Alexey Lesovsky
 
Максим Богук. Postgres-XC
PostgreSQL-Consulting
 
Что такое Postgresql (Максим Богук)
Ontico
 
История небольшого успеха с PostgreSQL – Владимир Бородин
Yandex
 
PostgreSQL. Стильно. Модно. Молодёжно
Vladislav Bezverhiy
 
PostgreSQL Streaming Replication
Alexey Lesovsky
 
SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
SECON
 
Building the Enterprise infrastructure with PostgreSQL as the basis for stori...
PavelKonotopov
 
Postgresql v509
luis perez
 
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Ontico
 
Hacking PostgreSQL. Обзор исходного кода
Anastasia Lubennikova
 
Абак Пресс
it-people
 
PG Day'14 Russia, PostgreSQL в avito.ru, Михаил Тюрин
pgdayrussia
 
Ad

More from Ontico (20)

PDF
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Ontico
 
PDF
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Ontico
 
PPTX
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Ontico
 
PDF
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 
PDF
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Ontico
 
PDF
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Ontico
 
PDF
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Ontico
 
PPTX
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
Ontico
 
PPTX
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Ontico
 
PDF
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Ontico
 
PPTX
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Ontico
 
PPTX
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Ontico
 
PDF
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Ontico
 
PPT
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Ontico
 
PPTX
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Ontico
 
PPTX
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Ontico
 
PPTX
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Ontico
 
PPTX
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Ontico
 
PDF
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Ontico
 
PPTX
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Ontico
 
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Ontico
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Ontico
 
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Ontico
 
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
Ontico
 
Ad

Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgres Professional)

  • 3. Для кого этот доклад ● Вы считаете, что репликация — это непостижимо сложно; ● Вы думаете, что масштабироваться можно только горизонтально; ● Вы никогда не настраивали физическую и/или логическую репликацию в PostgreSQL; ● Вы не знаете, как настроить фейловер; ● Вы хотели бы узнать, что нового здесь появилось у PostgreSQL в последнее время; ● Вы ищете идею для проекта =);
  • 4. Чего в нем не будет ● Скучного пересказа документации на тему, что именно писать в конфигах. То есть доклад, скорее, обзорный; ● Для заинтересованных в конце приводятся ссылки на дополнительные материалы.
  • 5. Небольшое отступление о железе ● В AWS инстанс x1.32xlarge (128 vCPU, 1952 Mb памяти, 2 x 1920 Mb SSD) стоит 9603$ в месяц [1]; ● SSD на 1 Тб стоит от ~20 000 рублей [2]. [1]: https://aws.amazon.com/ec2/pricing/on-demand/ [2]: Samsung MZ-75E1T0BW, https://market.yandex.ru/product/11929060
  • 7. Зачем это нужно ● Распределение нагрузки ○ OLTP: на чтение ходим в реплики ○ OLAP: тяжелая аналитика на отдельной реплике ○ Снятие бэкапа с отдельной реплики ● Фейловер / High Availability ○ Бывает ручной и автоматический ● Отложенная репликация ● Не заменяет резервное копирование!
  • 8. Потоковая (или физическая) репликация ● В сущности, заключается в передаче WAL по сети; ● Асинхронная ○ Быстро, но можно потерять данные; ● Синхронная ○ Медленнее (в рамках ДЦ не намного), но надежнее. Желательно иметь две реплики; ● Бывает еще каскадной (надо же было упомянуть об этом на каком-то слайде).
  • 9. Fun facts! Потоковая репликация: ● Не работает между разными архитектурами; ● Не работает между разными версиями PostgreSQL [1]. [1] Согласно https://simply.name/ru/upgrading-postgres-to-9.4.html типичное время даунтайма при обновлении версии составляет несколько минут.
  • 10. Логическая репликация ● Начиная с PostgreSQL 10 — из коробки; ● Старые подходы: Slony, Londiste, pglogical; ○ Не рекомендуются, потому что медленные и/или плохо работают.
  • 11. Зачем нужен еще один вид репликации? ● Репликация части данных, не всего подряд; ● Обновление без даунтайма; ● На реплике можно использовать временные таблицы, да и вообще писать все что угодно, в т.ч. в реплицируемые таблицы; ● Одна реплика может тянуть данные с двух мастеров; ● В теории — можно изобразить multimaster; ● И другие сценарии, когда физическая репликация не подошла.
  • 12. Fun facts! ● Схема таблиц на мастере и на реплике может различаться; ● Может отличаться порядок столбцов; ● Реплика может иметь дополнительные nullable-столбцы; ● НО мастер не может иметь больше столбцов, чем реплика, даже если в этих столбцах всегда NULL.
  • 13. Ограничения логической репликации ● Реплицируемые таблицы должны иметь primary key; ● DDL, TRUNCATE и sequences не реплицируются; ● Поддержка триггеров реализована не до конца [1]. [1]: https://postgr.es/m/[email protected]
  • 14. Logical decoding $ pg_recvlogical --slot=myslot --dbname=eax --user=eax --create-slot --plugin=test_decoding $ pg_recvlogical --slot=myslot --dbname=eax --user=eax --start -f - BEGIN 560 COMMIT 560 BEGIN 561 table public.test: INSERT: k[text]:'aaa' v[text]:'bbb' COMMIT 561
  • 15. Logical decoding: JSON ● Есть больше одного стороннего расширения... ● … но на сегодня все сломаны на 10-ке [1][2] :( [1]: https://github.com/eulerto/wal2json/issues/33 [2]: https://github.com/posix4e/jsoncdc/issues/77
  • 16. Фейловер ● Ручной ○ Имеет смысл, когда серверов БД не много (~10 штук); ○ Кстати, сейчас не проблема купить машину с сотнями Гб памяти и несколькими Тб места на диске; ● Автоматический ○ Может иметь смысл, когда вы приближаетесь к масштабам Google.
  • 17. Решения для настройки автофейловера ● Физическая репликация ○ Своими велосипедами на Python ;) ○ Repmgr ○ Patroni ○ Stolon (нравится мне больше всего) ● Логическая репликация ○ Еще не написали :(
  • 18. Stolon Коротко о главном: ● Разрабатывается с 2015 года компанией Sorint.lab ● Написан на Go ● Полагается на Consul или etcd ● Умеет интегрироваться с Kubernetes ● Настраивается быстро и просто ● Корректно обрабатывает любые падения машин и нетсплиты
  • 19. Stolon: как это работает?
  • 20. Fun facts! ● Stolon направляет и чтение, и запись в мастер. Но есть воркэраунд [1]; ● Использует Consul или etcd чисто как key-value, в частности, не знает про поддержку Consul’ом DNS. [1]: https://github.com/sorintlab/stolon/issues/132
  • 21. Consul Коротко о главном: ● Разрабатывается HashiCorp, подарившей миру Packer и Vagrant; ● Написан на языке Go, использует протокол Raft; ● Решение для service discovery, как ZooKeeper или etcd; ● Распределенное key-value хранилище с REST-интерфейсом; ● Имеет CAS, встроенный мониторинг, локи, подписки на обновления, …; ● Умеет отдавать информацию о сервисах по DNS; ● Тестируется Jepsen’ом [1]. [1]: https://www.consul.io/docs/internals/jepsen.html
  • 22. Fun facts! ● У Consul есть красивый веб-интерфейс с информацией о зарегистрированных сервисах; ● Поверх него (ровно как и поверх Cassandra или Couchbase) можно довольно легко написать выбор лидера, используя подход под названием leader lease [1]. [1]: http://eax.me/go-leader-election/
  • 23. synchronous_commit ● synchronous_commit = off ○ Не ждем записи в WAL, можно потерять часть последних изменений ○ В отличие от fsync = off не приведет к неконсистентности базы ● synchronous_commit = on ○ Ждем подтверждения записи в WAL — свой и синхронной реплики ● synchronous_commit = remote_write ○ Аналогично on, но не дожидаемся fsync() на реплике ● synchronous_commit = local ○ Не ждем записи на реплике, пишем только локально ● synchronous_commit = remote_apply ( >= 9.6 ) ○ Ждем, когда данные попадут в WAL реплики и применятся к данным
  • 24. Fun fact! ● synchronous_commit можно менять не только в postgresql.conf, но и в рамках сессии с помощью команды SET.
  • 25. synchronous_standby_names ● synchronous_standby_names = ‘*’ ○ Ждем подтверждения от одной любой реплики ● synchronous_standby_names = ANY 2(node1,node2,node3); ○ Коммит на кворум ○ Появилось в версии 10 ● Другие варианты [1] не очень полезны. [1]: https://www.postgresql.org/docs/current/static/runtime-config-replication.html
  • 26. Что осталось за кадром ● Шардинг и решардинг ○ Реализуемы при помощи логической репликации и словаря на базе Consul; ● Распределенные транзакции ○ Percolator-like-транзакции достаточно просто реализуемы; ○ Дают snapshot isolation, возможна аномалия write skew; ○ Подойдет для большинства приложений, в частности Oracle только SI и предлагает; ○ Важно! Нужно использовать и при записи, и при чтении; ● Готовых решений нет, или я про них не знаю ● Если вам повезет, то никогда не придется всем этим заниматься ● Кое-какие подробности — http://eax.me/sharding/
  • 27. Дополнительные материалы ● https://www.postgresql.org/docs/10/static/index.html ● https://www.consul.io/ ● https://github.com/sorintlab/stolon/ ● https://raft.github.io/ ● https://jepsen.io/ ● https://kubernetes.io/ ● + есть статьи на http://eax.me/
  • 28. Вопросы и ответы. ● [email protected] ● https://twitter.com/afiskon