Bootstrap

高可用 | Orchestrator+VIP部署hook脚本(四)

1、背景

  • Orchestrator默认仅提供MySQL主从复制的扩展管理。在发生故障转移时,会重新组织扩展,选出新主库并指定其他从库连接到它。

  • 但Orch自身不会进行任何DNS更改或VIP漂移。切换后,应用程序可能连接到错误的数据库。那么是否可以按照MHA+VIP类似的方式,来使用Orchestrator呢?

  • 建议开启无损半同步(rpl_semi_sync_master_wait_point=AFTER_SYNC)。

2、Hooks脚本

Orch支持hooks——在恢复过程中调用的外部脚本。这些是通过shell调用的命令数组,尤其是bash。

OnFailureDetectionProcesses:当检测故障转移现象时执行(在决定是否进行故障转移之前)。
PreGracefulTakeoverProcesses:graceful master takeover时执行,在master变成read-only之前立即执行。
PreFailoverProcesses:在orch进行恢复操作之前立即执行。在这个过程中任何的失败(非零退出代码)都会终止恢复。提示:这使得有机会根据系统的某些内部状态中止恢复。
PostMasterFailoverProcesses:在主恢复成功结束时执行
PostIntermediateMasterFailoverProcesses:在中间主恢复成功结束时执行
PostFailoverProcesses:在任何成功的恢复结束时执行(包括以及补充到PostMasterFailoverProcesses、PostIntermediateMasterFailoverProcesses)
PostUnsuccessfulFailoverProcesses:在任何不成功的恢复结束时执行
PostGracefulTakeoverProcesses:在有计划地、优雅地主库切换的时候会执行,在旧主库位于新主库之后执行

通过这些Hooks,我们可以根据当前的架构来定义、调用自己的外部脚本,让应用找到新的Master。

3、元数据信息表

Orch切换时,生产环境不可能把所有ip端口信息写到脚本中,建议维护一套生产环境的元数据信息库。

建表语句:

CREATE TABLE `vip_info_table` (
  `id` int NOT NULL AUTO_INCREMENT,
  `ip` varchar(255) COLLATE utf8_bin NOT NULL,
  `port` int NOT NULL,
  `vip` varchar(255) COLLATE utf8_bin NOT NULL,
  `interface` varchar(255) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`id`)
);

4、VIP切换配置

4.1 hook脚本配置

脚本名 说明
orch_hook.py 使用python2.7环境,依赖元数据信息库获取ip端口等信息
orch_vip.sh 通过执行ip addr del/add命令卸载/添加vip

将脚本复制到/usr/local/orchestrator目录下,并赋予执行权限:

chmod 777 orch_hook.py
chmod 777 orch_vip.sh

修改/etc/orchestrator.conf.json配置文件:

## 修改后如下
"PostFailoverProcesses": [
    "echo '(for all types) Recovered from {failureType} on {failureCluster}. Failed: {failedHost}:{failedPort}; Successor: {successorHost}:{successorPort}' >> /tmp/recovery.log",
    "python /usr/local/orchestrator/orch_hook.py {failedHost} {failedPo
;