ΠΠ΅ Π½Π°Π²Π΅Π΄Π°ΠΌ Π²ΠΊΡΡΡΠ΅Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΏΠΎΠΌΠ΅ΡΡ PostgreSQL ΠΈ MySQL, ΠΊΠ°ΠΊΠΎ ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΠΏΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ Π²ΠΊΡΡΡΠ΅Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΏΠΎΠΌΠ΅ΡΡ Π΄Π²Π°ΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠΈ Π½Π° Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠΎΠΎΠ±ΠΈΡΠ°Π΅Π½ΠΎ, Π²ΠΊΡΡΡΠ΅Π½ΠΎ ΡΠ΅ΠΏΠ»ΠΈΡΠΈΡΠ°Π½ΠΈΡΠ΅ Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΡΠ΅ Π½Π°ΡΠ΅ΠΊΡΠ²Π°Π°Ρ Ρ ΠΎΠΌΠΎΠ³Π΅Π½ΠΈ ΠΈ ΡΠΎΠ° Π΅ ΠΏΡΠΈΠ³ΠΎΠ΄Π΅Π½ ΠΌΠ΅ΡΠΎΠ΄ Π·Π° ΠΏΡΠ΅ΠΌΠ΅ΡΡΡΠ²Π°ΡΠ΅ ΠΎΠ΄ Π΅Π΄Π΅Π½ ΡΠ΅ΡΠ²Π΅Ρ RDBMS Π½Π° Π΄ΡΡΠ³.
ΠΠ°Π·ΠΈΡΠ΅ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ PostgreSQL ΠΈ MySQL Π³Π΅Π½Π΅ΡΠ°Π»Π½ΠΎ ΡΠ΅ ΡΠΌΠ΅ΡΠ°Π°Ρ Π·Π° ΡΠ΅Π»Π°ΡΠΈΠΎΠ½ΠΈ, Π½ΠΎ ΡΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ Π΅ΠΊΡΡΠ΅Π½Π·ΠΈΠΈ ΡΠΈΠ΅ Π½ΡΠ΄Π°Ρ NoSQL ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ. ΠΠ²Π΄Π΅ ΡΠ΅ ΡΠ°Π·Π³ΠΎΠ²Π°ΡΠ°ΠΌΠ΅ Π·Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΏΠΎΠΌΠ΅ΡΡ PostgreSQL ΠΈ MySQL ΠΎΠ΄ ΡΠ΅Π»Π°ΡΠΈΠΎΠ½Π° DBMS ΠΏΠ΅ΡΡΠΏΠ΅ΠΊΡΠΈΠ²Π°.
ΠΠ΅ΠΌΠ° Π΄Π° ΡΠ° ΠΎΠΏΠΈΡΠ΅ΠΌΠ΅ ΡΠ΅Π»Π°ΡΠ° Π²Π½Π°ΡΡΠ΅ΡΠ½Π° ΡΠ°Π±ΠΎΡΠ°, ΡΡΠΊΡ ΡΠ°ΠΌΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈ Π·Π° Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅ΡΠ΅ ΠΈΠ΄Π΅ΡΠ° Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΏΠΎΠΌΠ΅ΡΡ ΡΠ΅ΡΠ²Π΅ΡΠΈΡΠ΅ Π½Π° Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, ΠΏΡΠ΅Π΄Π½ΠΎΡΡΠΈΡΠ΅, ΠΎΠ³ΡΠ°Π½ΠΈΡΡΠ²Π°ΡΠ°ΡΠ° ΠΈ ΡΠ»ΡΡΠ°ΠΈΡΠ΅ Π½Π° ΡΠΏΠΎΡΡΠ΅Π±Π°.
ΠΠΎΠΎΠ±ΠΈΡΠ°Π΅Π½ΠΎ, ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° ΠΏΠΎΠΌΠ΅ΡΡ Π΄Π²Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΈ Π½Π° Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΡΠ΅ Π²ΡΡΠΈ ΠΈΠ»ΠΈ Π²ΠΎ Π±ΠΈΠ½Π°ΡΠ΅Π½ ΡΠ΅ΠΆΠΈΠΌ ΠΈΠ»ΠΈ ΡΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΠΏΡΠ°ΡΠ°ΡΠ° ΠΏΠΎΠΌΠ΅ΡΡ Π³Π»Π°Π²Π΅Π½ (ΠΏΠΎΠ·Π½Π°Ρ ΠΊΠ°ΠΊΠΎ ΠΈΠ·Π΄Π°Π²Π°Ρ, Π³Π»Π°Π²Π΅Π½ ΠΈΠ»ΠΈ Π°ΠΊΡΠΈΠ²Π΅Π½) ΠΈ slave (ΠΏΡΠ΅ΡΠΏΠ»Π°ΡΠ½ΠΈΠΊ, ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ΠΎΡΡ ΠΈΠ»ΠΈ ΠΏΠ°ΡΠΈΠ²Π΅Π½). Π¦Π΅Π»ΡΠ° Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° Π΅ Π΄Π° ΡΠ΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈ ΠΊΠΎΠΏΠΈΡΠ° Π²ΠΎ ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΎΠ΄ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π½Π° slave ΡΡΡΠ°Π½Π°ΡΠ°. ΠΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ ΡΠ΅ ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π°Π°Ρ ΠΎΠ΄ Π³ΠΎΡΠΏΠΎΠ΄Π°Ρ Π½Π° ΡΠΎΠ±, ΠΎΠ΄Π½ΠΎΡΠ½ΠΎ ΠΎΠ΄ Π°ΠΊΡΠΈΠ²Π΅Π½ Π²ΠΎ ΠΏΠ°ΡΠΈΠ²Π΅Π½, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° ΡΠ΅ ΠΈΠ·Π²Π΅Π΄ΡΠ²Π° ΡΠ°ΠΌΠΎ Π²ΠΎ Π΅Π΄Π½Π° Π½Π°ΡΠΎΠΊΠ°. ΠΠΎ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΏΠΎΠΌΠ΅ΡΡ Π΄Π²Π΅ Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π²ΠΎ Π΄Π²Π΅ΡΠ΅ Π½Π°ΡΠΎΠΊΠΈ, ΡΠ°ΠΊΠ° ΡΡΠΎ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ ΡΠ΅ ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π°Π°Ρ ΠΎΠ΄ slave Π²ΠΎ master Π²ΠΎ Π°ΠΊΡΠΈΠ²Π½ΠΎ-Π°ΠΊΡΠΈΠ²Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°. Π‘Π΅ΡΠΎ ΠΎΠ²Π°, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈ ΠΊΠ°ΡΠΊΠ°Π΄Π½Π°ΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°, Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ Π΄Π²Π° ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΈ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΠΊΡΠΈΠ²Π½ΠΎ-Π°ΠΊΡΠΈΠ²Π½Π° ΠΈΠ»ΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎ-ΠΏΠ°ΡΠΈΠ²Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π·Π°Π²ΠΈΡΠΈ ΠΎΠ΄ ΠΏΠΎΡΡΠ΅Π±Π°ΡΠ°, Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΎΡΡΠ° Π½Π° ΡΠ°ΠΊΠ²ΠΈΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π²ΠΎ ΠΏΠΎΡΠ΅ΡΠ½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΠΈΠ»ΠΈ ΡΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° Π½Π° Π½Π°Π΄Π²ΠΎΡΠ΅ΡΠ½ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΊΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡΠ° ΠΈ ΠΏΠΎΡΡΠΎΠ΅ΡΠΊΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΡΠΎΠΌΠΈΡΠΈ.
ΠΠΏΠΈΡΠ°Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π΅ ΠΌΠΎΠΆΠ½Π° ΠΏΠΎΠΌΠ΅ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΈ Π·Π° Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. Π‘Π΅ΡΠ²Π΅ΡΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ° Π΄Π° ΠΏΡΠΈΡΠ°ΡΠ° ΡΠ΅ΠΏΠ»ΠΈΡΠΈΡΠ°Π½ΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΎΠ΄ Π΄ΡΡΠ³ ΡΠ΅ΡΠ²Π΅Ρ Π·Π° Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΈ ΡΠ΅ΠΏΠ°ΠΊ Π΄Π° ΠΎΠ΄ΡΠΆΡΠ²Π° ΡΠ½ΠΈΠΌΠΊΠΈ ΠΎΠ΄ ΡΠ΅ΠΏΠ»ΠΈΡΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π²ΠΎ ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅. MySQL ΠΈ PostgreSQL Π³ΠΈ Π½ΡΠ΄Π°Ρ ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΎΠ΄ ΠΎΠ²ΠΈΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²Π½Π°ΡΡΠ΅ΡΠ½ΠΎ ΠΈΠ»ΠΈ ΠΏΡΠ΅ΠΊΡ Π΅ΠΊΡΡΠ΅Π½Π·ΠΈΠΈ ΠΎΠ΄ ΡΡΠ΅ΡΠΈ ΡΡΡΠ°Π½ΠΈ, Π²ΠΊΠ»ΡΡΡΠ²Π°ΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π½Π° Π±ΠΈΠ½Π°ΡΠ½ΠΈ Π΄Π½Π΅Π²Π½ΠΈΡΠΈ, Π·Π°ΠΊΠ»ΡΡΡΠ²Π°ΡΠ΅ Π½Π° Π΄ΠΈΡΠΊ ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° ΠΈΠ·ΡΠ°Π²ΠΈ ΠΈ ΡΠ΅Π΄ΠΎΠ²ΠΈ.
ΠΠΎΡΡΠ΅Π±Π½Π° Π΅ Π²ΠΊΡΡΡΠ΅Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΏΠΎΠΌΠ΅ΡΡ MySQL ΠΈ PostgreSQL Π·Π° Π΅Π΄Π½ΠΎΠΊΡΠ°ΡΠ½Π° ΠΌΠΈΠ³ΡΠ°ΡΠΈΡΠ° ΠΎΠ΄ Π΅Π΄Π΅Π½ ΡΠ΅ΡΠ²Π΅Ρ Π½Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π½Π° Π΄ΡΡΠ³. ΠΠ²ΠΈΠ΅ Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΊΠΎΡΠΈΡΡΠ°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ, ΡΠ°ΠΊΠ° ΡΡΠΎ Π½Π΅ Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π°Ρ. ΠΠ° Π΄Π° Π²ΠΎΡΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΡΠ°Π·ΠΌΠ΅Π½Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ Π½Π°Π΄Π²ΠΎΡΠ΅ΡΠ½Π° Π°Π»Π°ΡΠΊΠ° ΡΠΎ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ pg_chameleon.
Π¨ΡΠΎ Π΅ pg_chameleon
pg_chameleon Π΅ ΡΠΈΡΡΠ΅ΠΌ Π·Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΎΠ΄ MySQL Π΄ΠΎ PostgreSQL Π²ΠΎ Python 3. ΠΠ° ΠΊΠΎΡΠΈΡΡΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΠΎ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ mysql-ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°, ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° Π²ΠΎ 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
ΠΠ΅ΡΠ·ΠΈΡΠ° Π½Π° DB ΡΠ΅ΡΠ²Π΅Ρ
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 (ΠΊΠ°ΠΌΠ΅Π»Π΅ΠΎΠ½ΠΎΡ Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°) ΡΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΡ 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 Π·Π°Π΅Π΄Π½ΠΈΡΠ°ΡΠ° Π³ΠΈ Π½ΡΠ΄ΠΈ ΠΊΠ°ΠΊΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΈ. ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π·Π΅ΠΌΠ΅
ΠΠΎ Π±Π°Π·ΠΈΡΠ΅ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ 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 (ΠΊΠ°ΠΌΠ΅Π»Π΅ΠΎΠ½) ΡΠ° ΠΏΠΎΠ΄Π³ΠΎΡΠ²ΡΠ²Π°Π°Ρ ΠΎΠΊΠΎΠ»ΠΈΠ½Π°ΡΠ°, Π³ΠΎ Π΄ΠΎΠ΄Π°Π²Π°Π°Ρ ΠΈΠ·Π²ΠΎΡΠΎΡ ΠΈ ΡΠ° ΠΈΠ½ΠΈΡΠΈΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π°Ρ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠ°. ΠΡΠ³ΡΠΌΠ΅Π½ΡΠΎΡ 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 ΠΈ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡΠΈ Π½Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π²ΠΎ ΠΎΠ±Π»Π°ΠΊ, Π½Π° ΠΏΡ 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
ΠΠ΅ΡΠ·ΠΈΡΠ° Π½Π° DB ΡΠ΅ΡΠ²Π΅Ρ
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 ΠΈ ΡΠ°ΠΌΡ ΡΠ΅ ΡΠ΅ ΡΠΊΠ»Π°Π΄ΠΈΡΠ°Π°Ρ ΡΠ°Π·Π½ΠΈ ΠΏΠΎΠ΄Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΈ ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ. ΠΠ°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΈΡΠ°Π½ΠΈ ΡΠΌΠ΅ Π·Π° ΠΏΠΎΠ΄Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΈΡΠ΅ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠΎΡΠΈ ΠΈ ΠΌΠΎΡΠΎΡΠΈ. ΠΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΎΡ ΡΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡΠΈ ΡΠΎΠ΄ΡΠΆΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΊΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ ΡΠΎ ΡΠ²ΠΎΡΡΡΠ²Π° Π½Π° ΡΠ°Π·Π»ΠΈ, ΠΊΠ°ΠΊΠΎ ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π½Π° 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
ΠΠ²ΠΎΡ ΡΠ°Π·ΠΎΠ» Π²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° SymmetricDS ΡΠ΅ Π½Π°ΡΠ΅ΠΊΡΠ²Π° corp-000, Π° Π²ΡΡΠΊΠ°ΡΠ° ΡΠΎ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΡΠ° ΡΠΏΡΠ°Π²ΡΠ²Π° Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»ΠΎΡ mysql jdbc, ΠΊΠΎΡ ΡΠ° ΠΊΠΎΡΠΈΡΡΠΈ Π½ΠΈΠ·Π°ΡΠ° Π·Π° ΠΏΠΎΠ²ΡΠ·ΡΠ²Π°ΡΠ΅ ΠΏΠΎΠ³ΠΎΡΠ΅ ΠΈ ΠΈΠ½Π³Π΅ΡΠ΅Π½ΡΠΈΠΈΡΠ΅ Π·Π° Π½Π°ΡΠ°Π²ΡΠ²Π°ΡΠ΅. Π‘Π΅ ΠΏΠΎΠ²ΡΠ·ΡΠ²Π°ΠΌΠ΅ ΡΠΎ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ replica_db ΠΈ ΡΠ°Π±Π΅Π»ΠΈΡΠ΅ ΡΠ΅ ΡΠ΅ ΠΊΡΠ΅ΠΈΡΠ°Π°Ρ ΠΏΡΠΈ ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ΡΠΎ Π½Π° ΡΠ΅ΠΌΠ°ΡΠ°. sync.url ΠΏΠΎΠΊΠ°ΠΆΡΠ²Π° ΠΊΠ°Π΄Π΅ Π΄Π° ΡΠ΅ ΠΊΠΎΠ½ΡΠ°ΠΊΡΠΈΡΠ° ΡΠ°Π·ΠΎΠ»ΠΎΡ Π·Π° ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡΠ°.
ΠΠ°Π·ΠΎΠ»ΠΎΡ 2 Π½Π° Ρ ΠΎΡΡΠΎΡ vm2 Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ ΠΊΠ°ΠΊΠΎ store-001, Π° ΠΎΡΡΠ°ΡΠΎΠΊΠΎΡ Π΅ Π½Π°Π²Π΅Π΄Π΅Π½ Π²ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° node.properties ΠΏΠΎΠ΄ΠΎΠ»Ρ. Node store-001 ΡΠ° ΠΈΠ·Π²ΡΡΡΠ²Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ PostgreSQL, Π° pgdb_replica Π΅ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π·Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°. register.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_selling_price Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΈ ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π°Ρ Π΄Π° ΡΠ΅ ΡΠ΅ΠΏΠ»ΠΈΡΠΈΡΠ°Π°Ρ ΠΎΠ΄ corp-000 Π²ΠΎ store-001, Π° ΡΠ°Π±Π΅Π»ΠΈΡΠ΅ Π·Π° ΠΏΡΠΎΠ΄Π°ΠΆΠ±Π° (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 ΠΈ ΡΠ΅ ΡΠΏΡΠ°Π²ΡΠ²Π°ΠΌΠ΅ ΡΠΎ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ°. Π Π²ΠΎ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π½Π° node store-001 ΡΠ΅ ΠΈΠΌΠ° ΡΠ°ΠΌΠΎ 4 ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΈ ΡΠ°Π±Π΅Π»ΠΈ Π±Π΅Π· ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ.
Π‘ΠΈΡΠ΅. ΠΠΊΠΎΠ»ΠΈΠ½Π°ΡΠ° Π΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½Π° Π΄Π° Π³ΠΈ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ Π½Π° sym-ΡΠ΅ΡΠ²Π΅ΡΠΎΡ Π½Π° Π΄Π²Π°ΡΠ° ΡΠ°Π·Π»ΠΈ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ Π΅ ΠΏΡΠΈΠΊΠ°ΠΆΠ°Π½ΠΎ ΠΏΠΎΠ΄ΠΎΠ»Ρ.
vm1$> cd /usr/local/symmetric-server-3.9.20/bin
vm1$> sym 2>&1 &
ΠΠ°ΠΏΠΈΡΠΈΡΠ΅ Π²ΠΎ Π΄Π½Π΅Π²Π½ΠΈΠΊΠΎΡ ΡΠ΅ ΠΈΡΠΏΡΠ°ΡΠ°Π°Ρ Π΄ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° Π·Π° Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ° Π²ΠΎ Π·Π°Π΄Π½ΠΈΠ½Π° (symmetric.log) Π²ΠΎ ΠΏΠ°ΠΏΠΊΠ°ΡΠ° Π»ΠΎΠ³ΠΎΠ²ΠΈ Π²ΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΎΡ ΠΊΠ°Π΄Π΅ ΡΡΠΎ Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ SymmetricDS, ΠΊΠ°ΠΊΠΎ ΠΈ Π΄ΠΎ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΈΠΎΡ ΠΈΠ·Π»Π΅Π·. Sym-ΡΠ΅ΡΠ²Π΅ΡΠΎΡ ΡΠ΅Π³Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ½ΠΈΡΠΈΡΠ° Π½Π° node 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 Π΄ΠΎ node store-001 ΠΎΠ΄ corp-000 ΡΠΎ ΡΠ»Π΅Π΄Π½Π°Π²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°.
vm1$> ./symadmin --engine corp-000 reload-node 001
ΠΠΎ ΠΎΠ²ΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ, Π½ΠΎΠ² Π·Π°ΠΏΠΈΡ Π΅ Π²ΠΌΠ΅ΡΠ½Π°Ρ Π²ΠΎ ΡΠ°Π±Π΅Π»Π°ΡΠ° ΡΠΎ ΡΡΠ°Π²ΠΊΠΈ Π²ΠΎ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ MySQL Π½Π° ΡΠ°Π·ΠΎΠ» corp-000 (Π΄ΠΎΠΌΠ°ΡΠΈΠ½: vm1), ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° Π²ΠΎ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ PostgreSQL Π½Π° ΡΠ°Π·ΠΎΠ» ΠΏΡΠΎΠ΄Π°Π²Π½ΠΈΡΠ°-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 ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π·Π° Π΄Π° ΡΠ΅ ΠΈΡΠΏΡΠ°ΡΠ°Ρ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π½Π° ΡΠ΅ΠΌΠ°ΡΠ° Π²ΠΎ ΡΠ°Π·ΠΎΠ» ΠΏΡΠΎΠ΄Π°Π²Π½ΠΈΡΠ°-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