ΠŸΠ΅Ρ€Π΅ΠΊΡ€Π΅ΡΡ‚Π½Π°Ρ рСпликация ΠΌΠ΅ΠΆΠ΄Ρƒ PostgreSQL ΠΈ MySQL

ΠŸΠ΅Ρ€Π΅ΠΊΡ€Π΅ΡΡ‚Π½Π°Ρ рСпликация ΠΌΠ΅ΠΆΠ΄Ρƒ PostgreSQL ΠΈ MySQL

Π― Π² ΠΎΠ±Ρ‰ΠΈΡ… Ρ‡Π΅Ρ€Ρ‚Π°Ρ… расскаТу ΠΎ пСрСкрСстной Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ PostgreSQL ΠΈ MySQL, Π° Π΅Ρ‰Π΅ ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… настройки пСрСкрСстной Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ этими двумя сСрвСрами Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π² пСрСкрСстной Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΎΡ€ΠΎΠ΄Π½Ρ‹ΠΌΠΈ, ΠΈ это ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° с ΠΎΠ΄Π½ΠΎΠ³ΠΎ сСрвСра рСляционной Π‘Π£Π‘Π” Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

Π‘Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… PostgreSQL ΠΈ MySQL принято ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ рСляционными, Π½ΠΎ с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ ΠΎΠ½ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ возмоТности NoSQL. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ обсудим Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ PostgreSQL ΠΈ MySQL, с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния рСляционных Π‘Π£Π‘Π”.

ΠœΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ всю Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ ΠΊΡƒΡ…Π½ΡŽ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ прСдставлСниС ΠΎ настройкС Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ сСрвСрами Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, прСимущСствах, ограничСниях ΠΈ сцСнариях использования.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ рСпликация ΠΌΠ΅ΠΆΠ΄Ρƒ двумя ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ΠΌΠΈ сСрвСрами Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… выполняСтся Π»ΠΈΠ±ΠΎ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π»ΠΈΠ±ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ запросов ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅Π΄ΡƒΡ‰ΠΈΠΌ ΡƒΠ·Π»ΠΎΠΌ (ΠΎΠ½ ΠΆΠ΅ ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ, Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΈΠ»ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ) ΠΈ Π²Π΅Π΄ΠΎΠΌΡ‹ΠΌ (подписчик, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ ΠΈΠ»ΠΈ пассивный). ЦСль Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ β€” ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ копию Π³Π»Π°Π²Π½ΠΎΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° сторонС Π²Π΅Π΄ΠΎΠΌΠΎΠ³ΠΎ. ΠŸΡ€ΠΈ этом Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ Π²Π΅Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΊ Π²Π΅Π΄ΠΎΠΌΠΎΠΌΡƒ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΡ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΊ пассивному, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ рСпликация выполняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½Ρƒ сторону. Но ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΎΠ±Π΅ стороны, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π»ΠΈΡΡŒ ΠΎΡ‚ Π²Π΅Π΄ΠΎΠΌΠΎΠ³ΠΎ ΠΊ Π²Π΅Π΄ΡƒΡ‰Π΅ΠΌΡƒ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Β«Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ-Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉΒ». ВсС это, Π² Ρ‚ΠΎΠΌ числС каскадная рСпликация, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ΠΌΠΈ сСрвСрами Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Β«Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ-Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉΒ» ΠΈΠ»ΠΈ Β«Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ-пассивный» зависит ΠΎΡ‚ потрСбности, доступности Ρ‚Π°ΠΊΠΈΡ… возмоТностСй Π² исходной ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ использования Π²Π½Π΅ΡˆΠ½ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ для настройки ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… компромиссов.

Описанная конфигурация Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ сСрвСрами Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…. Π‘Π΅Ρ€Π²Π΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ для ΠΏΡ€ΠΈΠ΅ΠΌΠ° Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… с Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ сСрвСра Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΡ€ΠΈ этом ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ снимки Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. MySQL ΠΈ PostgreSQL ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ· этих ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ своими силами ΠΈΠ»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сторонних Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΆΡƒΡ€Π½Π°Π»Π°, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ диска ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½Π° основС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ строк.

ΠŸΠ΅Ρ€Π΅ΠΊΡ€Π΅ΡΡ‚Π½Π°Ρ рСпликация ΠΌΠ΅ΠΆΠ΄Ρƒ MySQL ΠΈ PostgreSQL Π½ΡƒΠΆΠ½Π° для ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠΉ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ с ΠΎΠ΄Π½ΠΎΠ³ΠΎ сСрвСра Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π­Ρ‚ΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹, поэтому ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΈΡ… Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π½Π΅ получится. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°Π»Π°Π΄ΠΈΡ‚ΡŒ ΠΎΠ±ΠΌΠ΅Π½ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ внСшний опСнсорс-инструмСнт, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ pg_chameleon.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ pg_chameleon

pg_chameleon β€” это систСма Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈΠ· MySQL Π² PostgreSQL Π½Π° Python 3. Π’ Π½Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ опСнсорс-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° mysql-replication, Ρ‚ΠΎΠΆΠ΅ Π½Π° Python. ΠžΠ±Ρ€Π°Π·Ρ‹ строк ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ΡΡ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ† MySQL ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ JSONB Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… PostgreSQL, Π° ΠΏΠΎΡ‚ΠΎΠΌ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ pl/pgsql ΠΈ воспроизводятся Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… PostgreSQL.

ВозмоТности pg_chameleon

НСсколько схСм MySQL ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ кластСра ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΎΠ΄Π½Ρƒ Ρ†Π΅Π»Π΅Π²ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… PostgreSQL с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ Β«ΠΎΠ΄ΠΈΠ½ ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌΒ»
ИмСна исходной ΠΈ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ схСм Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ.
Π”Π°Π½Π½Ρ‹Π΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠ· каскадной Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ MySQL.
Π’Π°Π±Π»ΠΈΡ†Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ошибки, ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ.
КаТдой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ Π΄Π΅ΠΌΠΎΠ½Ρ‹.
ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π° Π±Π°Π·Π΅ YAML.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π₯ост
vm1
vm2

ВСрсия ОБ
CentOS Linux 7.6 x86_64
CentOS Linux 7.5 x86_64

ВСрсия сСрвСра Π‘Π”
MySQL 5.7.26
PostgreSQL 10.5

ΠŸΠΎΡ€Ρ‚ Π‘Π”
3306
5433

IP-адрСс
192.168.56.102
192.168.56.106

Для Π½Π°Ρ‡Π°Π»Π° ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΡŒΡ‚Π΅ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ для установки pg_chameleon. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ установлСн Python 3.6.8, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ срСду ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π΅.

$> wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz
$> tar -xJf Python-3.6.8.tar.xz
$> cd Python-3.6.8
$> ./configure --enable-optimizations
$> make altinstall

ПослС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ установки Python3.6 Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ трСбования, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ срСду. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, pip-ΠΌΠΎΠ΄ΡƒΠ»ΡŒ обновляСтся Π΄ΠΎ послСднСй вСрсии ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для установки pg_chameleon. Π’ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ… Π½ΠΈΠΆΠ΅ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ устанавливаСтся pg_chameleon 2.0.9, хотя послСдняя вСрсия β€” 2.0.10. Π­Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Ρ… Π±Π°Π³ΠΎΠ² Π² ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ вСрсии.

$> python3.6 -m venv venv
$> source venv/bin/activate
(venv) $> pip install pip --upgrade
(venv) $> pip install pg_chameleon==2.0.9

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ pg_chameleon (chameleon β€” это ΠΊΠΎΠΌΠ°Π½Π΄Π°) с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ set_configuration_files, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ pg_chameleon ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

(venv) $> chameleon set_configuration_files
creating directory /root/.pg_chameleon
creating directory /root/.pg_chameleon/configuration/
creating directory /root/.pg_chameleon/logs/
creating directory /root/.pg_chameleon/pid/
copying configuration  example in /root/.pg_chameleon/configuration//config-example.yml

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ создаСм копию config-example.yml ΠΊΠ°ΠΊ default.yml, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ стал Ρ„Π°ΠΉΠ»ΠΎΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ΠžΠ±Ρ€Π°Π·Π΅Ρ† Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° приводится Π½ΠΈΠΆΠ΅.

$> cat default.yml
---
#global settings
pid_dir: '~/.pg_chameleon/pid/'
log_dir: '~/.pg_chameleon/logs/'
log_dest: file
log_level: info
log_days_keep: 10
rollbar_key: ''
rollbar_env: ''

# type_override allows the user to override the default type conversion into a different one.
type_override:
  "tinyint(1)":
    override_to: boolean
    override_tables:
      - "*"

#postgres  destination connection
pg_conn:
  host: "192.168.56.106"
  port: "5433"
  user: "usr_replica"
  password: "pass123"
  database: "db_replica"
  charset: "utf8"

sources:
  mysql:
    db_conn:
      host: "192.168.56.102"
      port: "3306"
      user: "usr_replica"
      password: "pass123"
      charset: 'utf8'
      connect_timeout: 10
    schema_mappings:
      world_x: pgworld_x
    limit_tables:
#      - delphis_mediterranea.foo
    skip_tables:
#      - delphis_mediterranea.bar
    grant_select_to:
      - usr_readonly
    lock_timeout: "120s"
    my_server_id: 100
    replica_batch_size: 10000
    replay_max_rows: 10000
    batch_retention: '1 day'
    copy_max_memory: "300M"
    copy_mode: 'file'
    out_dir: /tmp
    sleep_loop: 1
    on_error_replay: continue
    on_error_read: continue
    auto_maintenance: "disabled"
    gtid_enable: No
    type: mysql
    skip_events:
      insert:
        - delphis_mediterranea.foo #skips inserts on the table delphis_mediterranea.foo
      delete:
        - delphis_mediterranea #skips deletes on schema delphis_mediterranea
      update:

Π€Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ β€” это ΠΎΠ±Ρ€Π°Π·Π΅Ρ† Ρ„Π°ΠΉΠ»Π° с pg_chameleon с Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ измСнСниями Π² соотвСтствии с исходной ΠΈ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ срСдами, ΠΈ Π½ΠΈΠΆΠ΅ приводится ΠΎΠ±Π·ΠΎΡ€ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

Π’ Ρ„Π°ΠΉΠ»Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ default.yml Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π» Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (global settings), Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌΠΈ настройками, ΠΊΠ°ΠΊ располоТСниС Ρ„Π°ΠΉΠ»Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, располоТСниС Π»ΠΎΠ³ΠΎΠ², ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ хранСния Π»ΠΎΠ³ΠΎΠ² ΠΈ Ρ‚. Π΄. Π”Π°Π»ΡŒΡˆΠ΅ ΠΈΠ΄Π΅Ρ‚ Ρ€Π°Π·Π΄Π΅Π» пСрСопрСдСлСния Ρ‚ΠΈΠΏΠΎΠ² (type override), Π³Π΄Π΅ ΡƒΠΊΠ°Π·Π°Π½ Π½Π°Π±ΠΎΡ€ ΠΏΡ€Π°Π²ΠΈΠ» для пСрСопрСдСлСния Ρ‚ΠΈΠΏΠΎΠ² Π²ΠΎ врСмя Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ пСрСопрСдСлСния Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ tinyint(1) Π² логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Π’ нашСм случаС это Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… PostgreSQL, обозначСнная ΠΊΠ°ΠΊ pg_conn. Π’ послСднСм Ρ€Π°Π·Π΄Π΅Π»Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ источника, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ исходной Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, схСму сопоставлСния исходной ΠΈ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ, врСмя оТидания, ΠΏΠ°ΠΌΡΡ‚ΡŒ, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚Π°. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Β«sourcesΒ» ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π²ΠΎ мноТСствСнном числС, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ нСсколько исходных Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… для ΠΎΠ΄Π½ΠΎΠΉ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Β«ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒΒ».

Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… world_x Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ содСрТит 4 Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ со строками, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сообщСство MySQL ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. Π•Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ здСсь. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… поставляСтся Π² Π²ΠΈΠ΄Π΅ tar ΠΈ сТатого Π°Ρ€Ρ…ΠΈΠ²Π° с инструкциями ΠΏΠΎ созданию ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Ρƒ строк.

Π’ Π±Π°Π·Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ… MySQL ΠΈ PostgreSQL создаСтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ usr_replica. Π’ MySQL Π΅ΠΌΡƒ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€Π°Π²Π° Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ всСх Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ†.

mysql> CREATE USER usr_replica ;
mysql> SET PASSWORD FOR usr_replica='pass123';
mysql> GRANT ALL ON world_x.* TO 'usr_replica';
mysql> GRANT RELOAD ON *.* to 'usr_replica';
mysql> GRANT REPLICATION CLIENT ON *.* to 'usr_replica';
mysql> GRANT REPLICATION SLAVE ON *.* to 'usr_replica';
mysql> FLUSH PRIVILEGES;

На сторонС PostgreSQL создаСтся Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… db_replica, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ измСнСния ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… MySQL. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ usr_replica Π² PostgreSQL автоматичСски настраиваСтся ΠΊΠ°ΠΊ Π²Π»Π°Π΄Π΅Π»Π΅Ρ† Π΄Π²ΡƒΡ… схСм pgworld_x ΠΈ sch_chameleon, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат фактичСскиС Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ с ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ соотвСтствСнно. Π—Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ create_replica_schema, ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π½ΠΈΠΆΠ΅.

postgres=# CREATE USER usr_replica WITH PASSWORD 'pass123';
CREATE ROLE
postgres=# CREATE DATABASE db_replica WITH OWNER usr_replica;
CREATE DATABASE

Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… MySQL настраиваСтся с измСнСниями Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π΅ ΠΊ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅. НуТно Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сСрвСр Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ измСнСния вступили Π² силу.

$> vi /etc/my.cnf
binlog_format= ROW
binlog_row_image=FULL
log-bin = mysql-bin
server-id = 1

БСйчас Π²Π°ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ ΠΎΠ±ΠΎΠΈΠΌ сСрвСрам Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ pg_chameleon Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

На ΡƒΠ·Π»Π΅ PostgreSQL:

$> mysql -u usr_replica -Ap'admin123' -h 192.168.56.102 -D world_x

На ΡƒΠ·Π»Π΅ MySQL :

$> psql -p 5433 -U usr_replica -h 192.168.56.106 db_replica

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ pg_chameleon (chameleon) ΠΏΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ срСду, Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ источник ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ. АргумСнт create_replica_schema Π² pg_chameleon создаСт схСму ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (sch_chameleon) ΠΈ схСму Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ (pgworld_x) Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… PostgreSQL, ΠΊΠ°ΠΊ ΠΌΡ‹ ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ. АргумСнт add_source добавляСт ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, считывая Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ (default.yml), ΠΈ Π² нашСм случаС это mysql, Π° init_replica ΠΈΠ½ΠΈΡ†Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π½Π° основС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² Ρ„Π°ΠΉΠ»Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

$> chameleon create_replica_schema --debug
$> chameleon add_source --config default --source mysql --debug
$> chameleon init_replica --config default --source mysql --debug

Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ этих Ρ‚Ρ€Π΅Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° ΠΈΡ… ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ВсС сбои ΠΈΠ»ΠΈ синтаксичСскиС ошибки ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² простых ΠΈ понятных сообщСниях с подсказками ΠΏΠΎ ΠΈΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

НаконСц, запустим Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ start_replica ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ сообщСниС ΠΎΠ± ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ.

$> chameleon start_replica --config default --source mysql 
output: Starting the replica process for source mysql

Бтатус Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° show_status, Π° ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ошибки β€” с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° show_errors.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Как ΠΌΡ‹ ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ, ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ Π΄Π΅ΠΌΠΎΠ½Ρ‹. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΈΡ…, запросим Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ процСссов ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Linux ps, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

РСпликация Π½Π΅ считаСтся настроСнной, ΠΏΠΎΠΊΠ° ΠΌΡ‹ Π½Π΅ протСстируСм Π΅Π΅ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅. ΠœΡ‹ создаСм Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, вставляСм ΠΏΠ°Ρ€Ρƒ записСй Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… MySQL ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ sync_tables Π² pg_chameleon, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΄Π΅ΠΌΠΎΠ½Ρ‹ ΠΈ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ с записями Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… PostgreSQL.

mysql> create table t1 (n1 int primary key, n2 varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t1 values (1,'one');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1 values (2,'two');
Query OK, 1 row affected (0.00 sec)

$> chameleon sync_tables --tables world_x.t1 --config default --source mysql
Sync tables process for source mysql started.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ тСста, Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… PostgreSQL ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ строки.

$> psql -p 5433 -U usr_replica -d db_replica -c "select * from pgworld_x.t1";
 n1 |  n2
----+-------
  1 | one
  2 | two

Если ΠΌΡ‹ выполняСм ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ pg_chameleon Π±ΡƒΠ΄ΡƒΡ‚ Π΅Π΅ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ΠΌ. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ убСдимся, Ρ‡Ρ‚ΠΎ строки всСх Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ† Π±Ρ‹Π»ΠΈ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ пСрСнСсСнная Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… PostgreSQL Π±Π΅Π· ссылок Π½Π° ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ схСму Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ (sch_chameleon).

$> chameleon stop_replica --config default --source mysql 
$> chameleon detach_replica --config default --source mysql --debug

По ТСланию ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΈ схСму Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

$> chameleon drop_source --config default --source mysql --debug
$> chameleon drop_replica_schema --config default --source mysql --debug

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° pg_chameleon

ΠŸΡ€ΠΎΡΡ‚Π°Ρ настройка ΠΈ конфигурация.
Π£Π΄ΠΎΠ±Π½ΠΎΠ΅ устранСниС Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΎΠΊ ΠΈ выявлСниС Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΉ с понятными сообщСниями ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ….
Π’ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ послС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π½Π΅ мСняя ΠΎΡΡ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ.
МоТно Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ нСсколько исходных Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… для ΠΎΠ΄Π½ΠΎΠΉ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ, ΠΈ это ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Ссли Π²Ρ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… MySQL Π² ΠΎΠ΄Π½ΠΎΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… PostgreSQL.
МоТно Π½Π΅ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

НСдостатки pg_chameleon

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с MySQL 5.5 ΠΈ Π²Ρ‹ΡˆΠ΅ Π² качСствС источника ΠΈ PostgreSQL 9.5 ΠΈ Π²Ρ‹ΡˆΠ΅ Π² качСствС Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….
Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΈΠ»ΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡, ΠΈΠ½Π°Ρ‡Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² процСссС init_replica, Π½ΠΎ Π½Π΅ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ.
ΠžΠ΄Π½ΠΎΡΡ‚ΠΎΡ€ΠΎΠ½Π½ΡΡ рСпликация β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· MySQL Π² PostgreSQL. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для схСмы Β«Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ-пассивный».
Π˜ΡΡ…ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… MySQL, Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… PostgreSQL ΠΊΠ°ΠΊ источника Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΈ с ограничСниями (ΡƒΠ·Π½Π°ΠΉΡ‚Π΅ большС здСсь)

Π˜Ρ‚ΠΎΠ³ΠΈ ΠΏΠΎ pg_chameleon

ΠœΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² pg_chameleon ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· MySQL Π² PostgreSQL. БущСствСнный минус Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ рСпликация Ρ‚ΠΎΠ»ΡŒΠΊΠΎ односторонняя, поэтому спСциалисты ΠΏΠΎ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… вряд Π»ΠΈ захотят ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ. Но ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ одностороннСй Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ опСнсорс-инструмСнтом β€” SymmetricDS.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ здСсь. Π‘ΠΏΡ€Π°Π²ΠΊΡƒ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ здСсь.

ΠžΠ±Π·ΠΎΡ€ SymmetricDS

SymmetricDS β€” это опСнсорс-инструмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ Π»ΡŽΠ±ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Π² Π»ΡŽΠ±ΡƒΡŽ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½Π΅Π½Π½ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…: Oracle, MongoDB, PostgreSQL, MySQL, SQL Server, MariaDB, DB2, Sybase, Greenplum, Informix, H2, Firebird ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Π΅ экзСмпляры Π‘Π”, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Redshift, ΠΈ Azure ΠΈ Ρ‚. Π΄. ДоступныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: синхронизация Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ², рСпликация Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Π΅Π΄ΡƒΡ‰ΠΈΡ… Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Π½Π½Π°Ρ синхронизация, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. Π­Ρ‚ΠΎ инструмСнт Π½Π° Java, ΠΈ трСбуСтся стандартный выпуск JRE ΠΈΠ»ΠΈ JDK (вСрсии 8.0 ΠΈΠ»ΠΈ Π²Ρ‹ΡˆΠ΅). Π—Π΄Π΅ΡΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ измСнСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π°ΠΌ Π² исходной Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π½Π°ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡ… Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Ρ†Π΅Π»Π΅Π²ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Π² Π²ΠΈΠ΄Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ².

ВозмоТности SymmetricDS

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ Π½Π΅ зависит ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΈΠ»ΠΈ нСсколько Ρ€Π°Π·Π½Ρ‹Ρ… Π‘Π” ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.
РСляционныС Π‘Π” ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ записи измСнСния Π΄Π°Π½Π½Ρ‹Ρ…, Π° Π‘Π” Π½Π° основС Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… систСм ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ„Π°ΠΉΠ»ΠΎΠ².
Двусторонняя рСпликация с использованиСм ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Push ΠΈ Pull Π½Π° основС Π½Π°Π±ΠΎΡ€Π° ΠΏΡ€Π°Π²ΠΈΠ».
ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄Π°Π½Π½Ρ‹Ρ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΏΠΎ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΌ сСтям ΠΈ сСтям с Π½ΠΈΠ·ΠΊΠΎΠΉ пропускной ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒΡŽ.
АвтоматичСскоС восстановлСниС ΠΏΡ€ΠΈ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΡƒΠ·Π»ΠΎΠ² послС сбоя ΠΈ автоматичСскоС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ².
Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с ΠΎΠ±Π»Π°ΠΊΠΎΠΌ ΠΈ эффСктивныС API Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

SymmetricDS ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Π΄Π²ΡƒΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ²:
Π’Π΅Π΄ΡƒΡ‰ΠΈΠΉ (Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ) ΡƒΠ·Π΅Π», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡŽ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Π²Π΅Π΄ΠΎΠΌΡ‹ΠΌΠΈ (Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌΠΈ) ΡƒΠ·Π»Π°ΠΌΠΈ, ΠΈ ΠΎΠ±ΠΌΠ΅Π½ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ ΡƒΠ·Π»Π°ΠΌΠΈ осущСствляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ.
Активный ΡƒΠ·Π΅Π» (ΡƒΠ·Π΅Π» 1) ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ для Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ с Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ ΡƒΠ·Π»ΠΎΠΌ (ΡƒΠ·Π΅Π» 2) Π±Π΅Π· посрСдника.

Π’ ΠΎΠ±ΠΎΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ… ΠΎΠ±ΠΌΠ΅Π½ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ происходит с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Push ΠΈ Pull. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ рассмотрим ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Β«Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ-Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉΒ». ΠžΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ всю Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ слишком Π΄ΠΎΠ»Π³ΠΎ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ руководство, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎΠ± устройствС SymmetricDS.

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ SymmetricDS ΠΎΡ‡Π΅Π½ΡŒ просто: Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ опСнсорс-Π²Π΅Ρ€ΡΠΈΡŽ zip-Ρ„Π°ΠΉΠ»Π° ΠΎΡ‚ΡΡŽΠ΄Π° ΠΈ ΠΈΠ·Π²Π»Π΅ΠΊΠΈΡ‚Π΅ Π΅Π΅, ΠΊΡƒΠ΄Π° Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅. Π’ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π½ΠΈΠΆΠ΅ приводятся свСдСния ΠΎ мСстС установки ΠΈ вСрсии SymmetricDS Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ вСрсии Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, вСрсии Linux, IP-адрСса ΠΈ ΠΏΠΎΡ€Ρ‚Ρ‹ для ΠΎΠ±ΠΎΠΈΡ… ΡƒΠ·Π»ΠΎΠ².

Π₯ост
vm1
vm2

ВСрсия ОБ
CentOS Linux 7.6 x86_64
CentOS Linux 7.6 x86_64

ВСрсия сСрвСра Π‘Π”
MySQL 5.7.26
PostgreSQL 10.5

ΠŸΠΎΡ€Ρ‚ Π‘Π”
3306
5832

IP-адрСс
192.168.1.107
192.168.1.112

ВСрсия SymmetricDS
SymmetricDS 3.9
SymmetricDS 3.9

ΠŸΡƒΡ‚ΡŒ установки SymmetricDS
/usr/local/symmetric-server-3.9.20
/usr/local/symmetric-server-3.9.20

Имя ΡƒΠ·Π»Π° SymmetricDS
corp-000
store-001

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ устанавливаСм SymmetricDS Π² /usr/local/symmetric-server-3.9.20, ΠΈ Ρ‚ΡƒΡ‚ ΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ ΠΈ Ρ„Π°ΠΉΠ»Ρ‹. Нас ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ samples ΠΈ engines. Π’ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ samples хранятся ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ со свойствами ΡƒΠ·Π»Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ скриптов SQL для быстрого Π½Π°Ρ‡Π°Π»Π° дСмонстрации.

Π’ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ samples Π²ΠΈΠ΄ΠΈΠΌ Ρ‚Ρ€ΠΈ Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ со свойствами ΡƒΠ·Π»Π° β€” имя ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ ΡƒΠ·Π»Π° Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ схСмС.

corp-000.properties
store-001.properties
store-002.properties

Π’ SymmetricDS Π΅ΡΡ‚ΡŒ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ для Π±Π°Π·ΠΎΠ²ΠΎΠΉ схСмы ΠΈΠ· 3 ΡƒΠ·Π»ΠΎΠ² (Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ 1), ΠΈ Ρ‚Π΅ ΠΆΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для схСмы ΠΈΠ· 2 ΡƒΠ·Π»ΠΎΠ² (Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ 2). ΠšΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° samples Π² engines Π½Π° хостС vm1. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ Ρ‚Π°ΠΊ:

$> cat engines/corp-000.properties
engine.name=corp-000
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://192.168.1.107:3306/replica_db?autoReconnect=true&useSSL=false
db.user=root
db.password=admin123
registration.url=
sync.url=http://192.168.1.107:31415/sync/corp-000
group.id=corp
external.id=000

Π­Ρ‚ΠΎΡ‚ ΡƒΠ·Π΅Π» Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ SymmetricDS называСтся corp-000, Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… обрабатываСтся Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠΌ mysql jdbc, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ строку ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π²Ρ‹ΡˆΠ΅, ΠΈ ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ для Π²Ρ…ΠΎΠ΄Π°. ΠœΡ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… replica_db, Π° Π²ΠΎ врСмя создания схСмы Π±ΡƒΠ΄ΡƒΡ‚ созданы Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. sync.url ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ мСсто связи с ΡƒΠ·Π»ΠΎΠΌ для синхронизации.

Π£Π·Π΅Π» 2 Π½Π° хостС vm2 настраиваСтся ΠΊΠ°ΠΊ store-001, Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ„Π°ΠΉΠ»Π΅ node.properties, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ приводится Π½ΠΈΠΆΠ΅. Π£Π·Π΅Π» store-001 выполняСт Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… PostgreSQL, Π° pgdb_replica β€” это Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… для Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ. registration.url позволяСт хосту vm2 ΡΠ²ΡΠ·Π°Ρ‚ΡŒΡΡ с хостом vm1 ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚ Π½Π΅Π³ΠΎ Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

$> cat engines/store-001.properties
engine.name=store-001
db.driver=org.postgresql.Driver
db.url=jdbc:postgresql://192.168.1.112:5832/pgdb_replica
db.user=postgres
db.password=admin123
registration.url=http://192.168.1.107:31415/sync/corp-000
group.id=store
external.id=001

Π“ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ SymmetricDS содСрТит ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для настройки двустороннСй Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя сСрвСрами Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… (двумя ΡƒΠ·Π»Π°ΠΌΠΈ). ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π½ΠΈΠΆΠ΅ шаги Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π½Π° хостС vm1 (corp-000), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаст ΠΏΡ€ΠΈΠΌΠ΅Ρ€ схСмы с 4 Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ create-sym-tables ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ symadmin создаСт Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², Π³Π΄Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΡƒΠ·Π»Π°ΠΌΠΈ. НаконСц, Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ загруТаСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΄Π°Π½Π½Ρ‹Ρ….

vm1$> cd /usr/local/symmetric-server-3.9.20/bin
vm1$> ./dbimport --engine corp-000 --format XML create_sample.xml
vm1$> ./symadmin --engine corp-000 create-sym-tables
vm1$> ./dbimport --engine corp-000 insert_sample.sql

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ item ΠΈ item_selling_price настроСны автоматичСски для Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈΠ· corp-000 Π² store-001, Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ sale (sale_transaction ΠΈ sale_return_line_item) автоматичСски настроСны для Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈΠ· store-001 Π² corp-000. Π’Π΅ΠΏΠ΅Ρ€ΡŒ создаСм схСму Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… PostgreSQL Π½Π° хостС vm2 (store-001), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π΅ ΠΊ ΠΏΡ€ΠΈΠ΅ΠΌΡƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ corp-000.

vm2$> cd /usr/local/symmetric-server-3.9.20/bin
vm2$> ./dbimport --engine store-001 --format XML create_sample.xml

ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ провСряСм, Ρ‡Ρ‚ΠΎ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… MySQL Π½Π° vm1 Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ‚Π°Π±Π»ΠΈΡ† ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² SymmetricDS. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ систСмныС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ SymmetricDS (с прСфиксом sym_) сСйчас доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΡƒΠ·Π»Π΅ corp-000, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ ΠΌΡ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ create-sym-tables ΠΈ Π±ΡƒΠ΄Π΅ΠΌ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ. А Π΅Ρ‰Π΅ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΡƒΠ·Π»Π΅ store-001 Π±ΡƒΠ΄Π΅Ρ‚ всСго 4 Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±Π΅Π· Π΄Π°Π½Π½Ρ‹Ρ….

ВсС. Π‘Ρ€Π΅Π΄Π° Π³ΠΎΡ‚ΠΎΠ²Π° для запуска сСрвСрных процСссов sym Π½Π° ΠΎΠ±ΠΎΠΈΡ… ΡƒΠ·Π»Π°Ρ…, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

vm1$> cd /usr/local/symmetric-server-3.9.20/bin
vm1$> sym 2>&1 &

Записи Π»ΠΎΠ³ΠΎΠ² ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² Ρ„Π°ΠΉΠ» Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ Π»ΠΎΠ³Π° (symmetric.log) Π² ΠΏΠ°ΠΏΠΊΠ΅ Π»ΠΎΠ³ΠΎΠ² Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, Π³Π΄Π΅ установлСн SymmetricDS, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² стандартныС Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. Π‘Π΅Ρ€Π²Π΅Ρ€ sym Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° ΡƒΠ·Π»Π΅ store-001.

vm2$> cd /usr/local/symmetric-server-3.9.20/bin
vm2$> sym 2>&1 &

Если Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сСрвСрный процСсс sym Π½Π° хостС vm2, ΠΎΠ½ создаст Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° SymmetricDS Π΅Ρ‰Π΅ ΠΈ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… PostgreSQL. Если Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сСрвСрный процСсс sym Π½Π° ΠΎΠ±ΠΎΠΈΡ… ΡƒΠ·Π»Π°Ρ…, ΠΎΠ½ΠΈ ΡΠΊΠΎΠΎΡ€Π΄ΠΈΠ½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ с corp-000 Π½Π° store-001. Если Ρ‡Π΅Ρ€Π΅Π· нСсколько сСкунд ΠΌΡ‹ запросим всС 4 Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΠΎ ΠΎΠ±Π΅ стороны, Ρ‚ΠΎ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ рСпликация Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ. Или ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π½Π° ΡƒΠ·Π΅Π» store-001 ΠΈΠ· corp-000 ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ.

vm1$> ./symadmin --engine corp-000 reload-node 001

На этом этапС Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ item Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… MySQL Π½Π° ΡƒΠ·Π»Π΅ corp-000 (хост: vm1) вставляСтся новая запись, ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΅Π΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡŽ Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… PostgreSQL Π½Π° ΡƒΠ·Π»Π΅ store-001 (хост: vm2). ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Pull для пСрСмСщСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· corp-000 Π² store-001.

mysql> insert into item values ('22000002','Jelly Bean');
Query OK, 1 row affected (0.00 sec)

vm2$> psql -p 5832 -U postgres pgdb_replica -c "select * from item"
 item_id  |   name
----------+-----------
 11000001 | Yummy Gum
 22000002 | Jelly Bean
(2 rows)

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Push для пСрСмСщСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· store-001 Π² corp-000, вставляСм запись Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ sale_transaction ΠΈ провСряСм, Ρ‡Ρ‚ΠΎ рСпликация Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ ΡƒΡΠΏΠ΅ΡˆΠ½ΡƒΡŽ настройку двустороннСй Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ‚Π°Π±Π»ΠΈΡ† ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… MySQL ΠΈ PostgreSQL. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡŽ для Π½ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Ρ‚Π°Π±Π»ΠΈΡ†, выполняСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ t1 для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΈ настраиваСм ΠΏΡ€Π°Π²ΠΈΠ»Π° Π΅Π΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π’Π°ΠΊ ΠΌΡ‹ настраиваСм Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΈΠ· corp-000 Π² store-001.

mysql> create table  t1 (no integer);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into sym_channel (channel_id,create_time,last_update_time) 
values ('t1',current_timestamp,current_timestamp);
Query OK, 1 row affected (0.01 sec)

mysql> insert into sym_trigger (trigger_id, source_table_name,channel_id,
last_update_time, create_time) values ('t1', 't1', 't1', current_timestamp,
current_timestamp);
Query OK, 1 row affected (0.01 sec)

mysql> insert into sym_trigger_router (trigger_id, router_id,
Initial_load_order, create_time,last_update_time) values ('t1',
'corp-2-store-1', 1, current_timestamp,current_timestamp);
Query OK, 1 row affected (0.01 sec)

Π—Π°Ρ‚Π΅ΠΌ конфигурация ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ схСмы, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ symadmin с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ sync-triggers, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ воссоздаСт Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Ρ‹ для сопоставлСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Ρ‚Π°Π±Π»ΠΈΡ†. ВыполняСтся send-schema для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ схСмы Π½Π° ΡƒΠ·Π΅Π» store-001, ΠΈ рСпликация Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ t1 настроСна.

vm1$> ./symadmin -e corp-000 --node=001 sync-triggers    
vm1$> ./symadmin send-schema -e corp-000 --node=001 t1

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° SymmetricDS

ΠŸΡ€ΠΎΡΡ‚Π°Ρ установка ΠΈ конфигурация, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Ρ„Π°ΠΉΠ»ΠΎΠ² с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ для создания схСмы с трСмя ΠΈΠ»ΠΈ двумя ΡƒΠ·Π»Π°ΠΌΠΈ.
ΠšΡ€ΠΎΡΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΡΡ‚ΡŒ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ сСрвСры, Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠΈ ΠΈ ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Π΅ устройства.
РСпликация любой Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π² Π»ΡŽΠ±ΡƒΡŽ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… локально, Π² WAN ΠΈΠ»ΠΈ Π² ΠΎΠ±Π»Π°ΠΊΠ΅.
Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ°Ρ€ΠΎΠΉ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ нСскольким тысячами для ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ.
ΠŸΠ»Π°Ρ‚Π½Π°Ρ вСрсия с графичСским интСрфСйсом ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ.

НСдостатки SymmetricDS

НуТно Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ SQL для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ‚Π°Π±Π»ΠΈΡ† ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², Ρ‡Ρ‚ΠΎ Π±Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ.
ΠΠ°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Π°Π±Π»ΠΈΡ† для Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π±Ρ‹Π²Π°Π΅Ρ‚ ΡƒΡ‚ΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ссли Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ скрипты для создания ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² SQL, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ.
Π’ Π»ΠΎΠ³ΠΈ заносится слишком ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ Π½Π°Π²ΠΎΠ΄ΠΈΡ‚ΡŒ порядок Π² Ρ„Π°ΠΉΠ»Π΅ Π»ΠΎΠ³Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π½Π΅ Π·Π°Π½ΠΈΠΌΠ°Π» слишком ΠΌΠ½ΠΎΠ³ΠΎ мСста.

Π˜Ρ‚ΠΎΠ³ΠΈ ΠΏΠΎ SymmetricDS

SymmetricDS позволяСт Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π΄Π²ΡƒΡΡ‚ΠΎΡ€ΠΎΠ½Π½ΡŽΡŽ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя, трСмя ΠΈ Π΄Π°ΠΆΠ΅ нСсколькими тысячами ΡƒΠ·Π»ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΈ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹. Π­Ρ‚ΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ инструмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ выполняСт ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ автоматичСскоС восстановлСниС Π΄Π°Π½Π½Ρ‹Ρ… послС Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ простоя Π½Π° ΡƒΠ·Π»Π΅, Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΉ ΠΈ эффСктивный ΠΎΠ±ΠΌΠ΅Π½ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΡƒΠ·Π»Π°ΠΌΠΈ ΠΏΠΎ HTTPS, автоматичСскоС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π°ΠΌΠΈ Π½Π° основС Π½Π°Π±ΠΎΡ€Π° ΠΏΡ€Π°Π²ΠΈΠ» ΠΈ Ρ‚. Π΄. SymmetricDS выполняСт Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ Π»ΡŽΠ±Ρ‹ΠΌΠΈ Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, поэтому Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для самых Ρ€Π°Π·Π½Ρ‹Ρ… сцСнариСв, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, распространСниС, Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡŽ ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ….

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ создан Π½Π° основС ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ³ΠΎ руководства ΠΏΠΎ SymmetricDS. Π’ руководствС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ понятия, связанныС с настройкой Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SymmetricDS.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com