An Overview of PG & MySQL Cross Replication

本博客的目的在於簡述MySQL和PostgreSQL之間如何跨數據庫進行復制。涉及跨數據庫複製的databases通常被稱做異構databases。這是將數據從一種RDBMS server複製到另外一種server的一種很好的方法。html

PostgreSQL和MySQL都是傳統的RDBMS數據庫,可是他們也提供了NoSQL的能力。本文主要從RDBMS的角度討論PostgreSQL和MySQL之間的複製問題。不對複製內部機制作詳細介紹,只對一些基本元素、如何配置、有點、限制以及一些使用案例進行闡述。python

一般狀況下,兩個種類相同的主備之間使用binary模式或者query模式進行復制。複製的目的在於,在備上可以獲得主的實時備份數據,從而造成一個active-passive模式(由於複製只配置單向複製)。固然,也能夠配置成向同步,構建active-active模式。mysql

能夠在兩個不一樣數據庫server之間配置上面的兩種模式,其中一個數據庫server能夠配置從另一個徹底不一樣的數據庫server上接收副本數據並維護副本數據的實時快照。MySQL和PostgreSQL經過原生機制或者第三方插件(包括binlog方法、磁盤塊方法、基於語句和行的方法)完成上面提到的模式。linux

因爲MySQL和PostgreSQL使用不一樣的複製協議,因此他們之間不能互相交互。爲了達到通訊流的目的,可使用一個開源軟件pg_chameleon。sql

pg_chameleon背景

pg_chameleon是由python3開發的MySQL to PG的複製工具。該插件也會使用一個mysql-replication的開源庫,該庫也是由Python3開發。從MySQL表中拉取行鏡像並存儲成JSONB形式,而後同步到PG數據庫。PG數據庫經過pl/pgsql進行解析並回放。數據庫

pg_chameleon特性

一、同一個集羣中多個MySQL schema能夠複製到一個PG database,造成many-to-one複製模式。app

二、源和目的schema名能夠不同ide

三、複製數據能夠從mysql級聯副本中拉取。工具

四、會排除複製失敗的表及複製過程當中產生錯誤的表。oop

五、每一個複製功能經過守護進程進行管理

六、配置參數和配置文件以yaml結構進行控制。

Demo

Host

Vm1

Vm2

操做系統

Centos linux release 7.6 x86_64

Centos linux release 7.5 x86_64

數據庫版本

MySQL5.7.26

PostgreSQL10.5

數據庫端口號

3306

5433

IP地址

192.168.56.102

192.168.56.106

 

首先須要安裝Python,他在建立虛擬環境以及激活的時候會用到。

$> 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

安裝成功後須要建立並激活虛擬環境。另外須要將pip模塊升級到最新版本。pg_chameleon最新版本是2.0.10,爲了避免引入新的bug,建議先使用2.0.9版本。

$> python3.6 -m venv venv$> source venv/bin/activate(venv) $> pip install pip --upgrade(venv) $> pip install pg_chameleon==2.0.9

下一步須要經過set_configuration_files配置啓用pg_chameleon,並建立默認路徑以及配置文件:

(venv) $> chameleon set_configuration_filescreating directory /root/.pg_chameleoncreating 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文件做爲默認的配置文件。一個簡單的配置例子以下所示:

$> cat default.yml---#global settingspid_dir: '~/.pg_chameleon/pid/'log_dir: '~/.pg_chameleon/logs/'log_dest: filelog_level: infolog_days_keep: 10rollbar_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 connectionpg_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提供的樣例文件改造過的,以適應源和目標環境。下面是配置文件改造的摘要。

默認狀況下.yml文件有「global settings」段,用以控制詳細信息好比鎖文件位置、日誌位置、日誌保留期等。接着是「type override」段,這部分是在複製期間重寫類型的集合。默認狀況下使用樣本類型重寫規則,即將tinyint(1)轉換成布爾值。而後是「pg_conn」,是目標數據庫鏈接的詳細信息。最後一部分是源數據庫信息,控制源數據庫的鏈接、源和目標直接的schema映射、須要跳過不復制的表、時間超時、內存等配置。注意,「sources」表示能夠有多個源。

本文使用的demo中有一個「world_x」database,包括4個表,MySQL社區提供了下載位置:https://dev.mysql.com/doc/index-other.html。

在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」database用以接收MySQL數據。PG中的「usr_replica」用戶自動配置成兩個schemas(pgworld_x和sch_chameleon)的擁有者。這兩個schema包含實際複製表和catalog表。經過create_replica_schema參數自動配置:

postgres=# CREATE USER usr_replica WITH PASSWORD 'pass123';CREATE ROLEpostgres=# CREATE DATABASE db_replica WITH OWNER usr_replica;CREATE DATABASE

MySQL配置以下,需重啓服務才能生效:

$> vi /etc/my.cnfbinlog_format= ROWbinlog_row_image=FULLlog-bin = mysql-binserver-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的3個命令時搭建環境時執行,添加源並初始化一個備。「create_replica_schema」建立默認的schema(sch_chameleon)以及複製的schema(pgworld_x)。「add_source」經過讀取配置文件信息添加source database,本文中是「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 mysqloutput: Starting the replica process for source mysql

經過show_status顯示覆制狀態:

$> chameleon show_status --source mysql OUTPUT:  Source id  Source name    Type    Status    Consistent    Read lag    Last read    Replay lag    Last replay-----------  -------------  ------  --------  ------------  ----------  -----------  ------------  -------------          1  mysql          mysql   running   No            N/A                      N/A== Schema mappings ==Origin schema    Destination schema---------------  --------------------world_x          pgworld_x== Replica status ==---------------------  ---Tables not replicated  0Tables replicated      4All tables             4Last maintenance       N/ANext maintenance       N/AReplayed rowsReplayed DDLSkipped rows---------------------  ---$> chameleon show_errors --config defaultoutput: There are no errors in the log

經過ps命令查看守護進程:

$>  ps -ef|grep chameleonroot       763     1  0 19:20 ?        00:00:00 /u01/media/mysql_samp_dbs/world_x-db/venv/bin/python3.6 /u01/media/mysq l_samp_dbs/world_x-db/venv/bin/chameleon start_replica --config default --source mysqlroot       764   763  0 19:20 ?        00:00:01 /u01/media/mysql_samp_dbs/world_x-db/venv/bin/python3.6 /u01/media/mysq l_samp_dbs/world_x-db/venv/bin/chameleon start_replica --config default --source mysqlroot       765   763  0 19:20 ?        00:00:00 /u01/media/mysql_samp_dbs/world_x-db/venv/bin/python3.6 /u01/media/mysq l_samp_dbs/world_x-db/venv/bin/chameleon start_replica --config default --source mysql

直到「real-time 回放」搭建複製才能完成。涉及建立表、向MySQL數據庫中插入數據;PG的sync_tables命令更新守護進程並將表記錄複製到PG:

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 mysqlSync tables process for source mysql started.

測試確認複製正常:

$> psql -p 5433 -U usr_replica -d db_replica -c "select * from pgworld_x.t1"; n1 |  n2----+-------  1 | one  2 | two

若是是一個遷移需求,執行下面命令標記遷移結束。在全部須要複製的表複製完成後執行這些命令:

$> 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

Pros of Using pg_chameleon

安裝並配置比較簡單

錯誤日誌易看懂

無需更改任何配置,初始化完成後能夠添加額外的複製表

可配置成多源複製

能夠指定不復制哪些表

Cons of Using pg_chameleon

僅支持MySQL5.5及其以上的版本到Pg9.5及其以上之間進行復制

每一個複製表須要有主鍵或惟一鍵

只能MySQL到PG

總結

pg_chameleon工具提供從MySQL向PG遷移的方法。然而只能單向複製。這個缺點可使用另一個工具SymmetricDS來彌補。文檔:https://pgchameleon.org/documents/;命令行說明:https://pgchameleon.org/documents/usage.html#command-line-reference

原文

https://severalnines.com/blog/overview-postgresql-mysql-cross-replication

相關文章
相關標籤/搜索