MySQL高可用——Orchestrator架构、配置文件详细介绍和单机搭建部署

Orchestrator

    • 一、特性
      • 1. Discover(发现)
      • 2. Refactoring(重构)
      • 3. Recover(恢复)
    • 二、架构
      • 1. 单点模式
      • 2. 多点共享后端
        • (1)后端单点
        • (2)后端多点
      • 3. 多点非共享后端
    • 三、配置文件
    • 四、部署

Orchestrator是一个MySQL高可用和复制集管理工具平台,其具有如下主要功能:

  • 可以自动发现MySQL集群,通过mysql节点信息获取相关slave的信息,进而获取整个集群拓扑结构并将信息存储在后端数据库中
  • 基于复制集管理规则,提供自由重构复制集拓扑结构的功能,如将某个slave节点移动到其他master下
  • 自动探测故障并采取相应恢复措施,实现MySQL服务高可用的目的,减少人工介入
  • 提供web UI,API以及命令行等入口操作,方便用户监控和操作集群

一、特性

1. Discover(发现)

orchestrator主动搜寻MySQL拓扑并进行映射。它能读取基本的MySQL信息,例如复制状态和配置。即使遇到故障,也可以为MySQL环境的拓扑提供流畅的可视化效果,包括复制问题。

2. Refactoring(重构)

orchestrator了解复制规则。它知道binlog文件:位置,GTID,伪GTID,Binlog服务器。重构复制拓扑可以是将副本拖放到另一个主副本下的问题。移动副本是安全的:orchestrator将拒绝非法的重构尝试。通过各种命令行选项可以实现细粒度的控制。

3. Recover(恢复)

orchestrator使用全面方法来检测主库故障和级联中间主库的故障。根据从拓扑本身获得的信息,它可以识别各种故障情况。可通过配置,orchestrator可以选择执行自动恢复(或允许用户选择手动恢复的类型)。在内部实现中间主库的恢复。orchestrator通过Hooks进行自定义脚本支持故障切换。

二、架构

  • 针对复制提供故障切换,从库故障发现。基于GTID+增强半同步的高可用架构。

  • 生产环境建议使用多点非共享架构,开启reft保证Orchestrator自身高可用。

  • 同时需要注意的是,Orchestrator的server端需要和对外提供服务的MySQL放在一起的,Orchestrator的专属后端可以放到远程服务器上,这点在配置文件中也有体现。

1. 单点模式

单个Orchestrator对应单个后端MySQL

MySQL高可用——Orchestrator架构、配置文件详细介绍和单机搭建部署_第1张图片

2. 多点共享后端

(1)后端单点

后端可以为单点写或者主从模式,多个Orchestrator共享一个写节点后端

MySQL高可用——Orchestrator架构、配置文件详细介绍和单机搭建部署_第2张图片

(2)后端多点

后端为多点写集群模式,Orchestrator之间数据相互同步

MySQL高可用——Orchestrator架构、配置文件详细介绍和单机搭建部署_第3张图片

3. 多点非共享后端

后端相互独立,每个后端为自己的Orchestrator提供服务

MySQL高可用——Orchestrator架构、配置文件详细介绍和单机搭建部署_第4张图片

三、配置文件

{
  "Debug": true,                                          #debug模式,输出详细信息
  "EnableSyslog": false,                                  #是否输出到系统日志里
  "ListenAddress": ":3000",                               #orchestrator的监听端口,web端口
  "MySQLTopologyUser": "failover",  #后端被管理的mysql实例中的账号,所有实例都要有,本次为3307端口
  "MySQLTopologyPassword": "123456",                      #密码
  "MySQLTopologyCredentialsConfigFile": "",       #验证的配置文件,账号密码可以直接写入文件,读取
  "MySQLTopologySSLPrivateKeyFile": "",                   #ssl验证文件
  "MySQLTopologySSLCertFile": "",
  "MySQLTopologySSLCAFile": "",
  "MySQLTopologySSLSkipVerify": true,                     #跳过验证
  "MySQLTopologyUseMutualTLS": false,                     #使用TLS验证
  "MySQLOrchestratorHost": "127.0.0.1",                   #orchestrator的IP,也可以是本机IP
  "MySQLOrchestratorPort": 3306,                         #orchestrator所在的端口,本次为3306
  "MySQLOrchestratorDatabase": "orchestrator",            #orchestrator元数据的数据库名称
  "MySQLOrchestratorUser": "root",                        #管理orchestrator数据库的账户
  "MySQLOrchestratorPassword": "123456",                  #密码
  "MySQLOrchestratorCredentialsConfigFile": "",
  "MySQLOrchestratorSSLPrivateKeyFile": "",
  "MySQLOrchestratorSSLCertFile": "",
  "MySQLOrchestratorSSLCAFile": "",
  "MySQLOrchestratorSSLSkipVerify": true,
  "MySQLOrchestratorUseMutualTLS": false,
  "MySQLConnectTimeoutSeconds": 1,                        #orchestrator连接mysql超时秒数
  "DefaultInstancePort": 3307,                            #mysql实例的端口,本次为3307,对外提供服务的实例
  "DiscoverByShowSlaveHosts": true,                       #是否启用审查和自动发现
  "InstancePollSeconds": 5,                               #orchestrator探测mysql间隔秒数

  "SkipMaxScaleCheck": true,                           #没有MaxScale binlogserver设置为true

  "UnseenInstanceForgetHours": 240,                         #忘记看不见的实例的小时数
  "SnapshotTopologiesIntervalHours": 0,              #快照拓扑调用之间的小时间隔。默认值:0(禁用)
  "InstanceBulkOperationsWaitTimeoutSeconds": 10,            #执行批量(多个实例)操作时在单个实例上等待的时间
  "HostnameResolveMethod": "none",                    #解析主机名,默认default   不解析为none
  "MySQLHostnameResolveMethod": "@@hostname",               #MySQL主机名解析
  "SkipBinlogServerUnresolveCheck": true,                  #跳过二进制服务器检测
  "ExpiryHostnameResolvesMinutes": 60,                    #域名检测过期分钟数
  "RejectHostnameResolvePattern": "",                     #禁止的域名正则表达式
  "ReasonableReplicationLagSeconds": 10,                  #复制延迟高于10秒表示异常
  "ProblemIgnoreHostnameFilters": [],                    #主机正则匹配筛选最小化
  "VerifyReplicationFilters": false,                     #重构钱检查复制筛选器
  "ReasonableMaintenanceReplicationLagSeconds": 20,      #上移和下移的阈值
  "CandidateInstanceExpireMinutes": 60,                  #实例过期分钟数
  "AuditLogFile": "",                                    #审计日志
  "AuditToSyslog": false,                                #审计日志输出到系统日志
  "RemoveTextFromHostnameDisplay": ":3306",              #去除集群的文本
  "ReadOnly": true,                                      #全局只读
  "AuthenticationMethod": "",                            #身份验证模式
  "HTTPAuthUser": "",                                    #http验证用户名
  "HTTPAuthPassword": "",                                #http验证密码
  "AuthUserHeader": "",                                  #指示身份验证用户的HTTP标头,当AuthenticationMethod为“proxy”时
  "PowerAuthUsers": [   #在AuthenticationMethod ==“proxy”上,可以进行更改的用户列表。所有其他都是只读的。
    "*"
  ],
  "ClusterNameToAlias": {                         #正则表达式匹配群集名称与人类友好别名之间的映射
    "127.0.0.1": "test suite"
  },
  "SlaveLagQuery": "",                                   #使用SHOW SLAVE STATUS进行延迟判断
  "DetectClusterAliasQuery": "SELECT SUBSTRING_INDEX(@@hostname, '.', 1)",  #查询集群别名
  "DetectClusterDomainQuery": "",  #可选查询(在拓扑实例上执行),返回此集群主服务器的VIP / CNAME /别名/任何域名。查询将仅在集群主机上执行(尽管在拓扑的主机被重新调用之前,它可以在其他/所有副本上执行)。如果提供,必须返回一行,一列
  "DetectInstanceAliasQuery": "",  #可选查询(在拓扑实例上执行),返回实例的别名。如果提供,必须返回一行,一列
  "DetectPromotionRuleQuery": "",  #可选查询(在拓扑实例上执行),返回实例的提升规则。如果提供,必须返回一行,一列。
  "DataCenterPattern": "[.]([^.]+)[.][^.]+[.]mydomain[.]com",   #从正则表达式中筛选数据中心名称
  "PhysicalEnvironmentPattern": "[.]([^.]+[.][^.]+)[.]mydomain[.]com",  #返回实例的物理环境
  "PromotionIgnoreHostnameFilters": [],   #Orchestrator不会使用主机名匹配模式来提升副本(通过-c recovery;例如,避免使用dev专用计算机) 
  "DetectSemiSyncEnforcedQuery": "",                    #查询以确定是否强制完全半同步写入
  "ServeAgentsHttp": false,                             #产生一个agent的http接口
  "AgentsServerPort": ":3001",                          #可选,对于raft设置,此节点将向其对等方通告的HTTP地址是什么(可能在NAT后面或重新路由端口时使用;例如:“http://11.22.33.44:3030”)
  "AgentsUseSSL": false,       #当“true”orchestrator将使用SSL侦听代理端口以及通过SSL连接到代理时
  "AgentsUseMutualTLS": false,
  "AgentSSLSkipVerify": false,
  "AgentSSLPrivateKeyFile": "",
  "AgentSSLCertFile": "",
  "AgentSSLCAFile": "",
  "AgentSSLValidOUs": [],
  "UseSSL": false,                                      #在服务器Web端口上使用SSL
  "UseMutualTLS": false,
  "SSLSkipVerify": false,
  "SSLPrivateKeyFile": "",
  "SSLCertFile": "",
  "SSLCAFile": "",
  "SSLValidOUs": [], 
  "URLPrefix": "",                                     #在非根Web路径上运行orchestrator的URL前缀,例如/ orchestrator将其置于nginx之后。
  "StatusEndpoint": "/api/status",                     #使用相互TLS时的有效组织单位
  "StatusSimpleHealth": true,
  "StatusOUVerify": false,
  "AgentPollMinutes": 60,                              #代理轮询之间的分钟数
  "UnseenAgentForgetHours": 6,                         #忘记看不见代理的小时数
  "StaleSeedFailMinutes": 60,                          #认为陈旧(无进展)种子失败的分钟数。
  "SeedAcceptableBytesDiff": 8192,         #仍被视为成功复制的种子源和目标数据大小之间的字节数差异
  "PseudoGTIDPattern": "",                             #为空禁用伪GTID
  "PseudoGTIDPatternIsFixedSubstring": false,          #如果为true,则PseudoGTIDPattern不被视为正则表达式而是固定子字符串,并且可以提高搜索时间
  "PseudoGTIDMonotonicHint": "asc:",                   #Pseudo-GTID条目中的子字符串,表示Pseudo-GTID条目预计会单调递增
  "DetectPseudoGTIDQuery": "",                   #可选查询,用于权威地决定是否在实例上启用伪gtid
  "BinlogEventsChunkSize": 10000,                      #SHOW BINLOG的块大小(X| RELAYLOG EVENTS LIMIT?,X语句。较小意味着更少的锁定和工作要做
  "SkipBinlogEventsContaining": [],                    #扫描/比较Pseudo-GTID的binlog 时,跳过包含给定文本的条目。这些不是正则表达式(扫描binlog时会消耗太多的CPU),只需查找子字符串。
  "ReduceReplicationAnalysisCount": true,          #当为true时,复制分析将仅报告可能首先处理问题的可能性的实例(例如,不报告大多数叶子节点,这些实际上是无趣的)。如果为false,则为每个已知实例提供一个条目
  "FailureDetectionPeriodBlockMinutes": 60,            #该时间内发现故障,不被多次发现
  "RecoveryPeriodBlockSeconds": 3600,                  #该时间内发现故障,不会多次转移
  "RecoveryIgnoreHostnameFilters": [],                 #恢复会忽略的主机
  "RecoverMasterClusterFilters": [                     #仅在匹配这些正则表达式模式的集群上进行主恢复(当然“。*”模式匹配所有内容)
    "*"
  ],
  "RecoverIntermediateMasterClusterFilters": [         #仅在与这些正则表达式模式匹配的集群上进行IM恢复(当然“。*”模式匹配所有内容)
    "*"
  ],

#OnFailureDetectionProcesses:检测故障转移方案时执行的进程(在决定是否进行故障转移之前)。可以并且应该使用其中一些占位符:{failureType}{failureDescription}{command}{failedHost}{failureCluster}{failureClusterAlias}{failureClusterDomain}{failedPort}{successorHost}{successorPort}{ successorAlias}{countReplicas}{replicaHosts}{isDowntimed}{autoMasterRecovery}{autoIntermediateMasterRecovery}
  "OnFailureDetectionProcesses": [   
    "echo 'Detected {failureType} on {failureCluster}. Affected replicas: {countSlaves}  autoMasterRecovery:  {autoMasterRecovery}  losthost: {lostSlaves}  slavehost: {slaveHosts}   orchestratorHost: {orchestratorHost}' >> /tmp/recovery.log"
  ],

#PreGracefulTakeoverProcesses:在执行故障转移之前执行的进程(中止操作应该是任何一次以非零代码退出;执行顺序未定义)。可以并且应该使用其中一些占位符:{failureType}{failureDescription}{command}{failedHost}{failureCluster}{failureClusterAlias}{failureClusterDomain}{failedPort}{countReplicas}{replicaHosts}{ isDowntimed}
  "PreGracefulTakeoverProcesses": [   
    "echo 'Planned takeover about to take place on {failureCluster}. Master will switch to read_only autoMasterRecovery:  {autoMasterRecovery}  losthost: {lostSlaves}  slavehost: {slaveHosts}   orchestratorHost: {orchestratorHost}' >> /tmp/recovery.log"
  ],

#PreFailoverProcesses:在执行故障转移之前执行的进程(中止操作应该是任何一次以非零代码退出;执行顺序未定义)。可以并且应该使用其中一些占位符:{failureType}{failureDescription}{command}{failedHost}{failureCluster}{failureClusterAlias}{failureClusterDomain}{failedPort}{countReplicas}{replicaHosts}{ isDowntimed}
  "PreFailoverProcesses": [  #执行恢复操作前执行
    "echo 'Will recover from {failureType} on {failureCluster}' >> /tmp/recovery.log"
  ],

#PostFailoverProcesses:执行故障转移后执行的进程(执行顺序未定义)。可以并且应该使用其中一些占位符:{failureType}{failureDescription}{command}{failedHost}{failureCluster}{failureClusterAlias}{failureClusterDomain}{failedPort}{successorHost}{successorPort}{ successorAlias}{countReplicas}{replicaHosts}{isDowntimed}{isSuccessful}{lostReplicas}{countLostReplicas}
  "PostFailoverProcesses": [  
    "echo '(for all types) Recovered from {failureType} on {failureCluster}. Failed: {failedHost}:{failedPort}; Successor: {successorHost}:{successorPort}' >> /tmp/recovery.log"
  ],

#PostUnsuccessfulFailoverProcesses:在未完全成功的故障转移后执行的进程(执行顺序未定义)。可以并且应该使用其中一些占位符:{failureType}{failureDescription}{command}{failedHost}{failureCluster}{failureClusterAlias}{failureClusterDomain}{failedPort}{successorHost}{successorPort}{ successorAlias}{countReplicas}{replicaHosts}{isDowntimed}{isSuccessful}{lostReplicas}{countLostReplicas}
  "PostUnsuccessfulFailoverProcesses": [],  

#PostMasterFailoverProcesses:执行主故障转移后执行的进程(执行顺序未定义)。使用与PostFailoverProcesses相同的占位符
  "PostMasterFailoverProcesses": [ 
    "echo 'Recovered from {failureType} on {failureCluster}. Failed: {failedHost}:{failedPort}; Promoted: {successorHost}:{successorPort}' >> /tmp/recovery.log"
  ],

#PostIntermediateMasterFailoverProcesses:执行主故障转移后执行的进程(执行顺序未定义)。使用与PostFailoverProcesses相同的占位符
  "PostIntermediateMasterFailoverProcesses": [  #成功的中间主恢复时执行
    "echo 'Recovered from {failureType} on {failureCluster}. Failed: {failedHost}:{failedPort}; Successor: {successorHost}:{successorPort}' >> /tmp/recovery.log"
  ],

#PostGracefulTakeoverProcesses:在运行正常的主接管后执行的进程。使用与PostFailoverProcesses相同的占位符
  "PostGracefulTakeoverProcesses": [                     #旧主位于新主之后执行
    "echo 'Planned takeover complete' >> /tmp/recovery.log"
  ],
  "CoMasterRecoveryMustPromoteOtherCoMaster": true,  #当'false'时,任何东西都可以升级(候选人优先于其他人)。当'为'时,orchestrator将促进其他共同主人或否则失败
  "DetachLostSlavesAfterMasterFailover": true,           #恢复可能丢失一些副本DetachLostReplicasAfterMasterFailover的同义词 
  "ApplyMySQLPromotionAfterMasterFailover": true,   #orchestrator应该自己应用MySQL主促销:设置read_only = 0,分离复制等。
  "PreventCrossDataCenterMasterFailover": false,    #当为true(默认值:false)时,不允许跨DC主故障转移,orchestrator将尽其所能只在同一DC内进行故障转移,否则根本不进行故障转移。
  "MasterFailoverDetachSlaveMasterHost": false,     #确保新主不复制旧主的数据MasterFailoverDetachReplicaMasterHost的同义词
  "MasterFailoverLostInstancesDowntimeMinutes": 0,  #在主故障转移(包括失败的主副本和丢失的副本)之后丢失的任何服务器停机的分钟数。0表示禁用
  "PostponeSlaveRecoveryOnLagMinutes": 0,  #PostponeReplicaRecoveryOnLagMinutes的同义词
  "OSCIgnoreHostnameFilters": [],                   #OSC副本推荐将忽略与给定模式匹配的副本主机名
  "GraphiteAddr": "",
  "GraphitePath": "",
  "GraphiteConvertHostnameDotsToUnderscores": true,

  "RaftEnabled": true,                              #raft模式
  "BackendDB": "mysql",                             #后台数据库类型
  "RaftBind": "192.168.89.103",                     #绑定之地,本机IP
  "RaftDataDir": "/var/lib/orchestrator",           #数据目录,如果不存在,则自动创建
  "DefaultRaftPort": 10008,                         #raft通信端口,所有机器必须保持一致
  "RaftNodes": [                                    #raft节点,必须包含所有节点
    "192.168.89.100", 
    "192.168.89.102",
    "192.168.89.103"
    ],

  "ConsulAddress": "",                      #找到Consul HTTP api的地址。示例:127.0.0.18500
  "ConsulAclToken": ""                      #用于写入Consul KVACL令牌
}

四、部署

  1. 在对外提供服务的MySQL服务器上创建用户,使orchestrator可以检测到该MySQL,从而绘制拓补图。

    CREATE USER 'orch_discover'@'%' IDENTIFIED BY '123456';
    GRANT SUPER, PROCESS, REPLICATION SLAVE, REPLICATION CLIENT, RELOAD ON *.* TO 'orch_discover'@'%';
    CREATE DATABASE meta;
    GRANT SELECT ON meta.* TO 'orch_discover'@'%';
    #################创建集群别名###################3
    CREATE TABLE meta.cluster (
      anchor TINYINT NOT NULL,
      cluster_name VARCHAR(128) CHARSET ascii NOT NULL DEFAULT '',
      cluster_domain VARCHAR(128) CHARSET ascii NOT NULL DEFAULT '',
      PRIMARY KEY (anchor)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    INSERT INTO cluster (anchor, cluster_name, cluster_domain) VALUES (1, '你的集群名称', '你的集群域');
    #### 这里的cluster表对应DetectClusterAliasQuery这个参数,配置SQL选取这个表以查询当前集群,如:"select ifnull(max(cluster_name), '') as cluster_alias from meta.cluster where anchor=1
    
  2. 在Orchestrator专属后端MySQL上创建用户:

    CREATE DATABASE IF NOT EXISTS orchestrator;
    CREATE USER 'orch_manager'@'%' IDENTIFIED BY '123456';
    GRANT ALL ON orchestrator.* TO 'orch_manager'@'%';
    GRANT SUPER, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'orch_manager'@'%';
    
  3. 安装orchestrator

    wget https://github.com/openark/orchestrator/releases/download/v3.2.6/orchestrator-3.2.6-linux-amd64.tar.gz
    tar -xvzf https://github.com/openark/orchestrator/releases/download/v3.2.6/orchestrator-3.2.6-linux-amd64.tar.gz
    

    自动生成./usr/local/orchestrator目录

    MySQL高可用——Orchestrator架构、配置文件详细介绍和单机搭建部署_第5张图片

  4. 修改配置文件

    #仅需更改以下配置,不同节点更改raft bind和raft advertise即可
      "ListenAddress": ":8000",
    #配置orchestrator监控的目标数据库信息
      "MySQLTopologyUser": "orchestrator",
      "MySQLTopologyPassword": "orchestrator",
    #配置orchestrator后端元数据库信息  
      "MySQLOrchestratorHost": "10.177.54.161",
      "MySQLOrchestratorPort": 3000,
      "MySQLOrchestratorDatabase": "orchestrator",
      "MySQLOrchestratorUser": "orchestrator",
      "MySQLOrchestratorPassword": "orchestrator",
      "RaftEnabled": true,
      "RaftDataDir": "/data/orchestrator",
      "RaftBind": "xxx.xxx.xxx.xxx",
      "RaftAdvertise": "10.0.250.252",
      "DefaultRaftPort": 10008,
      "RaftNodes": [
        "xxx.xxx.xxx.xxx",
        "xxx.xxx.xxx.xxx",
        "xxx.xxx.xxx.xxx"
      ]
    
  5. 启动

    nohup ./orchestrator --config orchestrator.conf.json http &
    
  6. 在浏览器中访问:http://10.177.54.161:8000

    MySQL高可用——Orchestrator架构、配置文件详细介绍和单机搭建部署_第6张图片

    MySQL高可用——Orchestrator架构、配置文件详细介绍和单机搭建部署_第7张图片

MySQL高可用——Orchestrator架构、配置文件详细介绍和单机搭建部署_第8张图片

你可能感兴趣的:(MySQL,架构,mysql)