全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件
日志服务

插件-MySQL Binlog方式

更新时间:2018-01-12 17:56:10

MySQL Binlog同步类似 canal 功能,以MySQL slave的形式基于Binlog进行同步,性能较高。

注意: 此功能目前只支持Linux,依赖Logtail 0.16.0及以上版本,版本查看与升级参见安装文档

功能

  • 通过Binlog订阅数据库增量更新数据,性能优越,支持RDS等MySQL协议的数据库。
  • 支持数据库过滤(支持正则)。
  • 支持同步点设置。
  • 支持Checkpoint保存同步状态。

实现原理

如下图所示,Logtail内部实现了MySQL Slave的交互协议,将自己伪装成为MySQL的Slave节点,向MySQL master发送dump协议;MySQL的master收到dump请求后,会将自身的Binary log实时推送给Logtail,Logtail对Binlog进行事件解析、过滤、数据解析等,并将解析好的数据上传到日志服务。

Binlog实现原理

应用场景

适用于数据量较大且性能要求较高的数据同步场景。

  • 增量订阅数据库改动进行实时查询与分析。

  • 数据库操作审计。

  • 通过数据库更新信息使用日志服务进行自定义查询分析、可视化、对接下游流计算、导入MaxCompute离线计算、导入OSS长期存储等。

参数说明

MySQL Binlog方式输入源类型为:service_canal

参数 类型 必选或可选 参数说明
Host string 可选 数据库主机,默认为127.0.0.1。
Port int 可选 数据库端口,默认为3306。
User string 可选 数据库用户名,默认为root。
Password string 可选 数据库密码;默认为空。
ServerID int 可选 Logtail伪装成的Mysql Slave ID,默认为125。注意: ServerID对于一个MySQL数据库必须唯一,否则同步失败。
IncludeTables string 数组 可选 包含的表名称(包括db,例如test_db.test_table),为正则表达式,若某表不符合IncludeTables任一条件则该表不会被采集;不设置时默认收集所有表。
ExcludeTables string 数组 可选 忽略的表名称(包括db,例如test_db.test_table),为正则表达式,若某表符合IgnoreTables任一条件则该表不会被采集;不设置时默认收集所有表。
StartBinName string 可选 首次采集的Binlog文件名,不设置时默认从当前时间点开始采集。
StartBinLogPos int 可选 首次采集的Binlog文件名的offset,默认为0。
EnableGTID bool 可选 是否附加全局事务ID,默认为true,为false时上传的数据将不附加。
EnableInsert bool 可选 是否收集insert事件的数据,默认为true,为false时insert事件将不采集。
EnableUpdate bool 可选 是否收集update事件的数据,默认为true,为false时update事件将不采集。
EnableDelete bool 可选 是否收集delete事件的数据,默认为true,为false时delete事件将不采集。
Charset string 可选 编码方式,默认为utf-8
TextToString bool 可选 是否将text类型数据转换成string,默认为false。

使用限制

  • 此功能目前只支持Linux,依赖Logtail 0.16.0及以上版本,版本查看与升级参见安装文档

  • MySQL 必须开启Binlog,且Binlog必须为row模式(默认RDS已经开启)。

    1. # 查看是否开启Binlog
    2. mysql> show variables like "log_bin";
    3. +---------------+-------+
    4. | Variable_name | Value |
    5. +---------------+-------+
    6. | log_bin | ON |
    7. +---------------+-------+
    8. 1 row in set (0.02 sec)
    9. # 查看Binlog类型
    10. mysql> show variables like "binlog_format";
    11. +---------------+-------+
    12. | Variable_name | Value |
    13. +---------------+-------+
    14. | binlog_format | ROW |
    15. +---------------+-------+
    16. 1 row in set (0.03 sec)
  • ServerID 必须唯一,确保需同步的MySQL所有Slave的ID不重复。

  • 需保证配置的用户具有需要采集的数据库读权限以及MySQL REPLICATION权限,示例如下:

    1. CREATE USER canal IDENTIFIED BY 'canal';
    2. GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
    3. -- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
    4. FLUSH PRIVILEGES;
  • 首次配置采集时如果不配置StartBinName,默认从当前时间点采集。

    如果想从指定位置采集,可以查看当前的Binlog以及offset,并将StartBinNameStartBinLogPos设置成对应的值,示例如下:

    注意:当指定StartBinName时,第一次采集会产生较大开销。

    1. # StartBinName 设置成 "mysql-bin.000063", StartBinLogPos 设置成 0
    2. mysql> show binary logs;
    3. +------------------+-----------+
    4. | Log_name | File_size |
    5. +------------------+-----------+
    6. | mysql-bin.000063 | 241 |
    7. | mysql-bin.000064 | 241 |
    8. | mysql-bin.000065 | 241 |
    9. | mysql-bin.000066 | 10778 |
    10. +------------------+-----------+
    11. 4 rows in set (0.02 sec)
  • 如安全需求较高,建议将SQL访问用户名和密码配置为xxx,待配置同步至本地机器后,在/usr/local/ilogtail/user_log_config.json文件找到对应配置进行修改。

    注意

    • 修改完毕后请执行以下命令重启Logtail:sudo /etc/init.d/ilogtaild stop; sudo /etc/init.d/ilogtaild start
    • 如果您再次在Web端修改此配置,您的手动修改会被覆盖,请再次手动修改本地配置。
  • RDS 相关限制:

    • 无法直接在RDS服务器上安装Logtail,您需要将Logtail安装在能连通RDS实例的任意一台ECS上。
    • RDS 只读备库当前不支持Binlog采集,您需要配置主库进行采集。

操作步骤

从RDS中同步user_info库中不以_inner结尾的表,配置如下。

  1. 选择输入源。

    单击数据接入向导图标或创建配置,进入数据接入向导。并在选择数据库类型步骤中选择BINLOG

  2. 填写输入配置。

    进入输入源配置页面,填写插件配置

    插件配置输入框中已为您提供配置模板,请根据您的需求替换配置参数信息。

    inputs部分为采集配置,是必选项;processors部分为处理配置,是可选项。采集配置部分需要按照您的数据源配置对应的采集语句,处理配置部分请参考处理采集数据配置一种或多种采集方式。

    注意

    • 若安全需求较高,建议将SQL访问用户名/密码配置为xxx,待配置同步至本地机器后,在/usr/local/ilogtail/user_log_config.json文件找到对应配置进行修改。
    • 请将Host/User/Password/Port替换为实际访问参数。

    示例配置如下:

    1. {
    2. "inputs": [
    3. {
    4. "type": "service_canal",
    5. "detail": {
    6. "Host": "************.mysql.rds.aliyuncs.com",
    7. "User" : "root",
    8. "ServerID" : 56321,
    9. "Password": "*******",
    10. "IncludeTables": [
    11. "user_info\\..*"
    12. ],
    13. "ExcludeTables": [
    14. ".*\\.\\S+_inner"
    15. ],
    16. "TextToString" : true
    17. }
    18. }
    19. ]
    20. }
  3. 应用到机器组。

    进入应用到机器组页面。请在此处勾选运行有此插件的Logtail机器组

    如您之前没有创建过机器组,单击+创建机器组以创建一个新的机器组。

    注意: Binlog采集只需要一台安装Logtail的机器,您的机器组中只需要配置一个服务器IP即可。如您的机器组中有多台机器,请不要配置一样的ServerID。

  4. 修改本地配置。

    如果您没有在输入源配置页面输入真实的URL、账号、密码等信息,需要在采集配置下发到本地后手动修改其中的内容。

    注意: 如果您服务端输入的是真实信息,则无需此步骤。

    1. 登录Logtail所在服务器,查找/usr/local/ilogtail/user_log_config.json文件中service_canal关键词,修改下述对应的HostUserPassword等字段。

    2. 执行以下命令重启Logtail。

      1. sudo /etc/init.d/ilogtaild stop; sudo /etc/init.d/ilogtaild start

Binlog采集配置已经完成,如果您的数据库有在进行对应的修改操作,则Logtail会立即将变化的数据采集到日志服务。

注意: Logtail默认采集Binlog的增量数据,如查看不到数据请确认在配置更新后数据库对应的表存在修改操作。

使用实例

例如,按照以上操作步骤配置处理方式后,对user_info 下的SpecialAlarm表分别执行INSERTUPDATEDELETE操作。数据库表结构、数据库操作及Logtail采集的样例如下。

  • 表结构
    1. CREATE TABLE `SpecialAlarm` (
    2. `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    3. `time` datetime NOT NULL,
    4. `alarmtype` varchar(64) NOT NULL,
    5. `ip` varchar(16) NOT NULL,
    6. `count` int(11) unsigned NOT NULL,
    7. PRIMARY KEY (`id`),
    8. KEY `time` (`time`) USING BTREE,
    9. KEY `alarmtype` (`alarmtype`) USING BTREE
    10. ) ENGINE=MyISAM AUTO_INCREMENT=1;
  • 数据库操作

    对数据库执行INSERT、DELETE和UPDATE三种操作:

    1. insert into specialalarm (`time`, `alarmType`, `ip`, `count`) values(now(), "NO_ALARM", "10.10.**.***", 55);
    2. delete from specialalarm where id = 4829235 ;
    3. update specialalarm set ip = "10.11.***.**" where id = "4829234";
  • 样例日志

    在数据预览或在查找页面中,可以看到对应每种操作的样例日志如下:

    • INSERT语句

      1. __source__: 10.30.**.**
      2. __tag__:__hostname__: iZbp145dd9fccu*****
      3. __topic__:
      4. _db_: zc
      5. _event_: row_insert
      6. _gtid_: 7d2ea78d-b631-11e7-8afb-00163e0eef52:536
      7. _host_: *********.mysql.rds.aliyuncs.com
      8. _id_: 113
      9. _table_: specialalarm
      10. alarmtype: NO_ALARM
      11. count: 55
      12. id: 4829235
      13. ip: 10.10.22.133
      14. time: 2017-11-01 12:31:41
    • DELETE语句

      1. __source__: 10.30.**.**
      2. __tag__:__hostname__: iZbp145dd9fccu****
      3. __topic__:
      4. _db_: zc
      5. _event_: row_delete
      6. _gtid_: 7d2ea78d-b631-11e7-8afb-00163e0eef52:537
      7. _host_: *********.mysql.rds.aliyuncs.com
      8. _id_: 114
      9. _table_: specialalarm
      10. alarmtype: NO_ALARM
      11. count: 55
      12. id: 4829235
      13. ip: 10.10.22.133
      14. time: 2017-11-01 12:31:41
    • UPDATE语句

      1. __source__: 10.30.**.**
      2. __tag__:__hostname__: iZbp145dd9fccu****
      3. __topic__:
      4. _db_: zc
      5. _event_: row_update
      6. _gtid_: 7d2ea78d-b631-11e7-8afb-00163e0eef52:538
      7. _host_: *********.mysql.rds.aliyuncs.com
      8. _id_: 115
      9. _old_alarmtype: NO_ALARM
      10. _old_count: 55
      11. _old_id: 4829234
      12. _old_ip: 10.10.22.133
      13. _old_time: 2017-10-31 12:04:54
      14. _table_: specialalarm
      15. alarmtype: NO_ALARM
      16. count: 55
      17. id: 4829234
      18. ip: 10.11.145.98
      19. time: 2017-10-31 12:04:54
本文导读目录