В принципе интересно, но как добавить репликацию к уже имеющейся и пусть не сильно большой, но уже прилично весящей базе? Экспортировать текущую, создавать новую реплицируемую и импортировать данные туда? Или можно добавить репликацию к имеющейся рабочей базе «на лету» (естественно с требующейся по ходе дела остановкой, если нужно).
Да, можно добавить репликацию к имеющейся базе. Для этого необходимо модифицировать код файла insert_sample.sql, создав в таблицах Symmetric DS (начинающизся на sym_) нужные записи.
Особенность Symmetric DS такова, что он может реплицировать не всю базу подряд, а только некоторые ее таблицы. Например, у нас есть branch office и менеджер по продажам вносит в локальную базу нового клиента. Эта информация о клиенте синхронизируется с главной базой в headquarters и становится после этого доступна для остальных branch offices.
И еще, рассматривали, как ведут себя базы в случае потери соединения? Скажем, у меня две БД в разных городах — интернет есть всегда, но вдруг чего, разное бывает — пропадает. В таких случаях, если у нас мультимастер репликация, надо будет решать конфликты по id'ам insert'ов и update'ам. Хотелось бы еще несколько слов об этом.
Из тех систем, с которыми я сталкивался проблема решается двумя способами — либо каждая база данных имеет свой непересекающийся диапазон идентификаторов, либо первичный идентификатор составной — ИД записи + ИД базы данных. Можно еще позаморачиваться с UUID в качестве идентификаторов, но это уже совсем для гурманов.
В нашем проекте используется master-slave модель, когда данные пишутся только в master базу и реплицируются на находящуюся в hot standby вторичную базу.
Отвечу сразу на вопрос Lolka — при временном обрыве соединения между базами изменения в master базе накапливаются в служебных таблицах SymmetricDS, и при возобновлении соединения они загоняются в secondary db.
Вопрос об разрешении конфликтов при мультимастерной конфигурации, думаю, это тема отдельного поста. Пока же скажу, что симметрик умеет изменять запрос INSERT на UPDATE в случае, если в destination db такая запись уже есть.
Это очень важно как он будет себя вести.
Например, rubyrep, так же позионирующийся как мастер-мастер репликатор, тупо падает в этой ситуации. А это, согласитесь, обозначает полную неприменимость.
Давно смотрел на М-М решения, но пока не видел ничего достойного.
У меня работает уже второй год Bucardo в режиме асинхронной М-М для двух серверов в разных городах. С падениями канала справляется. Конфликты решаются по методу latest. Всё работает без сбоев. «Трафик» по запросам правда совсем маленький — до 50k запросов (update, insert, delete) в сутки.
БД более 300G. продакшен. работаем на master-slave реплике (hot_standby WAL) + pgpool для отказоустойчивости. полет нормальный. отставание практически незаметное. pgpool допилен немного скриптами для грамотного переключения и управления нодами.
так же есть балансировка нагрузки. на slave летит 99% SELECT.
Как пгпул переключает слейвы? Не нужно как-то явно говорить, что такой-то слейв теперь стал мастером?
Во всяком случае в слоне так — и он просто запрещает запись на слейв сервер.
Мы поостереглись делать автоматическое переключение мастера — т.к. в случае временных перебоев или еще каких сетевых проблем, начнется переконфигурация кластера.
1. падает мастер.
2. pgpool делает slave мастером. в случае нескольких слейвов запускается синхронизация с новым мастером.
даже если старый мастер поднимется он не включиться в текущую схему. его можно только принудительно сделать слейвом и так же принудительно включить в кластер.
Представим, что где-то возник таймаут — например, за счет перебоев в сети, скачка нагрузки, где-то своп подкачался и пр. — причин может быть масса.
После этого скрипт считает, что мастер пропал — тут же все переключается на слейв. Затем мастер появился, но работать уже не может — т.к. он рассинхронизирован. Таким образом из рабочей конфигурации вы потеряли 1 сервер БД. Конфигурация ослабла. Если будет скачок нагрузки, то есть риск вылета еще одного сервера таким же макаром, а дальше все будет «складываться» как домино.
надо понимать, что это все-таки псевдо-кластер. да. с большим отказом, но есть узкие места.
=)
при переходе на нового мастера, слейвы должны будут посинкаться с новым мастером. старый мастер стать слейвом и тоже посинкаться. в общем есть там слабые места. есть. не спорю, но это лучше чем вообще ничего и если надо обеспечить 24Хх7 то это хоть что-то при отказах, а не тупое «БД не доступна».
хорошая статья спасибо
позвольте поумничать
«Сервера должны пинговать друг друга, потому что SymmetricDS использует HTTP протокол для синхронизации. „
пинг это ICMP протокол, а HTTP — это другой протокол.
можно сделать чтобы сервера не пингались, а HTTP работает =)
[/умничать]
Репликация базы данных PostgreSQL на основе SymmetricDS