binlogserver搭建
在MySQL 5.7.x版本中,mysqlbinlog工具解析任何一个本地的binlog或relay log时,都不会在mysqlbinlog命令执行结束时追加rollback语句,
其实官方mysqlbinlog自带这个功能。
MySQL Binlog Server:是利用某个工具,把线上活跃的库的日志拉取到本地进行备份。在MySQL 5.6以后,可以利用mysqlbinlog这个命令去把远程机器的日志备份到本地目录,从而达到增量或是日志安全方面的备份。
常用的参数:
-R | --read-from-remote-server 表示开启binlog备份,在对应的主节点上请求binlog到本地。
--raw 被复制过来的binlog以二进制的格式存放,如果不加该参数则为text格式。
-r | --result-file 指定目录或文件名:若指定了--raw参数,-r的值指定binlog的存放目录和文件名前缀;若没有指定--raw参数,-r的值指定文本存放的目录和文件名。
-t 这个选项代表从指定的binlog开始拉取,直到当前主节点上binlog的最后一个。
--stop-never 持续连续从主节点拉取binlog,持续备份到当前最后一个,并继续下去。该参数包含-t
--stop-never-slave-server-id 默认值65535,用于在多个mysqlbinlog进程或者从服务器的情况下,避免ID冲突。
可通过ps查看到已经开启的备份进程。
用法示例:完整并保持原样的将远程server的binlog拉到本地,并存放在/data/backup_binlog目录中。
注意,-r指定的目录必须写完整,否则会被放在/data目录下,并以"backup_binlog"为前缀命名binlog
如:-r /data/backup_binlog 则会显示为 /data/backup_binlog/mysql-bin.000008
mysqlbinlog -h$ip -P$port -u$user -p$password -R --raw --stop-never mysql-bin.000008 -r /data/backup_binlog/ &
# cat bakbinlog.sh
#!/bin/bash
MBL=/usr/local/mysql/bin/mysqlbinlog
MYB=/usr/local/mysql/bin/mysql
MYSQLHOST=192.168.1.101
MYSQLPORT=3306
MYSQLUSER=dba_user
MYSQLPASS=msds007
BACKUPDIR=/data/backup_binlog/$MYSQLHOST/
RESPAWN=10
FIRSTBINLOG=`$MYB -u$MYSQLUSER -p$MYSQLPASS -h$MYSQLHOST -P$MYSQLPORT -e "show master status;" | grep bin | awk '{print $1}'`
mkdir -p $BACKUPDIR
while :
do
if [ `ls -A "$BACKUPDIR" | wc -l` -eq 0 ];then
LASTFILE=$FIRSTBINLOG
else
LASTFILE=`ls -al "$BACKUPDIR" | tail -n 1 | awk '{print $9}'`
fi
echo 'Starting live binlog backup'
$MBL -h$MYSQLHOST -P$MYSQLPORT -u$MYSQLUSER -p$MYSQLPASS -R --raw --stop-never $LASTFILE -r $BACKUPDIR
echo 'mysqlbinlog exited with $? trying to reconnect in $RESPAWN seconds'
sleep $RESPAWN
done
用Python开发MySQL增强半同步BinlogServer
项目地址为:
https://github.com/alvinzane/py-mysql-binlogserver
主要特性如下:
全Python标准模块开发,无第三方库依赖,减少学习成本
独立Dumper进程,用于同步保存Binlog event
支持半同步协议,数据零丢失
独立Server进程,支持Failover时Change master to来补数据
支持GTID,方便切换Master
暂不支持级联复制模式
仅在MySQL官方版5.7+下测试通过
仅支持Python3, 不兼容Python2
目录结构:
-
py-mysql-binlogserver
-
├── README.doc
-
├── doc
-
│ ├── T1基础篇-用Python开发MySQL增强半同步BinlogServer.md
-
│ ├── T2通信篇-用Python开发MySQL增强半同步BinlogServer.md
-
│ ├── T3实战篇-用Python开发MySQL增强半同步BinlogServer.md
-
│ ├── T4架构篇-用Python开发MySQL增强半同步BinlogServer.md
-
│ └── readme.md
-
└── py_mysql_binlogserver
-
├── __init__.py
-
├── _playground # 练习场,随便玩
-
│ ├── __init__.py
-
│ ├── socket_client.py
-
│ ├── socket_client_semi-repl.py
-
│ └── test_slave.py
-
├── _tutorial # 教程实例代码
-
│ ├── __init__.py
-
│ ├── learn_bin1_charset.py
-
│ ├── learn_bin2_binlog.py
-
│ ├── learn_packet1_greeting.py
-
│ ├── learn_packet2_auth.py
-
│ ├── learn_packet3_query.py
-
│ ├── learn_packet4_dump.py
-
│ ├── learn_packet4_dump2.py
-
│ ├── learn_packet5_dump_with_semi_ack.py
-
│ ├── learn_socket1_client.py
-
│ ├── learn_socket2_server.py
-
│ ├── learn_socket3_server_mulit_thread.py
-
│ └── learn_socket4_server_mulit_thread.py
-
├── binlogs # Binlog文件保存目录
-
│ ├── mysql-bin.000014
-
│ ├── mysql-bin.gtid.index
-
│ └── mysql-bin.index
-
├── cap
-
├── constants
-
│ ├── EVENT_TYPE.py
-
│ └── FIELD_TYPE.py
-
├── dump
-
│ └── readme.md
-
├── packet
-
│ ├── __init__.py
-
│ ├── binlog_event.py
-
│ ├── challenge.py
-
│ ├── dump_gtid.py
-
│ ├── dump_pos.py
-
│ ├── event_header.py
-
│ ├── gtid_event.py
-
│ ├── query.py
-
│ ├── response.py
-
│ ├── semiack.py
-
│ └── slave.py
-
├── protocol
-
│ ├── Flags.py
-
│ ├── __init__.py
-
│ ├── err.py
-
│ ├── gtid.py
-
│ ├── ok.py
-
│ ├── packet.py
-
│ └── proto.py
-
└── tests # 单元测试
-
│ ├── __init__.py
-
│ └── test_packet.py
-
├── proxy.py # 简单代理,用于观察和保存MySQL Packet
-
├── server.py # 实现Master协议
-
├── dumper.py # Binlog Dumper,相当于IO Thread
-
├── example.conf # 配置文件
-
└─── example.py # 同时启动 Server&Dumper