PostgreSQL ááŸáá·áº MySQL á¡ááŒá¬áž á¡ááŒááºá¡ááŸááºáá°ážáá°áá¯á¶áá°áá°ážáá»ááŒááºážá¡ááŒáẠáá±áá¬áá±á·á áºáá¬áá¬ááŸá áºáá¯ááŒá¬áž á¡ááŒááºá¡ááŸááºáá°ážáá°áááºááŸááºááŒááºážá¡ááœáẠáááºážáááºážáá»á¬ážááᯠá¡ááŒááºážáá»ááºážáá±á¬áºááŒáá«áááºá áá¯á¶ááŸááºá¡á¬ážááŒáá·áºá áá°ážáá°áá¬ážáá±á¬ áá±áá¬áá±á·á áºáá»á¬ážááᯠáá áºáá¬ážáááºážááŒá áºá á±áááºáᯠáá±á«áºááŒááŒá®áž áááºážááẠRDBMS áá¬áá¬áá áºáá¯á០á¡ááŒá¬ážáá áºáá¯ááá¯á· ááŒá±á¬ááºážááœáŸá±á·ááẠá¡áááºááŒá±áá±á¬áááºážáááºážááŒá áºáááºá
PostgreSQL ááŸáá·áº MySQL áá±áá¬áá±á·á áºáá»á¬ážááᯠáá±áá°áá»á¡á¬ážááŒáá·áº áááºááœááºááŸá¯ááŸááááºáᯠáá°ááá±á¬áºáááºáž á¡ááá¯áááºáá±á¬ááºážáá»á¬ážááŸáá·áºá¡áá° áááºážááá¯á·ááẠNoSQL á áœááºážáááºáá»á¬ážááᯠáá±ážáá±á¬ááºáááºá á€ááœááºáá»áœááºá¯ááºááá¯á·áááºáááºá áẠDBMS ááŸá¯áá±á¬áá·áºá០PostgreSQL ááŸáá·áº MySQL á¡ááŒá¬ážáá¯á¶áá°ááœá¬ážááŒááºážááá¯ááœá±ážááœá±ážáá«áááºá
áá±áá¬áá±á·á áºáá¬áá¬áá»á¬ážá á¡á¬ážáá¬áá»ááºáá»á¬ážá ááá·áºáááºáá»ááºáá»á¬ážááŸáá·áº á¡áá¯á¶ážááŒá¯ááŸá¯ááá á¹á áá»á¬ážááŒá¬ážááœáẠáá°ážáá°áááºááŸááºááŒááºážááá¯ááºáᬠá¡áá¯ááºáá®áá¬áá»á¬ážáááŸáá á±áááºá¡ááœáẠá¡ááœááºážááá¯ááºážáá áºáá¯áá¯á¶ážááᯠáá»áœááºá¯ááºááá¯á·áá±á¬áºááŒáááºááá¯ááºáá«á
áá¯á¶ááŸááºá¡á¬ážááŒáá·áºá áááºáá°áááºáá»áŸáá±á¬ áá±áá¬áá±á·á áºáá¬áá¬ááŸá áºáá¯ááŒá¬ážááœáẠáá°ážáá°ááŒááºážááᯠbinary áá¯ááºááœááºááŒá áºá á± ááá¯á·ááá¯áẠáá¬á áᬠ(a.k.a. áá¯ááºáá±áá°á áá¬á áᬠááá¯á·ááá¯áẠáááºááŒáœáá±á¬) ááŸáá·áº áá»áœáẠ(á á¬áááºážááœááºážáá°á á¡ááá·áºá¡áá±á¡áá¬áž ááá¯á·ááá¯áẠpassive) á¡ááŒá¬áž á á¯á¶á ááºážáá±ážááŒááºážááŸá¯áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áº áá¯ááºáá±á¬ááºáááºá áá°ážáá°ááŒááºážááááºááœááºáá»ááºááŸá¬ slave áááºááŒááºážááŸá áá¬á áá¬áá±áá¬áá±á·á áºá á¡áá»áááºááŸáá·áºáá áºááŒá±ážáá® áááá¹áá°ááᯠáá±ážáá±á¬ááºáááºááŒá áºáááºá á€ááá á¹á ááœááºá áá±áá¬ááᯠáá¬á áá¬ááŸáá»áœááºááá¯á· ááœáŸá²ááŒá±á¬ááºážáááºá ááá¯ááá¯áááºááŸá¬ áááºááŒáœááŸá¯á០passive ááá¯á· áá°ážáá°ááŒááºážá¡á¬áž áŠážáááºáá»ááºáá áºáá¯áááºážááœááºáᬠáá¯ááºáá±á¬ááºáá±á¬ááŒá±á¬áá·áºá ááá¯á·áá±á¬áº áá±áá¬áá±á·á áºááŸá áºáá¯ááŒá¬áž áááºážááŒá±á¬ááºážááŸá áºáá¯ááŒá¬ážááœáẠáá°ážáá°ááŒááºážá¡á¬áž áááºáááºááŸááºááá¯ááºáááºá ááá¯á·ááŸáᬠáá±áá¬áá»á¬ážááᯠslave á០master ááá¯á· ááœáŸá²ááŒá±á¬ááºážááŒááºážá¡á¬áž áááºááŒáœáá±á¬ááœá²á·á ááºážááŸá¯áá¯á¶á á¶ááŒáá·áº ááŒá¯áá¯ááºááá¯ááºáááºá Cascading áá¯á¶áá°áá°ážáá°ááŒááºážá¡áá«á¡áááºá á€á¡áá¬á¡á¬ážáá¯á¶ážááẠááŸá áºáᯠááá¯á·ááá¯áẠááá¯á·áááºááá¯áá°áá±á¬ áá±áá¬áá±á·á áºáá¬áá¬áá»á¬ážááŒá¬ážááœáẠááŒá áºááá¯ááºáááºá Active-active ááá¯á·ááá¯áẠactive-passive configuration ááẠááá¯á¡ááºááŸá¯á áááŸáááá¯ááºááŸá¯á¡áá±á«áºááœáẠáá°áááºáááº
áá±á¬áºááŒáá¬ážáá±á¬ ááœá²á·á ááºážááŸá¯áá¯á¶á á¶ááẠááá°áá®áá±á¬ áá±áá¬áá±á·á áºáá¬áá¬áá»á¬ážááŒá¬ážááœáẠááŒá áºááá¯ááºáááºá áá¬áá¬ááẠá¡ááŒá¬ážáá±áá¬áá±á·á áºáá¬áá¬á០áááºáá°áá°ážáá¬ážáá±á¬áá±áá¬ááᯠáááºáá¶ááẠááŒááºáááºáááºááŸááºááá¯ááºááŒá®áž áááºáá°áá°ážáá¬ážáá±á¬áá±áá¬á á¡áá»áááºááŸáá·áºáá áºááŒá±ážáá® áá»áŸááºáá áºááŒááºáá¯á¶áá»á¬ážááᯠáááºáááºááááºážááááºážáá¬ážááá¯ááºáááºá MySQL ááŸáá·áº PostgreSQL ááẠááœáááŸááºáááºážáááºážáááºážáá»á¬ážá áá áºááºáá±á¬á·ááºáá»ááŒááºáž ááŸáá·áº áá¯ááºááŒááºáá»ááº- ááŸáá·áº á¡áááºážá¡ááŒá±áá¶áááºážáááºážáá»á¬ážá¡áá«á¡ááẠá€ááœá²á·á ááºážááŸá¯á¡áá»á¬ážá á¯ááᯠá¡áááºááœááºáž ááá¯á·ááá¯áẠááŒááºááá¯áá¹ááá® ááá¯ážáá»á²á·ááŸá¯áá»á¬ážááŸáá áºááá·áº áá±ážáá±á¬ááºáááºá
áá±áá¬áá±á·á áºáá¬áá¬áá áºáá¯á០á¡ááŒá¬ážáá¬áá¬áá áºáá¯ááá¯á· áá áºááŒáááºááœáŸá±á·ááŒá±á¬ááºážááŒááºážá¡ááœáẠMySQL ááŸáá·áº PostgreSQL á¡ááŒá¬áž á¡ááŒááºá¡ááŸááºáá°ážáá°ááŸá¯ ááá¯á¡ááºáááºá á€áá±áá¬áá±á·á áºáá»á¬ážááẠááá°áá®áá±á¬ áááá¯ááá¯áá±á¬áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá±á¬ááŒá±á¬áá·áº áááºážááá¯á·ááᯠááá¯ááºááá¯ááºáá»áááºáááºááẠáááŒá áºááá¯ááºáá«á áá±áá¬áááŸááºááŸá¯ááᯠáááºáá±á¬ááºáááºá áááºááẠááŒááºá open source tool á¥ááᬠpg_chameleon ááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
pg_chameleon ááá¯áá¬áá¬áá²
pg_chameleon ááẠPython 3 ááŸá MySQL á០PostgreSQL ááá¯á· áá°ážáá°ááŒááºážá áá áºáá áºáá¯ááŒá áºáááºá áááºážááẠPython ááœááºáááºáž open source mysql-replication library ááá¯á¡áá¯á¶ážááŒá¯áááºá á¡áááºážáá¯á¶áá»á¬ážááᯠMySQL ááá¬ážáá»á¬ážááŸáá¯ááºáá¯ááºááŒá®áž PostgreSQL áá±áá¬áá±á·á áºááœáẠJSONB á¡áá¬ááá¹áá¯áá»á¬ážá¡ááŒá ẠááááºážáááºážááŒá®ážáá±á¬áẠpl/pgsql áá¯ááºáá±á¬ááºáá»ááºááŒáá·áº á á¬ááŸááºááŒá®áž PostgreSQL áá±áá¬áá±á·á áºááœáẠááŒááºáá¯ááºáá±ážáááºá
pg_chameleon áá¡ááºá¹áá«áááºáá»á¬áž
áá°áá®áá±á¬á¡á
á¯á¡áá±ážá០MySQL schema á¡áá»á¬ážá¡ááŒá¬ážááᯠáá
áºááŸááºáá
áºáá¯ááŸáá
áºáá¯ááá¯á· á¡áá»á¬ážá¡ááŒá¬ážááœá²á·á
ááºážááŸá¯áá
áºáá¯ááœáẠáá
áºááŸáẠPostgreSQL áá±áá¬áá±á·á
áºáá
áºáá¯ááá¯á· áá¯á¶áá°ááœá¬ážááá¯ááºáááºá
á¡áááºážá¡ááŒá
áºááŸáá·áº áá
áºááŸáẠschema á¡áááºáá»á¬ážááẠáá°áá®ááá¯ááºáááºááá¯ááºáá±á
áá°ážáá°ááŸá¯áá±áá¬ááᯠááœá²áá¬ážáá±á¬ MySQL áá¯á¶á
á¶áá°á០ááŒááºáááºááá°ááá¯ááºáá«áááºá
áá¯á¶áá°ááœá¬ážááŒááºáž ááá¯á·ááá¯áẠá¡ááŸá¬ážáá»á¬ážáá¯ááºáá¯ááºááááá±á¬ááá¬ážáá»á¬ážááᯠáááºáá¯ááºáá¬ážáááºá
áá¯á¶áá°ááœá¬ážááŒááºážáá¯ááºáá±á¬ááºáá»ááºáá
áºáá¯á
á®ááᯠdaemon ááŸááááºážáá»á¯ááºáá¬ážáááºá
YAML á¡ááŒá±ááŒá¯ ááá·áºáááºáá»ááºáá»á¬ážááŸáá·áº ááœá²á·á
ááºážááŸá¯áá¯á¶á
á¶ááá¯ááºáá»á¬ážááŸáá
áºááá·áº ááááºážáá»á¯ááºáá«á
ááá°áá¬
á¡áááºááŸááº
vm1
vm2
OS áá¬ážááŸááºáž
CentOS Linux 7.6 x86_64
CentOS Linux 7.5 x86_64
DB áá¬áá¬áá¬ážááŸááºáž
á MySQL 5.7.26
PostgreSQL áá
DB ááááºáááºáž
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 ááᯠá¡á±á¬ááºááŒááºá áœá¬ ááá·áºááœááºážááŒá®ážáá±á¬ááºá virtual áááºáááºážáá»ááºááᯠáááºáá®ážááŒááºážááŸáá·áº á¡áááºááœááºážááŒááºážáá²á·ááá¯á·áá±á¬ áá»ááºááá¯á¡ááºáá»ááºáá»á¬ážááᯠáááºááŒáá·áºáááºážááẠááá¯á¡ááºáááºá ááá¯á·á¡ááŒáẠpip module ááᯠáá±á¬ááºáá¯á¶ážáá¬ážááŸááºážááá¯á· á¡ááºááááºáá¯ááºááŒá®áž pg_chameleon ááᯠááá·áºááœááºážááẠá¡áá¯á¶ážááŒá¯áá«áááºá áá±á¬ááºáá¯á¶ážáá¬ážááŸááºáž 2.0.9 ááŒá áºáá±á¬áºáááºáž pg_chameleon 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 argument ááŒáá·áº pg_chameleon (áá¯ááºáááºááá¯ááẠcommand áá áºáá¯ááŒá áºáááº) ááá¯áá±á«áºááá¯áá«áááºá
(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
ááᯠáá»áœááºá¯ááºááá¯á·ááẠdefault.yml á¡ááŒá Ạconfig-example.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 configuration ááá¯ááºááœááºá áá±á¬á·áááºááá¯ááºááááºáá±áá¬á ááŸááºáááºážáááºáá±áá¬á ááŸááºáááºážáá»á¬ážá¡ááœáẠááá¯ááŸá±á¬ááºááŸá¯áá¬áá áááºááŒáá·áº áááºáááºáá»á¬ážááᯠá á®áá¶ááá·áºááœá²ááá¯ááºááá·áº ááá¹áá¬áá¯á¶ážááá¯ááºáá¬áááºáááºáá»á¬ážá á¡ááá¯ááºážáá áºáá¯áá«ááŸááááºá ááœá¬ážáá±á ááºá¡ááœááºáž á¡áá»áá¯ážá¡á á¬ážáá»á¬ážááᯠááœáŸááºážááá¯ážáááºá¡ááœáẠá ááºážáá»ááºážáá»á¬áž á¥ááá¬ááẠtinyint(1) ááᯠboolean áááºááá¯ážááá¯á· ááŒá±á¬ááºážáá±ážááá·áº á¡áá»áá¯ážá¡á á¬áž overriding rule á¡ááŒá Ạáá¯á¶áá±áááºááŸááºáááºá áá±á¬ááºá¡ááá¯ááºážááœááºá áá»áœááºá¯ááºááá¯á·ááẠáá áºááŸááºáá±áá¬áá±á·á áºááá¯á· áá»áááºáááºááŸá¯á¡áá±ážá áááºá¡áá»ááºá¡áááºáá»á¬ážááᯠáááºááŸááºáá±ážáá«áááºá áá»áœááºá¯ááºááá¯á·áááá á¹á ááœááºá áááºážááẠáááºááŸááºáá¬ážáá±á¬ pg_conn á PostgreSQL áá±áá¬áá±á·á áºááŒá áºáááºá áá±á¬ááºáá¯á¶ážá¡ááá¯ááºážááœááºá ááá¯ááá¯áááºááŸá¬ á¡áááºážá¡ááŒá áºáá±áá¬áá±á·á áºá áá»áááºáááºááŸá¯áá±á¬ááºáá»á¬ážá áááºážááŒá áºááŸáá·áº áá áºááŸááºáá±áá¬áá±á·á áºáá»á¬ážááŒá¬ážááœáẠááŒá±áá¯á¶ááœá²ááŒááºážá¡á á®á¡á ááºá áá»á±á¬áºááœá¬ážáááºááá¯á¡ááºáá±á¬ááá¬ážáá»á¬ážá á á±á¬áá·áºááá¯ááºážáá»áááºá ááŸááºáá¬ááºá áááºáá±á·ááºá»á¡ááœááºá¡á á¬ážááá¯á·ááᯠáá»áœááºá¯ááºááá¯á·áá±á¬áºááŒáá«áááºá "áááºážááŒá áºáá»á¬áž" ááẠá¡áá»á¬ážááááºážááŒá áºáááºááᯠáááááŒá¯áá«á ááá¯ááá¯áááºááŸá¬ áá»áœááºá¯ááºááá¯á·ááẠáá»á¬ážá áœá¬áá±á¬ áááºážááŒá áºáá±áá¬áá±á·á áºáá»á¬ážááᯠáá áºáá¯ááŸáá áºáá¯ááá¯á· áá¯á¶á á¶áááºááŸááºáááºááŸááºááẠáá áºáá¯áááºážáá±á¬ áá áºááŸááºáá±áá¬áá±á·á áºááá¯á· ááá·áºááá¯ááºáááºá
á¥ááᬠáá±áá¬áá±á·á
Ạ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 ááẠá¡ááŸááºáááẠáááºáá°áá¯ááºáá¬ážáá±á¬ ááá¬ážáá»á¬ážááŸáá·áº áááºáá°áá¯ááºáá¬ážáá±á¬ áááºážááœáŸááºááá¬ážáá»á¬áž á¡áá®ážáá®ážáá«ááŸááá±á¬ schemas ááŸá áºáá¯ááŒá áºáá±á¬ pgworld_x ááŸáá·áº sch_chameleon ááá¯á·á ááá¯ááºááŸááºá¡ááŒá Ạá¡ááá¯á¡áá»á±á¬áẠconfigure áá¯ááºáá¬ážáá«áááºá á¡á±á¬ááºáá±á¬áºááŒáá«á¡ááá¯ááºáž áááºááœá±á·áááá·áºá¡ááá¯ááºáž 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 commands áá»á¬ážááᯠrun áá±á¬á¡áá« ááŒá¿áá¬áááŸáá á±ááẠáá±áá¬áá±á·á áºáá¬áá¬ááŸá áºáá¯áá¯á¶ážááŸáá·áº áá»áááºáááºááŸá¯ááᯠá á áºáá±ážááẠá¡áá±ážááŒá®ážáá«áááºá
PostgreSQL node ááœááº-
$> mysql -u usr_replica -Ap'admin123' -h 192.168.56.102 -D world_x
MySQL node ááœááº-
$> psql -p 5433 -U usr_replica -h 192.168.56.106 db_replica
áá±á¬ááºááẠpg_chameleon (áá¯ááºáááºááá¯) á¡áááá·áºáá¯á¶ážáá¯ááẠáááºáááºážáá»ááºááᯠááŒááºáááºááŒá®ážá áááºážááŒá áºááᯠááá·áºáᬠáá¯á¶á á¶áá°ááᯠá áááºáá«á pg_chameleon á¡ááœáẠcreate_replica_schema á¡ááŒááºážá¡áá¯á¶ááẠáá»áœááºá¯ááºááá¯á·ááœá±ážááœá±ážáá¬ážááŒá®ážááŒá áºááá·áºá¡ááá¯ááºáž PostgreSQL áá±áá¬áá±á·á áºááœáẠáá¯á¶áá±áá¯á¶á ᶠ(sch_chameleon) ááŸáá·áº ááœá¬ážááŒááºážá¡á á®á¡á áẠ(pgworld_x) ááᯠáááºáá®ážáá±ážáá«áááºá add_source á¡ááŒá±á¬ááºážááŒáá»ááºááẠconfiguration file (default.yml) ááá¯áááºááŒááºážááŒáá·áº á¡áááºážá¡ááŒá áºáá±áá¬áá±á·á áºááᯠconfiguration ááœáẠáá±á«ááºážááá·áºááŒá®áž áá»áœááºá¯ááºááá¯á·ááá á¹á ááœáẠáááºážááẠmysql ááŒá áºááŒá®ážá configuration file á¡ááœááºážááŸá ááá·áºáááºáá»ááºáá»á¬ážá¡áá±á«áºá¡ááŒá±áá¶á configuration ááᯠinit_replica á០á¡á ááŒá¯áá«áááºá
$> chameleon create_replica_schema --debug
$> chameleon add_source --config default --source mysql --debug
$> chameleon init_replica --config default --source mysql --debug
ဠcommand áá¯á¶ážáá¯á output ááẠáááºážááá¯á·ááᯠá¡á±á¬ááºááŒááºá áœá¬ áá¯ááºáá±á¬ááºáá²á·ááŒá±á¬ááºáž ááŸááºážááŸááºážáááºážáááºáž áá±á¬áºááŒáááºá áá»ááºá á®ážááŸá¯áá»á¬áž ááá¯á·ááá¯áẠá¡áá¬ážá¡ááá¯á¡ááŸá¬ážá¡ááœááºážáá»á¬ážááᯠááŒá±ááŸááºážáááºážááᯠá¡ááááºá¡ááŒáœááºáá»á¬ážááŒáá·áº ááá¯ážááŸááºážááŸááºážáááºážáá±á¬ áááºáá±á·áá»áºáá»á¬ážááŒáá·áº á¡á á®áááºáá¶áá«áááºá
áá±á¬ááºáá¯á¶ážááœááºá áá»áœááºá¯ááºááá¯á·ááẠstart_replica ááᯠá¡áá¯á¶ážááŒá¯á áá¯á¶áá°ááœá¬ážááŒááºážááᯠá áááºááŒá®áž á¡á±á¬ááºááŒááºááá·áº áááºáá±á·áá»áºááᯠáááºáá¶áááŸááá«áááºá
$> chameleon start_replica --config default --source mysql
output: Starting the replica process for source mysql
áá°ážáá°ááŸá¯á¡ááŒá±á¡áá±á¡á¬áž show_status á¡ááŒá±á¬ááºážááŒáá»ááºááᯠá¡áá¯á¶ážááŒá¯á áá±ážááŒááºážááá¯ááºááŒá®áž show_errors á¡ááŒá±á¬ááºážááŒáá»ááºááᯠá¡áá¯á¶ážááŒá¯á á¡ááŸá¬ážáá»á¬ážááᯠááŒáá·áºááŸá¯ááá¯ááºáá«áááºá
áá»áœááºá¯ááºááá¯á·ááŒá±á¬áá²á·ááá·áºá¡ááá¯ááºážá áá¯á¶áá°ááœá¬ážááŒááºážáá¯ááºáá±á¬ááºáá»ááºáá áºáá¯á á®ááᯠdaemons ááŸááááºážáá»á¯ááºáá¬ážáááºá áááºážááá¯á·ááá¯ááŒáá·áºááŸá¯áááºá á¡á±á¬ááºááœááºáá±á¬áºááŒáá¬ážááá·áºá¡ááá¯ááºáž Linux ps command ááŒáá·áº áá¯ááºáááºážá ááºááá¬ážááᯠá á¯á¶á ááºážáá±ážááŒááºážáá«áááºá
á¡á±á¬ááºáá±á¬áºááŒáá«á¡ááá¯ááºážá á¡áá»áááºááŸáá·áºáááŒá±ážáá® áá ááºážáááºááá»ááºáž áá¯á¶áá°áá°ážáá°ááŒááºážááᯠááá·áºááœááºážá ááºážá á¬ážáááºááá¯ááºáá«á áá»áœááºá¯ááºááá¯á·ááẠááá¬ážáá áºáá¯áááºáá®ážáᬠMySQL áá±áá¬áá±á·á áºáá²ááá¯á· ááŸááºáááºážá¡áá»áá¯á·ááᯠááá·áºááœááºážáᬠdaemons áá»á¬ážááᯠá¡ááºááááºáá¯ááºááŒá®áž ááá¬ážááᯠPostgreSQL áá±áá¬áá±á·á áºááá¯á· ááŸááºáááºážáá»á¬ážááŸáá·áº áááºáá°ááœá¬ážááẠpg_chameleon ááŸá sync_tables á¡ááŒááºážá¡áá¯á¶ááᯠáá±á«áºááá¯áá«á
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 command áá»á¬ážááẠáááºážáá¡áá¯á¶ážáááºááŒá áºáááá·áºáááºá áá áºááŸááºááá¬ážá¡á¬ážáá¯á¶ážáá¡áááºážáá»á¬ážááᯠáááºáá°áá°ážáá¬ážááŒá±á¬ááºáž áá±áá»á¬ááŒá®ážáá±á¬ááºááœáẠááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºááẠááá¯á¡ááºááŒá®áž ááááºááẠá¡áááºážá¡ááŒá áºáá±áá¬áá±á·á Ạááá¯á·ááá¯áẠáá°ážáá°ááŸá¯á¡á á®á¡á áẠ(sch_chameleon) ááᯠáááºááœáŸááºážááŒááºážáááŸááá² áááºáááºá áœá¬ááœáŸá±á·ááŒá±á¬ááºážáá¬ážáá±á¬ PostgreSQL áá±áá¬áá±á·á áºáá áºáᯠááŒá áºáá¬áááºááŒá áºáááºá
$> chameleon stop_replica --config default --source mysql
$> chameleon detach_replica --config default --source mysql --debug
ááá¹áááŸááá«á áá°áááºážááœá²á·á ááºážáá¯á¶ááŸáá·áº áá¯á¶áá°ááœá¬ážááŸá¯á¡á á®á¡á ááºááᯠáá»ááºááẠá¡á±á¬ááºáá« command áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá
$> chameleon drop_source --config default --source mysql --debug
$> chameleon drop_replica_schema --config default --source mysql --debug
pg_chameleon áá¡á¬ážáá¬áá»ááºáá»á¬áž
ááœááºáá°áá±á¬ setup ááŸáá·áº configuration á
ááŸááºážáááºážáá±á¬ error áááºáá±á·áá»áºáá»á¬ážááŒáá·áº ááœá²ááœá²áá»ááºáá»á¬ážááᯠá¡ááœááºááá° ááŒá±ááŸááºážááá¯ááºááŒá®áž ááœá²ááŒá¬ážáááºááŸááºáá«á
áááŠážááœá²á·á
ááºážááŸá¯áá¯á¶á
á¶ááᯠáááŒá±á¬ááºážáá²áá² á¡ááá¯áááºáá±á¬ááºážá¡áá°ážááá¬ážáá»á¬ážááᯠáááŠážááá·áºááœááºážááŒá®ážáá±á¬áẠáá¯á¶áá°ááœá¬ážááŒááºážááá¯á· áá±á«ááºážááá·áºááá¯ááºáááºá
áá
áºááŸááºáá±áá¬áá±á·á
áºáá
áºáá¯áááºážá¡ááœáẠáááºážááŒá
áºáá±áá¬áá±á·á
áºá¡áá»á¬ážá¡ááŒá¬ážááᯠááŒááºáááºáááºááŸááºááẠááŒá
áºááá¯ááºááŒá®áž á¡áááºá áááºááẠáá
áºáᯠááá¯á·ááá¯áẠáá
áºáá¯áááºááá¯áá±á¬ MySQL áá±áá¬áá±á·á
áºáá»á¬ážá០áá±áá¬áá»á¬ážááᯠPostgreSQL áá±áá¬áá±á·á
áºáá
áºáá¯ááá¯á· áá±á«ááºážá
ááºáá«á áááºážááẠá¡ááœááºá¡áá¯á¶ážáááºáá«áááºá
áááºááœá±ážáá»ááºáá¬ážáá±á¬ááá¬ážáá»á¬ážááᯠáá¯á¶áá°ááœá¬ážááẠáááá¯á¡ááºáá«á
pg_chameleon áá¡á¬ážáááºážáá»ááºáá»á¬áž
MySQL 5.5 ááŸáá·áºá¡áááºááᯠá¡áááºážá¡ááŒá
áºá¡ááŒá
áºááŸáá·áº PostgreSQL 9.5 ááŸáá·áºá¡áááºááœááºáᬠáá
áºááŸááºáá±áá¬áá±á·á
áºá¡ááŒá
Ạáá¶á·ááá¯ážáá¬ážáááºá
ááá¬ážáá
áºáá¯á
á®ááá¯ááºážááœáẠá¡ááá ááá¯á·ááá¯áẠáá°ážááŒá¬ážáá±á¬áá±á¬á·áá
áºáá¯ááŸáááááºá ááá¯ááºáá«á ááá¬ážáá»á¬ážááᯠinit_replica áá¯ááºáááºážá
ááºá¡ááœááºáž á¡á
ááŒá¯áá¯ááºáá±á¬ááºáá±á¬áºáááºáž áááºáá°ááœá¬ážáááºááá¯ááºáá«á
áá
áºáááºážáááºážáá°ážáá°ááŒááºáž - MySQL á០PostgreSQL ááá¯á·áá¬á ááá¯á·ááŒá±á¬áá·áº áááºážááẠ"active-passive" circuit á¡ááœááºáᬠááá·áºáá»á±á¬áºáááºá
áááºážááŒá
áºááẠMySQL áá±áá¬áá±á·á
áºáá
áºáá¯áᬠááŒá
áºááá¯ááºááŒá®áž á¡áááºážá¡ááŒá
áºáá
áºáá¯á¡áá±ááŒáá·áº PostgreSQL áá±áá¬áá±á·á
áºá¡ááœáẠáá¶á·ááá¯ážááŸá¯ááŸá¬ á
ááºážáááºáá²ááŒá
áºááŒá®áž á¡ááá·áºá¡áááºáá»á¬ážááŒáá·áºáᬠ(ááá¯ááá¯áá±á·áá¬áááº
pg_chameleon á¡ááœáẠááááºáá»á¬áž
pg_chameleon ááœáẠáá¯á¶áá°áá°ážáááºážááẠMySQL á០PostgreSQL ááá¯á· áá±áá¬áá±á·á áºáá áºáá¯ááᯠááœáŸá±á·ááŒá±á¬ááºážáááºá¡ááœáẠáá±á¬ááºážááœááºáááºá áááá¬áááºááŸá¬ážáá±á¬ á¡á¬ážáááºážáá»ááºááŸá¬ áá°ážáá°ááŒááºážááŸá¬ áá áºáááºážáááºážáá¬ááŒá áºáá±á¬ááŒá±á¬áá·áº áá±áá¬áá±á·á áºáá»áœááºážáá»ááºáá°áá»á¬ážááẠááœáŸá±á·ááŒá±á¬ááºážááŒááºážááŸááœá²á á¡ááŒá¬ážáááºááá·áºá¡áá¬á¡ááœááºá០áááºážááᯠá¡áá¯á¶ážááŒá¯ááá¯ááŒááºážáááŸááá±á ááá¯á·áá±á¬áº áá áºáááºážááœá¬ážáá¯á¶áá°ááœá¬ážááŒááºážááŒá¿áá¬ááᯠá¡ááŒá¬ážáá±á¬ open source tool - SymmetricDS ááŒáá·áº ááŒá±ááŸááºážááá¯ááºáá«áááºá
ááá¬ážáááºá
á¬ááœááºá
á¬áááºážáá»á¬ážááœáẠááá¯ááá¯áááºááŸá¯áá«á
SymmetricDS áááŒá¯á¶áá¯á¶áá¯á¶ážáááºáá»ááº
SymmetricDS ááẠáááºááá·áºáá±áá¬áá±á·á áºááá¯áááᯠá¡ááŒá¬ážáá¯á¶áá±áá¬áá±á·á áºááá¯á· áááºáá°ááœá¬ážá á±ááá·áº ááœáá·áºáááºážáá±á¬ á¡áááºážá¡ááŒá áºáááááá¬áá áºáá¯ááŒá áºáááº- Oracleá MongoDBá PostgreSQLá MySQLá SQL Serverá MariaDBá DB2á Sybaseá Greenplumá Informixá H2á Firebird ááŸáá·áº á¡ááŒá¬ážáá±á¬ cloud áá±áá¬áá±á·á áºááŒá áºáááºáá»á¬ážá á¥ááᬠRedshift ááŸáá·áº Azure á áááºááá¯á·ááᯠáááŸáááá¯ááºáá±á¬ á¡ááºá¹áá«áááºáá»á¬áž- áá±áá¬áá±á·á áºááŸáá·áº ááá¯ááºááᯠáááºáá°ááŒá¯ááŒááºážá áá»á¬ážá áœá¬áá±á¬ áá¬á áá¬áá±áá¬áá±á·á Ạáá°ážáá°ááŒááºážá á á áºáá¯ááºááŒá®áž áááºáá°ááŒá¯ááŒááºážá á¡ááœááºááŒá±á¬ááºážááŒááºážááŸáá·áº á¡ááŒá¬ážá¡áá¬áá»á¬ážá áááºážááẠJava áááááá¬áá áºáá¯ááŒá áºááŒá®áž JRE ááá¯á·ááá¯áẠJDK (áá¬ážááŸááºáž 8.0 ááŸáá·áºá¡áááº) á á á¶áá¯ááºááŒááºáá»ááºáá áºáᯠááá¯á¡ááºáááºá á€áá±áá¬ááœááºá á¡áááºážá¡ááŒá áºáá±áá¬áá±á·á áºááŸá á¡á áá»áá¯ážááŸá¯áá»á¬ážáá®ááá¯á· áá±áá¬ááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠááŸááºáááºážáááºááŒá®áž á¡á á¯ááá¯ááºáá¯á¶á á¶ááŒáá·áº ááá·áºáá»á±á¬áºáá±á¬áá áºááŸááºáá±áá¬áá±á·á áºááá¯á· áá±ážááá¯á·ááá¯ááºáá«áááºá
SymmetricDS á¡ááºá¹áá«áááºáá»á¬áž
áááááá¬ááẠááááºáá±á¬ááºáž áá®ážááŒá¬ážááŒá
áºááŒá®ážá ááŸá
áºáᯠááá¯á·ááá¯áẠáá
áºáá¯áááºááá¯áá±á¬ áá±áá¬áá±á·á
áºáá»á¬ážááẠáá±áá¬áááŸááºááá¯ááºáááºáᯠááá¯ááá¯áááºá
áááºá
ááºáá±áá¬áá±á·á
áºáá»á¬ážááẠáá±áá¬ááŒá±á¬ááºážáá²ááŸá¯ááŸááºáááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á áá
áºááŒáá¯ááºáááºážáá¯ááºáá±á¬ááºááŒá®áž ááá¯ááºá
áá
áºá¡ááŒá±áá¶áá±áá¬áá±á·á
áºáá»á¬ážááẠááá¯ááºáá
áºááŒáá¯ááºáááºážáá»áááºááá¯ááºááŒááºážááᯠá¡áá¯á¶ážááŒá¯áááºá
á
ááºážáá»ááºážá¡á
á¯á¶á¡áá±á«áº á¡ááŒá±áá¶á Push ááŸáá·áº Pull áááºážáááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á ááŸá
áºáááºážáá°ážáá¯á¶áá°áá°ážááŒááºážá
áá¯á¶ááŒá¯á¶ááŒá®áž Bandwidth áááºážáá±á¬ ááœááºáááºáá»á¬ážááŸáááá·áº áá±áá¬ááœáŸá²ááŒá±á¬ááºážááŸá¯ ááŒá¯áá¯ááºááá¯ááºáááºá
áá»áá¯á·ááœááºážáá»ááºááŸáá·áº á¡ááá¯á¡áá»á±á¬áẠáááááá¹áááŒá±ááŸááºážááŸá¯á¡ááŒá®ážááœáẠnode áá»á¬ážááŒááºáááºá
áááºáá±á¬á¡áá« á¡ááá¯á¡áá»á±á¬ááºááŒááºáááºááá°ááŒááºážá
Cloud ááŸáá·áº ááá¯ááºáááºáá®ááŒá®áž á¡á
áœááºážáááºáá±á¬ ááá¯ážáá»á²á· API áá»á¬ážá
ááá°áá¬
SymmetricDS ááᯠááœá±ážáá»ááºá
áᬠááŸá
áºáá¯áá²á០áá
áºáá¯ááŒáá·áº configure áá¯ááºááá¯ááºáá«áááºá
slave (child) node ááŸá
áºáá¯ááŒá¬ážááœáẠáá±áá¬áá°ážáá°ááŸá¯ááᯠáááá¯ááŸááŸáááŸáá¯ááºážáá±ážáá±á¬ áá¬á
áᬠ(ááá) node áá
áºáá¯ááŸáá·áº ááá±áž node áá»á¬ážááŒá¬ážááœáẠáááºááœááºááŸá¯ááẠparent ááŸáááá·áºáᬠááŒá
áºáá±á«áºáá«áááºá
áááºááŒáœáá±á¬ node (Node 1) ááẠááŒá¬ážáá¶áá
á¹á
ááºážááá«áá² á¡ááŒá¬ážá¡áááºáááºáá±á¬ node (Node 2) ááŸáá·áº áááºáá°ááŒá¯áááºá¡ááœáẠáááºááœááºááá¯ááºáááºá
ááœá±ážáá»ááºá
áá¬ááŸá
áºáá¯á
áá¯á¶ážááœáẠPush ááŸáá·áº Pull ááá¯á¡áá¯á¶ážááŒá¯á áá±áá¬áááŸááºááŸá¯ááŒá
áºáá±á«áºáááºá á€á¥ááá¬ááœáẠáá»áœááºá¯ááºááá¯á·ááẠáááºááŒáœáá±á¬ááœá²á·á
ááºážááŸá¯áá¯á¶á
á¶ááᯠáá¯á¶ážáááºáá«áááºá áááá¯áá¬áááºáá¬áá
áºáá¯áá¯á¶ážááᯠáá±á¬áºááŒááẠá¡áá»áááºá¡áá±á¬áºááŒá¬áá±áááºááŒá
áºáá±á¬ááŒá±á¬áá·áº áááºááá¯áá±ááááŒá¯áá«á
SymmetricDS ááᯠááá·áºááœááºážááŒááºážááẠá¡ááœááºááá¯ážááŸááºážáá«áááº- áá
áºááá¯ááºá ááœáá·áºáááºážá¡áááºážá¡ááŒá
áºáá¬ážááŸááºážááᯠáá±á«ááºážáá¯ááºáá¯ááºáá«á
á¡áááºááŸááº
vm1
vm2
OS áá¬ážááŸááºáž
CentOS Linux 7.6 x86_64
CentOS Linux 7.6 x86_64
DB áá¬áá¬áá¬ážááŸááºáž
á MySQL 5.7.26
PostgreSQL áá
DB ááááºáááºáž
3306
5832
á¡áá¯ááºáá®-ááááºá
á¬
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 node á¡áááº
Corp-000
á
ááá¯áž - á
á€ááœáẠáá»áœááºá¯ááºááá¯á·ááẠSymmetricDS ááᯠ/usr/local/symmetric-server-3.9.20 ááœáẠááá·áºááœááºážááŒá®áž á¡áá»áá¯ážáá»áá¯ážáá±á¬ áááºážááŒá±á¬ááºážááœá²áá»á¬ážááŸáá·áº ááá¯ááºáá»á¬ážááᯠááá¯áá±áá¬ááœáẠááááºážáááºážáá¬ážáááºááŒá áºáááºá áá»áœááºá¯ááºááá¯á·ááẠááá°áá¬áá»á¬ážááŸáá·áº á¡ááºáá»ááºááœá²áááºážááœáŸááºáá»á¬ážááᯠá áááºáááºá á¬ážáá«áááºá ááá°áá¬áááºážááœáŸááºááœáẠnode áá¯ááºááá¹áááá»á¬ážáá«ááŸááá±á¬ ááá°áá¬ááœá²á·á ááºážáá¯á¶ááá¯ááºáá»á¬ážá¡ááŒáẠááá·áºá¡á¬áž áá»ááºááŒááºá áœá¬á áááºááá¯ááºááẠá¥ááᬠSQL script áá»á¬ážáá«ááŸááááºá
ááá°áá¬áááºážááœáŸááºááœáẠnode áá¯ááºááá¹áááá»á¬ážáá«ááŸááá±á¬ configuration ááá¯ááºáá¯á¶ážáá¯ááá¯áá»áœááºá¯ááºááá¯á·ááœá±á·ááŒááºáááẠ- á¡áááºáááºá¡áá»áá¯á·áá±á¬á¡á á®á¡á ááºáá áºáá¯ááœáẠnode áááá±á¬ááá¬áááá¯ááŒááááºá
corp-000.properties
store-001.properties
store-002.properties
SymmetricDS ááœáẠá¡ááŒá±áᶠ3-node áá®ááá¯ááºáž (option 1) á¡ááœáẠááá¯á¡ááºáá±á¬ configuration ááá¯ááºáá»á¬ážá¡á¬ážáá¯á¶ážááŸáááŒá®áž áá°áá®áá±á¬ááá¯ááºáá»á¬ážááᯠ2-node áá®ááá¯ááºáž (ááœá±ážáá»ááºááŸá¯ 2) á¡ááœáẠá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá ááá°áá¬áááºážááœáŸááºá០ááá¯á¡ááºáá±á¬ ááœá²á·á ááºážááŸá¯áá¯á¶á á¶ááá¯ááºááᯠvm1 host ááŸá á¡ááºáá»ááºáá»á¬ážááá¯á· áá°ážáá°áá«á á€áá²á·ááá¯á· ááœááºáá±á«áºáá¬áááº-
$> 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 configuration ááŸá ဠnode á¡á¬áž corp-000 áá¯áá±á«áºááŒá®áž áá±áá¬áá±á·á áºáá»áááºáááºááŸá¯ááᯠá¡áááºáá±á¬áºááŒáá« áá»áááºáááºááŸá¯á á¬ááŒá±á¬ááºážááŸáá·áº á¡áá±á¬áá·áºáááºá¡áá±á¬ááºá¡áá¬ážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááá·áº mysql jdbc driver á០ááá¯ááºááœááºáá±á¬ááºááœááºáá«áááºá áá»áœááºá¯ááºááá¯á·ááẠreplica_db áá±áá¬áá±á·á áºááá¯á· áá»áááºáááºáá¬ážááŒá®áž ááá¬ážááœááºáá»á¬ážááᯠáááºáá®ážáá±á ááºá¡ááœááºáž ááá¬ážáá»á¬ážááᯠáááºáá®ážáááºááŒá áºáááºá sync.url ááẠsynchronization á¡ááœáẠnode ááá¯á·áá»áááºáááºááŸá¯ááááºáá±áá¬ááá¯ááŒááááºá
host vm2 ááŸá Node 2 ááᯠstore-001 á¡ááŒá ẠáááºááŸááºááŒá®áž áá»ááºááᯠá¡á±á¬ááºáá±á¬áºááŒáá« node.properties ááá¯ááºááœáẠáááºááŸááºáá¬ážáá«áááºá Node store-001 ááẠPostgreSQL áá±áá¬áá±á·á áºááᯠáá¯ááºáá±á¬ááºááŒá®áž pgdb_replica ááẠáá¯á¶áá°áá±áá¬áá±á·á áºááŒá áºáááºá register.url ááẠhost vm2 ááᯠhost vm1 ááá¯á·áááºááœááºááá¯ááºááŒá®áž áááºážá០configuration á¡áá±ážá áááºáá»á¬ážááᯠáááºáá¶áááŸáá á±áááºá
$> 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 á¥ááá¬ááœáẠáá±áá¬áá±á·á áºáá¬áá¬ááŸá áºáᯠ(node ââááŸá áºáá¯) á¡ááŒá¬áž ááŸá áºáááºážáá°ážáá¯á¶áá°áá°ážáá°ááŸá¯ááᯠá áá áºááá·áºááœááºážááẠáá±á¬ááºáá»á¬ážáá«ááŸááááºá á¡á±á¬ááºáá«á¡ááá·áºáá»á¬ážááᯠhost vm1 (corp-000) ááœáẠáá¯ááºáá±á¬ááºááŒá®áž ááá¬áž 4 áá¯áá«áá±á¬ ááá°áᬠschema áá áºáá¯ááᯠáááºáá®ážáá«áááºá ááá¯á·áá±á¬áẠsymadmin command ááŒáá·áº create-sym-tables áá»á¬ážááᯠrun ááŒááºážááŒáá·áº node áá»á¬ážááŒá¬ážááœáẠá ááºážáá»á¥áºážá ááºážáááºážáá»á¬ážááŸáá·áº áŠážáááºáá»ááºáá»á¬ážá¡á¬áž ááááºážáááºážáá¬ážááá·áº directory tables áá»á¬ážááᯠáááºáá®ážáá±ážáá«áááºá áá±á¬ááºáá¯á¶ážááœáẠááá°áá¬áá±áá¬ááᯠááá¬ážáá»á¬ážáá²ááá¯á· áááºáá±ážáááºá
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_transaction ááŸáá·áº sale_return_line_item) ááẠstore-001 á០corp-000 ááá¯á· áá¯á¶áá°áá°ážááẠá¡ááá¯á¡áá»á±á¬áẠá á®á ááºáá¬ážáá«áááºá ááᯠáá»áœááºá¯ááºááá¯á·ááẠcorp-2 ááŸáá±áá¬ááá¯áááºáá¶áááŸááááºááŒááºáááºáááºá¡ááœáẠhost vm001 (store-000) ááŸá PostgreSQL áá±áá¬áá±á·á áºááœáẠschema áá áºáá¯ááá¯áááºáá®ážáá«áááºá
vm2$> cd /usr/local/symmetric-server-3.9.20/bin
vm2$> ./dbimport --engine store-001 --format XML create_sample.xml
vm1 ááŸá MySQL áá±áá¬áá±á·á áºááœáẠááá°áá¬ááá¬ážáá»á¬ážááŸáá·áº SymmetricDS áááºááá±á¬ááºááá¬ážáá»á¬áž áá«ááŸáááŒá±á¬ááºáž áá±áá»á¬áá«á á±á SymmetricDS á áá áºááá¬ážáá»á¬áž (sym_ ááŒáá·áºááŸá±á·áááºáá¬ážáááº) ááẠáááºááŸáá¡áá»áááºááœáẠnode corp-000 ááœááºáá¬áááá¯ááºáá±á¬ááŒá±á¬áá·áº áááºážááẠáá»áœááºá¯ááºááá¯á·áááºáá®ážáá¬ážáá±á¬-sym-tables ááœááºáááºážáá»á¬ážááá¯áá¯ááºáá±á¬ááºááŒá®áž áááºáá°ááœá¬ážááŸá¯ááá¯á á®áá¶ááá·áºááœá²ááá·áºáá±áá¬ááŒá áºáááºá node store-001 ááŸá áá±áá¬áá±á·á áºááœáẠáá±áá¬ááá«áá² ááá°áá¬ááá¬áž 4 áá¯áᬠááŸááá«áááºá
á¡á¬ážáá¯á¶ážá áááºáááºážáá»ááºááẠá¡á±á¬ááºáá±á¬áºááŒáá«á¡ááá¯ááºáž node ááŸá áºáá¯áá¯á¶ážááœáẠsym server áá¯ááºáááºážá ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºááẠá¡áááºááá·áºááŒá áºáá±áá«ááŒá®á
vm1$> cd /usr/local/symmetric-server-3.9.20/bin
vm1$> sym 2>&1 &
ááŸááºáááºážááá·áºááœááºážááŸá¯áá»á¬ážááᯠSymmetricDS ááá·áºááœááºážáá¬ážááá·áº áááºážááœáŸááºááá¯ááºááŸá ááŸááºáááºážááá¯ááºááœá²ááŸá ááŸááºáááºážááá¯áẠ(symmetric.log) ááŸáá·áº á á¶áá¯ááºáá±ážááŸá¯ááá¯á· áá±ážááá¯á·áááºá sym server ááᯠnode store-001 ááœáẠá áááºááá¯ááºáá«ááŒá®á
vm2$> cd /usr/local/symmetric-server-3.9.20/bin
vm2$> sym 2>&1 &
vm2 host ááœáẠsym server áá¯ááºáááºážá ááºááᯠáá¯ááºáá±á¬ááºáá«áá áááºážááẠPostgreSQL áá±áá¬áá±á·á áºááœáẠSymmetricDS áááºááá±á¬ááºááá¬ážáá»á¬ážááᯠáááºáá®ážáá±ážáááºááŒá áºáááºá á¡áááºá áááºááẠnode ááŸá áºáá¯áá¯á¶ážááœáẠsym server áá¯ááºáááºážá ááºááᯠáá¯ááºáá±á¬ááºáá«áá áááºážááá¯á·ááẠcorp-000 á០store-001 ááá¯á· data áá»á¬ážááᯠáááºáá°ááœá¬ážááẠá¡áá»ááºážáá»ááºáž ááŸáááŸáá¯ááºážáá±á¬ááºááœááºáá«áááºá á áá¹ááá·áºá¡áááºážáááºááŒá¬ááŒá®ážáá±á¬áẠááŸá áºáááºá áá¯á¶ážááŸá ááá¬áž 4 áá¯áá¯á¶ážááᯠáá±ážááŒááºážáá«áá áááºáá°ááŒá¯ááŒááºáž á¡á±á¬ááºááŒááºááŒá±á¬ááºáž ááœá±á·ááááºááŒá áºáá«áááºá ááá¯á·ááá¯áẠáááºááẠá¡á±á¬ááºáá« command ááŒáá·áº node store-001 ááá¯á· bootstrap ááᯠcorp-000 ááá¯á·áá±ážááá¯á·ááá¯ááºáááºá
vm1$> ./symadmin --engine corp-000 reload-node 001
á€á¡áá»áááºááœááºá node corp-000 (host: vm1) ááŸá MySQL áá±áá¬áá±á·á áºááŸá item table ááœáẠááŸááºáááºážá¡áá áºáá áºáá¯ááᯠááá·áºááœááºážáá¬ážááŒá®áž node store-001 (host: vm2) ááŸá PostgreSQL áá±áá¬áá±á·á áºááá¯á· áááºážááá¯á¶áá°ááœá¬ážááŸá¯ááᯠáááºá á áºáá±ážááá¯ááºáá«áááºá áá±áá¬ááᯠcorp-000 á០store-001 ááá¯á·ááœáŸá±á·ááẠPull áá¯ááºáá±á¬ááºáá»ááºááᯠáá»áœááºá¯ááºááá¯á·ááœá±á·ááŒááºááááºá
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)
store-001 á០corp-000 ááá¯á· data ááœáŸá±á·ááẠPush áá¯ááºáá±á¬ááºáá»ááºááᯠáá¯ááºáá±á¬ááºáááºá áá»áœááºá¯ááºááá¯á·ááẠsale_transaction table áá²ááá¯á· ááŸááºáááºážáá áºáá¯ááᯠááá·áºááœááºážááŒá®áž áá°ážáá°ááŒááºážá¡á±á¬ááºááŒááºááŒá±á¬ááºáž á¡áááºááŒá¯áá«áááºá
MySQL ááŸáá·áº PostgreSQL áá±áá¬áá±á·á áºáá»á¬ážááŒá¬ážááœáẠááá°áá¬ááá¬ážáá»á¬ážááᯠááŸá áºáááºážáá°ážáá¯á¶áá°áá°ážááŒááºážá á¡á±á¬ááºááŒááºá áœá¬áááºáááºááŸá¯ááᯠáá»áœááºá¯ááºááá¯á·ááœá±á·ááŒááºááá«áááºá á¡áá¯á¶ážááŒá¯áá°ááá¬ážá¡áá áºáá»á¬ážá¡ááœáẠáá¯á¶áá°ááœá¬ážááŒááºážááᯠá áá áºááá·áºááœááºážáááºá á€á¡ááá·áºáá»á¬ážááᯠááá¯ááºáá¬áá«- áá»áœááºá¯ááºááá¯á·ááẠá¥ááá¬á¡á¬ážááŒáá·áº ááá¬áž t1 ááᯠáááºáá®ážááŒá®áž áááºážá áá¯á¶áá°ááœá¬ážááŒááºážááá¯ááºáᬠá ááºážáá»ááºážáá»á¬ážááᯠá¡á±á¬ááºáá«á¡ááá¯ááºáž ááŒááºáááºáááºááŸááºáá«áááºá á€áááºážááŒáá·áº áá»áœááºá¯ááºááá¯á·ááẠcorp-000 á០store-001 ááá¯á· áá°ážáá°ááŒááºážááá¯áᬠconfigure áá¯ááºáá«áááºá
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 command ááá¯á¡áá¯á¶ážááŒá¯á ááá¬ážá¡áá áºáá áºáá¯áááºááá¯ážááŒááºážááŒá áºááŒá®ážá áááºážááẠááá¬ážáá¡áááá¹áá«ááºááœáá·áºááá¯áá»ááºáá»á¬ážááá¯ááŒá±áá¯á¶ááŒá¯áá¯ááºáááºá¡ááœááºá¡á áá»áá¯ážáá»á¬ážááá¯ááŒááºáááºáááºáá®ážáá±ážááá·áºááœá²á·á ááºážáá¯á¶ááœá²á·á ááºážáá¯á¶á¡á¬áž á¡áááá±ážááŒááºážááŒá áºáááºá send-schema ááᯠnode store-001 ááá¯á· schema á¡ááŒá±á¬ááºážá¡áá²áá»á¬áž áá±ážááá¯á·ááẠáá¯ááºáá±á¬ááºááŒá®áž ááá¬áž t1 á áá¯á¶áá°ááœá¬ážááŒááºážááᯠá á®á ááºáááºááŸááºáá¬ážáááºá
vm1$> ./symadmin -e corp-000 --node=001 sync-triggers
vm1$> ./symadmin send-schema -e corp-000 --node=001 t1
SymmetricDS áá¡áá»áá¯ážáá»á±ážáá°ážáá»á¬áž
three-node ááá¯á·ááá¯áẠtwo-node circuit ááá¯áááºáá®ážáááºá¡ááœáẠá¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ ááá¯ááºááœá²áá
áºáá¯á¡áá«á¡ááẠááœááºáá°áá±á¬áááºáááºááŸá¯ááŸáá·áº ááœá²á·á
ááºážááŸá¯áá¯á¶á
á¶á
áá¬áá¬áá»á¬ážá áááºááºáá±á¬á·áá»á¬ážááŸáá·áº ááá¯ááá¯ááºážáá
á¹á
ááºážáá»á¬áž á¡áá«á¡ááẠááááºáá±á¬ááºážáá±áá¬áá±á·á
áºáá»á¬ážááŸáá·áº ááááºáá±á¬ááºážááœááºáááºááŸá¯á
áááºááá·áºáá±áá¬áá±á·á
áºááá¯áááᯠá
ááºááœááºážá WAN ááá¯á·ááá¯áẠcloud ááœáẠá¡ááŒá¬ážáá±áá¬áá±á·á
áºááá¯á· áá°ážáá°áá«á
á¡áááºááŒá±áá±á¬áá¯á¶áá°ááœá¬ážáááºá¡ááœáẠáá±áá¬áá±á·á
áºááŸá
áºáᯠááá¯á·ááá¯áẠáá±á¬ááºáá±á«ááºážáá»á¬ážá
áœá¬ááŒáá·áº á¡áá±á¬ááºážáá¯á¶ážáá¯ááºáá±á¬ááºááá¯ááºááŒá±á
GUI ááŸáá·áº á¡ááœááºáá±á¬ááºážááœááºáá±á¬ áá¶á·ááá¯ážááŸá¯ááŒáá·áº á¡ááá±ážáá¬ážááŸááºážá
SymmetricDS áá¡á¬ážáááºážáá»ááºáá»á¬áž
á¡áááºáááŒá±ááá¯ááºáá±á¬ áááºááá±á¬ááºááá¬ážáá»á¬ážááᯠáááºááẠSQL ááŒá±áá¬áá»ááºáá»á¬ážááŸáááá·áº command line áá±á«áºááŸá á
ááºážáá»ááºážáá»á¬ážááŸáá·áº áááºážááŒá±á¬ááºážááᯠááá¯ááºááá¯ááºáááºááŸááºááẠááá¯á¡ááºáá«áááºá
áá¯á¶áá°ááœá¬ážááŒááºážá¡ááœáẠááá¬ážá¡áá»á¬ážá¡ááŒá¬ážááᯠá
áá
áºááá·áºááœááºážááŒááºážááẠá
ááºážáá»ááºážáá»á¬ážááŸáá·áº áááºáá°ááœá¬ážááŒááºážá áŠážáááºáá»ááºááá¯á·ááᯠáááºááŸááºáá±ážááá·áº SQL áá¯ááºááŒááºáá»ááºáá»á¬ážá¡á¬áž áááºáá®ážááẠscripts áá»á¬ážááᯠáááºá¡áá¯á¶ážááŒá¯ááŒááºážáááŒá¯áá«á áá»ááºážááááá¯ááºáá«áááºá
ááŸááºáááºážáá»á¬ážááœáẠááŸááºáááºážáááºáá¬ážáá±á¬ á¡áá»ááºá¡áááºáá»á¬áž á¡ááœááºá¡áá»áœá¶ááŸáááŒá®áž áá
áºáá«áá
áºáá¶ááœáẠáá±áá¬á¡ááœááºá¡áá»áœá¶ááá°ááá
á±ááẠááŸááºáááºážááá¯ááºááᯠáááºáááºá¡á±á¬áẠááŒááºáááºáá¬ážááẠááá¯á¡ááºáááºá
SymmetricDS á¡ááœáẠááááºáá»á¬áž
SymmetricDS ááẠááá¯ááºáá»á¬ážááᯠáá¯á¶áá°ááœá¬ážáááºááŸáá·áº áááºáá°ááŒá¯ááẠááá¯ááºáá»á¬ážááᯠáááºáá°ááŒá¯áááºá áá áºááŒáá¯ááºáááºážáá¯ááºááẠááŸá áºá áá¯á¶ážá ááá¯á·ááá¯áẠáá±á¬ááºáá±á«ááºážáá»á¬ážá áœá¬áá±á¬ node á¡áá»á¬ážá¡ááŒá¬ážááŒá¬ážááœáẠááŸá áºáááºážáá°ážáá¯á¶áá°áá°ážáá°ááŸá¯ááᯠáááºááŸááºááœáá·áºááŒá¯áááºá áááºážááẠnode áá áºáá¯áá±á«áºááœáẠá¡áá»áááºá¡ááŒá¬ááŒá®ážáááºáá¬ážááŒá®ážáá±á¬áẠá¡ááá¯á¡áá»á±á¬ááºáá±áá¬ááŒááºáááºááá°ááŒááºážáá²á·ááá¯á·áá±á¬ áá¯ááºáááºážáá»á¬ážá áœá¬ááᯠáá®ážááŒá¬ážáá¯ááºáá±á¬ááºáá±ážááá·áº áá®ážááŒá¬ážáááááá¬áá áºáá¯ááŒá áºááŒá®ážá HTTPS ááŸáá áºááá·áº node áá»á¬ážááŒá¬áž áá¯á¶ááŒá¯á¶ááŒá®áž áááá±á¬ááºáá±á¬áá±áá¬áááŸááºááŸá¯á á ááºážáá»ááºážá¡á á¯á¶á¡áááºá¡áá±á«áºá¡ááŒá±áá¶á á¡ááá¯á¡áá»á±á¬ááºáááááá¹áá á®áá¶ááá·áºááœá²ááŸá¯á á áááºááŒáá·áº SymmetricDS áá¯ááºáá±á¬ááºáá±ážááẠááá¯á·ááŒá±á¬áá·áº áááºááá·áºáá±áá¬áá±á·á áºáá»á¬ážááŒá¬ážá០áá°ážáá°ááŒááºáž á ááœáŸá±á·ááŒá±á¬ááºážááŒááºážá ááœáŸá±á·ááŒá±á¬ááºážááŒááºážá ááŒáá·áºááŒá°ážááŒááºážá á á áºáá¯ááºááŒááºážááŸáá·áº ááááºáá±á¬ááºážáá»á¬ážáá áºáá»áŸá±á¬áẠáá±áá¬á¡ááœááºááŒá±á¬ááºážááŒááºáž á¡áá«á¡ááẠáá»ááºááŒáá·áºáá±á¬ á¡ááŒá±á¡áá±áá»á¬ážááœáẠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
áá¬áááááºááá¬ážáááºá¡áá±á«áºá¡ááŒá±áá¶áááºá
source: www.habr.com