
Π ΠΎΠ±ΡΠΈ Π»ΠΈΠ½ΠΈΠΈ ΡΠ΅ Π²ΠΈ ΡΠ°Π·ΠΊΠ°ΠΆΠ° Π·Π° ΠΊΡΡΡΡΠΎΡΠ°Π½Π°ΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ 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
