An Overview of PostgreSQL & MySQL Cross Replication

Posted yzs的专栏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了An Overview of PostgreSQL & MySQL Cross Replication相关的知识,希望对你有一定的参考价值。


本博客的目的在于简述mysql和PostgreSQL之间如何跨数据库进行复制。涉及跨数据库复制的databases一般被称作异构databases。这是将数据从一种RDBMS server复制到另一种server的一种很好的方法。

PostgreSQL和MySQL都是传统的RDBMS数据库,但是他们也提供了NoSQL的能力。本文主要从RDBMS的角度讨论PostgreSQL和MySQL之间的复制问题。不对复制内部机制做详细介绍,只对一些基本元素、如何配置、有点、限制以及一些使用案例进行阐述。

通常情况下,两个种类相同的主备之间使用binary模式或者query模式进行复制。复制的目的在于,在备上能够得到主的实时备份数据,从而形成一个active-passive模式(因为复制只配置单向复制)。当然,也可以配置成向同步,构建active-active模式。

可以在两个不同数据库server之间配置上面的两种模式,其中一个数据库server可以配置从另外一个完全不同的数据库server上接收副本数据并维护副本数据的实时快照。MySQL和PostgreSQL通过原生机制或者第三方插件(包括binlog方法、磁盘块方法、基于语句和行的方法)完成上面提到的模式。

由于MySQL和PostgreSQL使用不同的复制协议,所以他们之间不能互相交互。为了达到通信流的目的,可以使用一个开源软件pg_chameleon。

pg_chameleon背景

pg_chameleon是由python3开发的MySQL to PG的复制工具。该插件也会使用一个mysql-replication的开源库,该库也是由Python3开发。从MySQL表中拉取行镜像并存储成JSONB形式,然后同步到PG数据库。PG数据库通过pl/pgsql进行解析并回放。

pg_chameleon特性

1、同一个集群中多个MySQL schema可以复制到一个PG database,形成many-to-one复制模式。

2、源和目的schema名可以不一样

3、复制数据可以从mysql级联副本中拉取。

4、会排除复制失败的表及复制过程中产生错误的表。

5、每个复制功能通过守护进程进行管理

6、配置参数和配置文件以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_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文件作为默认的配置文件。一个简单的配置例子如下所示:

$> 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提供的样例文件改造过的,以适应源和目标环境。下面是配置文件改造的摘要。

默认情况下.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 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 -Apadmin123 -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 mysql
output: 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 0
Tables replicated 4
All tables 4
Last maintenance N/A
Next maintenance N/A
Replayed rows
Replayed DDL
Skipped rows
--------------------- ---
$> chameleon show_errors --config default
output: There are no errors in the log

通过ps命令查看守护进程:

$>  ps -ef|grep chameleon
root 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 mysql
root 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 mysql
root 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 mysql
Sync 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​

以上是关于An Overview of PostgreSQL & MySQL Cross Replication的主要内容,如果未能解决你的问题,请参考以下文章

An Overview of Symbol Recognition符号识别综述

An Overview of Cisco IOS Versions and Naming

An overview of gradient descent optimization algorithms

(转) An overview of gradient descent optimization algorithms

An Overview of Blockchain

Overview and Evaluation of Bluetooth Low Energy: An Emerging Low-Power Wireless Technology