暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL高可用复制管理工具---orchestrator简单测试

原创 杨明翰 2022-01-21
3036

orchestrator是以go语言编写以Apache License 2.0的协议发布的一种MySQL高可用以及复制管理的工具。orchestrator服务提供命令行,http api以及web界面等多种操作接口,具备重构复制拓扑结构和自动failover的能力。

1、安装orchestrator

orchestrator具体有哪些功能,如何使用的,我们先安装一套测试一手。

首先按需下载安装包https://github.com/openark/orchestrator/releases本文下载rpm包安装。orchestrator可以配置MySQL或SQLite作为元数据存储库,如果选用MySQL需要预先安装

#选择最近的版本orchestrator-3.2.6-1.x86_64.rpm
# wget https://github.com/openark/orchestrator/releases/download/v3.2.6/orchestrator-3.2.6-1.x86_64.rpm

#直接rpm安装
# rpm  -ivh orchestrator-3.2.6-1.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:orchestrator-1:3.2.6-1           ################################# [100%]
   
复制

本文选择MySQL做元数据存储,预先安装MySQL服务并做相应配置、

mysql> CREATE DATABASE IF NOT EXISTS orchestrator;
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> CREATE USER 'orchestrator'@'127.0.0.1' IDENTIFIED BY 'orch_backend_password';
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT ALL PRIVILEGES ON `orchestrator`.* TO 'orchestrator'@'127.0.0.1';
Query OK, 0 rows affected (0.00 sec)
复制

orchestrator提供了一个配置文件模板,我们按需修改后保存到/etc/目录下。

[root@mogdb ~]# cp /usr/local/orchestrator/orchestrator-sample.conf.json /etc/orchestrator.conf.json
[root@mogdb ~]# vim /etc/orchestrator.conf.json
...............

  "MySQLOrchestratorHost": "127.0.0.1",
  "MySQLOrchestratorPort": 3306,
  "MySQLOrchestratorDatabase": "orchestrator",
  "MySQLOrchestratorUser": "orchestrator",
  "MySQLOrchestratorPassword": "orch_backend_password",

................
复制

除了存储元数据的配置数据库,还需要在每一个被管理的MySQL实例上给orchestrator创建有用户并授权,这样才能对复制和存活状态进行检测。

#在被管理的MySQL实例上授权
CREATE USER 'orchestrator'@'172.16.71.%' IDENTIFIED BY 'orch_topology_password';
GRANT SUPER, PROCESS, REPLICATION SLAVE, RELOAD ON *.* TO 'orchestrator'@'172.16.71.%';
GRANT SELECT ON mysql.slave_master_info TO 'orchestrator'@'172.16.71.%';
GRANT SELECT ON ndbinfo.processes TO 'orchestrator'@'orch_host'; -- Only for NDB Cluster
复制

再次修改orchestrator配置文件

[root@mogdb ~]# vim /etc/orchestrator.conf.json
....................

  "MySQLTopologyUser": "orchestrator",
  "MySQLTopologyPassword": "orch_topology_password",
  
....................
复制

2、启动orchestrator

在配置库和管理库上创建相应用户权限并修改orchestrator的相关配置后,就可以启动服务了。orchestrator提供了较丰富的配置,我会在后面详细说明。

#启动
cd /usr/local/orchestrator && ./orchestrator http
复制

orchestrator的默认监听端口是3000,正常启动后直接浏览器访问http://orchestratorIP:3000/

默认配置文件为/etc/orchestrator.conf.json,也可在启动时指定 或 打印更多日志信息

cd /usr/local/orchestrator && ./orchestrator --debug --stack --config=/path/to/config.file http
复制

通常情况下orchestrator或持续轮询所有已知实例,用来更新集群和实例状态。你也可以启动时禁止轮询

cd /usr/local/orchestrator && ./orchestrator --discovery=false http
复制

3、浏览器访问orchestrator

前面提到orchestrator 监听在3000端口,通过浏览器直接访问http://orchestratorIP:3000/

image.png

第一次使用orchestrator时,需配置要监控的集群。
image.png
image.png

只需要选择一个节点填写,orchestrator会自动发现分析集群的复制拓扑结构,监控集群所有节点。上图中我们添加172.16.71.30:3307节点后,很快在Dashboard中就能发现以主节点的hostname命名的集群信息。

image.png

点击图标就会显示集群的拓扑结构,可以看到orchestrator将集群级联复制的拓扑结构完整展示,初始化时添加的节点mogdb:3307在最后一级。

image.png

点击实例图标就会显示复制相关参数,可以支持在线变更

image.png

orchestrator也可以支持通过拖拽实例对应的图标改变复制的拓扑结构,如我们将mogdb:3307实例拖拽到mogdb1:3306实例上面,将级联复制改为一主两从架构

image.png
image.png

也可以通过拖拽实例图标实现主备切换

image.png
image.png
image.png

4、命令行访问orchestrator

orchestrator提供两种命令行访问方式:orchestrator二进制包或者orchestrator-client。如果使用第一种方式就要完成安装但不启动服务,调整好配置文件后使用。 选择使用orchestrator-client就要简单的多了,不需要安装也不需要配置文件。

测试环境中我已经配置好了,就以第一种方式简单演示功能; orchestrator命令行工具提供的功能非常多,可以使用orchestrator help查看支持的命令,再用orchestrator -c 命令 help` 查看用法



#查看当前管理的所有集群
[root@mogdb ~]# orchestrator -c clusters       
mogdb1:3306

#查看当前管理的所有实例
[root@mogdb ~]# orchestrator -c all-instances  
mogdb1:3306
mogdb:3307
mogdb2:3306

#删除一个实例(从管理列表中)
[root@mogdb ~]# orchestrator -c forget -i mogdb:3307
mogdb:3307

#加入一个实例
[root@mogdb ~]# orchestrator -c discover -i mogdb:3307       
mogdb:3307

#查看某个集群的拓扑结构
[root@mogdb ~]# orchestrator -c topology -i mogdb:3307
mogdb1:3306   [0s,ok,8.0.27,rw,ROW,>>,GTID]
+ mogdb:3307  [0s,ok,8.0.27,rw,ROW,>>,GTID]
+ mogdb2:3306 [0s,ok,8.0.27,rw,ROW,>>,GTID]

#主从切换自动选主
[root@mogdb ~]# orchestrator -c graceful-master-takeover-auto  -i mogdb1:3306
mogdb:3307
binlog.000003:152

[root@mogdb ~]# orchestrator -c topology -i mogdb:3307
mogdb:3307    [0s,ok,8.0.27,rw,ROW,>>,GTID]
+ mogdb1:3306 [0s,ok,8.0.27,ro,ROW,>>,GTID]
+ mogdb2:3306 [0s,ok,8.0.27,rw,ROW,>>,GTID]


#修改拓扑结构
[root@mogdb ~]# orchestrator -c relocate -i mogdb2:3306 -d mogdb1:3306
mogdb2:3306<mogdb1:3306

[root@mogdb ~]# orchestrator -c topology -i mogdb:3307
mogdb:3307      [0s,ok,8.0.27,rw,ROW,>>,GTID]
+ mogdb1:3306   [0s,ok,8.0.27,ro,ROW,>>,GTID]
  + mogdb2:3306 [0s,ok,8.0.27,rw,ROW,>>,GTID]


#设置节点读写状态

#可写
[root@mogdb ~]# orchestrator -c set-writeable -i mogdb2:3306
mogdb2:3306

[root@mogdb ~]# orchestrator -c topology -i mogdb:3307      
mogdb:3307      [0s,ok,8.0.27,rw,ROW,>>,GTID]
+ mogdb1:3306   [0s,ok,8.0.27,ro,ROW,>>,GTID]
  + mogdb2:3306 [0s,ok,8.0.27,rw,ROW,>>,GTID]

#只读
[root@mogdb ~]# orchestrator -c set-read-only -i mogdb2:3306
mogdb2:3306

[root@mogdb ~]# orchestrator -c topology -i mogdb:3307      
mogdb:3307      [0s,ok,8.0.27,rw,ROW,>>,GTID]
+ mogdb1:3306   [0s,ok,8.0.27,ro,ROW,>>,GTID]
  + mogdb2:3306 [0s,ok,8.0.27,ro,ROW,>>,GTID]
复制

orchestrator也支持无需安装,直接使用orchestrator-client 或直接调用 web api实现对集群的管理。官方文档写的非常清晰,这里就不再验证。使用orchestrator-client时注意下需要先安装jq。

wget -O jq https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
chmod +x ./jq
cp jq /usr/bin
复制

5、failover

orchestrator支持自动的故障处理,当主库故障时会自动选择一个合适的备库提升成主。

  • 注意orchestrator建议修改默认的复制重连参数,以便快速发现并缓解错误
set global slave_net_timeout = 4
CHANGE MASTER TO MASTER_CONNECT_RETRY=1, MASTER_RETRY_COUNT=86400
复制
  • orchestrator要做好相关配置
  "RecoveryPeriodBlockSeconds": 60,     //为了防止波动,默认是3600秒 也就是一个小时内不会再次切换
  "RecoveryIgnoreHostnameFilters": [],
  "RecoverMasterClusterFilters": [
    "*"
  ],
  "RecoverIntermediateMasterClusterFilters": [
    "*"
  ],
复制

当前主库是mogdb1:3306上

[root@mogdb ~]# orchestrator -c topology -i mogdb:3307      
mogdb1:3306   [0s,ok,8.0.27,rw,ROW,>>,GTID]
+ mogdb:3307  [0s,ok,8.0.27,ro,ROW,>>,GTID]
+ mogdb2:3306 [0s,ok,8.0.27,ro,ROW,>>,GTID]
复制

默认情况下orchestrator会选择the most up-to-date 的备库提升,也可以在客户端中查看目前最适合promotion的备库

[root@mogdb ~]# orchestrator -c  get-candidate-replica  -i mogdb1:3306
mogdb2:3306
复制

直接关闭主库

[root@mogdb1 ~]# mysqladmin -uroot -p  shutdown
Enter password: 
复制

orchestrator很快发现主库异常,进入切换流程

image.png
image.png

查看当前拓扑

[root@mogdb ~]# orchestrator -c topology -i mogdb:3307
mogdb2:3306  [0s,ok,8.0.27,rw,ROW,>>,GTID]
+ mogdb:3307 [0s,ok,8.0.27,ro,ROW,>>,GTID]
复制

orchestrator也支持配置hook相关参数,自己编写脚本实现如VIP切换,代理、DNS、中间件配置修改等功能。在配置文件中可以在不同的切换场景下配置不同的脚本。

#在计划的、优雅的 master 接管时执行,在 master 变为只读之前。
  "PreGracefulTakeoverProcesses": [
    "echo 'Planned takeover about to take place on {failureCluster}. Master will switch to read_only' >> /tmp/recovery.log"
  ],

#在 Orchestrator 采取恢复操作之前立即执行。任何这些进程的失败(非零退出代码)都会中止恢复。提示:这使您有机会根据系统的某些内部状态中止恢复。
  "PreFailoverProcesses": [
    "echo 'Will recover from {failureType} on {failureCluster}' >> /tmp/recovery.log"
  ],
  
#在成功的主恢复结束时执行。  
  "PostFailoverProcesses": [
    "echo '(for all types) Recovered from {failureType} on {failureCluster}. Failed: {failedHost}:{failedPort}; Successor: {successorHost}:{successorPort}' >> /tmp/recovery.log"
  ],
  

#在具有副本恢复的成功中间主节点或复制组成员结束时执行。
  "PostIntermediateMasterFailoverProcesses": [
    "echo 'Recovered from {failureType} on {failureCluster}. Failed: {failedHost}:{failedPort}; Successor: {successorHost}:{successorPort}' >> /tmp/recovery.log"
  ],  

  
 #在任何成功恢复结束时执行(包括并添加到上述两个)。 
  "PostMasterFailoverProcesses": [
    "echo 'Recovered from {failureType} on {failureCluster}. Failed: {failedHost}:{failedPort}; Promoted: {successorHost}:{successorPort}' >> /tmp/recovery.log"
  ],
  


  
#在任何不成功的恢复结束时执行。  
  "PostUnsuccessfulFailoverProcesses": [],
  
 #在旧的 master 被定位在新提升的 master 之下之后,在计划的、优雅的 master 接管时执行。 
  "PostGracefulTakeoverProcesses": [
    "echo 'Planned takeover complete' >> /tmp/recovery.log"
  ],
复制

orchestrator 为所有 hooks 提供故障/恢复相关信息,例如故障实例的身份、提升实例的身份、受影响的副本、故障类型、集群名称等。

这些信息以环境变量 或者 命令行文本替换的方式独立提供,可以任选

1.Environment variables: orchestrator will set the following, which can be retrieved by your hooks:
ORC_FAILURE_TYPE
ORC_INSTANCE_TYPE ("master", "co-master", "intermediate-master")
ORC_IS_MASTER (true/false)
ORC_IS_CO_MASTER (true/false)
ORC_FAILURE_DESCRIPTION
ORC_FAILED_HOST
ORC_FAILED_PORT
ORC_FAILURE_CLUSTER
ORC_FAILURE_CLUSTER_ALIAS
ORC_FAILURE_CLUSTER_DOMAIN
ORC_COUNT_REPLICAS
ORC_IS_DOWNTIMED
ORC_AUTO_MASTER_RECOVERY
ORC_AUTO_INTERMEDIATE_MASTER_RECOVERY
ORC_ORCHESTRATOR_HOST
ORC_IS_SUCCESSFUL
ORC_LOST_REPLICAS
ORC_REPLICA_HOSTS
ORC_COMMAND ("force-master-failover", "force-master-takeover", "graceful-master-takeover" if applicable)
And, in the event a recovery was successful:

ORC_SUCCESSOR_HOST
ORC_SUCCESSOR_PORT
ORC_SUCCESSOR_BINLOG_COORDINATES
ORC_SUCCESSOR_ALIAS

2.Command line text replacement. orchestrator replaces the following magic tokens in your *Proccesses commands:
{failureType}
{instanceType} ("master", "co-master", "intermediate-master")
{isMaster} (true/false)
{isCoMaster} (true/false)
{failureDescription}
{failedHost}
{failedPort}
{failureCluster}
{failureClusterAlias}
{failureClusterDomain}
{countReplicas} (replaces {countSlaves})
{isDowntimed}
{autoMasterRecovery}
{autoIntermediateMasterRecovery}
{orchestratorHost}
{lostReplicas} (replaces {lostSlaves})
{countLostReplicas}
{replicaHosts} (replaces {slaveHosts})
{isSuccessful}
{command} ("force-master-failover", "force-master-takeover", "graceful-master-takeover" if applicable)
And, in the event a recovery was successful:

{successorHost}
{successorPort}
{successorBinlogCoordinates}
{successorAlias}
复制

如果我们修改配置文件中的hook部分

 "PostMasterFailoverProcesses": [
    "echo `date` 'this is  a test for hook   Recovered from {failureType} on {failureCluster}. Failed: {failedHost}:{failedPort}; Promoted: {successorHost}:{successorPort};command {command} ; isSucc:{isSuccessful} ' >> /tmp/recovery.log"
  ],

复制

再次触发auto failover,在recovery.log中就会触发相关输出

Fri Jan 21 16:01:33 CST 2022 this is  a test for hook   Recovered from DeadMaster on mogdb2:3306. Failed: mogdb2:3306; Promoted: mogdb1:3306;command  ; isSucc:true 
复制

6、未完待续

orchestrator的配置参数还有很多,后续补充相关解释和测试结果。

orchestrator支持高可用部署架构,这一块也后续补充

这之前的测试中orchestrator是单点部署,如果配置MySQL或orchestrator本身出现异常则服务将不可用。此架构仅能用于测试环境

image.png

可以部署多个orchestrator实例,后端数据库使用主从或集群。这被称为Semi HA 或HA via shared backend。这种架构中每个orchestrator都可以接受请求。

image.png
image.png

orchestrator还支持基于raft共识算法的高可用部署,每个orchestrator节点都有自己的后端配置数据库MySQL和SQLite都支持。在orchestrator集群中只有一个节点作为leader接受请求,集群内部leader自动选举

image.png

参考

  • [1] https://github.com/openark/orchestrator
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论