αααα»αααΉαααΌααααααΆααααΆαα αααααααααααΆα PostgreSQL αα·α MySQL ααααΌα ααΆαα·ααΈααΆααααααααααΆααααα‘αΎαααΆαα αααααααααααΆααααΆαααΈαααααΌαααααΆααα·ααααααααΆααααΈαα ααΆααααααΆ ααΌαααααΆααα·ααααααα ααααααααααααΌαααΆαααα α ααΆααΌα ααααΆ α αΎαααΆααΆαα·ααΈααΆαααααααΆααααα½ααααα»αααΆαααααΆααααααΌαααΈαααΆαααΈααα RDBMS αα½ααα αααΆαααΈααααα½ααααα
ααΌαααααΆααα·αααααα PostgreSQL αα·α MySQL ααΆααΌαα ααααΌαααΆαα αΆαααα»αααΆααΆααααΆαααααα ααα»ααααααΆαα½αααΉαααααααααααααααααα αα½ααααααααααΌααααααααΆα NoSQL α αα ααΈαααααΎαααΉααα·ααΆααααΆα’αααΈααΆαα αααααααΆα PostgreSQL αα·α MySQL ααΆααααααα DBMS αααααΆααααα
ααΎαααΉααα·ααα·αααααΆα’αααΈααΆαααΆαααΆααααα»αααΆααααΌααα ααααΆααααααΆαααααΆαααααΆααΌαααααΆα ααΎααααΈα’ααα’αααααα½αααΆααααα·αααααΆαααααααα ααΆααααααααααΆαα αααααααΆααααΆαααΈαααααΌαααααΆααα·αααααα αα»ααααααααα· αααααααα αα·αααααΈααααΎααααΆααα
ααΆααααααΆ ααΆαα αααααααΆααααΆαααΈαααααΌαααααΆααα·ααααααααΌα ααααΆααααα·αααΈαααΊααααΎα‘αΎααααα»ααααααααααααΈα α¬ααααΎαααα½ααααΆααα (α’αααααααα»αααααααΆα αα α¬ααααα) αα·αααΆααα (α’αααααΆα αααα αΆα α¬α’αααα)α αααααααααααΆαα ααααααΊααΎααααΈαααααααΌαα αααΆααα αααααααααααΆαα·αααααΆααααααΌαααααΆααα·αααααααααα ααΎαααααααΆαααα αααα»αααααΈααα αα·ααααααααααΌαααΆααααααααΈαααα slave αααααΊααΈααααααα α’αααα ααΈαααααααΆαα ααααααααΌαααΆαα’αα»αααααααα»ααα·ααα αααα½αααα»αααααα ααα»ααααα’αααα’αΆα αααα αααΆαα αααααααΆαααΌαααααΆααα·ααααααααΈααααα»ααα·ααα ααΆααααΈα ααΌα αααααα·ααααααααααΌαααΆααααααααΈ slave αα αααα αααα»αααΆαααααααα ααΆαααααααααααααα α’αααΈαααΆααα’ααααα αα½αααΆααααΆαα ααααααΆαααα ααΊα’αΆα ααααΎαα ααΆααααΆααααΆαααΈαααααΌαααααΆααα·ααααααααΌα ααααΆααααα·αααΈα α¬α αααΎαα ααΆαααααααα ααΆααααααααααααα α¬ααααα-α’ααααα’αΆαααααααΎαααααΌαααΆα ααΆαα’αΆα ααααΆααααααααααΆααααααααααα»αααΆαααααααα ααΆααααααααααααΌα α¬ααΆαααααΎααααΆαααααααααααΆαααΆαααααααα ααΆααααααααααΆααααα αα·αααΆααααααΌααααααΆαααααΆααα
ααΆαααααααα ααΆαααααααααααααΆααα·αααααΆααΊα’αΆα ααααΎαα ααΆααααΆααααΆαααΈαααααΌαααααΆααα·αααααααααααααααΆα αααΆαααΈαααα’αΆα ααααΌαααΆαααααααα ααΆααααααααααΎααααΈααα½ααααα·ααααααα ααααααΈαααΆαααΈαααααΌαααααΆααα·αααααααααααααα α αΎααα αααααααΆααΆαααα αααααα·αααααααααααΆαα ααααααΆααααααααΆααΆαααααααα MySQL αα·α PostgreSQL αααααααΌαααΌαααΆαααααααα ααΆααααααααααΆαααααααΆαα αααΎααα αααα»ααααα α¬ααΆαααααααααααααααααΆααΈααΈααΈ αα½αααΆαααα·ααΈααΆααααααααααα ααα»αααααΈα ααΆαα αΆααααααΆα αα·αααα ααααΈαααααααΆααα αα·ααα·ααΈααΆαααααααα’ααααΎαα½ααααα
ααΆαα ααααααααααααΆαααΆα MySQL αα·α PostgreSQL ααΊα αΆαααΆα ααααααΆααααΆαααααΎα αααΆααααα»ααα½αααααΈαααΆαααΈαααααΌαααααΆααα·αααααααα½ααα αααΆαααΈααααα½ααααα ααΌαααααΆααα·ααααααααΆαααααααααΎαα·ααΈααΆααααααααααΆ ααΌα ααααααΆαα·αα’αΆα ααααΎαα ααΆαααΎααααΈααααΆαααα½αααΆαααααααΆααααα ααΎααααΈαααααΎαααΆαααααΆααααααΌααα·αααααα α’αααα’αΆα ααααΎα§ααααααααααααΎαα αα ααΆααααα α§ααΆα ααα pg_chameleon α
ααΎα’αααΈαα ααΆ pg_chameleon
pg_chameleon ααΊααΆααααααααα ααααααΈ MySQL αα PostgreSQL αα αααα»α Python 3. ααΆααααΎ open source mysql-replication library ααααΆααα αααα»α Python αααααα ααΌαααΆααα½αααααΌαααΆααααααα ααααΈααΆααΆα MySQL αα·ααααααΆαα»αααΆααααα» JSONB αα αααα»αααΌαααααΆααα·αααααα PostgreSQL α αΎααααααΆααααααααΌαααΆααα·ααααΈαααααα»αααΆα pl/pgsql αα·αααα·αα‘αΎααα·ααα αααα»αααΌαααααΆααα·αααααα PostgreSQL α
αααααααα·ααααα pg_chameleon
αααααααΆααα MySQL α
αααΎαααΈα
ααααααααα½αα’αΆα
ααααΌαααΆαα
αααααα
ααΌαααααΆααα·αααααα PostgreSQL ααααα
αααα½ααα
αααα»αααΆαααααααα
ααΆαααααααααα½ααα
α
αααΎα
ααααααααααααΆαααααααα αα·αααααα
αα·αα’αΆα
ααΌα
ααααΆααΆαααα
αα·ααααααβα
ααααβα’αΆα
βααααΌαβααΆαβαα
βααβααΈβααΆαβα
αααα MySQL ααααΆααα
ααΆααΆαααααα·αα’αΆα
α
αααα α¬αααααΎαααα α»αααααΌαααΆαααα
ααα
αα»αααΆαα
ααααααΈαα½ααααααΌαααΆααααααααααααααααα·αα
αααααααααααΆαααααααΆαααΆαααααααααααΆαααΌαααααΆαααΎ YAML αα·αα―αααΆαααααααα
ααΆααααααααα
α§ααΆα ααα:
αααΆαααΈα
vmα£α’α₯α’
vmα£α’α₯α’
ααααααααααααααααα·ααααα·ααΆα
CentOS Linux 7.6 x86_64
CentOS Linux 7.5 x86_64
αααααααΆαααΈααα DB
αααααα·ααΈ MySQL 5.7.26
PostgreSQL α¨.α€.α¦
α
ααα 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 (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 αααααα’ααααΎαααα»αααα
αααΆααα
ααΆαααααααα·ααααααα’αΆα
ααααΎαα
ααΆαααΆαααααααααΆααα»ααααα·ααΆα αα·αααααα·ααααααΌαααΆαα
ααΆαααΎαα‘αΎααα·ααααααααααααααααα·αα
ααααααααααΆααααααααααα·ααααα·ααΆααααααΆααααΈααΆααααΆααα αα·αααΆααααααααΆααααααααααααααααααααααα·α
Cloud αααααααΌαααααΆ αα·α APIs αααααααααααααααΆαα₯αααα·ααα
α§ααΆα ααα:
SymmetricDS α’αΆα
ααααΌαααΆαααααααα
ααΆαααααααααααα»ααααααΎααα½ααααα»αα
αααααααααΎαααΈαα
ααααΆαααα (αα) ααααααααααααα½αααΆαα
αααααα·ααααααααΆαααααΆααααΆαααααΆαα slave (ααΌα) ααΈα α αΎαααΆαααααΆαααααααααΆαααααΆααααΌαααΎαα‘αΎαααΆααααααααα»αααααα
ααααΆααααααα (ααααΆαα 1) α’αΆα
ααααΆαααααααααααΆααααΆαα
ααααααΆαα½αααααΆααααααααααααααα (ααααΆαα 2) αααααααΆαα’ααααααΆααΈα
αα
αααα»ααααααΎαααΆααααΈα ααΆαααααΆααααααΌααα·ααααααααΎαα‘αΎααααααααΎ Push αα·α Pull α αααα»αα§ααΆα αααααα ααΎαααΉααα·α
αΆαααΆααΆαααααααα
ααΆααααααααααααα-αααααα ααΆααΉαα
αααΆααααααΌαααααααα»αααΆααα·αααααΆα’αααΈααααΆααααααααααΆααααΌα ααΌα
ααααααααΎααΆαααααΆαααααΆαααααα’αααα
ααΆαααα‘αΎα SymmetricDS ααΊααΆααααααΆααα ααΆααααααααααααααΎαα
αα ααα―αααΆα zip
αααΆαααΈα
vmα£α’α₯α’
vmα£α’α₯α’
ααααααααααααααααα·ααααα·ααΆα
CentOS Linux 7.6 x86_64
CentOS Linux 7.6 x86_64
αααααααΆαααΈααα DB
αααααα·ααΈ MySQL 5.7.26
PostgreSQL α¨.α€.α¦
α
ααα 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-node ααΌαααααΆα (αααααΎα 1) α αΎαα―αααΆαααΌα ααααΆα’αΆα ααααΌαααΆαααααΎαααααΆααααΆααα ααΆ 2-node (αααααΎα 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 ααΊααΆααΌαααααΆααα·ααααααα ααααα register.url α’αα»ααααΆαα±αα host vm2 ααΆαααα host 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 αααααΎαααΆααΆα directory αααα αααΆαα αα·ααα·ααα ααααΆαα αααααααΆα nodes ααΉαααααΌαααΆααααααΆαα»αα ααΆα α»αααααα αα·ααααααααααΌααααΌαααΆααααα»ααα αααα»αααΆααΆαα
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 ααααΌαααΆαααααααα ααΆαααααααααααααααααααααααα·ααΎααααΈα ααααααΈ 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 ααα»αααααααααα·αααΆααα·ααααααα
ααΆααα’ααα ααα·ααααΆαααααααααα½αααΆααααα ααΎααααΈααααΎαααΆαααααΎαααΆααααΆαααΈααα sym αα ααΎααααΆααααΆααααΈαααΌα ααΆααααα αΆαααΆααααααα
vm1$> cd /usr/local/symmetric-server-3.9.20/bin
vm1$> sym 2>&1 &
ααΆαα»βαααααβα ααα»βααααΌαβααΆαβααααΎβαα βα―αααΆαβαααααβα ααα»βααααβααΆαβααααα (symmetric.log) αααα»αβααβαααααβα ααα»βαααα»αβααβααα SymmetricDS ααααΌαβααΆαβααα‘αΎα ααααβααΆααβααααααβαααααααΆαα α₯α‘αΌαααα sym server α’αΆα ααααΌαααΆααααα½α ααααΎααα ααΎ 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 (host: vm1) α αΎαα’αααα’αΆα αα·αα·αααααΎαααΆαα ααααααααααΆαα ααΌαααααΆααα·αααααα PostgreSQL αα ααΎ node store-001 (host: vm2) α ααΎαααΎαααααα·ααααα·ααΆαααΆαααΎααααΈααααΆααααΈαα·ααααααααΈ 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 ααααααααΎα 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