ืืื ืืืขื ืึทืืืืืื ืงืจืืึทื-ืจืขืคึผืืึทืงืืืฉืึทื ืฆืืืืฉื PostgreSQL ืืื MySQL, ืืื ืืขืืื ื ืืื ืืขืืืึธืืก ืคึฟืึทืจ ืืึทืฉืืขืืืงื ืึทืจืืืฃ ืงืจืืึทื-ืจืขืคึผืืึทืงืืืฉืึทื ืฆืืืืฉื ืื ืฆืืืื ืืึทืืึทืืืืก ืกืขืจืืืขืจืก. ืืืคึผืืงืึทืืื, ืงืจืืึทื-ืจืขืคึผืืืงืืืืื ืืึทืืึทืืืืกืื ืืขื ืขื ืืขืจืืคึฟื ืืึธืืืึทืืืฉืื ืืึทืก, ืืื ืขืก ืืื ืึท ืืึทืงืืืขื ืืืขื ืฆื ืึทืจืืืขืจืคืืจื ืคืื ืืืื RDBMS ืกืขืจืืืขืจ ืฆื ืื ืืขืจื.
PostgreSQL ืืื MySQL ืืึทืืึทืืืืกืื ืืขื ืขื ืืืื ืืขืจืขืื ื ืืื ืจืืืืืฉืึทื ืึทื, ืึธืืขืจ ืืื ื ืึธื ืืงืกืืขื ืฉืึทื ื ืืื ืคืึธืจืฉืืึธืื NoSQL ืงืืืคึผืึทืืืืึทืืื. ืืึธ ืืืจ ืืืขืื ืืืกืงืืืืจื ืจืขืคึผืืึทืงืืืฉืึทื ืฆืืืืฉื PostgreSQL ืืื MySQL ืคึฟืื ืึท ืจืืืืืฉืึทื ืึทื DBMS ืคึผืขืจืกืคึผืขืงืืืื.
ืืืจ ืืืขืื ื ืืฉื ืืึทืฉืจืืึทืื ืื ืืื ืฆืข ืื ืขืจ ืืืขืจืงืื ืื, ื ืึธืจ ืื ืืงืขืจืืืง ืคึผืจืื ืกืึทืคึผืึทืื ืึทืืื ืึทื ืืืจ ืืึทืงืืืขื ืึท ืืขืืึทื ืง ืคืื ืงืึทื ืคืืืืขืจืื ื ืจืขืคึผืืึทืงืืืฉืึทื ืฆืืืืฉื ืืืืืึทืืืืก ืกืขืจืืืขืจืก, ืึทืืืืึทื ืืืืืฉืื, ืืืืืืืืฉืึทื ื ืืื ื ืืฆื ืงืึทืกืขืก.
ืืืคึผืืงืึทืืื, ืจืขืคึผืืึทืงืืืฉืึทื ืฆืืืืฉื ืฆืืืื ืืืืขื ืืงืึทื ืืึทืืึทืืืืก ืกืขืจืืืขืจืก ืืื ืืขืืื ืึธืืขืจ ืืื ืืืื ืขืจื ืืึธืืข ืึธืืขืจ ื ืืฆื ืคึฟืจืืื ืฆืืืืฉื ืึท ืืขื (ืึทืงืึท ืึทืจืืืกืืขืืขืจ, ืืขื ืึธืืขืจ ืึทืงืืืื) ืืื ืึท ืฉืงืืึทืฃ (ืึทืืึธื ืขื ื, ืกืืึทื ืืืื ืึธืืขืจ ืคึผืึทืกืืื). ืืขืจ ืฆืื ืคืื ืจืขืคึผืืึทืงืืืฉืึทื ืืื ืฆื ืฆืืฉืืขืื ืึท ืคืึทืงืืืฉ-ืฆืืื ืงืึธืคึผืืข ืคืื โโโโืื ืืขื ืืึทืืึทืืืืก ืืืืฃ ืื ืฉืงืืึทืฃ ืืืึทื. ืืื ืืขื ืคืึทื, ืืึทืื ืืขื ืขื ืืจืึทื ืกืคืขืจื ืคืื ืืขื ืฆื ืฉืงืืึทืฃ, ืืึธืก ืืื, ืคืื ืึทืงืืืื ืฆื ืคึผืึทืกืืื, ืืืืึทื ืจืขืคึผืืึทืงืืืฉืึทื ืืื ืืืจืืืขืงืึธืื ืืืืื ืืื ืืืื ืจืืืืื ื. ืึธืืขืจ ืืืจ ืงืขื ืขื ืฉืืขืื ืจืขืคึผืืึทืงืืืฉืึทื ืฆืืืืฉื ืฆืืืื ืืึทืืึทืืืืกืื ืืื ืืืืืข ืืื ืกืืจืืงืฆืืขืก, ืึทืืื ืึทื ืืึทืื ืืขื ืขื ืืจืึทื ืกืคืขืจื ืคืื ืฉืงืืึทืฃ ืฆื ืืขื ืืื ืึทื ืึทืงืืืื-ืึทืงืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื. ืึทืืข ืืขื, ืึทืจืืึทื ืืขืจืขืื ื ืงืึทืกืงืืืืื ื ืจืขืคึผืืึทืงืืืฉืึทื, ืืื ืืขืืืขื ืฆืืืืฉื ืฆืืืื ืึธืืขืจ ืืขืจ ืืืืขื ืืงืึทื ืืึทืืึทืืืืก ืกืขืจืืืขืจืก, ืึทืงืืืื-ืึทืงืืืื ืึธืืขืจ ืึทืงืืืื-ืคึผืึทืกืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขืคึผืขื ืืก ืืืืฃ ื ืืื, ืื ืึทืืืืืืึทืืืืึทืื ืคืื ืึทืืึท ืงืืืคึผืึทืืืืึทืืื ืืื ืืขืจ ืขืจืฉื ืงืึทื ืคืืืืขืจืืืฉืึทื ืึธืืขืจ ื ืืฆื ืคืื ืคืื ืืจืืืกื ืืืง ืงืึทื ืคืืืืขืจืืืฉืึทื ืกืึทืืืฉืึทื ื ืืื ืืืืืกืืื ื ืืึทื ืื-ืึธืคืก.
ืื ืืืกืงืจืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืืขืืืขื ืฆืืืืฉื ืคืึทืจืฉืืืขื ืข ืืึทืืึทืืืืก ืกืขืจืืืขืจืก. ืืขืจ ืกืขืจืืืขืจ ืงืขื ืขื ืืืื ืงืึทื ืคืืืืขืจื ืฆื ืึธื ื ืขืืขื ืจืขืคึผืืืงืืืืื ืืึทืื ืคืื ืื ืื ืืขืจ ืืึทืืึทืืืืก ืกืขืจืืืขืจ ืืื ื ืึธื ืืึทืืื ืคืึทืงืืืฉ-ืฆืืื ืกื ืึทืคึผืฉืึทืฅ ืคืื ืื ืจืขืคึผืืืงืืืืื ืืึทืื. MySQL ืืื PostgreSQL ืคืึธืจืฉืืึธืื ืจืืึฟ ืคืื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ื ืืื-ืืืื ืึธืืขืจ ืืืจื ืืจืื-ืคึผืึทืจืืื ืืงืกืืขื ืฉืึทื ื, ืึทืจืืึทื ืืขืจืขืื ื ืืืื ืขืจื ืงืืึธืฅ ืืขืืืึธืืก, ืืืกืง ืืึทืงืื ื ืืื ืกืืึทืืขืืขื ื- ืืื ืจืืืขืจื-ืืืืืจื ืืขืืืึธืืก.
ืงืจืืึทื ืจืขืคึผืืึทืงืืืฉืึทื ืฆืืืืฉื MySQL ืืื PostgreSQL ืืื ืืืจืฃ ืคึฟืึทืจ ืึท ืืืื-ืฆืืึทื ืืืืจืึทืืืึธื ืคืื ืืืื ืืึทืืึทืืืืก ืกืขืจืืืขืจ ืฆื ืื ืืขืจื. ืื ืืึทืืึทืืืืกืื ื ืืฆื ืคืึทืจืฉืืืขื ืข ืคึผืจืึธืืึธืงืึธืืก, ืึทืืื ืขืก ืืื ื ืื ืืขืืืขื ืฆื ืคืึทืจืืื ืื ืืื ืืืืึทื. ืฆื ืคืึทืจืืืืื ืืึทืื ืืืขืงืกื, ืืืจ ืงืขื ืขื ื ืืฆื ืึท ืคืื ืืจืืืกื ืืืง ืขืคึฟืขื ืขื ืืงืืจ ืืขืฆืืึทื, ืืืฉื pg_chameleon.
ืืืึธืก ืืื pg_chameleon
pg_chameleon ืืื ืึท ืจืขืคึผืืึทืงืืืฉืึทื ืกืืกืืขื ืคึฟืื MySQL ืฆื PostgreSQL ืืื ืคึผืืืืึธื 3. ืขืก ื ืืฆื ืื ืึธืคึฟื ืืงืืจ ืืืกืงื-ืจืขืคึผืืึทืงืืืฉืึทื ืืืืืืึธืืขืง, ืืืื ืืื ืคึผืืืืึธื. ืจืืืขืจื ืืืืืขืจ ืืขื ืขื ืืงืกืืจืึทืงืืื ืคืื MySQL ืืืฉื ืืื ืกืืึธืจื ืืื JSONB ืึทืืืืฉืขืงืฅ ืืื ืื PostgreSQL ืืึทืืึทืืืืก, ืืื ืืึทื ืืขืงืจืืคึผืืขื ืืืจื ืื pl/pgsql ืคืื ืงืฆืืข ืืื ืจืืคึผืจืึทืืืกื ืืื ืื PostgreSQL ืืึทืืึทืืืืก.
ืคึฟืขืึดืงืืืื ืคืื pg_chameleon
ืงืืืคื MySQL ืกืืฉืขืืึทืก ืคึฟืื ืืขืจ ืืขืืืืงืขืจ ืงื ืืื ืงืขื ืขื ืืืื ืจืขืคึผืืืงืืืืื ืฆื ืึท ืืืื ืฆืื ืคึผืึธืกืืืจืขืกืงื ืืึทืืึทืืืืก ืืื ืึท ืืืื-ืฆื-ืคืืืข ืงืึทื ืคืืืืขืจืืืฉืึทื
ืื ืืงืืจ ืืื ืฆืื ืกืืฉืขืืึท ื ืขืืขื ืงืขื ืขื ื ืืฉื ืืืื ืื ืืขืืืข.
ืจืขืคึผืืึทืงืืืฉืึทื ืืึทืื ืงืขื ืขื ืืืื ืจืืืจืืืื ืคืื ืึท ืงืึทืกืงืืื ืืืกืงื ืจืขืคึผืืืงืข.
ืืึทืืืขืก ืืืึธืก ืงืขื ืขื ื ืืฉื ืจืขืคึผืืึทืงืืื ืึธืืขืจ ืคึผืจืึธืืืฆืืจื ืขืจืจืึธืจืก ืืขื ืขื ืืงืกืงืืืืื.
ืืขืืขืจ ืจืขืคึผืืึทืงืืืฉืึทื ืคึฟืื ืงืฆืืข ืืื ืงืึทื ืืจืึธืืื ืืืจื ืืืืืึทื ืื.
ืงืึธื ืืจืึธื ืืืจื YAML-ืืืืืจื ืคึผืึทืจืึทืืขืืขืจืก ืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขืงืขืก.
ืืืึทืฉืคึผืื
ืืึทืืขืืึธืก
vm1
vm2
OS ืืืขืจืกืืข
CentOS Linux 7.6 x86_64
CentOS Linux 7.5 x86_64
DB ืกืขืจืืืขืจ ืืืขืจืกืืข
ืืืกืงื ืงืกื ืืืงืก
ืคึผืึธืกืืืจืขืกืงื 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 (ืืฉืึทืืขืืขืึธื ืืื ืึท ืืึทืคึฟืขื) ืืื ืื ืกืขื_ืงืึธื ืคืืืืจืึทืืืึธื_ืคืืืขืก ืึทืจืืืืขื ื ืฆื ืืขืื 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 ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขืงืข ืขืก ืืื ืึท ืึธืคึผืืืืืื ื ืคืื ืืืืืืืข ืกืขืืืื ืืก, ืืื ืืืจ ืงืขื ืขื ืคืืจื ืกืขืืืื ืืก ืึทืืึท ืืื ืื ืึธืจื ืคืื ืื ืฉืืึธืก ืืขืงืข, ืื ืึธืจื ืคืื ืืึธืืก, ืื ืกืืึธืจืืืืฉ ืฆืืึทื ืคึฟืึทืจ ืืึธืืก, ืืื"ื ื. ืืืืึทืืขืจ ืงืืื ืืขืจ ืืืคึผ ืึธืืืืขืจืจืืื ืึธืคึผืืืืืื ื, ืืื ืึท ืกืืื ืคืื ืึผืืืื ืคึฟืึทืจ ืึธืืืืขืจืจืืืืื ื ืืืืคึผืก ืืขืฉืึทืก ืจืขืคึผืืึทืงืืืฉืึทื. ืืขืจ ืืืึทืฉืคึผืื ืืืคืึธืืฅ ืฆื ืึท ืืืคึผ ืึธืืืืขืจืจืืืืื ื ืืขืจืฉื ืืืึธืก ืงืึทื ืืืขืจืฅ ืืื ืืื ื (1) ืฆื ืึท ืืืืืึทื ืืืขืจื. ืืื ืืขืจ ืืืืึทืืขืจ ืึธืคึผืืืืืื ื, ืืืจ ืกืคึผืขืฆืืคืืฆืืจื ืื ืงืฉืจ ืืขืืึทืืืก ืฆื ืื ืฆืื ืืึทืืึทืืืืก. ืืื ืืื ืืืขืจ ืคืึทื, ืืึธืก ืืื ืึท PostgreSQL ืืึทืืึทืืืืก, ืืขืืืื ืืืืื pg_conn. ืืื ืื ืืขืฆืืข ืึธืคึผืืืืืื ื, ืืืจ ืึธื ืืืืึทืื ืื ืืงืืจ ืืึทืื, ืืึธืก ืืื ืื ืงืฉืจ ืคึผืึทืจืึทืืขืืขืจืก ืคืื ืื ืืงืืจ ืืึทืืึทืืืืก, ืื ืืึทืคึผืื ื ืกืืขืืข ืฆืืืืฉื ืื ืืงืืจ ืืื ืฆืื ืืึทืืึทืืืืกืื, ืืืฉื ืืืึธืก ืืึธื ืืืื ืกืงืืคึผื, ืืืึทืจืื ืฆืืื, ืืึผืจืื, ืคึผืขืงื ืืจืืืก. ืืึทืืขืจืงืื ื ืึทื "ืงืืืืื" ืืื ืืขืจืฆืึธื, ืืืึทืืฉ ืืืจ ืงืขื ืขื ืืืืื ืงืืืคื ืืงืืจ ืืึทืืึทืืืืกืื ืฆื ืึท ืืืื ืฆืื ืืึทืืึทืืืืก ืฆื ืฉืืขืื ืึทืจืืืฃ ืึท ืคืืืข-ืฆื-ืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื.
ืืขืจ ืืืืฉืคึผืื ืืึทืืึทืืืืก ืืืขืื_ืงืก ืึผืืื 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, ืืืึธืก ืจืืกืคึผืขืงืืืืืื ืึทื ืืืึทืืื ืื ืคืึทืงืืืฉ ืจืขืคึผืืืงืืืืื ืืืฉื ืืื ืื ืจืขืคึผืืึทืงืืืฉืึทื Directory ืืืฉื. ืื ืึทืจืืืืขื ื 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 ืืึทืืึทืืืืก, ืืื ืจืืคื ืื ืกืื ืง_ืืึทืืืขืก ืึทืจืืืืขื ื ืืื 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 ืืึทืืึทืืืืกืื ืืื ืึท ืืืื ืคึผืึธืกืืืจืขืกืงื ืืึทืืึทืืืืก.
ืืืจ ืืึธื ื ืื ืืึธืื ืฆื ืจืขืคึผืืึทืงืืื ืื ืืืืกืืขืงืืืื ืืืฉื.
ืืืกืึทืืืืึทื ืืืืืฉืื ืคืื pg_chameleon
ืืืืื ืืขืฉืืืฆื ืืื MySQL 5.5 ืืื ืืขืืขืจ ืืื ืืงืืจ ืืื PostgreSQL 9.5 ืืื ืืขืืขืจ ืืื ืฆืื ืืึทืืึทืืืืก.
ืืขืืขืจ ืืืฉ ืืืื ืืึธืื ืึท ืขืจืฉืืืง ืึธืืขืจ ืืื ืฆืืง ืฉืืืกื, ืึทื ืืขืจืฉ ืื ืืืฉื ืืขื ืขื ืื ืืืืึทืืืืื ืืขืฉืึทืก ืื init_replica ืคึผืจืึธืฆืขืก ืึธืืขืจ ืืขื ืขื ื ืืฉื ืจืขืคึผืืืงืืืืื.
ืืืื-ืืืขื ืจืขืคึผืืึทืงืืืฉืึทื - ืืืืื ืคึฟืื MySQL ืฆื PostgreSQL. ืืขืจืืืขืจ, ืขืก ืืื ืืืืื ืคึผืึทืกืืง ืคึฟืึทืจ ืื "ืึทืงืืืื-ืคึผืึทืกืืื" ืงืจืืึทื.
ืืขืจ ืืงืืจ ืงืขื ืขื ืืืืื ืืืื ืึท MySQL ืืึทืืึทืืืืก, ืืื ืฉืืืฆื ืคึฟืึทืจ ืึท PostgreSQL ืืึทืืึทืืืืก ืืื ืึท ืืงืืจ ืืื ืืืืื ืืงืกืคึผืขืจืืขื ืึทื ืืื ืืื ืืืืืืืืฉืึทื ื (ืืขืจื ืขื ืืขืจ
ืจืขืืืืืึทืื ืคึฟืึทืจ pg_chameleon
ืื ืจืขืคึผืืึทืงืืืฉืึทื ืืืคึฟื ืืื pg_chameleon ืืื ืืจืืืก ืคึฟืึทืจ ืืืืืจืืืืื ื ืึท ืืึทืืึทืืืืก ืคึฟืื MySQL ืฆื PostgreSQL. ืื ืืึทืืืืืืง ืืึทืื ืกืืื ืืื ืึทื ืจืขืคึผืืึทืงืืืฉืึทื ืืื ืืืืื ืืืื-ืืืขื, ืึทืืื ืืึทืืึทืืืืก ืคึผืจืึธืคืขืกืกืืึธื ืึทืืก ืืขื ืขื ืึทื ืืืืงืื ืฆื ืืืขืื ืฆื ื ืืฆื ืขืก ืคึฟืึทืจ ืขืคึผืขืก ืึทื ืืขืจืฉ ืืื ืืืืืจืืืฉืึทื. ืึธืืขืจ ืื ืคึผืจืึธืืืขื ืคืื ืืืื-ืืืขื ืจืขืคึผืืึทืงืืืฉืึทื ืงืขื ืขื ืืืื ืกืึทืืืื ืืื ืื ืื ืืขืจ ืขืคึฟืขื ืขื ืืงืืจ ืืขืฆืืึทื - ืกืืืืขืืจืืงืืก.
ืืืืขื ืขื ืืขืจ ืืื ืืขืจ ืืึทืึทืืืขืจ ืืึทืงืืืืขื ืืืืฉืึทื
ืืืืขืจืืืืง ืคืื ืกืืืืขืืจืืงืืก
SymmetricDS ืืื ืึทื ืึธืคึฟื ืืงืืจ ืืขืฆืืึทื ืืืึธืก ืจืขืคึผืืึทืงืืื ืงืืื ืืึทืืึทืืืืก ืฆื ืงืืื ืื ืืขืจืข ืคึผืจืึธืกื ืืึทืืึทืืืืก: Oracle, MongoDB, PostgreSQL, MySQL, SQL Server, MariaDB, DB2, Sybase, Greenplum, Informix, H2, Firebird ืืื ืื ืืขืจืข ืืืึธืืงื ืืึทืืึทืืืืก ืงืึทืกืขืก, ืืืฉื Azure, ืขืืง ืื ืืืฆื ืคึฟืขืึดืงืืืื: ืืืืืึทืืืืก ืืื ืืขืงืข ืกืื ืืงืจืึทื ืึทืืืืฉืึทื, ืืืืื-ืืขื ืืึทืืึทืืืืก ืจืขืคึผืืึทืงืืืฉืึทื, ืคืืืืขืจื ืกืื ืืงืจืึทื ืึทืืืืฉืึทื, ืืจืึทื ืกืคืึธืจืืึทืฆืืข ืืื ืื ืืขืจืข. ืืึธืก ืืื ืึท Java ืืขืฆืืึทื ืืื ืจืืงืืืืืขืจื ืึท ื ืึธืจืืึทื ืืขืืืื ื ืคืื ืื JRE ืึธืืขืจ JDK (ืืืขืจืกืืข 8.0 ืึธืืขืจ ืืขืืขืจ). ืืึธ, ืืึทืื ืขื ืืขืจืื ืืขื ืฆื ืืจืืืขืจื ืืื ืื ืืงืืจ ืืึทืืึทืืืืก ืงืขื ืขื ืืืื ืจืขืงืึธืจืืขื ืืื ืืขืฉืืงื ืฆื ืื ืฆืื ืขืืขื ืฆืื ืืึทืืึทืืืืก ืืื ืื ืคืึธืจืขื ืคืื ืืึทืืฉืึทื.
ืกืืืืขืืจืืงืืก ืคึฟืขืึดืงืืืื
ืื ืืขืฆืืึทื ืืื ืคึผืืึทืืคืึธืจืืข ืคืจืืึท, ืืืึทืืฉ ืฆืืืื ืึธืืขืจ ืืขืจ ืคืึทืจืฉืืืขื ืข ืืึทืืึทืืืืกืื ืงืขื ืขื ืืืขืงืกื ืืึทืื.
ืจืืืืืฉืึทื ืึทื ืืึทืืึทืืืืกืื ืืขื ืขื ืกืื ืืงืจืึทื ืืืื ื ืืฆื ืืึทืื ืืืืฉื ืจืขืงืึธืจืืก, ืืฉืขืช ืืขืงืข ืกืืกืืขื-ืืืืืจื ืืึทืืึทืืืืกืื ื ืืฆื ืืขืงืข ืกืื ืืงืจืึทื ืึทืืืืฉืึทื.
ืฆืืืื-ืืืขื ืจืขืคึผืืึทืงืืืฉืึทื ื ืืฆื ืคึผืืฉ ืืื ืคึผืื ืืขืืืึธืืก ืืืืืจื ืืืืฃ ืึท ืกืืื ืคืื ืึผืืืื.
ืืึทืื ืึทืจืืืขืจืคืืจื ืืื ืืขืืืขื ืืืืขืจ ืืืืขืจ ืืื ื ืืืขืจืืง-ืืึทื ืืืืืื ื ืขืืืืึธืจืงืก.
ืึธืืึทืืึทืืืง ืึธืคึผืืื ืืืขื ื ืึธืืื ื ืขืืขื ืืื ืืืืืขืจ ืึธืคึผืขืจืึทืฆืืข ื ืึธื ืึท ืืืจืืคืึทื ืืื ืึธืืึทืืึทืืืง ืงืึธื ืคืืืงื ืืึทืืืึธืืข.
ืืืึธืืงื ืงืึทืืคึผืึทืืึทืืึทื ืืื ืฉืืึทืจืง ืคืึทืจืืขื ืืขืจืื ื ืึทืคึผืืก.
ืืืึทืฉืคึผืื
ืกืืืืขืืจืืงืืก ืงืขื ืขื ืืืื ืงืึทื ืคืืืืขืจื ืืื ืืืื ืขืจ ืคืื ืฆืืืื ืืืขืื:
ื ืืขื (ืคืึธืืขืจ) ื ืึธืืข ืึทื ืกืขื ืืจืึทืื ืงืึธืืึธืจืืึทื ืึทืฅ ืืึทืื ืจืขืคึผืืึทืงืืืฉืึทื ืฆืืืืฉื ืฆืืืื ืฉืงืืึทืฃ (ืงืื ื) ื ืึธืืื, ืืื ืงืึธืืื ืืงืึทืฆืืข ืฆืืืืฉื ืงืื ื ื ืึธืืื ืึทืงืขืจื ืืืืื ืืืจื ืื ืคืึธืืขืจ.
ืึทื ืึทืงืืืื ื ืึธืืข (ื ืึธืืข 1) ืงืขื ืขื ืืืขืจืืขืื ืคึฟืึทืจ ืจืขืคึผืืึทืงืืืฉืึทื ืืื ืื ืื ืืขืจ ืึทืงืืืื ื ืึธืืข (ื ืึธืืข 2) ืึธื ืึท ืื ืืขืจืืืืืขืจื.
ืืื ืืืืืข ืึธืคึผืฆืืขืก, ืืึทืื ืืืขืงืกื ืึทืงืขืจื ืืื ืคึผืืฉ ืืื ืคึผืื. ืืื ืืขื ืืืึทืฉืคึผืื ืืืจ ืืืขืื ืืึทืืจืึทืืื ืึทื ืึทืงืืืื-ืึทืงืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื. ืขืก ืืืึธืื ื ืขืืขื ืฆื ืืึทื ื ืฆื ืืึทืฉืจืืึทืื ืื ืืื ืฆืข ืึทืจืงืึทืืขืงืืฉืขืจ, ืึทืืื ืืึธื ืืืื ืคืึธืจืฉืื ื.
ืื ืกืืึธืืื ื SymmetricDS ืืื ืืืืขืจ ืคึผืฉืื: ืืจืืคืงืืคืืข ืื ืขืคึฟืขื ืขื ืืงืืจ ืืืขืจืกืืข ืคืื โโโโืื ืคืึทืจืฉืืขืกืืขื ืืขืงืข
ืืึทืืขืืึธืก
vm1
vm2
OS ืืืขืจืกืืข
CentOS Linux 7.6 x86_64
CentOS Linux 7.6 x86_64
DB ืกืขืจืืืขืจ ืืืขืจืกืืข
ืืืกืงื ืงืกื ืืืงืก
ืคึผืึธืกืืืจืขืกืงื 10.5
ืื ืคึผืึธืจื
3306
5832
ืืคึผ ืึทืืจืขืก
192.168.1.107
192.168.1.112
ืกืืืืขืืจืืงืืก ืืืขืจืกืืข
ืกืืืืขืืจืืงืืก 3.9
ืกืืืืขืืจืืงืืก 3.9
ืกืืืืขืืจืืงืืก ืื ืกืืึทืืืจืื ื ืืจื
/usr/local/symmetric-server-3.9.20
/usr/local/symmetric-server-3.9.20
ืกืืืืขืืจืืงืืก ื ืึธืืข ื ืึธืืขื
ืงืึธืจืคึผ-000
ืงืจืึธื-001
ืืึธ ืืืจ ืื ืกืืึทืืืจื SymmetricDS ืืื /usr/local/symmetric-server-3.9.20, ืืื ืคืึทืจืฉืืื ืกืืืืืจืขืงืืึธืจืืขืก ืืื ืืขืงืขืก ืืืขื ืืืื ืกืืึธืจื ืืึธืจื. ืืืจ ืืขื ืขื ืืื ืืขืจืขืกืืจื ืืื ืื ืกืึทืืคึผืึทืื ืืื ืขื ืืืฉืึทื ื ืกืืืืืจืขืงืืึธืจืืขืก. ืื ืกืึทืืคึผืึทืื ืืืขืืืืืึทืืขืจ ืึผืืื ืืืืฉืคืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขืงืขืก ืืื ื ืึธืืข ืคึผืจืึธืคึผืขืจืืืขืก, ืืื ืืขืืื ื ืืื ืืืืฉืคืืื SQL ืกืงืจืืคึผืก ืฆื ืึธื ืืืืื ืืขืฉืืืื ื.
ืืื ืื ืกืึทืืคึผืึทืื ืืืขืืืืืึทืืขืจ ืืืจ ืืขื ืืจืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขืงืขืก ืืื ื ืึธืืข ืคึผืจืึธืคึผืขืจืืืขืก - ืืขืจ ื ืึธืืขื ืืืืืื ืื ื ืึทืืืจ ืคืื ืื ื ืึธืืข ืืื ืึท ืืืืขืจ ืกืืขืืข.
corp-000.properties
store-001.properties
store-002.properties
ืกืืืืขืืจืืงืืก ืืื ืึทืืข ืื ื ืืืืืง ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขืงืขืก ืคึฟืึทืจ ืึท ืืงืขืจืืืง 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 ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืืขืจืืคึฟื ืงืึธืจืคึผ-000, ืืื ืื ืืึทืืึทืืืืก ืคึฟืึทืจืืื ืืื ื ืืื ืืึทื ืืึทืื ืืืจื ืื mysql jdbc ืฉืึธืคืขืจ, ืืืึธืก ื ืืฆื ืื ืงืึทื ืขืงืฉืึทื ืฉืืจืืงื ืืืืื ืืื ืื ืืึธืืื ืงืจืึทืืขื ืืฉืึทืื. ืืืจ ืคืึทืจืืื ืื ืฆื ืื ืจืขืคึผืืืงืข_ืื ืืึทืืึทืืืืก ืืื ืืืฉื ืืืขื ืืืื ืืืฉืืคื ืืขืฉืึทืก ืกืืฉืขืืึท ืฉืึทืคืื ื. sync.url ืืืืืื ืื ืึธืจื ืคืื ืื ืงืฉืจ ืฆื ืื ื ืึธืืข ืคึฟืึทืจ ืกืื ืืงืจืึทื ืึทืืืืฉืึทื.
ื ืึธืืข 2 ืืืืฃ ืืึทืืขืืึธืก ืืื2 ืืื ืงืึทื ืคืืืืขืจื ืืื ืงืจืึธื-001 ืืื ืื ืื ืืื ืืื ืกืคึผืขืกืืคืืขื ืืื ืื ื ืึธืืข.ืคึผืจืึธืคึผืขืจืืืขืก ืืขืงืข ืืื ืื. Node store-001 ืืืืคื ืื PostgreSQL ืืึทืืึทืืืืก ืืื pgdb_replica ืืื ืื ืจืขืคึผืืึทืงืืืฉืึทื ืืึทืืึทืืืืก. registration.url ืึทืืึทืื ืืึทืืขืืึธืก ืืื2 ืฆื ืงืึธื ืืึทืงื ืืึทืืขืืึธืก ืืื1 ืืื ืืึทืงืืืขื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขืืึทืืืก ืคืื ืขืก.
$> 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
ืื ืืขืขื ืืืงื ืกืืืืขืืจืืงืืก ืืืืฉืคึผืื ืึผืืื ืคึผืึทืจืึทืืขืืขืจืก ืคึฟืึทืจ ืืึทืฉืืขืืืงื ืฆืืืื-ืืืขื ืจืขืคึผืืึทืงืืืฉืึทื ืฆืืืืฉื ืฆืืืื ืืึทืืึทืืืืก ืกืขืจืืืขืจืก (ืฆืืืื ื ืึธืืื). ืื ืกืืขืคึผืก ืืื ืื ืืขื ืขื ืืืจืืืขืงืึธืื ืืืืฃ host vm1 (corp-000), ืืืึธืก ืืืขื ืืึทืื ืึท ืืืืฉืคึผืื ืกืืฉืขืืึท ืืื 4 ืืืฉื. ืืขืจื ืึธื, ืคืืืกื ืืืง create-sym-tables ืืื ืื ืกืืืึทืืืื ืืึทืคึฟืขื ืงืจืืืืฅ Directory ืืืฉื ืืื ืื ืึผืืืื ืืื ืจืืืืื ื ืคืื ืจืขืคึผืืึทืงืืืฉืึทื ืฆืืืืฉื ื ืึธืืื ืืืขื ืืืื ืกืืึธืจื. ืฆืื ืกืืฃ, ืืืกืืขืจ ืืึทืื ืืื ืืึธืืืื ืืื ืื ืืืฉื.
vm1$> cd /usr/local/symmetric-server-3.9.20/bin
vm1$> ./dbimport --engine corp-000 --format XML create_sample.xml
vm1$> ./symadmin --engine corp-000 create-sym-tables
vm1$> ./dbimport --engine corp-000 insert_sample.sql
ืืื ืืขื ืืืึทืฉืคึผืื, ืื ื ืืืขืจ ืืื item_selling_price ืืืฉื ืืขื ืขื ืืืืืึธืืึทืืืฉ ืงืึทื ืคืืืืขืจื ืฆื ืจืขืคึผืืึทืงืืื ืคึฟืื ืงืึธืจืคึผ-000 ืฆื ืงืจืึธื-001, ืืื ืื ืคืึทืจืงืืืฃ ืืืฉื (ืกืึทืืข_ืืจืึทื ืกืึทืงืืืึธื ืืื ืกืึทืืข_ืจืขืืืจื_ืืื ืข_ืืืขื) ืืขื ืขื ืืืืืึธืืึทืืืฉ ืงืึทื ืคืืืืขืจื ืฆื ืจืขืคึผืืึทืงืืื ืคึฟืื ืงืจืึธื-001 ืฆื ืงืึธืจืคึผ-000. ืืืฆื ืืืจ ืืึทืื ืึท ืกืืขืืข ืืื ืื PostgreSQL ืืึทืืึทืืืืก ืืืืฃ ืืึทืืขืืึธืก vm2 (store-001) ืฆื ืฆืืืจืืืื ืขืก ืฆื ืืึทืงืืืขื ืืึทืื ืคึฟืื ืงืึธืจืคึผ-000.
vm2$> cd /usr/local/symmetric-server-3.9.20/bin
vm2$> ./dbimport --engine store-001 --format XML create_sample.xml
ืืืื ืืืืขืจ ืฆื ืงืึธื ืืจืึธืืืจื ืึทื ืื MySQL ืืึทืืึทืืืืก ืืืืฃ vm1 ืืื ืืืืฉืคืืื ืืืฉื ืืื ืกืืืืขืืจืืงืืก ืงืึทืืึทืืึธื ืืืฉื. ืืึทืืขืจืงืื ื ืึทื ืื SymmetricDS ืกืืกืืขื ืืืฉื (ืคึผืจืขืคืืงืกืขื ืืื sym_) ืืขื ืขื ืืขืจืืืืึทื ืืืืื ืื ืืืฆื ืืืืฃ ื ืึธืืข ืงืึธืจืคึผ-000 ืืืืึทื ืืึธืก ืืื ืืื ืืืจ ืืืืคื ืื create-sym-tables ืืึทืคึฟืขื ืืื ืืืขื ืคืืจื ืจืขืคึผืืึทืงืืืฉืึทื. ืืื ืืื ืื ืืึทืืึทืืืืก ืืืืฃ ื ืึธืืข ืงืจืึธื-001 ืขืก ืืืขื ืืืื ืืืืื 4 ืืืืฉืคึผืื ืืืฉื ืึธื ืืึทืื.
ืึทืืข. ืื ืกืืืืืืข ืืื ืืจืืื ืฆื ืืืืคื ืกืื ืกืขืจืืืขืจ ืคึผืจืึทืกืขืกืึทื ืืืืฃ ืืืืืข ื ืึธืืื ืืื ืืขืืืืื ืืื ืื.
vm1$> cd /usr/local/symmetric-server-3.9.20/bin
vm1$> sym 2>&1 &
ืงืืึธืฅ ืืืื ืกื ืืขื ืขื ืืขืฉืืงื ืฆื ืึท ืืื ืืขืจืืจืื ื ืงืืึธืฅ ืืขืงืข (symmetric.log) ืืื ืื ืืึธืืก ืืขืงืข ืืื ืื ืืืขืืืืืึทืืขืจ ืืื ืกืืืืขืืจืืงืืก ืืื ืืื ืกืืึทืืืจื, ืืื ืืขืืื ื ืืื ืฆื ื ืึธืจืืึทื ืจืขืืืืืึทื. ืื ืกืื ืกืขืจืืืขืจ ืงืขื ืขื ืืืฆื ืืืื ืื ืืฉืืืืืื ืืืืฃ ื ืึธืืข ืงืจืึธื-001.
vm2$> cd /usr/local/symmetric-server-3.9.20/bin
vm2$> sym 2>&1 &
ืืืื ืืืจ ืืืืคื ืื sym ืกืขืจืืืขืจ ืคึผืจืึธืฆืขืก ืืืืฃ ืื vm2 ืืึทืืขืืึธืก, ืขืก ืืืขื ืืืื ืฉืึทืคึฟื SymmetricDS ืงืึทืืึทืืึธื ืืืฉื ืืื ืื PostgreSQL ืืึทืืึทืืืืก. ืืืื ืืืจ ืืืืคื ืื ืกืื ืกืขืจืืืขืจ ืคึผืจืึธืฆืขืก ืืืืฃ ืืืืืข ื ืึธืืื, ืืื ืงืึธืืึธืจืืึทื ืึทื ืืื ืืขืืขืจ ืื ืืขืจืข ืฆื ืจืขืคึผืืึทืงืืื ืืึทืื ืคึฟืื ืงืึธืจืคึผ-000 ืฆื ืงืจืึธื-001. ืืืื ื ืึธื ืึท ืืืกื ืกืขืงืื ืืขืก ืืืจ ืึธื ืคึฟืจืขื ืึทืืข 4 ืืืฉื ืืืืฃ ืืืืืข ืืืืื, ืืืจ ืืืขืื ืืขื ืึทื ืจืขืคึผืืึทืงืืืฉืึทื ืืื ืืขืืืขื ืืขืจืึธืื. ืึธืืขืจ ืืืจ ืงืขื ืขื ืฉืืงื ืื ืืึธืึธืืกืืจืึทืคึผ ืฆื ื ืึธืืข ืงืจืึธื-001 ืคึฟืื ืงืึธืจืคึผ-000 ืืื ืื ืคืืืืขื ืืข ืืึทืคึฟืขื.
vm1$> ./symadmin --engine corp-000 reload-node 001
ืืื ืืขื ืคืื ื, ืึท ื ืืึทืข ืจืขืงืึธืจื ืืื ืื ืกืขืจืืึทื ืืื ืื ื ืืืขืจ ืืืฉ ืืื ืื MySQL ืืึทืืึทืืืืก ืืืืฃ ื ืึธืืข ืงืึธืจืคึผ-000 (ืืึทืืขืืึธืก: vm1), ืืื ืืืจ ืงืขื ืขื ืงืึธื ืืจืึธืืืจื ืื ืจืขืคึผืืึทืงืืืฉืึทื ืฆื ืื ืคึผืึธืกืืืจืขืกืงื ืืึทืืึทืืืืก ืืืืฃ ื ืึธืืข ืงืจืึธื-001 (ืืึทืืขืืึธืก: vm2). ืืืจ ืืขื ืึท ืคึผืื ืึธืคึผืขืจืึทืฆืืข ืฆื ืึทืจืืืขืจืคืืจื ืืึทืื ืคืื ืงืึธืจืคึผ-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 ืฆื ืงืึธืจืคึผ-000, ืืืจ ืึทืจืืึทื ืืืืื ืึท ืจืขืงืึธืจื ืืื ืื sale_transaction ืืืฉ ืืื ืืึทืฉืืขืืืงื ืึทื ืจืขืคึผืืึทืงืืืฉืึทื ืืื ืืขืจืึธืื.
ืืืจ ืืขื ืื ืืขืจืึธืื ืกืขืืึทืคึผ ืคืื ืฆืืืื-ืืืขื ืจืขืคึผืืึทืงืืืฉืึทื ืคืื ืื ืืืืฉืคึผืื ืืืฉื ืฆืืืืฉื MySQL ืืื PostgreSQL ืืึทืืึทืืืืกืื. ืฆื ืฉืืขืื ืจืขืคึผืืึทืงืืืฉืึทื ืคึฟืึทืจ ื ืืึทืข ืืึทื ืืฆืขืจ ืืืฉื, ื ืึธืืืืื ืื ืกืืขืคึผืก: ืืืจ ืฉืึทืคึฟื ืืืฉ ื 1 ืคึฟืึทืจ ืืืึทืฉืคึผืื ืืื ืงืึทื ืคืืืืขืจ ืื ืจืขืคึผืืึทืงืืืฉืึทื ืึผืืืื ืืื ืืืื. ืืขื ืืืขื ืืืจ ืงืึทื ืคืืืืขืจ ืืืืื ืจืขืคึผืืึทืงืืืฉืึทื ืคืื ืงืึธืจืคึผ-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, ืืื ืจืขืคึผืืึทืงืืืฉืึทื ืคืื ืืืฉ ื 1 ืืื ืงืึทื ืคืืืืขืจื.
vm1$> ./symadmin -e corp-000 --node=001 sync-triggers
vm1$> ./symadmin send-schema -e corp-000 --node=001 t1
ืื ืืขื ืขืคืืฅ ืคืื ืกืืืืขืืจืืงืืก
ืืจืื ื ืื ืกืืึทืืืจืื ื ืืื ืงืึทื ืคืืืืขืจืืืฉืึทื, ืึทืจืืึทื ืืขืจืขืื ื ืึท ืคืึทืจืืืง ืืึทื ื ืคืื ืืขืงืขืก ืืื ืคึผืึทืจืึทืืขืืขืจืก ืคึฟืึทืจ ืงืจืืืืืื ื ืึท ืืจืื-ื ืึธืืข ืึธืืขืจ ืฆืืืื-ื ืึธืืข ืงืจืืึทื.
ืงืจืืึทื-ืคึผืืึทืืคืึธืจืืข ืืึทืืึทืืืืกืื ืืื ืคึผืืึทืืคืึธืจืืข ืืขืืืกืืฉืืขื ืืืงืืึทื, ืึทืจืืึทื ืืขืจืขืื ื ืกืขืจืืืขืจืก, ืืึทืคึผืืึทืคึผืก ืืื ืจืืจืขืืืืืง ืืขืืืืกืขืก.
ืจืขืคึผืืึทืงืืื ืงืืื ืืึทืืึทืืืืก ืฆื ืงืืื ืื ืืขืจืข ืืึทืืึทืืืืก ืืึธืืงืึทืื, ืืืืฃ ืื ืืืึทื ืึธืืขืจ ืืื ืื ืืืึธืืงื.
ืืขืืืขืืงืืื ืคืื ืึธืคึผืืืืึทื ืึทืจืืขื ืืื ืึท ืคึผืึธืจ ืคืื ืืึทืืึทืืืืกืื ืึธืืขืจ ืขืืืขืืข ืืืืื ื ืคึฟืึทืจ ืืึทืงืืืขื ืจืขืคึผืืึทืงืืืฉืึทื.
ืืึทืฆืึธืื ืืืขืจืกืืข ืืื GUI ืืื ืืืกืืขืฆืืืื ื ืฉืืืฆื.
ืืืกืึทืืืืึทื ืืืืืฉืื ืคืื ืกืืืืขืืจืืงืืก
ืืืจ ืืึทืจืคึฟื ืฆื ืืึทื ืืืึทืื ืืขืคืื ืืจื ืื ืึผืืืื ืืื ืจืืืืื ื ืคืื ืจืขืคึผืืึทืงืืืฉืึทื ืืืืฃ ืื ืืึทืคึฟืขื ืฉืืจื ืืืจื ืกืงื ืกืืืืืืึทื ืฅ ืฆื ืืึทืกืข ืงืึทืืึทืืึธื ืืืฉื, ืืืึธืก ืงืขื ืขื ืืืื ืืืืึทืงืืืขื.
ืืึทืฉืืขืืืงื ืคืืืข ืืืฉื ืคึฟืึทืจ ืจืขืคึผืืึทืงืืืฉืึทื ืงืขื ืขื ืืืื ืืืืืึทืก ืกืืึทืื ืืืจ ื ืืฆื ืกืงืจืืคึผืก ืฆื ืฉืึทืคึฟื ืกืงื ืกืืืืืืึทื ืฅ ืืืึธืก ืืขืคืื ืืจื ืื ืึผืืืื ืืื ืจืืืืื ื ืคืื ืจืขืคึผืืึทืงืืืฉืึทื.
ืขืก ืืื ืฆื ืคืื ืืื ืคึฟืึธืจืืึทืฆืืข ืจืขืงืึธืจืืขื ืืื ืื ืืึธืืก, ืืื ืืื ืืืจ ืืึทืจืคึฟื ืฆื ืจืืื ืืงื ืื ืงืืึธืฅ ืืขืงืข ืึทืืื ืึทื ืขืก ืืึธื ื ืืฉื ื ืขืืขื ืฆื ืคืื ืคึผืืึทืฅ.
ืจืขืืืืืึทืื ืคึฟืึทืจ SymmetricDS
ืกืืืืขืืจืืงืืก ืึทืืึทืื ืืืจ ืฆื ืฉืืขืื ืฆืืืื-ืืืขื ืจืขืคึผืืึทืงืืืฉืึทื ืฆืืืืฉื ืฆืืืื, ืืจืื ืึธืืขืจ ืืคืืื ืขืืืขืืข ืืืืื ื ื ืึธืืื ืฆื ืจืขืคึผืืึทืงืืื ืืื ืกืื ืืงืจืึทื ืืื ืืขืงืขืก. ืืึธืก ืืื ืึท ืืื ืฆืืง ืืขืฆืืึทื ืืืึธืก ืื ืืืคึผืขื ืืึทื ืืื ืคึผืขืจืคืึธืจืื ืคืืืข ืืึทืกืงืก, ืึทืืึท ืืื ืึธืืึทืืึทืืืง ืืึทืื ืึธืคึผืืื ื ืึธื ืึท ืืึทื ื ืฆืืื ืคืื ืืึทืื ืืืื ืืืืฃ ืึท ื ืึธืืข, ืืืืขืจ ืืื ืขืคืขืงืืืื ืืึทืื ืืืขืงืกื ืฆืืืืฉื ื ืึธืืื ืืืจื ืืืืคึผืก, ืึธืืึทืืึทืืืง ืงืึธื ืคืืืงื ืคืึทืจืืืึทืืืื ื ืืืืืจื ืืืืฃ ืึท ืืึทื ื ืคืื ืึผืืืื, ืืื"ื ื. ืจืขืคึผืืึทืงืืืฉืึทื ืฆืืืืฉื ืงืืื ืืึทืืึทืืืืกืื, ืืขืจืืืขืจ, ืขืก ืงืขื ืขื ืืืื ืืขืืืืื ื ืคึฟืึทืจ ืึท ืืจืืื ืคืึทืจืฉืืืื ืงืืึทื ืคืื ืกืื ืขืจืืึธืื, ืึทืจืืึทื ืืขืจืขืื ื ืืืืืจืืืฉืึทื, ืืืืืจืืืฉืึทื, ืคืึทืจืฉืคึผืจืืืืื ื, ืคึฟืืืืจืืจืื ื ืืื ืืจืึทื ืกืคืึธืจืืึทืฆืืข ืคืื โโืืึทืื ืึทืจืืืขืจ ืคึผืืึทืืคืึธืจืืก.
ืืขืจ ืืืืฉืคึผืื ืืื ืืืืืจื ืืืืฃ ืืขืจ ืืึทืึทืืืขืจ
ืืงืืจ: www.habr.com