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/
第一次使用orchestrator时,需配置要监控的集群。
只需要选择一个节点填写,orchestrator会自动发现分析集群的复制拓扑结构,监控集群所有节点。上图中我们添加172.16.71.30:3307节点后,很快在Dashboard中就能发现以主节点的hostname命名的集群信息。
点击图标就会显示集群的拓扑结构,可以看到orchestrator将集群级联复制的拓扑结构完整展示,初始化时添加的节点mogdb:3307在最后一级。
点击实例图标就会显示复制相关参数,可以支持在线变更
orchestrator也可以支持通过拖拽实例对应的图标改变复制的拓扑结构,如我们将mogdb:3307实例拖拽到mogdb1:3306实例上面,将级联复制改为一主两从架构
也可以通过拖拽实例图标实现主备切换
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很快发现主库异常,进入切换流程
查看当前拓扑
[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本身出现异常则服务将不可用。此架构仅能用于测试环境
可以部署多个orchestrator实例,后端数据库使用主从或集群。这被称为Semi HA 或HA via shared backend。这种架构中每个orchestrator都可以接受请求。
orchestrator还支持基于raft共识算法的高可用部署,每个orchestrator节点都有自己的后端配置数据库MySQL和SQLite都支持。在orchestrator集群中只有一个节点作为leader接受请求,集群内部leader自动选举
参考
- [1] https://github.com/openark/orchestrator