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