Π― Π² ΠΎΠ±ΡΠΈΡ ΡΠ΅ΡΡΠ°Ρ ΡΠ°ΡΡΠΊΠ°ΠΆΡ ΠΎ ΠΏΠ΅ΡΠ΅ΠΊΡΠ΅ΡΡΠ½ΠΎΠΉ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρ 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
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 Π΅ΡΡΡ ΡΠ°Π·Π΄Π΅Π» Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² (global settings), Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΠ°ΠΊΠΈΠΌΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌΠΈ, ΠΊΠ°ΠΊ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΎΠ², ΠΏΠ΅ΡΠΈΠΎΠ΄ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π»ΠΎΠ³ΠΎΠ² ΠΈ Ρ. Π΄. ΠΠ°Π»ΡΡΠ΅ ΠΈΠ΄Π΅Ρ ΡΠ°Π·Π΄Π΅Π» ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ² (type override), Π³Π΄Π΅ ΡΠΊΠ°Π·Π°Π½ Π½Π°Π±ΠΎΡ ΠΏΡΠ°Π²ΠΈΠ» Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ² Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ. Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΈΠΏΠ°, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ tinyint(1) Π² Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π΄Π΅ΡΠ°Π»ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊ ΡΠ΅Π»Π΅Π²ΠΎΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ . Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ PostgreSQL, ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½Π½Π°Ρ ΠΊΠ°ΠΊ pg_conn. Π ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π΄Π°Π½Π½ΡΠ΅ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ°, ΡΠΎ Π΅ΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ , ΡΡ Π΅ΠΌΡ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ ΡΠ΅Π»Π΅Π²ΠΎΠΉ Π±Π°Π· Π΄Π°Π½Π½ΡΡ , ΡΠ°Π±Π»ΠΈΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ, Π²ΡΠ΅ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, ΠΏΠ°ΠΌΡΡΡ, ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΠ°ΠΊΠ΅ΡΠ°. ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ Β«sourcesΒ» ΡΠΊΠ°Π·Π°Π½ΠΎ Π²ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠΌ ΡΠΈΡΠ»Π΅, ΡΠΎ Π΅ΡΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΡΡ ΠΎΠ΄Π½ΡΡ Π±Π°Π· Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ΅Π»Π΅Π²ΠΎΠΉ, ΡΡΠΎΠ±Ρ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Β«ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡΒ».
ΠΠ°Π·Π° Π΄Π°Π½Π½ΡΡ
world_x Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ 4 ΡΠ°Π±Π»ΠΈΡΡ ΡΠΎ ΡΡΡΠΎΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²ΠΎ MySQL ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°. ΠΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³ΡΡΠ·ΠΈΡΡ
Π Π±Π°Π·Π°Ρ Π΄Π°Π½Π½ΡΡ 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: 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
ΠΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ, ΡΠΎ Π΅ΡΡΡ Π΄Π²Π΅ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·Π½ΡΡ
ΠΠ ΠΌΠΎΠ³ΡΡ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡΡΡΡ Π΄Π°Π½Π½ΡΠΌΠΈ.
Π Π΅Π»ΡΡΠΈΠΎΠ½Π½ΡΠ΅ ΠΠ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΡΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π·Π°ΠΏΠΈΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
, Π° ΠΠ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ
ΡΠΈΡΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ².
ΠΠ²ΡΡΡΠΎΡΠΎΠ½Π½ΡΡ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Push ΠΈ Pull Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π½Π°Π±ΠΎΡΠ° ΠΏΡΠ°Π²ΠΈΠ».
ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° Π΄Π°Π½Π½ΡΡ
Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΏΠΎ Π·Π°ΡΠΈΡΠ΅Π½Π½ΡΠΌ ΡΠ΅ΡΡΠΌ ΠΈ ΡΠ΅ΡΡΠΌ Ρ Π½ΠΈΠ·ΠΊΠΎΠΉ ΠΏΡΠΎΠΏΡΡΠΊΠ½ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡΡ.
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΈ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΡΠ°Π±ΠΎΡΡ ΡΠ·Π»ΠΎΠ² ΠΏΠΎΡΠ»Π΅ ΡΠ±ΠΎΡ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ².
Π‘ΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ Ρ ΠΎΠ±Π»Π°ΠΊΠΎΠΌ ΠΈ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠ΅ 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
ΠΠΎΡΡ ΠΠ
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 Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ Π»ΡΠ±ΡΠΌΠΈ Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ , ΠΏΠΎΡΡΠΎΠΌΡ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΠ°ΠΌΡΡ ΡΠ°Π·Π½ΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π², Π²ΠΊΠ»ΡΡΠ°Ρ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ, ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ Π½Π° Π½ΠΎΠ²ΡΡ Π²Π΅ΡΡΠΈΡ, ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅, ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΡ ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ Π½Π° ΡΠ°Π·Π½ΡΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°Ρ .
ΠΡΠΈΠΌΠ΅Ρ ΡΠΎΠ·Π΄Π°Π½ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com