扩展 MySQL 9.0  /  ...  /  编写半同步复制插件

4.4.7 编写半同步复制插件

本节介绍如何编写服务器端半同步复制插件,使用 MySQL 源代码发行版中 plugin/semisync 目录下的示例插件。该目录包含名为 rpl_semi_sync_masterrpl_semi_sync_slave 的源和副本插件的源文件。此处的信息仅涵盖如何设置插件框架。有关插件如何实现复制功能的详细信息,请参阅源代码。

要编写半同步复制插件,请在插件源文件中包含以下头文件。其他 MySQL 或通用头文件也可能需要,具体取决于插件的功能和要求。

#include <mysql/plugin.h>

plugin.h 定义了 MYSQL_REPLICATION_PLUGIN 服务器插件类型以及声明插件所需的数据结构。

对于源端,semisync_master_plugin.cc 包含名为 rpl_semi_sync_master 的插件的以下常规描述符:

mysql_declare_plugin(semi_sync_master)
{
  MYSQL_REPLICATION_PLUGIN,
  &semi_sync_master_plugin,
  "rpl_semi_sync_master",
  "He Zhenxing",
  "Semi-synchronous replication master",
  PLUGIN_LICENSE_GPL,
  semi_sync_master_plugin_init, /* Plugin Init */
  semi_sync_master_plugin_deinit, /* Plugin Deinit */
  0x0100 /* 1.0 */,
  semi_sync_master_status_vars, /* status variables */
  semi_sync_master_system_vars, /* system variables */
  NULL,                         /* config options */
  0,                            /* flags */
}
mysql_declare_plugin_end;

对于副本端,semisync_slave_plugin.cc 包含名为 rpl_semi_sync_slave 的插件的以下常规描述符:

mysql_declare_plugin(semi_sync_slave)
{
  MYSQL_REPLICATION_PLUGIN,
  &semi_sync_slave_plugin,
  "rpl_semi_sync_slave",
  "He Zhenxing",
  "Semi-synchronous replication slave",
  PLUGIN_LICENSE_GPL,
  semi_sync_slave_plugin_init, /* Plugin Init */
  semi_sync_slave_plugin_deinit, /* Plugin Deinit */
  0x0100 /* 1.0 */,
  semi_sync_slave_status_vars,  /* status variables */
  semi_sync_slave_system_vars,  /* system variables */
  NULL,                         /* config options */
  0,                            /* flags */
}
mysql_declare_plugin_end;

对于源和副本插件,常规描述符都包含指向特定于类型的描述符、初始化和取消初始化函数以及插件实现的状态和系统变量的指针。有关变量设置的信息,请参阅 第 4.4.2.2 节“服务器插件状态和系统变量”。以下注释讨论了源插件的特定于类型的描述符以及初始化和取消初始化函数,但也同样适用于副本插件。

源常规描述符的 semi_sync_master_plugin 成员指向特定于类型的描述符,该描述符仅包含特定于类型的 API 版本号:

struct Mysql_replication semi_sync_master_plugin= {
  MYSQL_REPLICATION_INTERFACE_VERSION
};

初始化和取消初始化函数声明如下所示:

static int semi_sync_master_plugin_init(void *p);
static int semi_sync_master_plugin_deinit(void *p);

初始化函数使用指针向服务器注册事务和二进制日志记录“观察者”。成功初始化后,服务器将在适当的时间调用观察者。(有关观察者的详细信息,请参阅源文件。)取消初始化函数通过取消注册观察者来进行清理。每个函数在成功时返回 0,如果发生错误则返回 1。

要编译和安装插件库文件,请使用 第 4.4.3 节“编译和安装插件库” 中的说明。要使库文件可供使用,请将其安装在插件目录中(由 plugin_dir 系统变量命名的目录)。对于 rpl_semi_sync_masterrpl_semi_sync_slave 插件,它们在您从源代码构建 MySQL 时进行编译和安装。它们也包含在二进制发行版中。构建过程生成名为 semisync_master.sosemisync_slave.so 的共享对象库(.so 后缀可能会因平台而异)。