ΠšΡ€ΡŠΡΡ‚ΠΎΡΠ°Π½Π° рСпликация ΠΌΠ΅ΠΆΠ΄Ρƒ 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

Π‘Π»Π΅Π΄ ΡƒΡΠΏΠ΅ΡˆΠ½Π°Ρ‚Π° инсталация Π½Π° Python 3.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 ΠΈΠΌΠ° Ρ€Π°Π·Π΄Π΅Π» Π·Π° Π³Π»ΠΎΠ±Π°Π»Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ (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: Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° процСса Π½Π° рСпликация Π·Π° ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ mysql

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

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

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

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

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

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