MySQL 集群架构中,每个 MySQL 实例均为主机模式,都可对外提供读写服务。因此 MySQL 实例组件提供了实例组功能,用于为应用提供统一的元数据视图,并保证集群的元数据一致性。同时,当一个 MySQL 实例退出实例组后,连接该实例的应用可以切换到实例组内的其他实例,获得对等的读写服务,以保证服务的高可用。
MySQL 实例组是由若干 MySQL 实例组成的一个无状态的集群,集群内部的实例可以相互同步元数据操作,用户可以通过部署多个实例来保证 MySQL 服务的高可用。MySQL 实例组架构图如下:
实例组内 SQL 实例通过 HA 组件保证组内元数据的一致性。HA 主要功能如下:
Note:
用户在使用实例组功能时,需确保 SequoiaDB 事务功能已开启(即通过配置快照查看 transactionon 为 true)。
以下命令均在数据库管理用户(安装时创建,默认为 sdbadmin)下执行。
进入到 MySQL 的安装目录
$ cd /opt/sequoiasql/mysql
初始化一个名为“mysql”实例组
$ bin/ha_inst_group_init mysql --key test
创建两个 MySQL 实例并加入到实例组 mysql
$ bin/sdb_mysql_ctl addinst myinst_01 -D database/3306 -P 3306 -g mysql -k test $ bin/sdb_mysql_ctl addinst myinst_02 -D database/3307 -P 3307 -g mysql -k test
Note:
sdb_mysql_ctl 的使用可参考实例管理。
查看实例组 mysql 的配置信息
$ bin/ha_inst_group_list --name mysql
输出结果如下:
InstanceGroupName InstanceID HostName SvcName DBType mysql 129135 sdbserver 3306 mysql mysql 129136 sdbserver 3307 mysql
使用 mysql 命令连接到 myinst_01 实例
$ bin/mysql --socket=/opt/mysql/database/3306/mysqld.sock -u root
在实例 myinst_01 上进行建库、建表等元数据操作
mysql> create database mysql_ha_test; Query OK, 1 row affected (0.42 sec) mysql> use mysql_ha_test Database changed mysql> create table t1(id int); Query OK, 0 rows affected (0.35 sec) mysql> create table t2 as select * from t1; Query OK, 0 rows affected (0.76 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> create table t3 like t1; Query OK, 0 rows affected (0.51 sec) mysql> show tables; +-------------------------+ | Tables_in_mysql_ha_test | +-------------------------+ | t1 | | t2 | | t3 | +-------------------------+ 3 rows in set (0.01 sec)
使用 mysql 命令连接到 myinst_02 实例
$ bin/mysql --socket=/opt/mysql/database/3307/mysqld.sock -u root
验证实例 myinst_01 的操作是否同步到实例 myinst_02
mysql> show tables from mysql_ha_test; +-------------------------+ | Tables_in_mysql_ha_test | +-------------------------+ | t1 | | t2 | | t3 | +-------------------------+ 3 rows in set (0.00 sec)
新增实例 myinst_03 并加入实例组
$ bin/sdb_mysql_ctl addinst myinst_03 -D database/3308 -P 3308 -g mysql -k test
使用 mysql 命令连接到实例 myinst_03
$ bin/mysql --socket=/opt/mysql/database/3308/mysqld.sock -u root
查询元数据是否同步到实例 myinst_03
mysql> show tables from mysql_ha_test; +-------------------------+ | Tables_in_mysql_ha_test | +-------------------------+ | t1 | | t2 | | t3 | +-------------------------+ 3 rows in set (0.00 sec)
server_ha_inst_group_name
该参数用于配置当前实例所属的实例组。若没有配置该参数,默认不启用实例组功能。
server_ha_inst_group_key
该参数用于加密实例组用户密码。实例启动时,会从默认的配置表中获取实例组用户的配置信息,并在当前实例中创建实例组用户。实例组用户可用于执行全量元数据同步和日志回放操作。
server_ha_wait_recover_timeout
该参数用于设置等待元数据全量同步的超时时间。启用实例组功能的情况下,新增实例启动时需要与实例组中其他实例进行元数据的全量同步。为保证元数据的一致性,在该实例未完成同步时,外部元数据操作请求将进入等待状态。如果等待超时,则返回错误提示信息。
server_ha_wait_replay_timeout
该参数用于设置等待元数据日志回放完成的超时时间。启用实例组功能的情况下,实例启动时会在后台创建一个日志回放线程,日志回放线程定期从 SequoiaDB 获取元数据操作日志并在本地回放。由于日志的回放操作是定期执行的,在一个实例上更改元数据并不能实时地同步到其他实例。因此,在一个实例上修改元数据后,立即在另外一个实例上更改相同对象的元数据时,需要等待最新的元数据同步完成后才能进行。如果等待超时,则返回错误提示信息。
server_ha_wait_sync_timeout
该参数用于设置实例组内,等待其他实例同步当前实例元数据操作的超时时间。启用实例组功能的情况下,如果该参数的值不为 0,则实例成功执行元数据操作后,需要等待元数据在其他实例上同步完成,才能返回执行结果。如果等待超时,则返回警告信息。
实例组管理工具包括初始化工具、配置查看工具、配置清除工具和密码修改工具。运行上述工具时,应使用数据库管理用户(安装 MySQL 实例组件时指定,默认为 sdbadmin)权限。
用户在使用实例组功能之前,需要使用实例组初始化工具 ha_inst_group_init 初始化实例组。
参数说明
参数 | 描述 | 是否必填 |
---|---|---|
--host | SequoiaDB 集群协调节点服务地址 | 否 |
-u, --user | 连接 SequoiaDB 集群用户的用户名 | 否 |
-p, --password | 连接 SequoiaDB 集群用户的密码 | 否 |
--key | 实例组用户密码密钥 | 否 |
-t, --token | 指定解密 SequoiaDB 用户密码令牌 | 否 |
--file | 指定 SequoiaDB 用户密码文件 | 否 |
--data-group | 指定 SequoiaDB 复制组,该复制组用于存储实例组中的数据 | 否 |
--verbose | 输出工具的日志信息 | 否 |
-?, --help | 返回详细的帮助说明 | 否 |
--usage | 返回简要的帮助说明 | 否 |
使用说明
ha_inst_group_init [-?] [-u USER] [-p[PASSWORD]] [-t TOKEN] [--host=HOST] [--user=USER] [--password[=PASSWORD]] [--key=KEY] [--token=TOKEN] [--file=FILE] [--verbose] [--data-group=NAME] [--help] [--usage] inst_group_name
初始化一个名为“sql_group”的实例组
$ ha_inst_group_init sql_group
ha_inst_group_list 工具用于查看 SQL 实例的配置信息,包括实例组名、实例 ID、主机名、实例服务端口和实例类型。
参数说明
参数 | 描述 | 是否必填 |
---|---|---|
--host | SequoiaDB 集群协调节点服务地址 | 否 |
-u, --user | 连接 SequoiaDB 集群用户的用户名 | 否 |
--name | 指定要查看的实例组名称 | 否 |
-p, --password | 连接 SequoiaDB 集群用户的密码 | 否 |
-t, --token | 指定解密 SequoiaDB 用户密码令牌 | 否 |
--file | 指定 SequoiaDB 用户密码文件 | 否 |
-?, --help | 返回详细的帮助说明 | 否 |
--usage | 返回简要的帮助说明 | 否 |
使用说明
ha_inst_group_list [-?] [-u USER] [-p[PASSWORD]] [-t TOKEN] [--host=HOST] [--user=USER] [--name=INST_GROUP_NAME] [--password[=PASSWORD]] [--token=TOKEN] [--file=FILE] [--help] [--usage]
查看所有实例的配置信息
$ ha_inst_group_list
输出示例结果如下:
InstanceGroupName InstanceID HostName SvcName DBType group1 129147 sdbserver 3309 mariadb group1 129148 sdbserver 3310 mariadb group2 129135 sdbserver 3306 mysql group2 129136 sdbserver 3307 mysql group3 129149 sdbserver 3330 mysql group3 129150 sdbserver 3331 mysql
查看实例组 group2 中所有实例的配置信息
$ ha_inst_group_list --name group2
输出结果如下:
InstanceGroupName InstanceID HostName SvcName DBType group2 129135 sdbserver 3306 mysql group2 129136 sdbserver 3307 mysql
ha_inst_group_clear 工具用于清除实例组或者实例的配置信息。
参数说明
参数 | 描述 | 是否必填 |
---|---|---|
--host | SequoiaDB 集群协调节点服务地址 | 否 |
-u, --user | 连接 SequoiaDB 用户的用户名 | 否 |
-p, --password | 连接 SequoiaDB 用户的密码 | 否 |
--force | 直接删除配置,不提示用户确认,默认为 false | 否 |
-t, --token | 指定解密 SequoiaDB 用户密码令牌 | 否 |
--file | 指定 SequoiaDB 用户密码文件 | 否 |
--inst_id | 通过实例 ID 指定要删除的实例 | 否 |
--inst_host | 通过实例的服务地址指定要删除的实例 | 否 |
-?, --help | 返回详细的帮助说明 | 否 |
--usage | 返回简要的帮助说明 | 否 |
使用说明
ha_inst_group_clear [-?] [-u USER] [-p[PASSWORD]] [-t TOKEN] [--host=HOST] [--user=USER] [--password[=PASSWORD]] [--force] [--token=TOKEN] [--file=FILE] [--inst_id=INST_ID] [--inst_host=INST_HOST] [--help] [--usage] inst_group_name
清除实例组 group1 中所有实例的配置信息
$ ha_inst_group_clear group1
提示用户是否真的需要清除实例组的配置信息
Do you really want to clear instance group 'group1' [y/N]? y Note: clearing instance group configuration will not delete SQL instances. please use instance management tool to delete them Info: completed cleanup of instance group 'group1'
清除实例组后,再次查看所有实例的配置信息
$ ha_inst_group_list
输出结果如下:
InstanceGroupName InstanceID HostName SvcName DBType group2 129135 sdbserver 3306 mysql group2 129136 sdbserver 3307 mysql group3 129149 sdbserver 3330 mysql group3 129150 sdbserver 3331 mysql
清除实例组 group2 中服务端口为 3306 的实例配置
$ ha_inst_group_clear group2 --inst_host="sdbserver:3306" --force
输出结果如下:
Note: clearing instance group configuration will not delete SQL instances. please use instance management tool to delete them Info: completed cleanup of instance 'sdbserver:3306'
清除实例配置后,再次查看所有实例的配置信息
$ ha_inst_group_list
输出结果如下:
InstanceGroupName InstanceID HostName SvcName DBType group2 129136 sdbserver 3307 mysql group3 129149 sdbserver 3330 mysql group3 129150 sdbserver 3331 mysql
Note:
清除实例组或实例配置并不会删除实例,删除实例需要用户手动使用 sdb_mysql_ctl 命令完成。
ha_inst_group_chpass 工具用于修改配置表中的密码信息。实例组初始化后,会自动生成实例组用户信息并写入配置表。如果该用户的密码被修改,需使用 ha_inst_group_chpass 工具同步配置表中的信息,否则实例组将无法添加新的实例。
参数说明
参数 | 描述 | 是否必填 |
---|---|---|
--host | SequoiaDB 集群协调节点服务地址 | 否 |
-u, --user | 连接 SequoiaDB 集群用户的用户名 | 否 |
-p, --password | 连接 SequoiaDB 集群用户的密码 | 否 |
-s, --new_pass | 实例组用户密码 | 否 |
--key | 实例组用户密码密钥 | 否 |
-t, --token | 指定解密 SequoiaDB 用户密码令牌 | 否 |
--file | 指定 SequoiaDB 用户密码文件 | 否 |
--verbose | 输出工具的日志信息 | 否 |
-?, --help | 返回详细的帮助说明 | 否 |
--usage | 返回简要的帮助说明 | 否 |
使用说明
ha_inst_group_chpass [-?] [-u USER] [-p [PASSWORD]] [-s [PASSWORD]] [-t TOKEN] [--host=HOST] [--user=USER] [--password[=PASSWORD]] [--new_pass=[PASSWORD]] [--key=KEY] [--token=TOKEN] [--file=FILE] [--verbose] [--help] [--usage] inst_group_name
连接实例 inst1,该实例所属实例组 sql_group
$ mysql --socket=/opt/sequoiasql/mysql/database/3206/mysqld.sock -u root
修改实例组用户密码
mysql> select user from mysql.user; +----------------------------------+ | User | +----------------------------------+ | HAInstanceGroup_sql_group_D6965A | | root | | sdbadmin | +----------------------------------+ mysql> ALTER USER 'HAInstanceGroup_sql_group_D6965A'@'%' IDENTIFIED BY 'sdbadmin'; Query OK, 0 rows affected (0.01 sec)
同步配置表中的密码信息
$ ha_inst_group_chpass sql_group -s sdbadmin