ΠšΠΎΡΠΌΠ΅ΡΡ‚Π½Π° рСпликация ΠΌΠ΅ΠΆΠ΄Ρƒ 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
създаванС Π½Π° дирСктория /root/.pg_chameleon
създаванС Π½Π° дирСктория /root/.pg_chameleon/configuration/
създаванС Π½Π° дирСктория /root/.pg_chameleon/logs/
създаванС Π½Π° дирСктория /root/.pg_chameleon/pid/
ΠΊΠΎΠΏΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½Π°Ρ‚Π° конфигурация Π² /root/.pg_chameleon/configuration//config-example.yml

Π‘Π΅Π³Π° създавамС ΠΊΠΎΠΏΠΈΠ΅ Π½Π° config-example.yml ΠΊΠ°Ρ‚ΠΎ default.yml, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Π΄Π° станС Ρ„Π°ΠΉΠ»ΡŠΡ‚ Π·Π° конфигурация ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° конфигурационния Ρ„Π°ΠΉΠ» Π·Π° Ρ‚ΠΎΠ·ΠΈ случай Π΅ прСдоставСн ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ.

$> cat default.yml
---
#Π³Π»ΠΎΠ±Π°Π»Π½ΠΈ настройки
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 позволява Π½Π° потрСбитСля Π΄Π° Π·Π°ΠΌΠ΅Π½ΠΈ стандартното ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°Π½Π΅ Π½Π° Ρ‚ΠΈΠΏΠ° с Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½.
type_override:
  "tinyint(1)":
    override_to: boolean
    override_tables:
      - "*"

# postgres  Ρ†Π΅Π»Π΅Π²ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠ°
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 #пропуска вмъквания Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° delphis_mediterranea.foo
      delete:
        - delphis_mediterranea #пропуска изтривания Π² схСмата delphis_mediterranea
      update:

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈΡΡ‚ Ρ„Π°ΠΉΠ» Π² Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΅ Π΅Π΄ΠΈΠ½ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† Π½Π° Ρ„Π°ΠΉΠ» с pg_chameleon с ΠΌΠ°Π»ΠΊΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ, ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π°Ρ‰ΠΈ Π½Π° ΠΈΠ·Ρ…ΠΎΠ΄Π½Π°Ρ‚Π° ΠΈ Ρ†Π΅Π»Π΅Π²Π°Ρ‚Π° срСда, Π° ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ Π΅ ΠΏΡ€Π΅Π³Π»Π΅Π΄ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈΡ‚Π΅ Ρ€Π°Π·Π΄Π΅Π»ΠΈ Π½Π° конфигурационния Ρ„Π°ΠΉΠ».

Π’ конфигурационния Ρ„Π°ΠΉΠ» default.yml ΠΈΠΌΠ° Ρ€Π°Π·Π΄Π΅Π» Π·Π° Π³Π»ΠΎΠ±Π°Π»Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° управляватС настройки ΠΊΠ°Ρ‚ΠΎ мСстополоТСниС Π½Π° Ρ„Π°ΠΉΠ» Π·Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅, мСстополоТСниС Π½Π° Π»ΠΎΠ³ΠΎΠ²Π΅Ρ‚Π΅, ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Π½Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π»ΠΎΠ³ΠΎΠ²Π΅Ρ‚Π΅ ΠΈ Π΄Ρ€. Π‘Π»Π΅Π΄Π²Π° Ρ€Π°Π·Π΄Π΅Π» Π·Π° замяна Π½Π° Ρ‚ΠΈΠΏΠΎΠ²Π΅, Π² ΠΊΠΎΠΉΡ‚ΠΎ Π΅ посочСн Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° замяна Π½Π° Ρ‚ΠΈΠΏΠΎΠ²Π΅Ρ‚Π΅ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° рСпликацията. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π·Π° замяна Π½Π° Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π° 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: Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° процСса Π½Π° рСпликация Π·Π° ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ mysql

Π‘Ρ‚Π°Ρ‚ΡƒΡΡŠΡ‚ Π½Π° рСпликацията ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π·Π°ΠΏΠΈΡ‚Π°Π½ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° show_status, Π° Π³Ρ€Π΅ΡˆΠΊΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΏΡ€Π΅Π³Π»Π΅Π΄Π°Π½ΠΈ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° show_errors.

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

ΠšΠ°ΠΊΡ‚ΠΎ Π²Π΅Ρ‡Π΅ спомСнахмС, всяка функция Π½Π° рСпликацията сС управлява ΠΎΡ‚ Π΄Π΅ΠΌΠΎΠ½ΠΈ. Π—Π° Π΄Π° Π³ΠΈ ΠΏΡ€Π΅Π³Π»Π΅Π΄Π°ΠΌΠ΅, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° поискамС Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° Π½Π° процСситС с ΠΊΠΎΠΌΠ°Π½Π΄Π° Linux ps, ΠΊΠ°ΠΊΡ‚ΠΎ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ.

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

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

mysql> create table t1 (n1 int primary key, n2 varchar(10));
Π—Π°ΠΏΠΈΡ‚Π²Π°Π½Π΅ OK, 0 Ρ€Π΅Π΄Π° засСгнати (0.01 сСк)
mysql> insert into t1 values (1,'one');
Π—Π°ΠΏΠΈΡ‚Π²Π°Π½Π΅ OK, 1 Ρ€Π΅Π΄ засСгнат (0.00 сСк)
mysql> insert into t1 values (2,'two');
Π—Π°ΠΏΠΈΡ‚Π²Π°Π½Π΅ OK, 1 Ρ€Π΅Π΄ засСгнат (0.00 сСк)

$> chameleon sync_tables --tables world_x.t1 --config default --source mysql
ΠŸΡ€ΠΎΡ†Π΅ΡΡŠΡ‚ Π·Π° синхронизиранС Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†ΠΈΡ‚Π΅ Π·Π° ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ mysql стартира.

Π—Π° Π΄Π° ΠΏΠΎΡ‚Π²ΡŠΡ€Π΄ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ тСста, Π·Π°ΠΏΠΈΡ‚Π²Π°ΠΌΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΠΎΡ‚ Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ 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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster