实时第三方数据复制

随着机器学习、人工智能的发展,越来越多的企业倾向于实时的获取数据的价值,而不满足于通过夜间运行批量任务作业的方式来处理信息。 本文档将介绍如何将 DB2, Oracle, MySQL 的数据实时复制至 SequoiaDB 巨杉数据库中。

DB2和Oracle数据实时复制

对于 DB2 和 Oracle 的数据实时复制存在很多种方案,通常的做法如下:

  • 使用 Oracle 官方数据迁移工具,如 OGG(Oracle GlodenGate)、CDC(Change Data Capture)
  • 自研数据导入导出程序实现
  • 使用第三方数据迁移工具

MySQL 数据实时复制

SequoiaDB 巨杉数据库作为分布式数据库,由数据库存储引擎与数据库实例两大模块构成。 其中,数据库存储引擎模块是数据存储的核心,负责提供整个数据库的读写服务、数据的高可用与容灾、ACID 与分布式事务等全部核心数据服务能力。 用户可以通过添加 SequoiaSQL-MySQL 实例,基于 binlog Replication 方式实时同步 MySQL 的数据至 SequoiaDB 中。 在 MySQL 与 SequoiaDB 之间建立主从复制需要以下4个步骤:

  • 安装部署 Sequoiasql-MySQL,详细步骤参见 SequoiaSQL-MySQL 安装部署
  • 存量数据从 MySQL 迁移至 SequoiaSQL-MySQL
  • MySQL数据库开启 binlog 日志,配置为主库
  • SequoiaSQL-MySQL 开启 binlog 日志,配置为从库
  • 配置 binlog Replication 主从关系

存量数据从 MySQL 迁移至 Sequoiadb-MySQL

MySQL 的 binlog Replication 机制只能实时同步增量数据,不能同步存量数据,因此存量数据需要使用 mydumper 工具导出,再使用 myloader 工具导入到 SequoiaSQL-MySQL 中。可参考mydumper&myloader的使用

SequoiaSQL-MySQL 采用的存储引擎是 SequoiaDB 分布式数据库引擎,而非 InnoDB 引擎,对于 mydumper 导出的建表语句需要进行相应的修改,因此需要分别导出数据表结构以及数据。 假设 MySQL 数据库中存在存量数据 info 库,将该库的数据迁移至 SequoiaSQL-MySQL 需要以下5个步骤:

  1. 导出 info 库的所有表结构:

    1. mydumper -h sdbserver1 -P 3306 -u sdbadmin -p sdbadmin -d -t 4 -s 1000000 -e -B info -o /home/sdbadmin/info/schema
  2. 导出 info 库的所有数据表的数据:

    1. mydumper -h sdbserver1 -P 3306 -u sdbadmin -p sdbadmin -m -t 4 -s 1000000 -e -B info -o /home/sdbadmin/info/data
  3. 修改表结构的存储引擎为 SequoiaDB,字符编码修改为 utf8mb4

  4. 导入 info 库的表结构至 SequoiaSQL-MySQL:

    1. myloader -h sdbserver2 -P 3306 -u sdbadmin -p sdbadmin -t 4 -d /home/sdbadmin/info/schema
  5. 导入 info 库的数据表数据至 SequoiaSQL-MySQL的 info 库中:

    1. myloader -h sdbserver2 -P 3306 -u sdbadmin -p sdbadmin -t 4 -d /home/sdbadmin/info/data

MySQL开启binlog

  1. 修改 MySQL 配置文件 /etc/mysql/mysql.conf.d/mysqld.cnf

    1. [mysqld]
    2. port=3306
    3. log-bin=master-bin
    4. server-id=1
  2. 重启 MySQL 服务

    1. service mysql restart
  3. 查看 binlog 日志状态

    1. mysql> show variables like '%log_bin%';
    2. +---------------------------------+------------------------------------------------------+
    3. | Variable_name | Value |
    4. +---------------------------------+------------------------------------------------------+
    5. | log_bin | ON |
    6. | log_bin_basename | /opt/sequoiasql/mysql/database/3306/master-bin |
    7. | log_bin_index | /opt/sequoiasql/mysql/database/3306/master-bin.index |
    8. | log_bin_trust_function_creators | OFF |
    9. | log_bin_use_v1_row_events | OFF |
    10. | sql_log_bin | ON |
    11. +---------------------------------+------------------------------------------------------+
    12. 6 rows in set (0.00 sec)

SequoiaSQL-MySQL 开启 binlog

  1. 修改 SequoiaSQL-MySQL 配置文件/opt/sequoiasql/mysql/database/3306/auto.cnf

    1. [mysqld]
    2. server-id=3
    3. relay_log=relay-log
    4. relay_log_index=relay-log.index
  2. 重启 SequoiaSQL-MySQL 服务

    1. service sequoiasql-mysql restart
  3. 查看 replay_log 日志状态

    1. mysql> show variables like '%relay_log%';
    2. +---------------------------+-----------------------------------------------------+
    3. | Variable_name | Value |
    4. +---------------------------+-----------------------------------------------------+
    5. | max_relay_log_size | 0 |
    6. | relay_log | relay-log |
    7. | relay_log_basename | /opt/sequoiasql/mysql/database/3306/relay-log |
    8. | relay_log_index | /opt/sequoiasql/mysql/database/3306/relay-log.index |
    9. | relay_log_info_file | relay-log.info |
    10. | relay_log_info_repository | FILE |
    11. | relay_log_purge | ON |
    12. | relay_log_recovery | OFF |
    13. | relay_log_space_limit | 0 |
    14. | sync_relay_log | 10000 |
    15. | sync_relay_log_info | 10000 |
    16. +---------------------------+-----------------------------------------------------+
    17. 11 rows in set (0.06 sec)

配置 Binlog Recplication 主从关系

  1. 在 MySQL 主库上查看主库 binlog 日志文件位置

    1. mysql> show master status\G
    2. *************************** 1. row ***************************
    3. File: master-bin.000001
    4. Position: 154
    5. Binlog_Do_DB:
    6. Binlog_Ignore_DB:
    7. Executed_Gtid_Set:
    8. 1 row in set (0.00 sec)
  2. 在主库上授权复制用户

    1. mysql> grant replication slave,replication client on *.* to 'repl'@'%' identified by 'sequoiadb';
    2. mysql> flush privileges;
  3. 在 SequoiaSQL-MySQL 从库上配置主从关系,使用有复制权限的用户账号连接主库,启动复制线程

    1. reset slave;
    2. change master to
    3. master_host='sdbserver1',
    4. master_user='repl',
    5. master_password='sequoiadb',
    6. master_port=3306,
    7. master_log_file='master-bin.000001',
    8. master_log_pos=154;
    9. start slave;
  4. 查看 Slave 状态

    1. mysql> show slave status\G
    2. *************************** 1. row ***************************
    3. Slave_IO_State: Waiting for master to send event
    4. Master_Host: sdbserver1
    5. Master_User: repl
    6. Master_Port: 3306
    7. Connect_Retry: 60
    8. Master_Log_File: master-bin.000001
    9. Read_Master_Log_Pos: 154
    10. Relay_Log_File: relay-log.000002
    11. Relay_Log_Pos: 321
    12. Relay_Master_Log_File: master-bin.000001
    13. Slave_IO_Running: Yes
    14. Slave_SQL_Running: Yes
    15. Replicate_Do_DB:
    16. Replicate_Ignore_DB:
    17. Replicate_Do_Table:
    18. Replicate_Ignore_Table:
    19. Replicate_Wild_Do_Table:
    20. Replicate_Wild_Ignore_Table:
    21. Last_Errno: 0
    22. Last_Error:
    23. Skip_Counter: 0
    24. Exec_Master_Log_Pos: 154
    25. Relay_Log_Space: 522
    26. Until_Condition: None
    27. Until_Log_File:
    28. Until_Log_Pos: 0
    29. Master_SSL_Allowed: No
    30. Master_SSL_CA_File:
    31. Master_SSL_CA_Path:
    32. Master_SSL_Cert:
    33. Master_SSL_Cipher:
    34. Master_SSL_Key:
    35. Seconds_Behind_Master: 0
    36. Master_SSL_Verify_Server_Cert: No
    37. Last_IO_Errno: 0
    38. Last_IO_Error:
    39. Last_SQL_Errno: 0
    40. Last_SQL_Error:
    41. Replicate_Ignore_Server_Ids:
    42. Master_Server_Id: 1
    43. Master_UUID: dec14b1d-b772-11e9-af76-0050562a7848
    44. Master_Info_File: /opt/sequoiasql/mysql/database/3306/master.info
    45. SQL_Delay: 0
    46. SQL_Remaining_Delay: NULL
    47. Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
    48. Master_Retry_Count: 86400
    49. Master_Bind:
    50. Last_IO_Error_Timestamp:
    51. Last_SQL_Error_Timestamp:
    52. Master_SSL_Crl:
    53. Master_SSL_Crlpath:
    54. Retrieved_Gtid_Set:
    55. Executed_Gtid_Set:
    56. Auto_Position: 0
    57. Replicate_Rewrite_DB:
    58. Channel_Name:
    59. Master_TLS_Version:
    60. 1 row in set (0.03 sec)
  5. 至此,基于 binlog Replication 实时数据同步环境已搭建完成。

mydumper&myloader安装

mydumper&myloader 是用于对MySQL数据库进行多线程备份和恢复的开源 (GNU GPLv3)工具。 安装部署如下:

  1. mydumper 官网 下载 mydumper安装包
  2. 切换到 root 权限用户,执行以下命令安装
  • Centos6 / Red Hat6:
  1. sudo yum install mydumper-0.9.5-2.el6.x86_64.rpm
  • Centos7 / Red Hat7:
  1. sudo yum install mydumper-0.9.5-2.el7.x86_64.rpm
  • Ubuntu / Debian
  1. sudo dkpg -i mydumper_0.9.5-2.xenial_amd64.deb

小结

SequoiaDB 巨杉数据库支持通过 Oracle 官方迁移工具、第三方迁移工具等方式从 DB2、Oracle 中实时同步数据至 SequoiaDB 以及支持基于 MySQL 的 binlog Replication 机制实时复制 MySQL 的数据至 SequoiaDB 中。