MySQL 官方高可用方案 InnoDB Cluster

news2024/12/27 1:00:59

文章目录

    • 前言
    • 1. 方案构成
    • 2. 使用要求和限制
    • 3. 集群部署
      • 3.1 环境说明
      • 3.2 软件下载
      • 3.2 MySQL Server 安装
      • 3.3 MySQL Shell 安装
      • 3.4 检测实例是否符合资格
      • 3.5 创建集群
      • 3.6 向集群中添加节点
      • 3.7 配置 Router
      • 3.8 测试验证
    • 4. 集群运维
      • 4.1 Router 服务管理
      • 4.2 MySQL 服务管理
      • 4.3 集群配置调整
      • 4.4 添加节点
      • 4.5 添加只读实例
      • 4.6 主动切换
    • 5. dba 对象方法介绍
      • 5.1 add_instance()
      • 5.2 add_replica_instance()
      • 5.3 create_cluster_set()
      • 5.4 describe()
      • 5.5 disconnect()
      • 5.6 dissolve()
      • 5.7 fence_all_traffic()
      • 5.8 get_name()
      • 5.9 list_routers()
      • 5.10 options()
      • 5.11 remove_instance()
      • 5.12 rejoin_instance()
      • 5.13 remove_router_metadata()
      • 5.14 rescan()
      • 5.15 reset_recovery_accounts_password()
      • 5.16 router_options()
      • 5.17 set_instance_option()
      • 5.18 set_option()
      • 5.19 set_primary_instance()
      • 5.20 set_routing_option()
      • 5.21 setup_admin_account()
      • 5.22 setup_router_account()
      • 5.23 status()
      • 5.24 switch_to_multi_primary_mode()
      • 5.25 switch_to_multi_primary_mode()
    • 总结

前言

不知不觉 LTS 长期支持版本从 8.0 调整为了 8.4 版本,8.0.x 只会修复 bug 不再有新功能发布,而我们维护的数据库中 5.7 依然占大多数。8.0 版本 MySQL 官方发布了三套高可用方案,分别是 ReplicaSet、InnoDB Cluster、InnoDB ClusterSet 都提供切换和透明路由能力,用户可根据业务高可用的需求,选择对应的高可用方案。今天介绍的是 InnoDB Cluster 官方推出的一套高可用方案。

1. 方案构成

下图为 MySQL 官方提供的 InnoDB Cluster 架构图。

在这里插入图片描述

InnoDB Cluster 由三部分组成,数据节点是基于 MySQL 组复制构建,组复制可以提供成员资格管理、容错、自动故障转移等功能。

MySQL Shell 提供了很多自动化接口,集群部署和维护的大部分操作都可以实现自动化。并且支持 Python 脚本,意味着用户可以基于它提供的 AdminAPI 补充研发适合本地环境的自动化程序,实现一套程序管理多条集群。

MySQL Router 是 MySQL 官方提供的一个轻量化代理中间价,可以在服务器和 MySQL 集群之间提供连接路由,实现透明切换和读写分离。在 8.2 版本之前 Router 读/写 和 只读 分为两个端口,应用使用要使用读写分离,需要额外适配,也是很多用户不愿意使用它的原因。在 8.2 之后提供了一个额外的端口,支持透明的读写分离,这样就没理由不使用它了。

2. 使用要求和限制

3. 集群部署

3.1 环境说明

由于是本地测试,所以把 Shell 和 Router 和 Primary 节点部署在一起,如果是生产环境 Shell 没有特别要求,Router 可以单独部署到一台服务器或者与应用部署在一起。

IPhostnameRole
172.16.104.55172-16-104-55MySQL 8.4、MySQL Shell、MySQL Router
172.16.104.56172-16-104-56MySQL 8.4
172.16.104.57172-16-104-57MySQL 8.4

三个节点需要添加一下映射关系:

vi /etc/hosts
172.16.104.57 172-16-104-57
172.16.104.56 172-16-104-56
172.16.104.55 172-16-104-55

操作系统:CentOS Linux release 7.9.2009 (Core)

3.2 软件下载

MySQL Shell 下载地址:

https://downloads.mysql.com/archives/shell/

MySQL Server 下载地址:

https://dev.mysql.com/downloads/mysql/

在这里插入图片描述
下载 tar 包,里面包含 router 组件。

3.2 MySQL Server 安装

MySQL Server 安装参考之前到一篇文章,不过脚本只兼容 5.7 和 8.0 版本。

安装步骤参考:MySQL 自动化部署

程序优化了一下,如果是 8.4 版本可以使用新的脚本。

兼容 8.4 版本的程序:MySQL 8.4 自动化部署脚本下载地址

MySQL Server 安装完成后,需要创建一个 MySQL Shell 管理账号:

CREATE USER 'rw_shell'@'%' IDENTIFIED BY 'admin123';

GRANT CLONE_ADMIN, CONNECTION_ADMIN, CREATE USER, EXECUTE, FILE, GROUP_REPLICATION_ADMIN, PERSIST_RO_VARIABLES_ADMIN, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, REPLICATION_APPLIER, REPLICATION_SLAVE_ADMIN, ROLE_ADMIN, SELECT, SHUTDOWN, SYSTEM_VARIABLES_ADMIN ON *.* TO 'rw_shell'@'%' WITH GRANT OPTION;
GRANT DELETE, INSERT, UPDATE ON mysql.* TO 'rw_shell'@'%' WITH GRANT OPTION;
GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata.* TO 'rw_shell'@'%' WITH GRANT OPTION;
GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata_bkp.* TO 'rw_shell'@'%' WITH GRANT OPTION;
GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata_previous.* TO 'rw_shell'@'%' WITH GRANT OPTION;

3.3 MySQL Shell 安装

MySQL Shell 是一个自动化管理工具,可以部署在任何一个节点,一个 MySQL Shell 可以管理多套集群。

tar -zxvf mysql-shell-8.4.0-linux-glibc2.17-x86-64bit.tar.gz
mv mysql-shell-8.4.0-linux-glibc2.12-x86-64bit /usr/local/mysqlsh
export PATH=/usr/local/mysqlsh/bin/:$PATH
echo 'PATH=$PATH:/usr/local/mysqlsh/bin/' >> /etc/profile

通过 MySQL Shell 连接 57 节点,

mysqlsh --uri rw_shell@172-16-104-57 -p'admin123' --py

请添加图片描述

3.4 检测实例是否符合资格

MySQL Shell 提供的 AdminAPI 可以检测 MySQL Server 当前的配置是否符合组件集群的条件。

mysqlsh --uri rw_shell@172-16-104-57 -p'admin123' --py
dba.check_instance_configuration('rw_shell@172-16-104-55:3306')
dba.check_instance_configuration('rw_shell@172-16-104-56:3306')
dba.check_instance_configuration('rw_shell@172-16-104-57:3306')

请添加图片描述

三个 MySQL Server 都要依次检测,检测无误后执行下方命令,会自动创建一些元数据库和开启组复制相关的配置。

dba.configure_instance('rw_shell@172-16-104-55:3306')
dba.configure_instance('rw_shell@172-16-104-56:3306')
dba.configure_instance('rw_shell@172-16-104-57:3306')

请添加图片描述

3.5 创建集群

rs = dba.create_cluster('test_cluster')
A new InnoDB Cluster will be created on instance '172-16-104-57:3306'.

Validating instance configuration at 172-16-104-57:3306...

This instance reports its own address as 172-16-104-57:3306

Instance configuration is suitable.
NOTE: Group Replication will communicate with other members using '172-16-104-57:3306'. Use the localAddress option to override.

* Checking connectivity and SSL configuration...

Creating InnoDB Cluster 'test_cluster' on '172-16-104-57:3306'...

Adding Seed Instance...
Cluster successfully created. Use Cluster.add_instance() to add MySQL instances.
At least 3 instances are needed for the cluster to be able to withstand up to
one server failure.

<Cluster:test_cluster>
rs.status()

{
    "clusterName": "test_cluster", 
    "defaultReplicaSet": {
        "name": "default", 
        "primary": "172-16-104-57:3306", 
        "ssl": "REQUIRED", 
        "status": "OK_NO_TOLERANCE", 
        "statusText": "Cluster is NOT tolerant to any failures.", 
        "topology": {
            "172-16-104-57:3306": {
                "address": "172-16-104-57:3306", 
                "memberRole": "PRIMARY", 
                "mode": "R/W", 
                "readReplicas": {}, 
                "replicationLag": "applier_queue_applied", 
                "role": "HA", 
                "status": "ONLINE", 
                "version": "8.4.0"
            }
        }, 
        "topologyMode": "Single-Primary"
    }, 
    "groupInformationSourceMember": "172-16-104-57:3306"
}

3.6 向集群中添加节点

上一步连接的是 57 创建集群,所以默认主节点是 57 现在需要把另外两个 replica 节点也加入到集群中。

rs.add_instance('rw_shell@172-16-104-55:3306')
rs.add_instance('rw_shell@172-16-104-56:3306')

加入完成后,执行下方命令查询集群状态。

 rs.status()
{
    "clusterName": "test_cluster", 
    "defaultReplicaSet": {
        "name": "default", 
        "primary": "172-16-104-57:3306", 
        "ssl": "REQUIRED", 
        "status": "OK", 
        "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", 
        "topology": {
            "172-16-104-55:3306": {
                "address": "172-16-104-55:3306", 
                "memberRole": "SECONDARY", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "replicationLag": "applier_queue_applied", 
                "role": "HA", 
                "status": "ONLINE", 
                "version": "8.4.0"
            }, 
            "172-16-104-56:3306": {
                "address": "172-16-104-56:3306", 
                "memberRole": "SECONDARY", 
                "mode": "R/O", 
                "readReplicas": {}, 
                "replicationLag": "applier_queue_applied", 
                "role": "HA", 
                "status": "ONLINE", 
                "version": "8.4.0"
            }, 
            "172-16-104-57:3306": {
                "address": "172-16-104-57:3306", 
                "memberRole": "PRIMARY", 
                "mode": "R/W", 
                "readReplicas": {}, 
                "replicationLag": "applier_queue_applied", 
                "role": "HA", 
                "status": "ONLINE", 
                "version": "8.4.0"
            }
        }, 
        "topologyMode": "Single-Primary"
    }, 
    "groupInformationSourceMember": "172-16-104-57:3306"
}

3.7 配置 Router

官方下载地址:MySQL Router Donwload

xz -d mysql-router-8.4.0-linux-glibc2.17-x86_64.tar.xz
tar -xvf mysql-router-8.4.0-linux-glibc2.17-x86_64.tar

解压后就可以使用,现在需要创建一个 router 引导使用的账号,用户状态检测。

rs.setup_router_account('op_router')

创建完成后,进入的 bin 目录,引导 router 自动配置。

./mysqlrouter \
   --bootstrap rw_shell@172-16-104-57:3306 \
   --directory /data/myrouter \
   --conf-use-sockets \
   --account op_router \
   --user=mysql

bootstrap:引导实例的连接串 router 会通过该实例获取集群元数据信息。
directory:mysql-router 数据目录,需要创建好,并设置 mysql 属组。
conf-use-sockets:确认生成 socket 文件。
account:router 连接 MySQL 的账号,上一步已使用 mysql shell 已创建。

- Creating account(s) (only those that are needed, if any)
- Verifying account (using it to run SQL queries that would be run by Router)
- Storing account in keyring
- Adjusting permissions of generated files
- Creating configuration /data/myrouter/mysqlrouter.conf

# MySQL Router configured for the InnoDB Cluster 'test_cluster'

After this MySQL Router has been started with the generated configuration

    $ ./mysqlrouter -c /data/myrouter/mysqlrouter.conf

InnoDB Cluster 'test_cluster' can be reached by connecting to:

## MySQL Classic protocol

- Read/Write Connections: localhost:6446, /data/myrouter/mysql.sock
- Read/Only Connections:  localhost:6447, /data/myrouter/mysqlro.sock
- Read/Write Split Connections: localhost:6450, /data/myrouter/mysqlsplit.sock

## MySQL X protocol

- Read/Write Connections: localhost:6448, /data/myrouter/mysqlx.sock
- Read/Only Connections:  localhost:6449, /data/myrouter/mysqlxro.sock

MySQL Router 会自动生成配置文件,启动命令也打印在终端中。

./mysqlrouter -c /data/myrouter/mysqlrouter.conf &

3.8 测试验证

使用 root 账号连接主节点,创建测试库和账号。

create database test;
create user rw_test@'%' identified by 'admin123';
grant ALL on test.* to rw_test@'%'

使用读写分离代理连接数据库:

mysql -h172.16.104.55 -urw_test -padmin123 -P6450

写入测试数据,然后可以再连接 replica 节点查看是否同步完成。

use test;
create table rep_test(id int primary key, a varchar(10));
insert into rep_test values(1, 'a'),(2, 'b'),(3, 'c');

mysql shell 中可以通过下方命令,查看是否配置 router。

rs.list_routers()
{
    "clusterName": "test_cluster", 
    "routers": {
        "172-16-104-55::": {
            "hostname": "172-16-104-55", 
            "lastCheckIn": "2024-08-14 16:27:55", 
            "roPort": "6447", 
            "roXPort": "6449", 
            "rwPort": "6446", 
            "rwSplitPort": "6450", 
            "rwXPort": "6448", 
            "version": "8.4.0"
        }
    }
}

4. 集群运维

4.1 Router 服务管理

通过服务的方式管理 mysqlrouter 下面介绍配置方法:

vi /etc/systemd/system/mysqlrouter.service

写入到配置中:

[Unit]
Description=mysqlrouter
After=network.target
 
[Service]
User=mysql
Group=mysql
Type=sample
ExecStart=/opt/mysqlrouter/bin/mysqlrouter -c /data/myrouter/mysqlrouter.conf
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target

加载配置:

systemctl daemon-reload

常用命令:

# 查看 router 状态
systemctl status mysqlrouter

# 关闭 router
systemctl stop mysqlrouter

# 启动 router
systemctl start mysqlrouter

开机自启:

# 关闭开机自启
systemctl disable mysqlrouter.service
# 查看确认
systemctl list-unit-files|grep mysqlrouter

4.2 MySQL 服务管理

MySQL 服务管理配置,可以参考之前的文章:使用 systemctl 管理 MySQL 服务

4.3 集群配置调整

MySQL Shell 可以修改组复制相关的配置,支持单独修改或者全局修改,可以通过下方命令查看可修改的参数。

rs = dba.get_cluster()
rs.options()

输出有两部分,全局配置和拓扑配置,都可以对应到 MySQL 底层到参数,比如 autoRejoinTries 是节点意外断开后重试的配置,在 MySQL Server 中的参数是 group_replication_autorejoin_tries 在 MySQL Shell 集群中使用 autoRejoinTries 来配置。

{ 
	"option" : "autoRejoinTries", 
	"value" : "3", 
	"variable" : "group_replication_autorejoin_tries" 
}

组复制相关的配置调整,就不在此介绍了,大家可以使用 options() 方法列出来查看。可以修改选主权重、集群离开后加入集群的配置、集群一致性的级别等。

下面是一个修改示例,将 55 节点的选主权重调整为 80 分:

rs.set_instance_option("172-16-104-55:3306", "memberWeight", 80)

4.4 添加节点

MySQL Shell 中可以使用 add_instance() 方法添加一个新节点。使用的格式如下:

-- 待定
rs.add_instance('rw_shell@172-16-104-56:3306', label='node1', recoveryMethod = 'auto', password = 'xxxxx', memberWeight = 80)

下面介绍一下,方法内常用参数的作用:

  • label:该节点的标签,就是为该节点起一个名字。

  • recoveryMethod:加入集群时,如果主节点有数据,那么需要给该节点传输数据。

    • incremental:基于 binlog 的增量恢复。
    • clone:基于 clone 插件的全量恢复。
    • auto:基于目标实例是否支持 clone 插件,以及 group_replication_clone_threshold 的参数设置。
  • password:该节点的密码。

  • memberWeight:选举过程中,该节点的权重,默认为 50。

4.5 添加只读实例

MySQL Shell 可以使用 add_replica_instance() 方法添加一个只读副本。该副本可以添加到集群中任何一个成员上面进行复制,如果该成员异常退出集群,那么会自动切换到存活的节点上继续接收复制。

该功能可以用于在线业务和离线业务分离的场景,在线业务对高可用和性能要求很高 SQL 一般都是 短、平、快 的类型,离线业务 SQL 一般都非常复杂,所以两个业务不能混合使用,否则会影响在线业务的吞吐量。如果把离线业务加入到 InnoDB Cluster 集群中,增加代理配置的复杂度,干脆挂在一个只读节点,只需要能持续复制即可,不参与集群的选主切换以及读写分离。

现在测试将 172-16-121-152 新的 MySQL 节点,作为只读实例挂到集群中。

首先,需要创建用户,可以参考 MySQL Server 部署那小节。

# 进入 MySQL Shell
mysqlsh --uri rw_shell@172-16-104-55 -p'admin123' --py

检测该节点是否符合要求:

dba.check_instance_configuration('rw_shell@172-16-121-152:3306')
dba.configure_instance('rw_shell@172-16-121-152:3306')

执行完成后,可以使用下方命令,将 152 作为只读节点加入到集群中:

rs.add_replica_instance('rw_shell@172-16-121-152:3306', {'label': 'RReplica1', 'replicationSources': ['172-16-104-56:3306']})

这里指定 replicationSources 选项,表示从哪个实例获取 clone 全量数据以及建立复制通道,这里选择的是一个 SECONDARY 节点。执行成功后,可以使用下方命令查看:

{
    "clusterName": "test_cluster", 
    "defaultReplicaSet": {
        "name": "default", 
        "topology": [
            {
                "address": "172-16-104-57:3306", 
                "label": "172-16-104-57:3306", 
                "role": "HA"
            }, 
            {
                "address": "172-16-104-55:3306", 
                "label": "172-16-104-55:3306", 
                "role": "HA"
            }, 
            {
                "address": "172-16-104-56:3306", 
                "label": "172-16-104-56:3306", 
                "role": "HA"
            }, 
            {
                "address": "172-16-121-152:3306", 
                "label": "RReplica1", 
                "replicationSources": [
                    "172-16-104-56:3306"
                ], 
                "role": "READ_REPLICA"
            }
        ], 
        "topologyMode": "Single-Primary"
    }
}

只读实例,默认是不会加入到 router 的读写分离配置中的,如果有离线业务,可以直连只读实例。

如果只读实例连接的节点出现异常,会自动连接到健康的节点,新节点恢复后,只读实例不会自动再连接到老节点,如果想要把它重新挂在老节点上面,可以使用下面的命令。

rs.set_instance_option("172-16-121-152:3306", 'replicationSources', ["172-16-104-56:3306"])

如果需要移除只读节点,可以使用如下方法:

rs.remove_instance("172-16-121-152:3306")

4.6 主动切换

手动切换主实例,可以使用 set_primary_instance 方法切换。

cluster.set_primary_instance('172-16-104-57:3306')
Setting instance '172-16-104-57:3306' as the primary instance of cluster 'pre_cluster'...

Instance '172-16-104-56:3306' remains SECONDARY.
Instance '172-16-104-55:3306' was switched from PRIMARY to SECONDARY.
Instance '172-16-104-57:3306' was switched from SECONDARY to PRIMARY.

The instance '172-16-104-57:3306' was successfully elected as primary.

5. dba 对象方法介绍

通过 dba.get_cluster() 方法获取操作对象后,可以看到支持很多自动化的方法,这里会介绍使用方法和场景。
请添加图片描述
需要注意的是 MySQL Shell 可以管理多套集群,所以在使用 get_cluster(‘集群名称’) 可以指定集群名称。

5.1 add_instance()

向集群中添加新的实例,这里给出一个示例,详细可参考 4.4 小节。

-- 待定
rs.add_instance('rw_shell@172-16-104-56:3306', label='node1', recoveryMethod = 'auto', password = 'xxxxx', memberWeight = 80)

5.2 add_replica_instance()

添加只读实例,该方法已在 4.5 小节中介绍,只读实例不参与集群的切换和选举,适用于离线业务。

rs.add_replica_instance('rw_shell@172-16-121-152:3306', {'label': 'RReplica1', 'replicationSources': ['172-16-104-56:3306']})

5.3 create_cluster_set()

该方法用于部署 ClusterSet 架构,将在后面的文章中介绍。

5.4 describe()

属于集群的监控方法,列出当前集群的拓扑信息。

{
    "clusterName": "test_cluster", 
    "defaultReplicaSet": {
        "name": "default", 
        "topology": [
            {
                "address": "172-16-104-57:3306", 
                "label": "172-16-104-57:3306", 
                "role": "HA"
            }, 
            {
                "address": "172-16-104-55:3306", 
                "label": "172-16-104-55:3306", 
                "role": "HA"
            }, 
            {
                "address": "172-16-104-56:3306", 
                "label": "172-16-104-56:3306", 
                "role": "HA"
            }, 
            {
                "address": "172-16-121-152:3306", 
                "label": "RReplica1", 
                "replicationSources": [
                    "172-16-104-56:3306"
                ], 
                "role": "READ_REPLICA"
            }
        ], 
        "topologyMode": "Single-Primary"
    }
}

5.5 disconnect()

断开 cluster 对象与组复制节点之间的连接,在 Python 模式下,相当于销毁了操作对象,适用于管理多套集群的场景。

-- 创建对象
cluster = dba.get_cluster()
-- 销毁对象
cluster.disconnect()

5.6 dissolve()

该方法用于解散集群,需要连接到主实例,执行该命令后将 InnoDB Cluster 的元数据配置删除,实例中的用户数据不会删除。

cluster.dissolve() 

5.7 fence_all_traffic()

将集群与所有流量隔离,关闭所有节点的复制并禁止写入,属于优雅的关闭组复制的操作。

cluster.fence_all_traffic()
The Cluster 'test_cluster' will be fenced from all traffic

* Enabling super_read_only on the primary '172-16-104-55:3306'...
* Enabling offline_mode on the primary '172-16-104-55:3306'...
* Enabling offline_mode on '172-16-104-57:3306'...
* Stopping Group Replication on '172-16-104-57:3306'...
* Enabling offline_mode on '172-16-104-56:3306'...
* Stopping Group Replication on '172-16-104-56:3306'...
* Enabling offline_mode on '172-16-121-152:3306'...
* Stopping replication on '172-16-121-152:3306'...
* Stopping Group Replication on the primary '172-16-104-55:3306'...

Cluster successfully fenced from all traffic

恢复集群使用下面的方法:

dba.reboot_cluster_from_complete_outage('test_cluster')

5.8 get_name()

该方法用于获取集群的名称。

cluster.get_name()

5.9 list_routers()

列出 Router 代理实例信息。

cluster.list_routers() 
{
    "clusterName": "test_cluster", 
    "routers": {
        "172-16-104-55::": {
            "hostname": "172-16-104-55", 
            "lastCheckIn": "2024-08-28 15:34:14", 
            "roPort": "6447", 
            "roXPort": "6449", 
            "rwPort": "6446", 
            "rwSplitPort": "6450", 
            "rwXPort": "6448", 
            "version": "8.4.0"
        }
    }
}

5.10 options()

该方法用于列出集群的配置信息。

cluster.options()

5.11 remove_instance()

从集群中移除一个节点,也可用于移除复制节点。

cluster.remove_instance('172-16-104-55:3306')

5.12 rejoin_instance()

用于将一个集群中已有的实例,状态异常的实例,重新加入到集群。

cluster.rejoin_instance('172-16-104-55:3306')

5.13 remove_router_metadata()

Router 代理集机器如果要迁移,可以使用该命令清理到元数据,重新引导 Router 即可。

cluster.remove_router_metadata("172-16-104-55::")

5.14 rescan()

用户如果没有通过 MySQL Shell 修改或者调整集群的复制通道或者参数等,就会出现集群元数据与实际不匹配的问题,此时可以使用该方法,重新扫描集群收集最新的元数据信息。

cluster.rescan()

5.15 reset_recovery_accounts_password()

MySQL Shell 在建立复制关系的时候,会自动创建复制通道的账号,密码用户是不知道的。基于安全合规要求,账号可能需要定期修改,那么可以执行如下命令,会自动修改密码并重启复制:

cluster.reset_recovery_accounts_password()
The recovery and replication account passwords of all the cluster instances' were successfully reset.

5.16 router_options()

列出 Router 代理的配置信息,其中 extended 表示详细等级 0~2,选项 router 是查看指定代理时使用。

cluster.router_options({'extended':0, 'router':'172-16-104-55::'})

5.17 set_instance_option()

用户修改配置时使用,使用的格式如下:

cluster.set_instance_option("172-16-104-55:3306", "memberWeight", 80)

5.18 set_option()

修改集群级别的参数,比如修改集群的名称:

cluster.set_option('clusterName', 'pre_cluster')
Setting the value of 'clusterName' to 'pre_cluster' in the Cluster ...

Successfully set the value of 'clusterName' to 'pre_cluster' in the Cluster: 'test_cluster'.

5.19 set_primary_instance()

手动切换主实例,可以使用

cluster.set_primary_instance('172-16-104-57:3306')
Setting instance '172-16-104-57:3306' as the primary instance of cluster 'pre_cluster'...

Instance '172-16-104-56:3306' remains SECONDARY.
Instance '172-16-104-55:3306' was switched from PRIMARY to SECONDARY.
Instance '172-16-104-57:3306' was switched from SECONDARY to PRIMARY.

The instance '172-16-104-57:3306' was successfully elected as primary.

5.20 set_routing_option()

5.21 setup_admin_account()

创建或者修改 InnoDB Cluster 的账号:

cluster.setup_admin_account('admin')

5.22 setup_router_account()

创建或者修改 router 监控和引导用户的账号:

cluster.setup_router_account('op_router', {'update':1})
Updating user op_router@%.
Updating .
Account op_router@% was successfully updated.

5.23 status()

查看集群状态,参数 extended 表示输出的详细等级,取值范围是 0~3:

cluster.status({'extended':0})

5.24 switch_to_multi_primary_mode()

将集群从单主模式调整为多主模式。

cluster.switch_to_multi_primary_mode()
Switching cluster 'pre_cluster' to Multi-Primary mode...

Instance '172-16-104-57:3306' remains PRIMARY.
Instance '172-16-104-55:3306' was switched from SECONDARY to PRIMARY.
Instance '172-16-104-56:3306' was switched from SECONDARY to PRIMARY.

The cluster successfully switched to Multi-Primary mode.

5.25 switch_to_multi_primary_mode()

将集群由多主模式调整为单主模式。

cluster.switch_to_single_primary_mode()
Switching cluster 'pre_cluster' to Single-Primary mode...

Instance '172-16-104-55:3306' remains PRIMARY.
Instance '172-16-104-57:3306' was switched from PRIMARY to SECONDARY.
Instance '172-16-104-56:3306' was switched from PRIMARY to SECONDARY.

WARNING: Existing connections that expected a R/W connection must be disconnected, i.e. instances that became SECONDARY.

The cluster successfully switched to Single-Primary mode.

总结

本文介绍 MySQL InnoDB Cluster 部署和维护的方法,基于 MySQL Shell 提供的 Admin API 大大简化运维人员部署和维护集群,并且兼容 Python 语法,个人觉得可玩性还是非常高的,后面如果有亮点功能还会单独介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2096708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

结束Linux特定端口上的进程,超级实用!

在使用 Linux 时&#xff0c;您可能会遇到特定端口被进程占用的情况。了解如何终止在特定端口上运行的进程可能非常有用&#xff0c;特别是对于排除故障和有效地管理系统而言。 本文中&#xff0c;我们将完成查找端口号、识别使用该端口的进程以及安全停止该进程。 详细步骤 …

【最全深度学习介绍】基本概念、类型、应用、优缺点、与机器学习区别是什么?

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发…

PostgreSQL技术内幕6:PostgreSQL索引技术

文章目录 0. 简介1.PG索引类型介绍2. PG创建索引说明及索引属性查看2.1 创建说明2.2 查看方式2.2.1 查看PG默认支持的索引及对应的Handler类型2.2.2 查看B树索引属性 3. 索引选择3.1 查看索引情况 4.PG中B-Tree索引原理4.1 页存储结构 5.索引代码分析5.1 不同索引结构解析5.1.1…

郑州建站网页手机版

随着移动互联网的迅猛发展&#xff0c;越来越多的企业和个人开始重视手机网页的建设。在郑州&#xff0c;这一趋势尤为明显&#xff0c;搭建手机网页已经成为提升品牌形象和吸引客户的重要方式。本文将就郑州建站网页手机版的现状、重要性及注意事项进行探讨。 首先&#xff0c…

LabVIEW中升采样和降采样

升采样 (Upsampling) 和 降采样 (Downsampling) 是信号处理中的两种常见操作&#xff0c;用于改变信号的采样率。它们在数字信号处理&#xff08;DSP&#xff09;和许多工程应用中非常重要&#xff0c;尤其是在处理不同采样率的数据流时。 升采样 (Upsampling) 升采样是增加信…

SpringBoot 引入使用消息队列RabbitMQ通信 配置连接 无路由模式

介绍 请先对Rabbitmq的用户和权限配置好在进行往下的操作 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>下面将演示最简单的例子不过路由 生产者 -&g…

IDEA工程连接不上Mysql数据库

在进行项目创建的时候&#xff0c;发现IDEA工程连接不上数据库。即使登陆的用户名和密码全部正确也报错。 在服务里发现Mysql80没有启动 直接利用命令提示符启动&#xff0c;也显示启动失败。 通过 netstat -ano | findstr :3306 查看数据库默认端口3306的占用情况&#…

【CSP:202009-2】风险人群筛查(Java)

题目链接 202009-2 风险人群筛查 题目描述 求解思路 本题的数据量并不大&#xff0c;直接模拟即可。x和y表示每次读取的坐标点。res1表示经过高风险场地的人数&#xff0c;res2表示在高风险场地停留的人数。s用来记录连续在高风险场地停留的点数。r1表示是否经过高风险场地&…

【学习笔记】卫星通信NTN 3GPP标准化进展分析(三)- 3GPP Release17 内容

一、引言&#xff1a; 本文来自3GPP Joern Krause, 3GPP MCC (May 14,2024) Non-Terrestrial Networks (NTN) (3gpp.org) 本文总结了NTN标准化进程以及后续的研究计划&#xff0c;是学习NTN协议的入门。 【学习笔记】卫星通信NTN 3GPP标准化进展分析&#xff08;一&#xff…

CART算法原理及Python实践

一、CART算法原理 CART&#xff08;Classification And Regression Trees&#xff09;算法是一种用于分类和回归任务的决策树学习技术。它采用贪心策略递归地划分数据集&#xff0c;以构建一棵二叉决策树。CART算法的原理可以概括为以下几个关键步骤&#xff1a; 1. 特征选择与…

如何在 CentOS 6 上安装 Nagios

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 Status: 已弃用 本文涵盖的 CentOS 版本已不再受支持。如果您目前正在运行 CentOS 6 服务器&#xff0c;我们强烈建议升级或迁移到受支持…

什么是单片机?为什么要学习单片机?

实现目标 1、熟悉单片机定义、特点、应用场景、发展历史等&#xff1b; 2、理解为什么要学习单片机&#xff1f;怎样学习单片机&#xff1f; 一、单片机是什么&#xff1f; 1、定义 单片机是集成在一块&#xff08;单&#xff09;芯片上的微型计算机。平时我们把 MCU&#x…

E. Sheep Eat Wolves

https://codeforces.com/gym/104869/problem/E 赛时队友想贪心&#xff0c;贪不了一点&#xff0c;我想了数学办法每次都送固定的发现送过去就不满足了 赛后补&#xff0c;暴力做O&#xff08;n4) 至少要几次才能把安全所有羊送到对岸去 考虑最短路,bfs,用数组存下所有状态 …

nerf论文代码理解

近年来&#xff0c;生成式AI(AGI)快速发展&#xff0c;各类生成式模型层出不群&#xff0c;但我更觉得具有物理意义的生成式AI将是未来革命性技术。因此也在抽空看看关于三维重建的知识&#xff0c;这篇文章就是记录我对nerf的理解。 一、论文理解 首先&#xff0c;需要知道ne…

车载冰箱的介绍

车载冰箱产业链的上游环节主要涉及制冷模块的研发与制造&#xff0c;这一环节根据所采用的制冷技术不同而展现出各自的特点。压缩机制冷模块和半 导体制冷模块是车载冰箱制冷系统的核心组成部分&#xff0c;它们在设计、材料选择和制造工艺上各有千秋。 车载冰箱的原理图 车载…

HTB-Three(云服务)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解Three靶机 渗透过程 信息搜集 服务器开启了22 SSH 和 80 HTTP服务端口 扫描目录 服务器只有一个image图片文件&#xff0c;ssh 需要账号名密码 绑定域名 进行子域名扫描探测 疑似域名&#xff0c;尝…

中秋之美——html5+css+js制作中秋网页

中秋之美——html5cssjs制作中秋网页 一、前言二、功能展示三、系统实现四、其它五、源码下载 一、前言 八月十五&#xff0c;秋已过半&#xff0c;是为中秋。 “但愿人长久&#xff0c;千里共婵娟”&#xff0c;中秋时节&#xff0c;气温已凉未寒&#xff0c;天高气爽&#x…

支付平台构建支付接口供整个公司调用—支付代理商

一、支付平台一般需要对外开放用于满足一体化平台调用 支付平台提供支付接口具有以下必要性&#xff1a; 1. 拓展业务范围&#xff1a;使各类商家和服务提供商能够接入支付服务&#xff0c;从而扩大支付平台的用户群体和业务覆盖范围。 2. 提升用户体验&#xff1a;为不同的应…

音视频-图像篇(YUV和RGB)

文章目录 一、图像基础概念二、YUV与RGB1.YUV分类方式2.YUV“空间-间”的数据划分1&#xff09;UV按照“空间-间”的划分方式&#xff0c;分为YUV444、YUV422、YUV4202&#xff09;YUV“空间-内”的数据划分 3.RGB 三、比较JPG、PNG、GIF、BMP图片格式 一、图像基础概念 像素&…

Python OpenCV 入门指南

引言 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;它包含了大量的用于实时图像分析和视频处理的功能。Python 作为一种流行的编程语言&#xff0c;以其易用性和灵活性成为了进行快速原型设计和开发的理想选择。结…