美文网首页PostgreSQL
An Overview of PostgreSQL &

An Overview of PostgreSQL &

作者: yanzongshuaiDBA | 来源:发表于2019-07-07 15:57 被阅读1次

    本博客的目的在于简述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

    HostVm1Vm2

    操作系统Centos linux release 7.6 x86_64Centos linux release 7.5 x86_64

    数据库版本MySQL5.7.26PostgreSQL10.5

    数据库端口号33065433

    IP地址192.168.56.102192.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>CREATEUSERusr_replica ;

    mysql>SETPASSWORDFORusr_replica='pass123';

    mysql>GRANTALLONworld_x.*TO'usr_replica';

    mysql>GRANTRELOADON*.*to'usr_replica';

    mysql>GRANTREPLICATIONCLIENTON*.*to'usr_replica';

    mysql>GRANTREPLICATIONSLAVEON*.*to'usr_replica';

    mysql>FLUSHPRIVILEGES;

    PostgreSQL段创建一个“db_replica”database用以接收MySQL数据。PG中的“usr_replica”用户自动配置成两个schemas(pgworld_x和sch_chameleon)的拥有者。这两个schema包含实际复制表和catalog表。通过create_replica_schema参数自动配置:

    postgres=#CREATEUSERusr_replicaWITHPASSWORD'pass123';

    CREATEROLE

    postgres=#CREATEDATABASEdb_replicaWITHOWNER usr_replica;

    CREATEDATABASE

    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的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 --sourcemysql --debug

    $> chameleon init_replica --config default --sourcemysql --debug

    上面的三个命令执行成功后,会分别输出明显的执行成功信息。任何错误和语法错误都会清晰的输出。

    最后一步是通过“start_replica”启动复制:

    $> chameleon start_replica --config default --sourcemysql

    output: Starting the replica processforsourcemysql

    通过show_status显示复制状态:

    $> chameleon show_status --sourcemysql

    OUTPUT:

    Source id  Source name    Type    Status    Consistent    Read lag    LastreadReplay 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 errorsinthelog

    通过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 --sourcemysql

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

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

    直到“real-time 回放”搭建复制才能完成。涉及创建表、向MySQL数据库中插入数据;PG的sync_tables命令更新守护进程并将表记录复制到PG:

    mysql>createtablet1 (n1intprimarykey, n2varchar(10));

    Query OK, 0 rows affected (0.01 sec)

    mysql>insertintot1values(1,'one');

    Query OK, 1 row affected (0.00 sec)

    mysql>insertintot1values(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*frompgworld_x.t1";

     n1 |  n2

    ----+-------

      1 | one

      2 | two

    如果是一个迁移需求,执行下面命令标记迁移结束。在所有需要复制的表复制完成后执行这些命令:

    $> chameleon stop_replica --configdefault--source mysql

    $> chameleon detach_replica --configdefault--source mysql --debug

    下面的命令可选:

    $> chameleon drop_source --config default --sourcemysql --debug

    $> chameleon drop_replica_schema --config default --sourcemysql --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 &

        本文链接:https://www.haomeiwen.com/subject/xnobhctx.html