ΠšΡ€ΡŠΡΡ‚ΠΎΡΠ°Π½Π° рСпликация ΠΌΠ΅ΠΆΠ΄Ρƒ PostgreSQL ΠΈ MySQL

ΠšΡ€ΡŠΡΡ‚ΠΎΡΠ°Π½Π° рСпликация ΠΌΠ΅ΠΆΠ΄Ρƒ PostgreSQL ΠΈ MySQL

Π©Π΅ говоря Π½Π°ΠΊΡ€Π°Ρ‚ΠΊΠΎ Π·Π° ΠΊΡ€ΡŠΡΡ‚ΠΎΡΠ°Π½Π° рСпликация ΠΌΠ΅ΠΆΠ΄Ρƒ 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 общността ΠΏΡ€Π΅Π΄Π»Π°Π³Π° Π·Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. МоТС Π΄Π° сС ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈ Ρ‚ΡƒΠΊ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½Π°Ρ‚Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈΠ΄Π²Π° ΠΊΠ°Ρ‚ΠΎ tar ΠΈ компрСсиран Π°Ρ€Ρ…ΠΈΠ² с инструкции Π·Π° създаванС ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° Π½ΠΈΠ·ΠΎΠ²Π΅.

Бъздава сС спСциалСн ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» със ΡΡŠΡ‰ΠΎΡ‚ΠΎ ΠΈΠΌΠ΅ 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.

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° SymmetricDS Π΅ лСсно: ΠΈΠ·Ρ‚Π΅Π³Π»Π΅Ρ‚Π΅ zip Ρ„Π°ΠΉΠ»Π° с ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄ слСдоватСлно ΠΈ Π³ΠΎ ΠΈΠ·Π²Π»ΠΈΡ‡Π°ΠΉΡ‚Π΅ ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ искатС. Π‘Π»Π΅Π΄Π½Π°Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° изброява мСстополоТСниСто Π½Π° инсталацията ΠΈ вСрсията Π½Π° SymmetricDS Π² Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ вСрсиитС Π½Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ, вСрсиитС Π½Π° Linux, IP адрСситС ΠΈ ΠΏΠΎΡ€Ρ‚ΠΎΠ²Π΅Ρ‚Π΅ Π·Π° Π΄Π²Π°Ρ‚Π° възСла.

Π’ΠΎΠ΄Π΅Ρ‰
vm1
vm2

вСрсия Π½Π° ОБ
CentOS Linux 7.6 x86_64
CentOS Linux 7.6 x86_64

ВСрсия Π½Π° ΡΡŠΡ€Π²ΡŠΡ€ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ
MySQL 5.7.26
PostgreSQL 10.5

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 Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈΡ€Π° ΠΌΠ΅ΠΆΠ΄Ρƒ всякакви Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ, слСдоватСлно ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° голямо Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ ΠΎΡ‚ сцСнарии, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ миграция, Π½Π°Π΄Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅, разпространСниС, Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Π½Π΅ ΠΈ трансформация Π½Π° Π΄Π°Π½Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΡŠΡ‚ Π΅ Π±Π°Π·ΠΈΡ€Π°Π½ Π½Π° официалния Π±ΡŠΡ€Π·ΠΎ Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ ΠΎΡ‚ SymmetricDS. IN Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ Π·Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° Описва ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈΡ‚Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈ Π² настройката Π½Π° рСпликация със SymmetricDS.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€