Group replication代码学习一

举报
kfpanda 发表于 2018/02/04 12:23:50 2018/02/04
【摘要】 1 介绍 在Group Replication集群中,初始化后的各个节点数据一致。所有节点的事物乐观的在各个节点执行,提交前全局广播到其他节点,且所有事物在各个节点全局顺序一致。提交时进行冲突检测,检测该事物在其他节点是否有冲突,如果有则回退,如果没有则成功提交。这样就保证所有节点在相同的状态下,按照相同的顺序引用相同的事物,要么都提交,要么都回退,所以可以保证所有节点数据一致。2

1      介绍

  Group Replication集群中,初始化后的各个节点数据一致。所有节点的事物乐观的在各个节点执行,提交前全局广播到其他节点,且所有事物在各个节点全局顺序一致。提交时进行冲突检测,检测该事物在其他节点是否有冲突,如果有则回退,如果没有则成功提交。这样就保证所有节点在相同的状态下,按照相同的顺序引用相同的事物,要么都提交,要么都回退,所以可以保证所有节点数据一致。

2      代码实现

Group Replication是通过插件来实现的,其逻辑利用回调函数的来处理。

2.1      初始化函数

int plugin_group_replication_init(MYSQL_PLUGIN plugin_info)

{

….

//初始化transactions observer相关结构,里面初始化的是其相关的锁

observer_trans_initialize();

//初始化一个group_replication_handler对象,通过它可以到的当前group中成员的信息和状态等

group_replication_init(group_replication_plugin_name)

//注册节点状态相关的回调函数

register_server_state_observer(&server_state_observer,(void *)plugin_info_ptr)

//注册事物相关的回调函数

register_trans_observer(&trans_observer, (void *)plugin_info_ptr)

//注册binlog传输相关的回调函数

register_binlog_transmit_observer(&binlog_transmit_observer,(void *)plugin_info_ptr)

auto_increment_handler= new Plugin_group_replication_auto_increment();

channel_observation_manager= new Channel_observation_manager(plugin_info);

gcs_module= new Gcs_operations();

//初始化一个compatibility_mgr对象,用来检测版本兼容性

init_compatibility_manager();

//如果设置了变量group_replication_start_on_boot,则启动mysql 初始化插件是,在这里也会出发启动MGR

if (start_group_replication_at_boot_var && group_replication_start())

  {

    log_message(MY_ERROR_LEVEL,

                "Unable to start Group Replication on boot");

  }

}

2.2      注册的回调函数集

MGR的主要逻辑实现都是通过回调函数来做的。

image.png

server_state_observer:节点状态相关的回调函数集合。

trans_observer:事物相关的回调函数集合。

binlog_transmit_observerbinlog传输相关的回调函数集合。

2.2.1        节点状态相关的回调函数集合

image.png

2.2.2        事物相关的回调函数集合

image.png

2.2.3        binlog传输相关的回调函数集合

image.png

2.3      启动函数

int plugin_group_replication_start()

{

//如果MGR不是开启启动,并且空的channel不存在时,会返回错误。

if (!start_group_replication_at_boot_var &&!server_engine_initialized())

{DBUG_RETURN(GROUP_REPLICATION_CONFIGURATION_ERROR);}

//如果配置的group_replication_force_member参数为空,这里会返回错误

if (force_members_var != NULL &&strlen(force_members_var) > 0)

{DBUG_RETURN(GROUP_REPLICATION_CONFIGURATION_ERROR);}

if (!server_engine_initialized())

{

  delayed_initialization_thread= new Delayed_initialization_thread();

  delayed_initialization_thread->launch_initialization_thread()

}

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。