Chinaunix首页 | 论坛 | 博客
  • 博客访问: 52431
  • 博文数量: 6
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 70
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-15 19:11
文章分类

全部博文(6)

文章存档

2015年(6)

我的朋友

分类: Mysql/postgreSQL

2015-04-24 18:51:40

hook start后,接着分析handle_slave_io函数,下面从代码中列出了主要流程:
pthread_handler_t handle_slave_io(void *arg)
{
| if (!safe_connect(thd, mysql, mi))
| |
| else
| | goto err;
connected:
if (binlog_version > 1) {
|
| | if (register_slave_on_master(mysql, mi, &suppress_warnings)){
| | |
| | }
| | else
| | | goto err;
}
while (!io_slave_killed(thd,mi))
{
| if (request_dump(thd, mysql, mi, &suppress_warnings)){
| }
| while (!io_slave_killed(thd,mi)) {
| | event_len= read_event(mysql, mi, &suppress_warnings);
| | if (RUN_HOOK(binlog_relay_io, after_read_event,
| | | | | (thd, mi,(const char*)mysql->net.read_pos + 1,
| | | | | |event_len, &event_buf, &event_len)))
| | {}
| | if (queue_event(mi, event_buf, event_len))
| | {
| | | goto err;
| | }
| | if (RUN_HOOK(binlog_relay_io, after_queue_event,
| | | | | (thd, mi, event_buf, event_len, synced)))
| | {
| | | goto err;
| | }
| }
}
err:
}

slave io线程先通过safe_connect连接到master,然后通过register_slave_on_master注册到master,
其实这个函数就是发送Register Slave命令,
接着进入一个死循环,调用request_dump,在这个函数内
会判断是否设置GTID 的 auto_position 协议,如果设置就会发送Binlog Dump GTID,否则直接发送Binlog Dump
这两个区别就是是否需要master确定读取binlog的位置。
这个命令执行成功之后,后面就是不停的执行read_event,这个函数会读取master推送过来的event,
然后不停的通过queue_event立即将evnet写入relay_log, 然后刷新master信息。
阅读(2305) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~