ืืชืืจ ืฉืืคืื ืฆืืื ืืื PostgreSQL ื-MySQL, ืืื ืื ืฉืืืืช ืืืืืจืช ืฉืืคืื ืฆืืื ืืื ืฉื ื ืฉืจืชื ืืกื ืื ืชืื ืื. ืืืจื ืืื, ืืกืื ื ืชืื ืื ืืฉืืืคืืื ื ืงืจืืื ืืืืืื ืืื, ืืื ืฉืืื ื ืืื ืืขืืืจ ืืฉืจืช RDBMS ืืื ืืืืจ.
ืืกืื ื ืชืื ืื PostgreSQL ื-MySQL ื ืืฉืืื ืืืจื ืืื ืืืืกืื, ืื ืขื ืืจืืืืช ื ืืกืคืืช ืื ืืฆืืขืื ืืืืืืช NoSQL. ืืื ื ืืื ืืฉืืคืื ืืื PostgreSQL ื-MySQL ืื ืงืืืช ืืื ืฉื DBMS ืืืกื.
ืื ื ืชืืจ ืืช ืื ืืคืขืืืืช ืืคื ืืืืืช, ืจืง ืืช ืืขืงืจืื ืืช ืืืกืืกืืื ืืื ืฉืชืงืื ืืืฉื ืขื ืืืืจืช ืฉืืคืื ืืื ืฉืจืชื ืืกื ื ืชืื ืื, ืืชืจืื ืืช, ืืืืืืช ืืืงืจื ืฉืืืืฉ.
ืืืจื ืืื, ืฉืืคืื ืืื ืฉื ื ืฉืจืชื ืืกื ื ืชืื ืื ืืืื ืืชืืฆืข ืืืฆื ืืื ืืจื ืื ืืืืฆืขืืช ืฉืืืืชืืช ืืื ืืืกืืจ (ืืืืื ื ืืคืจืกื, ืืืกืืจ ืื ืืงืืืื) ืืืื ืขืื (ืื ืื, ืืืชื ื ืื ืคืกืืื). ืืืจืช ืืฉืืคืื ืืื ืืกืคืง ืขืืชืง ืืืื ืืืช ืฉื ืืกื ืื ืชืื ืื ืืจืืฉื ืืฆื ืืขืื. ืืืงืจื ืื, ื ืชืื ืื ืืืขืืจืื ืืืกืืจ ืืขืื, ืืืืืจ ืืืงืืืื ืืคืกืืื, ืืืืืื ืฉืืคืื ืืืืฆืข ืจืง ืืืืืื ืืื. ืืื ืืชื ืืืื ืืืืืืจ ืฉืืคืื ืืื ืฉื ื ืืกืื ื ืชืื ืื ืืฉื ื ืืืืืื ืื, ืื ืฉืื ืชืื ืื ืืืขืืจืื ืืขืื ืืืืกืืจ ืืชืฆืืจื ืืงืืืืืช-ืืงืืืืืช. ืื ืื, ืืืื ืฉืืคืื ืืืืจื, ืืคืฉืจื ืืื ืฉื ื ืฉืจืชื ืืกื ื ืชืื ืื ืืืื ืื ืืืชืจ. ืชืฆืืจื ืืงืืืืืช-ืืงืืืืืช ืื ืืงืืืืืช-ืคืืกืืืืช ืชืืืื ืืฆืืจื, ืืืื ืืช ืฉื ืืืืืืช ืืืื ืืชืฆืืจื ืืจืืฉืื ืืช ืื ืืฉืืืืฉ ืืคืชืจืื ืืช ืชืฆืืจื ืืืฆืื ืืื ืืืืืืคืื ืงืืืืื.
ืืชืฆืืจื ืืืชืืืจืช ืืคืฉืจืืช ืืื ืฉืจืชื ืืกื ื ืชืื ืื ืฉืื ืื. ื ืืชื ืืืืืืจ ืืช ืืฉืจืช ืืงืื ื ืชืื ืื ืืฉืืืคืืื ืืฉืจืช ืืกื ื ืชืื ืื ืืืจ ืืขืืืื ืืฉืืืจ ืขื ืฆืืืืื ืืฆื ืืืื ืืืช ืฉื ืื ืชืื ืื ืืืฉืืืคืืื. 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
ืืจืกืช ืฉืจืช DB
MySQL 5.7.26
ืคืืกืืืจืกื 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 ืืฆืืขื ืืืืืืืืช. ื ืืชื ืืืืจืื ืืืชื
ืืืกืื ื ืชืื ืื 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 ืืืืคืขื ืืกืื ื ืชืื ืื ืืืจืื ืืขื ื, ืืืฉื Redshift, ื Azure ืืื' ืชืืื ืืช ืืืื ืืช: ืกื ืืจืื ืืกื ื ืชืื ืื ืืงืืฆืื, ืฉืืคืื ืืกื ื ืชืื ืื ืจื ืืืกืืจ, ืกื ืืจืื ืืกืื ื, ืืจื ืกืคืืจืืฆืื ืืขืื. ืืื ืืื Java ืืืืจืฉ ืืืืืจื ืกืื ืืจืืืช ืฉื JRE ืื JDK (ืืจืกื 8.0 ืืืขืื). ืืื, ื ืืชื ืืืงืืื ืฉืื ืืืื ืื ืชืื ืื ืืืจืืืจืื ืืืกื ืื ืชืื ืื ืฉื ืืืงืืจ ืืืฉืืื ืืืชื ืืืกื ืื ืชืื ืื ืืืชืืื ืืฆืืจืช ืืฆืืืช.
ืชืืื ืืช SymmetricDS
ืืืื ืืื ื ืชืืื ืืคืืืคืืจืื, ืืืืืจ ืฉื ื ืืกืื ื ืชืื ืื ืฉืื ืื ืื ืืืชืจ ืืืืืื ืืืืืืฃ ื ืชืื ืื.
ืืกืื ื ืชืื ืื ืืืกืืื ืืกืื ืืจื ืื ืืืืฆืขืืช ืจืฉืืืืช ืฉืื ืื ื ืชืื ืื, ืืขืื ืฉืืกืื ื ืชืื ืื ืืืืกืกื ืืขืจืืช ืงืืฆืื ืืฉืชืืฉืื ืืกื ืืจืื ืงืืฆืื.
ืฉืืคืื ืื-ืืืืื ื ืืืืฆืขืืช ืฉืืืืช Push ื-Pull ืืืืืกืกืืช ืขื ืืขืจืืช ืืืืื.
ืืขืืจืช ื ืชืื ืื ืืคืฉืจืืช ืืจืฉืชืืช ืืืืืืืืช ืืืจืืื ืคืก ื ืืื.
ืฉืืืืจ ืืืืืืื ืืืฉืจ ืืฆืืชืื ืืืืจืื ืืคืขืื ืืืืจ ืืฉื ืืคืชืจืื ืกืืกืืืื ืืืืืืื.
ืืืฉืงื API ืชืืืืื ืืขื ื ืืขืืฆืืชืืื.
ืืืืื
ื ืืชื ืืืืืืจ ืืช SymmetricDS ืืืืช ืืฉืชื ืืจืืื:
ืฆืืืช ืืืกืืจ (ืืืจื) ืฉืืชืื ืืืืคื ืืจืืื ืืช ืฉืืคืื ืื ืชืื ืื ืืื ืฉื ื ืฆืืชืื ืขืืืื (ืืืืื), ืืชืงืฉืืจืช ืืื ืฆืืชื ืฆืืฆื ืืชืจืืฉืช ืจืง ืืจื ืืื.
ืฆืืืช ืคืขืื (ืฆืืืช 1) ืืืื ืืชืงืฉืจ ืืฆืืจื ืฉืืคืื ืขื ืฆืืืช ืคืขืื ืืืจ (ืฆืืืช 2) ืืื ืืชืืื.
ืืฉืชื ืืืคืฉืจืืืืช, ืืืืืคื ื ืชืื ืื ืืชืจืืฉืื ืืืืฆืขืืช Push ื-Pull. ืืืืืื ืื ื ืฉืงืื ืชืฆืืจื ืืงืืืืืช-ืืงืืืืืช. ืื ืืืงื ืืืชืจ ืืื ืืื ืืชืืจ ืืช ืืืจืืืืงืืืจื ืืืื, ืื ืืฆืข ืืช ืืืืงืจ ืฉืื.
ืืชืงื ืช SymmetricDS ืืื ืคืฉืืื ืืืื: ืืืจื ืืช ืืจืกืช ืืงืื ืืคืชืื ืฉื ืงืืืฅ ื-zip
ืืืจื
Vm1
Vm2
ืืจืกืช ืืขืจืืช ืืืคืขืื
CentOS Linux 7.6 x86_64
CentOS Linux 7.6 x86_64
ืืจืกืช ืฉืจืช DB
MySQL 5.7.26
ืคืืกืืืจืกื 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
corp-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 ืืื ืืกื ืื ืชืื ืื ืฉื ืืฉืืคืื. 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 ืืืืื ืคืจืืืจืื ืืืืืจืช ืฉืืคืื ืื-ืืืืื ื ืืื ืฉื ื ืฉืจืชื ืืกื ื ืชืื ืื (ืฉื ื ืฆืืชืื). ืืฉืืืื ืฉืืืื ืืืืฆืขืื ืขื host 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
ืืืืืื, ืืืืืืช ืืคืจืื ืืืคืจืื_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_) ืืืื ืืช ืืจืืข ืจืง ื-node corp-000 ืืืืืื ืฉืฉื ืืจืฆื ื ืืช ืืคืงืืื create-sym-tables ืื ื ืื ืืช ืืฉืืคืื. ืืืืกืืก ืื ืชืื ืื ืขื node store-001 ืืืื ืจืง 4 ืืืืืืช ืืืืืื ืืื ื ืชืื ืื.
ืืช ืื. ืืกืืืื ืืืื ื ืืืจืืฅ ืชืืืืื ืฉืจืช ืกืืื ืื ืืฉื ื ืืฆืืชืื ืืคื ืฉืืืฆื ืืืื.
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 ื-node corp-000 (ืืืจื: vm1), ืืชืืื ืืืืืง ืืช ืืฉืืคืื ืฉืื ืืืกื ืื ืชืื ืื PostgreSQL ื-node 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 ืืืืฆืข ืืื ืืฉืืื ืฉืื ืืืื ืืกืืืื ื- node store-001, ืืฉืืคืื ืฉื ืืืื t1 ืืืืืจ.
vm1$> ./symadmin -e corp-000 --node=001 sync-triggers
vm1$> ./symadmin send-schema -e corp-000 --node=001 t1
ืืืชืจืื ืืช ืฉื SymmetricDS
ืืชืงื ื ืืชืฆืืจื ืงืื, ืืืื ืกื ืืืื ืฉื ืงืืฆืื ืขื ืคืจืืืจืื ืืืฆืืจืช ืืขืื ืฉื ืฉืืืฉื ืื ืฉื ื ืฆืืชืื.
ืืกืื ื ืชืื ืื ืืืฆื ืคืืืคืืจืืืช ืืขืฆืืืืช ืคืืืคืืจืื, ืืืื ืฉืจืชืื, ืืืฉืืื ื ืืืืื ืืืืฉืืจืื ื ืืืืื.
ืฉืืคื ืื ืืกื ื ืชืื ืื ืืื ืืกื ื ืชืื ืื ืืืจ ืืืืคื ืืงืืื, ื-WAN ืื ืืขื ื.
ืืคืฉืจืืช ืืขืืืื ืืืืืืช ืขื ืืื ืืกืื ื ืชืื ืื ืื ืืื ืืืคืื ืืฉืืคืื ื ืื.
ืืจืกื ืืชืฉืืื ืขื GUI ืืชืืืื ืืฆืืื ืช.
ืืกืจืื ืืช ืฉื SymmetricDS
ืขืืื ืืืืืืจ ืืืืคื ืืื ื ืืช ืืืืืื ืืืช ืืืืื ืืฉืืคืื ืืฉืืจืช ืืคืงืืื ืืืืฆืขืืช ืืฆืืจืืช SQL ืืื ืืืขืื ืืืืืืช ืงืืืื, ืืืจ ืฉืขืืื ืืืืืช ืื ื ืื.
ืืืืจืช ืืืืืืช ืจืืืช ืืฉืืคืื ืขืฉืืื ืืืืืช ืืืืืขืช, ืืื ืื ืื ืืชื ืืฉืชืืฉ ืืกืงืจืืคืืื ืืืฆืืจืช ืืฆืืจืืช SQL ืฉืืืืืจืืช ืืช ืืืืืื ืืืช ืืืืื ืืฉืืคืื.
ืืฉ ืืืชืจ ืืื ืืืืข ืฉื ืจืฉื ืืืืื ืื, ืืืคืขืืื ืฆืจืื ืืกืืจ ืืช ืงืืืฅ ืืืืื ืืื ืฉืื ืืชืคืืก ืืืชืจ ืืื ืืงืื.
ืชืืฆืืืช ืขืืืจ SymmetricDS
SymmetricDS ืืืคืฉืจ ืื ืืืืืืจ ืฉืืคืื ืื-ืืืืื ื ืืื ืฉื ืืื, ืฉืืืฉื, ืื ืืคืืื ืืื ืืืคื ืฆืืชืื ืืื ืืฉืืคื ืืืกื ืืจื ืงืืฆืื. ืืืืืจ ืืืื ืืืืืื ืืืืฆืข ืืืืคื ืขืฆืืื ืืฉืืืืช ืจืืืช, ืืืื ืฉืืืืจ ื ืชืื ืื ืืืืืืื ืืืืจ ืชืงืืคื ืืจืืื ืฉื ืืฉืืชื ืืฆืืืช, ืืืืืคื ื ืชืื ืื ืืืืืืืื ืืืขืืืื ืืื ืฆืืชืื ืืืืฆืขืืช HTTPS, ื ืืืื ืงืื ืคืืืงืืื ืืืืืืื ืืืืืกืก ืขื ืืขืจืืช ืืืืื ืืขืื. SymmetricDS ืืืฆืขืช ืฉืืคืื ืืื ืื ืืกืื ื ืชืื ืื, ืืคืืื, ื ืืชื ืืืฉืชืืฉ ืื ืขืืืจ ืืืืื ืจืื ืฉื ืชืจืืืฉืื, ืืืื ืืืืจื, ืืืืจื, ืืคืฆื, ืกืื ืื ืืืืจืช ื ืชืื ืื ืืื ืคืืืคืืจืืืช.
ืืืืืื ืืืืกืกืช ืขื ืืจืฉืื
ืืงืืจ: www.habr.com