前言
新建两个数据库, 分别为 192.168.220.132:3001, 192.168.220.132:3002
设置 192.168.220.132:3001 为 master, 192.168.220.132:3002 为 slave
配置文件如下
然后使用 mysqld --initialize 来初始化 data 目录, 以及相关基础数据库
这里会为 root 账户创建一个随机的密码, 用于后面的登录
然后是修改 root 的密码信息, 可访问客户端的信息
master 和 slave 启动好了之后, 在 slave 上面执行如下命令, 配置 master 的相关信息
change master to master_host='192.168.220.132', master_port=3301, master_user='root', master_password='root', master_log_file='mysql-master.000006', master_log_pos=154;
start slave;
show slave status;
假设我们这里测试数据表如下
CREATE TABLE `tz_test_02` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`field1` varchar(128) DEFAULT NULL,
`field2` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
KEY `field_1` (`field1`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8
基础数据如下
master 这边 binlog 的处理
我们这里测试执行 sql 如下, 我们这里 着重关注第二条 insert 语句的相关处理
delete from tz_test_02 where id = 11;
INSERT INTO `tz_test_02`(`id`, `field1`, `field2`) VALUES (11, 'field11', '11');
在提交事务的时候, 会唤醒 BinlogSender 这边的相关逻辑处理
然后 Binlog_sener 这边被唤醒, 开始处理发送 binlog 的相关处理
然后这里会遍历新增的 event, 将需要传递的 event 传输到 slave
这里会依次遍历几个 event, 类型分别为 Anonymous_Gtid, Query, Table_map, Write_rows, Xid
这里的 WRITE_ROWS_EVENT 对应的 position 为 8889
然后 master 的 binlog 中信息如下, 可以看到 8889 对应的 event 为 WRITE_ROWS_EVENT
slave 这边 binlog 的处理
然后 slave 这边会收到相关的几个 event, Anonymous_Gtid, Query, Table_map, Write_rows, Xid 这里我们主要关心 WRITE_ROWS_EVENT
这里将接收过来的 WRITE_ROWS_EVENT 添加到 Relay_log_info 中, 其是对应于一段带缓冲的文件映射
slave 这边的 relay_log 的 apply 的处理如下, 相当于拿到对应的 binlog 之后, 处理相关的业务处理, 对于我们这里的 WRITE_ROWS_EVENT 就是根据目标语句, 或者Write_rows 新增业务记录
slave 这边 handleSlaveSql 的线程
slave reapply relay_log 的线程如下, 只负责处理该部分的业务
该线程是在 “start slave” 命令的处理中执行的, 新建了 handleSlaveSql 的线程
另外可以看出 这个 replication 过程时候近乎实时的
中间空隙是 master 这边遍历发送 binlog, slave 这边接受 binlog, 并执行
完