á PostgreSQL áĽá MySQL ááŤá¨á áľá á°áťá᪠ááŁááľ áĽáá˛áá á áĽááá áááľ á¨ááἠááł á ááááŽá˝ ááŤá¨á á¨ááľáá ááŁááľá á¨áááá áá´áá˝á á á áአáĽáááŤáá ᢠá¨á°á°ááá áłáłá¤áá˝ á á°áááś á°ááłáłá á¨ááἠááłáá˝ á°áĽáá áá áŤáᣠáĽá áá á¨á ááľ RDBMS á áááá áá° áá ááá¸ááá ááš áá´ ááá˘
PostgreSQL áĽá MySQL á¨ááἠááłáá˝ á á°áááś áĽáá° áááááľ ááá áŤáᣠááá áá á¨á°á¨á᪠á áĽáŤáá˝ áá á¨NoSQL á˝ááłáá˝á áá°áŁáᢠáĽáá á PostgreSQL áĽá MySQL ááŤá¨á áľá ááŁááľ á¨á°ááá á¨ááἠááł á áľá°áłá°á áĽááł áĽáááŤáŤááá˘
á áá¨á ááľ á ááááŽá˝ ᣠáĽá á áĽá áὠᣠáá°áŚá˝ áĽá á¨á á ááá ááłáŽá˝ ááŤá¨á ááŁááľá á¨áááá ááłáĽ áĽáá˛ááŽáľ áááá á¨ááľáĽ á áŤááľá ᣠáá°á¨áłá áááá˝á áĽáť á áááá˝á á˘
á á°áááśáŁ á áááľ á°ááłáłá á¨ááἠááł á ááááŽá˝ ááŤá¨á ááŁááľ á¨áá¨áááá á áááľáŽá˝ áááł ááá á ááł (á á áłáłáᣠááľá°á ááá áá) áĽá á áŁáŞáŤ (á°áááá˘áŁ á°á áŁáŁá ááá á°ááĽáŽ) ááŤá¨á áŁá áĽáŤááá˝ ááᢠá¨ááŁááľ ááá á á°á áŁáŁáá áá á¨áááá á¨ááἠááł á á˝á áłá á á áá á¨áĽ ááᢠá áá á ááŁá áá¨á á¨ááł áá° áŁáŞáŤ áááľá á¨ááŁáŞ áá° á°ááĽáŽ áá°áááá ááááŤáąá ááŁááľ á¨áá¨áááá á á ááľ á á áŁáŤ áĽáť ááᢠááá áá á áááą á¨ááἠááłáá˝ ááŤá¨á ááŁááľá á áááąá á á áŁáŤáá˝ áááá á áá˝áá, áľááá á ááἠá¨áŁáŞáŤá áá° ááłá á áá-áá áá á ááľáĽ áá°áááá. áá ááᣠááŁááľá á¨ááŽáŁ á áááľ ááá á¨á፠á áá á áá á°ááłáłá á¨áá¨á ááśá˝ á ááááŽá˝ ááŤá¨á ááá áá˝ááá˘á¨áá-ááŁáŞ ááá ááŁáŞ-á°áááá áá á áĽáá°ááááąáŁá ááááŞáŤá áá á ááľáĽ áĽáá˛á áŤá á˝ááłáá˝ ááááľ ááá á¨áá ááľá°áŤá¨áŤ áááľááá˝á áĽá ááŁá ááĽááľá á áá áá áá á¨á°áá á¨á° ááᢠ- á ááˇá .
á¨á°ááá¸á áá á á á°ááŤáŠ á¨ááἠááł á ááááŽá˝ ááŤá¨á ááťáá. á áááአá¨á°áŁá ááἠá¨áá á¨ááἠááł á áááá áĽáá˛áá á áááá áĽá á ááá á¨á°áŁáá ááἠá á˝á áłá á á˝á áłá áá˝ áĽááłáá˝á ááá¨áľ áá˝ááᢠMySQL áĽá PostgreSQL á áĽáááášá áĽááá á á ááááŽá˝ á á ááá ááá á áśáľá°á ááá á áĽáŤáá˝ áŤáááŁááŁá¨áááľáŽá˝ áá áá´áá˝áᣠá¨á˛áľá áááááŤáá˝áᣠáĽá ááá፠áĽá á¨áľáá˝á áá°á¨áľ áŤá°á¨á áá´áá˝á á¨ááŽá˘
á¨á ááľ á¨ááἠááł á áááá áá° áá áá ááľ áá ááá°áľ á MySQL áĽá PostgreSQL ááŤá¨á ááťáá áŤáľááááᢠáĽááá á¨ááἠááłáá˝ á¨á°ááŤáŠ ááŽáśáŽáá˝á áľááá áá á ááĽáł áááááľ á áá˝ááᢠá¨ááἠááááĽá ááááťá¸áľáŁ áĽáá° pg_chameleon áŤá á¨áá áááľ ááá ááłáŞáŤ áá áá áá˝ááá˘
pg_chameleon áááľá áá?
pg_chameleon á Python 3 ááľáĽ ᨠMySQL áá° PostgreSQL á¨ááŁááľ áľáááľ áá. ᨠmysql-replication áááľ ááá áááĽá¨áŞ áá ááá, áĽáá˛áá á Python ááľáĽ. á¨á¨áľá ááľáὠᨠMySQL á°áá á¨áŚá˝ á°á°ááľá¨á áĽáá° JSONB áááŽá˝ á PostgreSQL áłáłá¤á ááľáĽ ááááŁá áĽá á pl/pgsql á°ááŁá á˛áŽáľ á°á°ááá á PostgreSQL áłáłá¤á ááľáĽ ááŤááłáá˘
á¨pg_chameleon áŁá áŞáá˝
á¨á°ááłáłáŠ ááá ááľáĽ áŤá á ááŤáł ᨠMySQL áááááĽáŽá˝ á¨á ááľ-ááĽá áá
á áá áá° á áᾠᨠPostgreSQL á˘áá áłáłá¤á ááŁá áá˝áá
á¨ááá áĽá á¨ááá ááľá áľáá˝ á°ááłáłá ááá á áá˝ááá˘
á¨ááŁááľ ááἠᨠMySQL cascading á
á ááᣠáá˝ááá˘
áľá
á°áśá˝á ááŁááľ ááá áááá¨áľ á¨ááá˝á á°áá á¨áŚá˝ á ááŤá°áąáá˘
áĽáŤááłááą á¨ááŁááľ á°ááŁá á á˛ááá˝ ááĽáĽá áá°á¨áá áłáá˘
á YAML áá á°ááľáá°á á áááŞáŤáá˝ áĽá á áááá áááá˝ áááŁá áŠá˘
áááłá:
á áľá°ááá
áĽ.á¤.á .
áĽ.á¤.á .
á¨áľááá° ááá áľáŞáľ
CentOS ááááľ 7.6 x86_64
CentOS ááááľ 7.5 x86_64
á¨ááἠááł á áááá áľáŞáľ
ᨠMySQL 5.7.26
PostgreSQL 10.5
á˛á˘ áá°áĽ
3306
5433
á¨á áá á áľáŤáť
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 á á°áłáŤ áááł á¨á°áŤáᣠá¨á°ááŠáľ ááľáááśá˝ áá ááá á ááŁá¸áᣠáááłá áááŁá á áŤáŁá˘ ááá á áĽá ááááľá˘ áĽáá˛áá á¨áá ááá áá° á¨á áἠááá áľáŞáľ á°áááá áĽá 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 áĽáá áŤááá (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 áá á ááá áĽáá° á¨áááá፠ááá áŚáł ᣠá¨áááἠááľáłááťá á¨áááá áľ áŚáł ᣠá¨áááἠááľáłááťáá˝ á¨áá¨ááť áá ᣠââááá° áŤá á ááĽáŽá˝á á¨áááŁá áŠá áľ á¨á ááá áá ááźáśá˝ (á áá á áá ááźáśá˝) ááá á áá ᢠááĽá á¨áááŁá ááťá ááááľ áááŁáᢠáááᣠá ááŁááľ áá áľ ááááśá˝á áááťá á¨á°á°áááá á°ááĽá˘ ááŁáŞ ááłá áĽáá á(1)á áá° áĄááŤá á¨áááá á áááľ á¨ááťá á á áá áááᢠá áááĽáá ááá, á¨áłááá á¨ááἠááł áá á¨áááááľ ááááŽá˝á áĽááááťáá. á áĽá áááłáŁ áá á¨PostgreSQL áłáłá¤á ááᣠáĽáá° pg_conn á¨á°áá¨ááᢠá áá¨á¨áťá ááá á¨ááá áá¨áá áááľá á¨ááá áłáłá¤á á¨áááááľ áááŞáŤáá˝á áŁá¨áááŠá áĽá á¨ááá á¨ááἠááłáá˝á á¨áŤááł áĽá áľ áŁá¨áááá á°áá á¨áŚá˝á áŁáá ááĽá፠áŁáá á°á¨ áľááľáłá áŁá¨áĽá á áá áá áĽááááááᢠ"áááŽá˝" áĽá ááĽá áááá áἠáá áᣠáá á áááľ áĽá-áá ááľ áá á ááááááľ á ááŤáł á¨ááá áłáłá¤áá˝á áá° á ááľ á˘áá áá¨á áĽáá˝ááá áááľ ááá˘
á ááłáá áá áŤáá world_x áłáłá¤á ᨠMySQL áá
á á¨á°áĽ áá áĽááľ á¨áá áá 4 á°áá á¨áŚá˝á áááᢠááááľ áá˝ááá˘
á 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 á áŠáᣠᨠMySQL áłáłá¤á áááŚá˝á á¨ááá á db_replica áłáłá¤á ááá áŤáᢠá PostgreSQL ááľáĽ áŤáá ᨠusr_replica á°á áá á¨áááą áźááá˝ pgworld_x áĽá sch_chameleon áŁáá¤áľ áá ááááŤáᣠáĽááąá áĽáá°á á°á á°á¨á°áá¸á á¨á°áŁá á áá á¨áŚá˝ áĽá á¨ááŁááľ áŤáłáá á áá á¨áŚá˝á˘ á¨creat_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) áľáááá˝ á áŤáŁá˘á áŤáááá, áááŠá áá¨áአáĽá á ááá áŤáľáááŠ. á¨creat_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 áááá ááłáŠ áá˝ááá˘
áá°á áĽáá áĽáá°á°ááááá á˛ááá˝ áĽáŤááłááąá á¨ááŁááľ á°ááŁá áŤáľá°áłáľáŤáᢠáĽááąá ááá¨áľ á¨áá á áłá˝ áĽáá°ááłá¨á á¨áá°áąá á°áá á¨áĽ á ááááľ áá¤áľ áľááá áá ááá˘
á¨áłá˝ áĽáá°ááłá¨á á áĽááá°á áá áĽáľááááľáá áľá¨áľ ááŁááľ áĽáá°á°ááᨠá ááá ááᢠá á¨á´á áĽáááĽáŤááᣠáááľ ááááŚá˝á áá° 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, ááá°. á¨ááá áŁá áŞáŤáľáĄ á¨ááἠááł áĽá á¨ááá áááłá°á, áŁááĽá-ááľá°á á¨ááἠááł ááŁááľ, á¨á°áŁáŤ áááłá°á, áľáŤááľáááá˝á áĽá ááá˝. áá á¨á፠ááłáŞáŤ áá áĽá áá°á á áááľ JRE ááá JDK (áľáŞáľ 8.0 ááá á¨á፠á áá) áŤáľáááááᢠáĽáá á áááť áłáłá¤á ááľáĽ ááľá á´áá˝ áá á¨ááἠáááŚá˝á ááááἠáĽá áá° á°áá˘á á¨ááá áłáłá¤á áĽáá° áŁá˝ ááá áá˝ááá˘
SymmetricDS á˝ááłáá˝
ááŁáŞáŤá á¨ááľá¨á áá áá, áááľá áááľ ááá á¨á፠á áá á¨á°ááŤáŠ á¨ááἠááłáá˝ ááἠááááᥠáá˝áá.
á°ááá
á¨ááἠááłáá˝ á¨ááἠáááŚá˝á á ááááἠáááłá°áá, áĽá á ááá áľáááśá˝ áá á¨á°áá°á¨áą á¨ááἠááłáá˝ á¨ááá áááłá°áá áá ááá.
á¨ááááľ áĽá á¨ááá°áľ áá´áá˝á á áá áá áŁá áááľ ááááľ ááŁááľ á á°ááŚá˝ áľáĽáľáĽá˘
áá
á°á á¨áá°ááá፠áááľ áŁáá¸á á°á
áááłá¸á á á°á á á á ááłá¨ áá¨áŚá˝ áĽá á ááłá¨ áá¨áŚá˝ áá á¨ááἠááľá°ááá ááťáá.
á¨á°áłáŤ áĽá á ááśáá˛á á¨áááľ á ááłáľ á áá á¨ááľááá ááááśá˝á áĽáŤ á áááĽáá áľ áá á áŤáľ-á°á ááááá˘
á¨á°áá áá á°áłáá áĽá áááŁá á¨á¤áá ááá˝ á
áĽáŤá˘
áááłá:
SymmetricDS á¨áááľ ááááśá˝ á á ááą áááá áá˝áááĄ-
á áááľ áŁáŞáŤ (áá
) á áááá˝ ááŤá¨á á¨ááἠááŁááľá á ááá¨áá á¨ááŤáľá°áŁáĽá áá (á¨ááá
) ááľ áĽá á ááá˝ ááśá˝ ááŤá¨á á¨áá¨á áááἠá¨áá¨áááá á ááá
á áŠá áĽáť ááá˘
ááŁáŞ ááľááá ááááľ (ááľááá ááááľ 1) á¨áá ááŁáŞ ááľááá ááááľ (ááľááá ááááľ 2) áá áááŤáŁáľ ááááá áá˝ááá˘
á áááąá á ááŤáŽá˝ á¨ááἠáááἠáá˝ áĽá áá á áá áá áá¨á°áłá. á áá
ááłá ááľáĽ á¨áá-áá áá
áá áĽáááá¨áłáá. á á ááá á ááá´áá¸áá ááááá˝ á áŁá á¨á
á ááᣠáľááá
á áĽá
SymmetricDS á ááŤá ááá ááᥠáááľ ááá áá ááá áŤáááą
á áľá°ááá
áĽ.á¤.á .
áĽ.á¤.á .
á¨áľááá° ááá áľáŞáľ
CentOS ááááľ 7.6 x86_64
CentOS ááááľ 7.6 x86_64
á¨ááἠááł á áááá áľáŞáľ
ᨠMySQL 5.7.26
PostgreSQL 10.5
á˛á˘ áá°áĽ
3306
5832
á¨á áá á áľáŤáť
192.168.1.107
192.168.1.112
SymmetricDS áľáŞáľ
á˛ááľáŞáá˛á¤áľ 3.9
á˛ááľáŞáá˛á¤áľ 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 ážáá á¨áá áŤááá á¨áááááľ ááĽá¨ááá áĽá á¨ááá˘áŤ ááľááááśá˝á áá áááᢠá¨á°áŁá_á˛á˘ áłáłá¤á áá áĽá¨á°áááá áá áĽá á áá áľ á ááá áá áľ áá á°áá á¨áŚá˝ ááá áŤáᢠsync.url ááááłá°á á¨ááľááá ááááľ ááááá áŤáłáŤáá˘
á á áľá°ááá vm2 áá áŤáá ááľááá ááááľ 2 áĽáá° áá°áĽá-001 á°áá áŻá áĽá á¨á°áá¨á á¨áá á áłá˝ áŁáá node.properties ááá ááľáĽ á°áááżá. á¨áá°áĽá-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 á°áá á¨áŚá˝ áá ááá ááľá áááĽáŤá. á¨ááŤá á á˛áá áľáá áľááá áá á-á˛á-á áá á¨áŚá˝á áá°áá á á ááśá˝ ááŤá¨á á¨ááŁááľ á°ááŚá˝ áĽá á á áŁáŤáá˝ á¨ááááĄá áľ áá፠á áá á¨áŚá˝á áááĽáŤáᢠá áá¨á¨áťá, á¨ááá áá¨áá á á á¨á´ááá˝ ááľáĽ ááŤáá.
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
á ááłáá ááľáĽ á¨ááĽá áĽá á¨ááĽá_á¨á˝áŤá_áá á áá á¨áŚá˝ á¨corp-000 áá° áá¨ááť-001 áááľáá á áŤáľ-á°á á°áá á¨ááᣠáĽá á¨á˝áŤá á áá á¨áŚá˝ (á¨á˝áŤá_ááĽááľ áĽá á¨á˝áŤá_ááááť_ááá_áá) á¨áá°áĽá-001 áá° corp-000 áááľáá á áŤáľ-á°á á°áá á¨ááᢠá áá á¨corp-2 áá¨á áááá á ááááááľ á PostgreSQL á¨ááἠááł á á áľá°ááá vm001 (store-000) áá ááľá áĽáááĽáŤááá˘
vm2$> cd /usr/local/symmetric-server-3.9.20/bin
vm2$> ./dbimport --engine store-001 --format XML create_sample.xml
á vm1 áá áŤáá MySQL áłáłá¤á á¨ááá á áá á¨áŚá˝ áĽá á¨á˛áááľáŞáDS áŤáłáá á áá á¨áĽ áĽááłáá áá¨áááĽáá áĽááá á áááᢠá¨SymmetricDS á¨áľáááľ á°áá á¨áŚá˝ (á¨á˛á_ á áľá á áĽáŤ áá) á á áá áá á¨ááááľ á corp-000 node áá áĽáť ááᣠááááŤáąá áĽá፠áá á¨áá á-sym-tables áľáááá áŤáľááľá áĽá ááŁááľá á¨ááááŤáᢠáĽá á áá°áĽá-001 ááľááá ááááľ ááľáĽ áŁáá á¨ááἠááł ááľáĽ áŤá áá¨á 4 ááłá á°áá á¨áŚá˝ áĽáť áááŤá.
áááᢠá¨áłá˝ áĽáá°ááłá¨á á áááąá á áááá˝ áá á¨á˛á á áááá áá°áśá˝á ááááľ á á¨áŁá˘á ááá ááá˘
vm1$> cd /usr/local/symmetric-server-3.9.20/bin
vm1$> sym 2>&1 &
á¨áááἠááľáłááťáá˝ áá° á¨ááᣠáááἠááá (symmetric.log) á áááἠá áá ááľáĽ SymmetricDS á á°áŤáá áľ áá፠ááľáĽ áĽáá˛áá áá° áá°á áá áá ááľ áááŤáᢠá¨á˛á á áááá á áá á áá°áĽá-001 ááľááá ááááľ áá áááá áá˝ááá˘
vm2$> cd /usr/local/symmetric-server-3.9.20/bin
vm2$> sym 2>&1 &
á¨á˛á á áááá áá°áąá á vm2 á áľá°ááá áá áŤáľáŹáąáŁ á PostgreSQL á¨ááἠááł ááľáĽá á¨SymmetricDS áŤáłáá á°áá á¨áŚá˝á áááĽáŤáᢠá áááąá ááśá˝ áá á¨á˛á á°áá¨á áá°áľá á¨ááłáŤááą á¨áá á¨corp-000 áá° áá¨ááť-001 áá¨á áááľáá áĽááľ á ááľ áá°áŁá áŤáᢠá¨áĽááľ á°á¨ááśá˝ á áá á áááąá á áŠá áááá 4 á á¨á´ááá˝ á¨á á¨á á ᣠááŁááą á¨á°áłáŤ áááá áĽááŤááᢠááá bootstrapá á áá¨á°áá áľááá á¨corp-001 áá° store-000 ááá áá˝ááá˘
vm1$> ./symadmin --engine corp-000 reload-node 001
á áá ááĽáĽ áá, á á˛áľ áááἠá MySQL áłáłá¤á ááľáĽ áŁáá á¨ááĽá á°áá á¨áĽ ááľáĽ á node corp-000 (á áľá°ááá : vm1) ááľáĽ ááĽáˇá áĽá á node store-001 (á áľá°ááá : vm2) áá° PostgreSQL á¨ááἠááł áááľáá áá¨ááἠááťáá. áá¨áá á¨corp-000 áá° áá¨ááť-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)
áá¨áá á¨áąá -001 áá° corp-000 áááááłááľ á¨áá áŚááŹá˝áá áááŤááľ á á˝áŤá_ááĽááľ á áá á¨áĽ ááľáĽ áááἠá áľááĽá°á ááŁááąá áĽáá¨áááŁááá˘
á MySQL áĽá PostgreSQL á¨ááἠááłáá˝ ááŤá¨á á¨ááłá á°áá á¨áŚá˝á á áááľ ááááľ ááŁááľ á á°áłáŤ áááł áááá áĽááŤááᢠáá á˛áľ á¨á°á áá á áá á¨áŚá˝ ááŁááľá ááááááľ á¨áá¨á°ááľá á°á¨ááá˝ áŤá¨áááᢠáááłá á°áá á¨áĽ t1 áĽáááĽáŤáá áĽá á¨ááŁááľ á°ááŚášá áĽáá°áá¨á°áá áĽáááááá. áľááá ᨠcorp-000 áá° áá°áĽá-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)
á¨ááŤá á áááአáľá ááľá ááἠáááľá á á˛áľ á áá á¨áĽ áá¨áá á¨á˛áá áľáá áľáááá á¨áááłá°á-ááľáá˝ áááá áá á áá áá áŤáłááá, áá á ááľá ážášá á¨á áá á¨áĽ ááşáá˝ áá áááááľ áĽáá°áá áááĽáŤá. á¨áźá áááŚá˝á áá° áá¨ááť-001 áááá Send-schema áá°áŤáᣠáĽá á áá á¨áĽ 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 áááá˝á áááľáá áĽá ááááłá°á á áááľáŁ á áśáľáľ ááá á áĽá áşáá˝ ááŤá¨á áŁá áááľ ááááľ ááŁááľá áĽáá˛áŤááá ááá áľáááłáᢠá áŤáą áĽá á°ááŁáŤáľá á¨ááŤá¨ááá áአááłáŞáŤ áá áááłá á ááľááá ááááľ áá áá¨á á áá á¨ááᨠá áá áá¨áá á áŤáľ á°á áááś ááááľáŁ á á¤á˝á˛á˛áá¤áľ áá áŁá á áááá˝ ááŤá¨á á°á áááą á¨á°á á á áĽá áááŁá áááááľáŁ á á áá˝ áľáĽáľáĽ áá á¨á°áá°á¨á° á ááśáá˛á á¨áááľ á áľá°áłá°á áĽá á¨ááłá°ááľá˘ SymmetricDS áá°áááᢠá ááá¸áá á¨áá¨á ááśá˝ ááŤá¨áᣠáľááá ᣠáľá°áľáᣠááťáťáŤáᣠáľáááľáᣠááŁáŤáľá áĽá á ááľá¨á áá áŤá á¨áá¨á áááŚá˝á á¨áᎠááĽá á áááľ áááłáá˝ ááŤáááá áá˝ááá˘
ááłáá á áŚáá´ááá áá á¨á°áá°á¨á° áá
ááá: hab.com