Π©Π΅ Π³ΠΎΠ²ΠΎΡΡ Π½Π°ΠΊΡΠ°ΡΠΊΠΎ Π·Π° ΠΊΡΡΡΡΠΎΡΠ°Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ PostgreSQL ΠΈ MySQL, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π·Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ Π·Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΠΊΡΡΡΡΠΎΡΠ°Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅Π·ΠΈ Π΄Π²Π° ΡΡΡΠ²ΡΡΠ° Π½Π° Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ. ΠΡΡΡΡΠΎΡΠ°Π½ΠΎ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈΡΠ°Π½ΠΈΡΠ΅ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ Π½Π°ΡΠΈΡΠ°Ρ ββΡ ΠΎΠΌΠΎΠ³Π΅Π½Π½ΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΠΈ ΡΠΎΠ²Π° Π΅ ΡΠ΄ΠΎΠ±Π΅Π½ ΠΌΠ΅ΡΠΎΠ΄ Π·Π° ΠΌΠΈΠ³ΡΠΈΡΠ°Π½Π΅ ΠΎΡ Π΅Π΄ΠΈΠ½ RDBMS ΡΡΡΠ²ΡΡ ΠΊΡΠΌ Π΄ΡΡΠ³.
ΠΠ°Π·ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ PostgreSQL ΠΈ MySQL ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎ ΡΠ΅ ΡΡΠΈΡΠ°Ρ Π·Π° ΡΠ΅Π»Π°ΡΠΈΠΎΠ½Π½ΠΈ, Π½ΠΎ Ρ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ΅ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Ρ NoSQL Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ. Π’ΡΠΊ ΡΠ΅ ΠΎΠ±ΡΡΠ΄ΠΈΠΌ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ PostgreSQL ΠΈ MySQL ΠΎΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅Π»Π°ΡΠΈΠΎΠ½Π½ΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ.
ΠΡΠΌΠ° Π΄Π° ΠΎΠΏΠΈΡΠ²Π°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΈ Π²ΡΡΡΠ΅ΡΠ½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ, Π° ΡΠ°ΠΌΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈ, Π·Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π° Π·Π° Π½Π°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡΠ²ΡΡΠΈ Π½Π° Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ, ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°, ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΈ ΡΠ»ΡΡΠ°ΠΈ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅.
ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΈ ΡΡΡΠ²ΡΡΠ° Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΈΠ»ΠΈ Π² Π΄Π²ΠΎΠΈΡΠ΅Π½ ΡΠ΅ΠΆΠΈΠΌ, ΠΈΠ»ΠΈ ΡΡΠ΅Π· Π·Π°ΡΠ²ΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π³Π»Π°Π²Π΅Π½ (ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΎΡΠ΅ ΠΊΠ°ΡΠΎ ΠΈΠ·Π΄Π°ΡΠ΅Π», Π³Π»Π°Π²Π΅Π½ ΠΈΠ»ΠΈ Π°ΠΊΡΠΈΠ²Π΅Π½) ΠΈ ΠΏΠΎΠ΄ΡΠΈΠ½Π΅Π½ (Π°Π±ΠΎΠ½Π°ΡΠ΅Π½, ΡΠ΅Π·Π΅ΡΠ²Π΅Π½ ΠΈΠ»ΠΈ ΠΏΠ°ΡΠΈΠ²Π΅Π½). Π¦Π΅Π»ΡΠ° Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡΠ° Π΅ Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈ ΠΊΠΎΠΏΠΈΠ΅ Π² ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π³Π»Π°Π²Π½Π°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΡΡΡΠ°Π½Π°ΡΠ° Π½Π° Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡ. Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ Π΄Π°Π½Π½ΠΈΡΠ΅ ΡΠ΅ ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΡ ΠΎΡ master ΠΊΡΠΌ slave, ΡΠΎΠ΅ΡΡ ΠΎΡ Π°ΠΊΡΠΈΠ²Π΅Π½ ΠΊΡΠΌ ΠΏΠ°ΡΠΈΠ²Π΅Π½, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠ°ΠΌΠΎ Π² Π΅Π΄Π½Π° ΠΏΠΎΡΠΎΠΊΠ°. ΠΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΡΠ΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²Π΅ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ Π² Π΄Π²Π΅ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ, ΡΠ°ΠΊΠ° ΡΠ΅ Π΄Π°Π½Π½ΠΈΡΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΡ ΠΎΡ ΠΏΠΎΠ΄ΡΠΈΠ½Π΅Π½Π°ΡΠ° ΠΊΡΠΌ Π³Π»Π°Π²Π½Π°ΡΠ° Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π°ΠΊΡΠΈΠ²Π½ΠΎ-Π°ΠΊΡΠΈΠ²Π½ΠΎ. ΠΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π°, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΊΠ°ΡΠΊΠ°Π΄Π½ΠΎ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈΡΠ°Π½Π΅, Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²Π° ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΈ ΡΡΡΠ²ΡΡΠ° Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ.ΠΠΊΡΠΈΠ²Π½ΠΎ-Π°ΠΊΡΠΈΠ²Π½Π° ΠΈΠ»ΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎ-ΠΏΠ°ΡΠΈΠ²Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π·Π°Π²ΠΈΡΠΈ ΠΎΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ°, Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΡΠ°ΠΊΠΈΠ²Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π² ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Π²ΡΠ½ΡΠ½ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠ°ΡΠ° ΡΡΡΠ³ΠΎΠ²ΠΈΡ -ΠΈΠ·ΠΊΠ»ΡΡΠ²Π°Π½ΠΈΡ.
ΠΠΏΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½Π° ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΡΠ²ΡΡΠΈ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ. Π‘ΡΡΠ²ΡΡΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ Π΄Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈΡΠ°Π½ΠΈ Π΄Π°Π½Π½ΠΈ ΠΎΡ Π΄ΡΡΠ³ ΡΡΡΠ²ΡΡ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ Π²ΡΠ΅ ΠΎΡΠ΅ Π΄Π° Π·Π°ΠΏΠ°Π·Π²Π° ΠΌΠΎΠΌΠ΅Π½ΡΠ½ΠΈ ΡΠ½ΠΈΠΌΠΊΠΈ Π² ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈΡΠ°Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ. 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
DB ΠΏΠΎΡΡ
3306
5433
IP Π°Π΄ΡΠ΅Ρ
192.168.56.102
192.168.56.106
ΠΡΡΠ²ΠΎ, ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π·Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° pg_chameleon. Π’ΠΎΠ·ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠΌΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ Python 3.6.8, ΠΊΠΎΠΉΡΠΎ ΡΡΠ·Π΄Π°Π²Π° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΡΡΠ΅Π΄Π° ΠΈ Ρ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°.
$> wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz
$> tar -xJf Python-3.6.8.tar.xz
$> cd Python-3.6.8
$> ./configure --enable-optimizations
$> make altinstall
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ Python3.6 Π±ΡΠ΄Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½, ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈΡ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈ, ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ ΠΈ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π΅ Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΡΡΠ΅Π΄Π°. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΠΌΠΎΠ΄ΡΠ»ΡΡ pip ΡΠ΅ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ° Π΄ΠΎ Π½Π°ΠΉ-Π½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° pg_chameleon. ΠΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΡΠΌΠΈΡΠ»Π΅Π½ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Ρ pg_chameleon 2.0.9, Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ Π½Π°ΠΉ-Π½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π΅ 2.0.10. Π’ΠΎΠ²Π° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, Π·Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π±Π΅Π³Π½Π°Ρ Π½ΠΎΠ²ΠΈ Π³ΡΠ΅ΡΠΊΠΈ Π² Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ.
$> python3.6 -m venv venv
$> source venv/bin/activate
(venv) $> pip install pip --upgrade
(venv) $> pip install pg_chameleon==2.0.9
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΠΌΠ΅ pg_chameleon (chameleon Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°) Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° set_configuration_files, Π·Π° Π΄Π° Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΌΠ΅ pg_chameleon ΠΈ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅.
(venv) $> chameleon set_configuration_files
creating directory /root/.pg_chameleon
creating directory /root/.pg_chameleon/configuration/
creating directory /root/.pg_chameleon/logs/
creating directory /root/.pg_chameleon/pid/
copying configuration example in /root/.pg_chameleon/configuration//config-example.yml
Π‘Π΅Π³Π° ΠΏΡΠ°Π²ΠΈΠΌ ΠΊΠΎΠΏΠΈΠ΅ Π½Π° config-example.yml ΠΊΠ°ΡΠΎ default.yml, ΡΠ°ΠΊΠ° ΡΠ΅ Π΄Π° ΡΡΠ°Π½Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΡ ΡΠ°ΠΉΠ» ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅. ΠΡΠΈΠΌΠ΅ΡΠ΅Π½ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΡΠ°ΠΉΠ» Π·Π° ΡΠΎΠ·ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ Π΅ Π΄Π°Π΄Π΅Π½ ΠΏΠΎ-Π΄ΠΎΠ»Ρ.
$> cat default.yml
---
#global settings
pid_dir: '~/.pg_chameleon/pid/'
log_dir: '~/.pg_chameleon/logs/'
log_dest: file
log_level: info
log_days_keep: 10
rollbar_key: ''
rollbar_env: ''
# type_override allows the user to override the default type conversion into a different one.
type_override:
"tinyint(1)":
override_to: boolean
override_tables:
- "*"
#postgres destination connection
pg_conn:
host: "192.168.56.106"
port: "5433"
user: "usr_replica"
password: "pass123"
database: "db_replica"
charset: "utf8"
sources:
mysql:
db_conn:
host: "192.168.56.102"
port: "3306"
user: "usr_replica"
password: "pass123"
charset: 'utf8'
connect_timeout: 10
schema_mappings:
world_x: pgworld_x
limit_tables:
# - delphis_mediterranea.foo
skip_tables:
# - delphis_mediterranea.bar
grant_select_to:
- usr_readonly
lock_timeout: "120s"
my_server_id: 100
replica_batch_size: 10000
replay_max_rows: 10000
batch_retention: '1 day'
copy_max_memory: "300M"
copy_mode: 'file'
out_dir: /tmp
sleep_loop: 1
on_error_replay: continue
on_error_read: continue
auto_maintenance: "disabled"
gtid_enable: No
type: mysql
skip_events:
insert:
- delphis_mediterranea.foo #skips inserts on the table delphis_mediterranea.foo
delete:
- delphis_mediterranea #skips deletes on schema delphis_mediterranea
update:
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΡ ΡΠ°ΠΉΠ» Π² ΡΠΎΠ·ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ΅Π½ pg_chameleon ΡΠ°ΠΉΠ» Ρ Π½Π΅Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, Π·Π° Π΄Π° ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π° Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π½Π°ΡΠ° ΠΈ ΡΠ΅Π»Π΅Π²Π°ΡΠ° ΡΡΠ΅Π΄Π°, Π° ΠΏΠΎ-Π΄ΠΎΠ»Ρ Π΅ ΠΏΡΠ΅Π³Π»Π΅Π΄ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΠΈ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΡΠ°ΠΉΠ».
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΡ ΡΠ°ΠΉΠ» default.yml ΠΈΠΌΠ° ΡΠ°Π·Π΄Π΅Π» Ρ Π³Π»ΠΎΠ±Π°Π»Π½ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ (Π³Π»ΠΎΠ±Π°Π»Π½ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ), ΠΊΡΠ΄Π΅ΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΊΠ°ΡΠΎ ΠΌΠ΅ΡΡΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ°ΠΉΠ»Π° Π·Π° Π·Π°ΠΊΠ»ΡΡΠ²Π°Π½Π΅, ΠΌΠ΅ΡΡΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΠΏΠ΅ΡΠΈΠΎΠ΄Π° Π·Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ Ρ.Π½. Π‘Π»Π΅Π΄Π²Π° ΡΠ΅ΠΊΡΠΈΡΡΠ° Π·Π° ΠΎΡΠΌΡΠ½Π° Π½Π° ΡΠΈΠΏΠ° , ΠΊΡΠ΄Π΅ΡΠΎ Π·Π°Π΄Π°Π΄Π΅Π½ΠΈΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° Π·Π°ΠΌΡΠ½Π° Π½Π° ΡΠΈΠΏΠΎΠ²Π΅ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ. ΠΡΠΈΠΌΠ΅ΡΡΡ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Π·Π° ΠΎΡΠΌΡΠ½Π° Π½Π° ΡΠΈΠΏΠ°, ΠΊΠΎΠ΅ΡΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π° tinyint(1) Π² Π±ΡΠ»Π΅Π²ΠΎ. Π ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ ΡΠ°Π·Π΄Π΅Π» ΡΡΠΎΡΠ½ΡΠ²Π°ΠΌΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈΡΠ΅ Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ ΠΊΡΠΌ ΡΠ΅Π»Π΅Π²Π°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ. Π Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΡΠΎΠ²Π° Π΅ PostgreSQL Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, ΠΎΠ·Π½Π°ΡΠ΅Π½Π° ΠΊΠ°ΡΠΎ pg_conn. Π ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ ΡΠ°Π·Π΄Π΅Π» Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΡΠ²Π°ΠΌΠ΅ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ, ΡΠΎΠ΅ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° Π²ΡΡΠ·ΠΊΠ°ΡΠ° Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π½Π°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, ΡΡ Π΅ΠΌΠ°ΡΠ° Π·Π° ΠΊΠ°ΡΡΠΎΠ³ΡΠ°ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π½Π°ΡΠ° ΠΈ ΡΠ΅Π»Π΅Π²Π°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, ΡΠ°Π±Π»ΠΈΡΠΈ, ΠΊΠΎΠΈΡΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΏΡΡΠΊΠ°Ρ, Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΠΈΠ·ΡΠ°ΠΊΠ²Π°Π½Π΅, ΠΏΠ°ΠΌΠ΅Ρ, ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ°. ΠΠΌΠ°ΠΉΡΠ΅ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ βΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈβ Π΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½ΠΎ ΡΠΈΡΠ»ΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΠΊΡΠΌ Π΅Π΄Π½Π° ΠΈ ΡΡΡΠ° ΡΠ΅Π», Π·Π° Π΄Π° Π½Π°ΡΡΡΠΎΠΈΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΡΠΌ Π΅Π΄Π½ΠΎ.
ΠΠ°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ world_x Π² ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΡΠ΄ΡΡΠΆΠ° 4 ΡΠ°Π±Π»ΠΈΡΠΈ Ρ ΡΠ΅Π΄ΠΎΠ²Π΅, ΠΊΠΎΠΈΡΠΎ MySQL ΠΎΠ±ΡΠ½ΠΎΡΡΡΠ° ΠΏΡΠ΅Π΄Π»Π°Π³Π° Π·Π° ΠΏΡΠΈΠΌΠ΅ΡΠ°. ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΡΠ΅Π³Π»ΠΈ
Π‘ΡΠ·Π΄Π°Π²Π° ΡΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» ΡΡΡ ΡΡΡΠΎΡΠΎ ΠΈΠΌΠ΅ usr_replica Π² Π±Π°Π·ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ MySQL ΠΈ PostgreSQL. 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 (Ρ Π°ΠΌΠ΅Π»Π΅ΠΎΠ½) ΠΏΠΎΠ΄Π³ΠΎΡΠ²ΡΡ ΡΡΠ΅Π΄Π°ΡΠ°, Π΄ΠΎΠ±Π°Π²ΡΡ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊΠ° ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Ρ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠ°. ΠΡΠ³ΡΠΌΠ΅Π½ΡΡΡ create_replica_schema Π½Π° pg_chameleon ΡΡΠ·Π΄Π°Π²Π° ΡΡ Π΅ΠΌΠ° ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ (sch_chameleon) ΠΈ ΡΡ Π΅ΠΌΠ° Π·Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ (pgworld_x) Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ PostgreSQL, ΠΊΠ°ΠΊΡΠΎ ΠΊΠ°Π·Π°Ρ ΠΌΠ΅. ΠΡΠ³ΡΠΌΠ΅Π½ΡΡΡ add_source Π΄ΠΎΠ±Π°Π²Ρ ΠΈΠ·Ρ ΠΎΠ΄Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΊΡΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΡΡΠ΅Π· ΡΠ΅ΡΠ΅Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΡΠ°ΠΉΠ» (default.yml), ΠΊΠΎΠΉΡΠΎ Π² Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ Π΅ mysql, Π° init_replica ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΡΠ°ΠΉΠ».
$> chameleon create_replica_schema --debug
$> chameleon add_source --config default --source mysql --debug
$> chameleon init_replica --config default --source mysql --debug
Π Π΅Π·ΡΠ»ΡΠ°ΡΡΡ ΠΎΡ ΡΠ΅Π·ΠΈ ΡΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΡΡΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Π²Π° ΡΠ΅Ρ Π½ΠΈΡ ΡΡΠΏΠ΅Ρ . ΠΡΠΈΡΠΊΠΈ ΠΏΠΎΠ²ΡΠ΅Π΄ΠΈ ΠΈΠ»ΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ½ΠΈ Π³ΡΠ΅ΡΠΊΠΈ ΡΠ° ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈ Π² ΠΏΡΠΎΡΡΠΈ ΠΈ ΡΠ°Π·Π±ΠΈΡΠ°Π΅ΠΌΠΈ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Ρ ΡΡΠ²Π΅ΡΠΈ ΠΊΠ°ΠΊ Π΄Π° ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅.
ΠΠ°ΠΊΡΠ°Ρ Π·Π°ΠΏΠΎΡΠ²Π°ΠΌΠ΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΡΡΡ start_replica ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π·Π° ΡΡΠΏΠ΅Ρ .
$> chameleon start_replica --config default --source mysql
output: Starting the replica process for source mysql
Π‘ΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π·Π°ΡΠ²Π΅Π½ΠΎ Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° show_status, Π° Π³ΡΠ΅ΡΠΊΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΡΠ΅Π³Π»Π΅Π΄Π°Π½ΠΈ Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° show_errors.
ΠΠ°ΠΊΡΠΎ Π²Π΅ΡΠ΅ ΠΊΠ°Π·Π°Ρ ΠΌΠ΅, Π΄Π΅ΠΌΠΎΠ½ΠΈΡΠ΅ ΡΠΏΡΠ°Π²Π»ΡΠ²Π°Ρ Π²ΡΡΠΊΠ° ΡΡΠ½ΠΊΡΠΈΡ Π·Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ. ΠΠ° Π΄Π° Π³ΠΈ Π²ΠΈΠ΄ΠΈΡΠ΅, Π½Π°ΠΏΡΠ°Π²Π΅ΡΠ΅ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ ΠΊΡΠΌ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Ρ ΠΏΡΠΎΡΠ΅ΡΠΈ Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Linux ps, ΠΊΠ°ΠΊΡΠΎ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΏΠΎ-Π΄ΠΎΠ»Ρ.
Π Π΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡΠ° Π½Π΅ ΡΠ΅ ΡΡΠΈΡΠ° Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π°, Π΄ΠΎΠΊΠ°ΡΠΎ Π½Π΅ Ρ ΡΠ΅ΡΡΠ²Π°ΠΌΠ΅ Π² ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅, ΠΊΠ°ΠΊΡΠΎ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΏΠΎ-Π΄ΠΎΠ»Ρ. Π‘ΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΡΠ°Π±Π»ΠΈΡΠ°, Π²ΠΌΡΠΊΠ²Π°ΠΌΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π·Π°ΠΏΠΈΡΠ° Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π½Π° MySQL ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΠΌΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° sync_tables Π² pg_chameleon, Π·Π° Π΄Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π΄Π΅ΠΌΠΎΠ½ΠΈΡΠ΅ ΠΈ Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΡΡΡ Π·Π°ΠΏΠΈΡΠΈΡΠ΅ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π½Π° PostgreSQL.
mysql> create table t1 (n1 int primary key, n2 varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t1 values (1,'one');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1 values (2,'two');
Query OK, 1 row affected (0.00 sec)
$> chameleon sync_tables --tables world_x.t1 --config default --source mysql
Sync tables process for source mysql started.
ΠΠ° Π΄Π° ΠΏΠΎΡΠ²ΡΡΠ΄ΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ ΡΠ΅ΡΡΠ°, ΠΏΡΠ°Π²ΠΈΠΌ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ ΠΊΡΠΌ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΎΡ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ Π½Π° PostgreSQL ΠΈ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΡΠ΅Π΄ΠΎΠ²Π΅ΡΠ΅.
$> psql -p 5433 -U usr_replica -d db_replica -c "select * from pgworld_x.t1";
n1 | n2
----+-------
1 | one
2 | two
ΠΠΊΠΎ ΠΌΠΈΠ³ΡΠΈΡΠ°ΠΌΠ΅, ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ pg_chameleon ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΊΡΠ°ΡΡ Π½Π° ΠΌΠΈΠ³ΡΠ°ΡΠΈΡΡΠ°. ΠΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈ, ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΠΌΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΠ»ΠΈ, ΡΠ΅ ΡΠ΅Π΄ΠΎΠ²Π΅ΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Π»Π΅Π²ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ ΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈΡΠ°Π½ΠΈ, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ ΡΠΏΡΠ΅ΡΠ½Π°ΡΠΎ ΠΌΠΈΠ³ΡΠΈΡΠ°Π½Π° PostgreSQL Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Π±Π΅Π· ΠΏΡΠ΅ΠΏΡΠ°ΡΠΊΠΈ ΠΊΡΠΌ ΠΈΠ·Ρ ΠΎΠ΄Π½Π°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈΠ»ΠΈ ΡΡ Π΅ΠΌΠ° Π·Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ (sch_chameleon).
$> chameleon stop_replica --config default --source mysql
$> chameleon detach_replica --config default --source mysql --debug
ΠΠΎ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΡΡΠΈΠ΅ΡΠ΅ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈ ΡΡ Π΅ΠΌΠ°ΡΠ° Π·Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΡΡΡ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ.
$> chameleon drop_source --config default --source mysql --debug
$> chameleon drop_replica_schema --config default --source mysql --debug
ΠΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π° Π½Π° pg_chameleon
ΠΠ΅ΡΠ½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ.
Π£Π΄ΠΎΠ±Π½ΠΎ ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° Π½Π΅ΠΈΠ·ΠΏΡΠ°Π²Π½ΠΎΡΡΠΈ ΠΈ ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΈ Ρ ΡΡΠ½ΠΈ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ Π·Π° Π³ΡΠ΅ΡΠΊΠΈ.
ΠΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΡΡ ΠΊΡΠΌ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡΠ° ΡΠ»Π΅Π΄ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ, Π±Π΅Π· Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Ρ ΠΎΡΡΠ°Π½Π°Π»Π°ΡΠ° ΡΠ°ΡΡ ΠΎΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°.
ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΡΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΈΠ·Ρ
ΠΎΠ΄Π½ΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ Π·Π° Π΅Π΄Π½Π° ΡΠ΅Π»Π΅Π²Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ ΡΠΎΠ²Π° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ, Π°ΠΊΠΎ ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π°ΡΠ΅ Π΄Π°Π½Π½ΠΈ ΠΎΡ Π΅Π΄Π½Π° ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ MySQL Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ Π² Π΅Π΄Π½Π° PostgreSQL Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ.
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ Π΄Π° Π½Π΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈΡΠ°ΡΠ΅ ΠΈΠ·Π±ΡΠ°Π½ΠΈ ΡΠ°Π±Π»ΠΈΡΠΈ.
ΠΠ΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈ Π½Π° pg_chameleon
ΠΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΠ΅ ΡΠ°ΠΌΠΎ Ρ MySQL 5.5 ΠΈ ΠΏΠΎ-Π½ΠΎΠ²Π° ΠΊΠ°ΡΠΎ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ ΠΈ PostgreSQL 9.5 ΠΈ ΠΏΠΎ-Π½ΠΎΠ²Π° ΠΊΠ°ΡΠΎ ΡΠ΅Π»Π΅Π²Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ.
ΠΡΡΠΊΠ° ΡΠ°Π±Π»ΠΈΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠΌΠ° ΠΏΡΡΠ²ΠΈΡΠ΅Π½ ΠΈΠ»ΠΈ ΡΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΊΠ»ΡΡ, Π² ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ ΡΠ°Π±Π»ΠΈΡΠΈΡΠ΅ ΡΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Ρ Π² ΠΏΡΠΎΡΠ΅ΡΠ° init_replica, Π½ΠΎ Π½Π΅ ΡΠ΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈΡΠ°Ρ.
ΠΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ - ΡΠ°ΠΌΠΎ ΠΎΡ MySQL ΠΊΡΠΌ PostgreSQL. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ Π΅ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡ ΡΠ°ΠΌΠΎ Π·Π° Π°ΠΊΡΠΈΠ²Π½ΠΎ-ΠΏΠ°ΡΠΈΠ²Π½Π°ΡΠ° ΡΡ
Π΅ΠΌΠ°.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ°ΠΌΠΎ MySQL Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π·Π° PostgreSQL Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΊΠ°ΡΠΎ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π΅ ΡΠ°ΠΌΠΎ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»Π½Π° ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π° (Π½Π°ΡΡΠ΅ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅
ΠΠ±ΡΠΎ Π·Π° pg_chameleon
ΠΠ΅ΡΠΎΠ΄ΡΡ Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ Π² pg_chameleon Π΅ ΡΡΠ΄Π΅ΡΠ΅Π½ Π·Π° ΠΌΠΈΠ³ΡΠΈΡΠ°Π½Π΅ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ MySQL ΠΊΡΠΌ PostgreSQL. ΠΠΎΠ»Π΅ΠΌΠΈΡΡ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠΊ Π΅, ΡΠ΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡΠ° Π΅ ΡΠ°ΠΌΠΎ Π΅Π΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½Π°, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠΈΡΠ΅ ΠΏΠΎ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ Π΅Π΄Π²Π° Π»ΠΈ ΡΠ΅ ΠΈΡΠΊΠ°Ρ Π΄Π° Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π° Π½Π΅ΡΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎ ΠΎΡ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ. ΠΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡΡ Ρ Π΅Π΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½Π°ΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ΅ΡΠ΅Π½ Ρ Π΄ΡΡΠ³ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ - SymmetricDS.
ΠΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ Π² ΠΎΡΠΈΡΠΈΠ°Π»Π½Π°ΡΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ
ΠΡΠ΅Π³Π»Π΅Π΄ Π½Π° SymmetricDS
SymmetricDS Π΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈΡΠ° Π²ΡΡΠΊΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΊΡΠΌ Π²ΡΡΠΊΠ° Π΄ΡΡΠ³Π° ΠΎΠ±ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ: Oracle, MongoDB, PostgreSQL, MySQL, SQL Server, MariaDB, DB2, Sybase, Greenplum, Informix, H2, Firebird ΠΈ Π΄ΡΡΠ³ΠΈ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈ Π½Π° ΠΎΠ±Π»Π°ΡΠ½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Redshift, ΠΈ Azure ΠΈ Π΄Ρ. ΠΠ°Π»ΠΈΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ: ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π³Π»Π°Π²Π½ΠΈ, ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π° ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ, ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈ Π΄ΡΡΠ³ΠΈ. Π’ΠΎΠ²Π° Π΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π½Π° Java ΠΈ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ JRE ΠΈΠ»ΠΈ JDK (Π²Π΅ΡΡΠΈΡ 8.0 ΠΈΠ»ΠΈ ΠΏΠΎ-Π½ΠΎΠ²Π°). Π’ΡΠΊ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π·Π°ΠΏΠΈΡΠ²Π°ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² Π΄Π°Π½Π½ΠΈΡΠ΅ Π½Π° ΡΡΠΈΠ³Π΅ΡΠΈΡΠ΅ Π² ΠΈΠ·Ρ ΠΎΠ΄Π½Π°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ Π΄Π° Π³ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ°ΡΠ΅ ΠΊΡΠΌ ΡΡΠΎΡΠ²Π΅ΡΠ½Π°ΡΠ° ΡΠ΅Π»Π΅Π²Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΊΠ°ΡΠΎ ΠΏΠ°ΡΡΠΈΠ΄ΠΈ.
ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° SymmetricDS
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡΡ Π΅ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌ ΠΎΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ°, ΠΊΠΎΠ΅ΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ Π΄Π²Π΅ ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΎΠ±ΠΌΠ΅Π½ΡΡ Π΄Π°Π½Π½ΠΈ.
Π Π΅Π»Π°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΡΠ΅ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΠ°Ρ ΡΡΠ΅Π· Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π² Π΄Π°Π½Π½ΠΈΡΠ΅, Π° Π±Π°Π·ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ, Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
ΠΠ²ΡΠΏΠΎΡΠΎΡΠ½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° Π½Π°ΡΠΈΡΠΊΠ°Π½Π΅ ΠΈ ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅, Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° Π½Π°Π±ΠΎΡ ΠΎΡ ΠΏΡΠ°Π²ΠΈΠ»Π°.
ΠΡΠ΅Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π· Π·Π°ΡΠΈΡΠ΅Π½ΠΈ ΠΌΡΠ΅ΠΆΠΈ ΠΈ ΠΌΡΠ΅ΠΆΠΈ Ρ Π½ΠΈΡΠΊΠ° ΡΠ΅ΡΡΠΎΡΠ½Π° Π»Π΅Π½ΡΠ°.
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ±Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° Π²ΡΠ·Π»ΠΈ ΡΠ»Π΅Π΄ ΠΏΠΎΠ²ΡΠ΅Π΄Π° ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠ°Π·ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΈ.
Π‘ΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ Ρ ΠΎΠ±Π»Π°ΠΊ ΠΈ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΈ API Π·Π° ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ.
ΠΡΠΈΠΌΠ΅Ρ
SymmetricDS ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ ΠΏΠΎ Π΅Π΄ΠΈΠ½ ΠΎΡ Π΄Π²Π°ΡΠ° Π½Π°ΡΠΈΠ½Π°:
ΠΠ»Π°Π²Π΅Π½ (ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΠΊΠΈ) Π²ΡΠ·Π΅Π», ΠΊΠΎΠΉΡΠΎ ΡΠ΅Π½ΡΡΠ°Π»Π½ΠΎ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½ΠΈΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡΠ° Π½Π° Π΄Π°Π½Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²Π° ΠΏΠΎΠ΄ΡΠΈΠ½Π΅Π½ΠΈ (Π΄ΡΡΠ΅ΡΠ½ΠΈ) Π²ΡΠ·Π΅Π»Π°, Π° ΠΎΠ±ΠΌΠ΅Π½ΡΡ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ΅ΡΠ½ΠΈΡΠ΅ Π²ΡΠ·Π»ΠΈ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠ°ΠΌΠΎ ΡΡΠ΅Π· ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΠΊΠΈΡ.
ΠΠΊΡΠΈΠ²Π΅Π½ Π²ΡΠ·Π΅Π» (Π²ΡΠ·Π΅Π» 1) ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠΈΡΠ° Π·Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ Ρ Π΄ΡΡΠ³ Π°ΠΊΡΠΈΠ²Π΅Π½ Π²ΡΠ·Π΅Π» (Π²ΡΠ·Π΅Π» 2) Π±Π΅Π· ΠΏΠΎΡΡΠ΅Π΄Π½ΠΈΠΊ.
Π Π² Π΄Π²Π°ΡΠ° Π²Π°ΡΠΈΠ°Π½ΡΠ° ΠΎΠ±ΠΌΠ΅Π½ΡΡ Π½Π° Π΄Π°Π½Π½ΠΈ ΡΠ΅ ΠΎΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΡΡΠ΅Π· Push ΠΈ Pull. Π ΡΠΎΠ·ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π°ΠΊΡΠΈΠ²Π½ΠΎ-Π°ΠΊΡΠΈΠ²Π½ΠΎ. Π’Π²ΡΡΠ΄Π΅ Π΄ΡΠ»Π³ΠΎ Π΅ Π΄Π° ΠΎΠΏΠΈΡΠ²Π°ΠΌ ΡΡΠ»Π°ΡΠ° Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΡΠΎΡΡΠ΅ΡΠ΅
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° SymmetricDS Π΅ Π»Π΅ΡΠ½ΠΎ: ΠΈΠ·ΡΠ΅Π³Π»Π΅ΡΠ΅ zip ΡΠ°ΠΉΠ»Π° Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄
ΠΠΎΠ΄Π΅Ρ
vm1
vm2
Π²Π΅ΡΡΠΈΡ Π½Π° ΠΠ‘
CentOS Linux 7.6 x86_64
CentOS Linux 7.6 x86_64
ΠΠ΅ΡΡΠΈΡ Π½Π° ΡΡΡΠ²ΡΡ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ
MySQL 5.7.26
PostgreSQL 10.5
DB ΠΏΠΎΡΡ
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
ΠΊΠΎΡΠΏ-000
ΠΌΠ°Π³Π°Π·ΠΈΠ½-001
Π’ΡΠΊ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ SymmetricDS Π² /usr/local/symmetric-server-3.9.20 ΠΈ ΡΠ°ΠΌ ΡΠ΅ ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠΎΠ΄Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. ΠΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°ΠΌΠ΅ ΡΠ΅ ΠΎΡ ΠΏΠΎΠ΄Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈΡΠ΅ samples ΠΈ engines. ΠΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° Ρ ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΡΡΠ΄ΡΡΠΆΠ° ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π½Π° Π²ΡΠ·Π΅Π», ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΈ SQL ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ Π·Π° Π±ΡΡΠ·ΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡΡΠ°.
Π Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° Ρ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ ΡΡΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ°ΠΉΠ»Π° ΡΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π½Π° Π²ΡΠ·Π΅Π»Π° - ΠΈΠΌΠ΅ΡΠΎ ΠΏΠΎΠΊΠ°Π·Π²Π° Π΅ΡΡΠ΅ΡΡΠ²ΠΎΡΠΎ Π½Π° Π²ΡΠ·Π΅Π»Π° Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΡ Π΅ΠΌΠ°.
corp-000.properties
store-001.properties
store-002.properties
SymmetricDS ΠΈΠΌΠ° Π²ΡΠΈΡΠΊΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° ΠΎΡΠ½ΠΎΠ²Π½Π° ΡΡ Π΅ΠΌΠ° Ρ 3 Π²ΡΠ·Π΅Π»Π° (ΠΎΠΏΡΠΈΡ 1) ΠΈ ΡΡΡΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π° ΡΡ Π΅ΠΌΠ° Ρ 2 Π²ΡΠ·Π΅Π»Π° (ΠΎΠΏΡΠΈΡ 2). ΠΠΎΠΏΠΈΡΠ°ΠΉΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΡΠ°ΠΉΠ» ΠΎΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° Π·Π° ΠΎΠ±ΡΠ°Π·ΡΠΈ Π² Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»ΠΈΡΠ΅ Π½Π° Ρ ΠΎΡΡΠ° 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
Π’ΠΎΠ·ΠΈ Π²ΡΠ·Π΅Π» ΡΠ΅ Π½Π°ΡΠΈΡΠ° corp-000 Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° SymmetricDS ΠΈ Π²ΡΡΠ·ΠΊΠ°ΡΠ° Ρ Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΡΠ΅ ΡΠΏΡΠ°Π²Π»ΡΠ²Π° ΠΎΡ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° 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 server ΠΈ Π½Π° Π΄Π²Π°ΡΠ° Π²ΡΠ·Π΅Π»Π°, ΠΊΠ°ΠΊΡΠΎ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΏΠΎ-Π΄ΠΎΠ»Ρ.
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 ΡΠ°Π±Π»ΠΈΡΠΈ ΠΎΡ Π΄Π²Π΅ΡΠ΅ ΡΡΡΠ°Π½ΠΈ, ΡΠ΅ Π²ΠΈΠ΄ΠΈΠΌ, ΡΠ΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡΠ° Π΅ Π±ΠΈΠ»Π° ΡΡΠΏΠ΅ΡΠ½Π°. ΠΠ»ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΠΈΡΠ΅ bootstrap Π΄ΠΎ store-001 ΠΎΡ corp-000 ΡΡΡ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°.
vm1$> ./symadmin --engine corp-000 reload-node 001
Π ΡΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ Π½ΠΎΠ² Π·Π°ΠΏΠΈΡ ΡΠ΅ Π²ΠΌΡΠΊΠ²Π° Π² ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° Ρ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ Π² 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 ΠΈΠ»ΠΈ Π² ΠΎΠ±Π»Π°ΠΊΠ°.
ΠΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΎΠΏΡΠΈΠΌΠ°Π»Π½Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΠΈΠ»ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Ρ
ΠΈΠ»ΡΠ΄ΠΈ Π·Π° Π»Π΅ΡΠ½ΠΎ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈΡΠ°Π½Π΅.
ΠΠ»Π°ΡΠ΅Π½Π° Π²Π΅ΡΡΠΈΡ Ρ GUI ΠΈ ΠΎΡΠ»ΠΈΡΠ½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°.
ΠΠ΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈ Π½Π° SymmetricDS
Π’ΡΡΠ±Π²Π° ΡΡΡΠ½ΠΎ Π΄Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° ΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΡΠ° Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΈΡ ΡΠ΅Π΄ ΡΡΠ΅Π· SQL ΠΈΠ·ΡΠ°Π·ΠΈ, Π·Π° Π΄Π° Π·Π°ΡΠ΅Π΄ΠΈΡΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠΆΠ½ΠΈΡΠ΅ ΡΠ°Π±Π»ΠΈΡΠΈ, ΠΊΠΎΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π½Π΅ΡΠ΄ΠΎΠ±Π½ΠΎ.
ΠΠ°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π±Π»ΠΈΡΠΈ Π·Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π΄ΠΎΡΠ°Π΄Π½ΠΎ, ΠΎΡΠ²Π΅Π½ Π°ΠΊΠΎ Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° SQL ΠΈΠ·ΡΠ°Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° ΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΡΠ° Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ.
Π ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈΠΌΠ° ΡΠ²ΡΡΠ΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈ ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΡΠΈΡΡΠΈΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΡΠ°ΠΉΠ», ΡΠ°ΠΊΠ° ΡΠ΅ Π΄Π° Π½Π΅ Π·Π°Π΅ΠΌΠ° ΡΠ²ΡΡΠ΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΡΡΡΠΎ.
Π Π΅Π·ΡΠΌΠ΅ Π½Π° SymmetricDS
SymmetricDS Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π½Π°ΡΡΡΠΎΠΈΡΠ΅ Π΄Π²ΡΠΏΠΎΡΠΎΡΠ½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²Π°, ΡΡΠΈ ΠΈΠ»ΠΈ Π΄ΠΎΡΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Ρ ΠΈΠ»ΡΠ΄ΠΈ Π²ΡΠ·Π΅Π»Π°, Π·Π° Π΄Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈΡΠ°ΡΠ΅ ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. Π’ΠΎΠ²Π° Π΅ ΡΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΠΊΠΎΠΉΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°Π΄Π°ΡΠΈ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»Π½ΠΎ, ΠΊΠ°ΡΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΡΠ»Π΅Π΄ Π΄ΡΠ»ΡΠ³ ΠΏΡΠ΅ΡΡΠΎΠΉ Π½Π° Π²ΡΠ·Π΅Π», ΡΠΈΠ³ΡΡΠ½Π° ΠΈ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½Π° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΠ·Π»ΠΈ ΠΏΡΠ΅Π· HTTPS, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΈ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° Π½Π°Π±ΠΎΡ ΠΎΡ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΈ Π΄Ρ. SymmetricDS ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Π³ΠΎΠ»ΡΠΌΠΎ ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·ΠΈΠ΅ ΠΎΡ ΡΡΠ΅Π½Π°ΡΠΈΠΈ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ, Π½Π°Π΄Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅, ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅, ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ ΠΈ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΈ.
ΠΡΠΈΠΌΠ΅ΡΡΡ Π΅ Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΈΡ
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com