文档中心>日志服务

采集 MySQL BinLog

最近更新时间:2024-07-29 17:31:51

我的收藏
CLS 日志服务支持采集 MySQL 二进制日志(binlog),该日志以事件形式记录了对 MySQL 数据库执行更改的所有操作。

使用场景

该日志适用于对增量的数据库改动进行实时查询、分析与审计的需求场景。

前提条件

CentOS7 及以上版本。
已创建 MySQL 数据库且开启 ROW 模式的 Binlog 功能。TencentDB for MySQL 数据库默认开启 Binlog 功能。
确保在安装 cls-binlog 的机器上具有 mysqldump。如果没有可以先安装,例如在 centos/redhat 下执行yum -y install mysql。完成安装后,在机器上执行mysqldump出现以下信息即可:
> mysqldump
Usage: mysqldump [OPTIONS] database [tables]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]

操作步骤

步骤1: 部署安装

1. 在目标路径执行以下命令下载采集器自动化安装脚本。
wget http://mirrors.tencent.com/install/cls/binlog/install.sh
chmod +x install.sh
2. 执行以下命令安装采集器。 注意:不指定 -d,--data-dir 时,采集器默认安装位置在 /etc/binlog,配置文件位置在 /etc/binlog/config.toml,可执行二进制文件在/etc/binlog/bin
./install.sh -d 安装路径

步骤2: 采集配置

假设安装路径为 /etc/binlog,执行以下命令打开配置文件 config.toml。
vi /etc/binlog/config.toml

通用配置

data_dir = "/etc/binlog" #数据目录,保存.master.info等
cpu_limit = 0 #CPU使用限制,0表示不限制
server_id = 1001 #填写伪装 slave ID
flavor = "mysql" #数据库类型, 支持 mysql 或 mariadb
mode = "full" #full表示第一次启动的时候采集全部 binlog 同步到 CLS;increment 表示从当前最新位置采集

MySQL 配置

# mysql master parameter settings
[mysql]
addr = "" # MySQL 访问地址(IP+port)
user = "" # MySQL 账户
password = "" # MySQL 账户对应密码
charset = "utf8" # MySQL 字符集

# MySQL data source 配置采集哪些table的binlog
[[source]]
schema = "" # 数据库名称,DB 名称,不支持正则表达式,需要指定具体的 DB 名称
tables = [""] # MySQL tables名称,多个 table 用逗号分割,支持正则表达式;例如["test", "^set"];表示采集test表和set开头的表
topic_id = "" # CLS日志主题;binlog采集上传的CLS日志主题
filter_event = [] # 填写需要采集的事件 ["update", "insert", "delete"],不配置表示不区分事件类型,全部采集

CLS 配置

# cls
[cls]
endpoint = "ap-guangzhou.cls.tencentcs.com" #CLS的访问域名,区分地域,参考https://cloud.tencent.com/document/product/614/18940#.E5.9F.9F.E5.90.8D
secret_id = "" #访问CLS的 secret id
secret_key = "" #访问CLS的 secret key

组件运行日志配置

# log
[log]
log_path = "/var/log/binlog" #组件运行日志存储日志目录
max_size = 1024 #组件运行日志轮转大小,单位M
max_age = 5 #组件运行日志保留时长
max_backups = 10 #组件运行日志保留个数
level = "info" #组件运行日志日志打印级别,默认 info

组件运行指标配置

# metrics
[metrics]
addr = "0.0.0.0:8080" # 组件运行 metrics 暴露端口
path = "/metrics" # 组件运行 metrics 暴露请求路径

步骤3: 权限配置

创建具备目标数据库读权限与 MySQL REPLICATION 权限的账号。
例如数据库账号为 clsr,密码为 clsr 的用户授予权限。执行如下命令可授予 clsr 用户对目标数据库下的所有表有 SELECT 权限和 MySQL REPLICATION 权限。
CREATE USER clsr IDENTIFIED BY 'clsr';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'clsr'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'clsr'@'%' ;
FLUSH PRIVILEGES;
若为第一次启动采集器时,且 通用配置 中的 mode 如果设置为 full, 需要确保使用的 Mysql 用户有 FLUSH TABLES 权限(一般在非 root 用户下没有此权限)。若没有, 需执行以下 MySQL 命令配置。
GRANT RELOAD ON *.* TO 'your_user'@'%';

步骤4: 启动采集器

执行以下命令启动 binlog 采集器
systemctl start cls-binlog

停止采集器

执行以下命令,停止 binlog 采集器:
systemctl stop cls-binlog

查看采集器状态

执行以下命令,查看采集器状态:
systemctl status cls-binlog


数据可靠性

数据漏采集:cls-binlog 与 MySQL 服务器之间的网络长时间中断时,可能会产生数据漏采集情况。
如果 cls-binlog 和 MySQL master 节点之间的网络发生中断,MySQL master 节点仍会不断地产生新的 Binlog 数据并且回收旧的 Binlog 数据。
当网络恢复,cls-binlog 与 MySQL master 节点重连成功后,cls-binlog 会使用自身的 checkpoint 向 MySQL master 节点请求更多的 Binlog 数据。但由于长时间的网络中断,它所需要的数据很可能已经被回收,这时会触发 cls-binlog 的异常恢复机制。
在异常恢复机制中,cls-binlog 会从 MySQL master 节点获取最近的 Binlog 位置,以它为起点继续采集,这样就会跳过checkpoint 和最近的 Binlog 位置之间的数据,导致数据漏采集。
数据重复采集:当 MySQL master 节点和 slave 节点之间的 Binlog 序号不同步时,发生了主备切换事件,可能会产生数据重复采集情况。
在 MySQL 主备同步的设置下,MySQL master 节点会将产生的 Binlog 同步给 MySQL slave 节点,MySQL slave 节点收到后存储到本地的 Binlog 文件中。
当 MySQL master 节点和 slave 节点之间的 Binlog 序号不同步时,发生了主备切换事件,以 Binlog 文件名和文件大小偏移量作为 checkpoint 的机制将导致数据重复采集。
例如,有一段数据在 MySQL master 节点上位于(binlog.100, 4)到(binlog.105, 4)之间,而在 MySQL slave 节点上位于(binlog.1000, 4)到(binlog.1005, 4)之间,并且 cls-binlog 已经从 MySQL master 节点获取了这部分数据,将本地 checkpoint 更新到了(binlog.105, 4)。如果此时发生了主备切换且无任何异常发生,cls-binlog 将会继续使用本地 checkpoint(binlog.105, 4)去向新的 MySQL master 节点采集 binlog。但是因为新的 MySQL master 上的(binlog.1000, 4)到(binlog.1005, 4)这部分数据的序号都大于 Logtail 所请求的序号,MySQL master 将它们返回给 cls-binlog,导致重复采集。