Group replication代码学习一
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的主要逻辑实现都是通过回调函数来做的。
server_state_observer:节点状态相关的回调函数集合。
trans_observer:事物相关的回调函数集合。
binlog_transmit_observer:binlog传输相关的回调函数集合。
2.2.1 节点状态相关的回调函数集合
2.2.2 事物相关的回调函数集合
2.2.3 binlog传输相关的回调函数集合
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()
}
}
- 点赞
- 收藏
- 关注作者
评论(0)