在MySQL高可用架構中,目前使用比較多的是Percona的PXC,Galera以及MySQL 5.7以後的MGR等,其餘的還有的MHA,今天介紹另外一個比較好用的MySQL高可用複製管理工具:Orchestrator(orch)。
html
Orchestrator(orch):go編寫的MySQL高可用性和複製拓撲管理工具,支持複製拓撲結構的調整,自動故障轉移和手動主從切換等。後端數據庫用MySQL或SQLite存儲元數據,並提供Web界面展現MySQL複製的拓撲關係及狀態,經過Web可更改MySQL實例的複製關係和部分配置信息,同時也提供命令行和api接口,方便運維管理。相對比MHA來看最重要的是解決了管理節點的單點問題,其經過raft協議保證自己的高可用。GitHub的一部分管理也在用該工具進行管理。關於Orchestrator更詳細的介紹能夠看Github的介紹,大體的特色有:mysql
① 自動發現MySQL的複製拓撲,而且在web上展現。git
② 重構複製關係,能夠在web進行拖圖來進行復制關係變動。github
③ 檢測主異常,並能夠自動或手動恢復,經過Hooks進行自定義腳本。web
④ 支持命令行和web界面管理複製。正則表達式
系統: Ubuntu 16.04 三臺主機: test1:192.168.163.131 test2:192.168.163.132 test3:192.168.163.133 後端MySQL端口:3306 測試MySQL端口:3307
根據須要下載合適的包進行安裝,本文是基於Ubuntu16.04安裝的,下載好deb包後,須要安裝jq的依賴包(apt-get install jq)。安裝完成以後,相應的目錄爲:sql
/usr/local/orchestrator -rwxr-xr-x 1 root root 20M 1月 16 21:49 orchestrator -rw-r--r-- 1 root root 5.1K 1月 16 21:49 orchestrator-sample.conf.json -rw-r--r-- 1 root root 4.4K 1月 16 21:49 orchestrator-sample-sqlite.conf.json drwxr-xr-x 7 root root 4.0K 2月 15 19:03 resources
orchestrator:應用程序數據庫
*.json:默認的配置模板json
resources:orchestrator相關的文件:client、web、僞GTID等相關文件。後端
配置的相關參數瞭解後,大體說明以下(可能會有誤差、後續不定時更新):
Debug: false, --設置debug模式 EnableSyslog: false, -- 是否把日誌輸出到系統日誌裏 ListenAddress: ":3000", -- web http tpc 監聽端口 ListenSocket: "", -- 套接字文件,默認空,和ListenAddress互斥。 HTTPAdvertise: "", --可選,爲raft設置。通知相關http信息 AgentsServerPort: ":3001",--回調接口 StatusEndpoint: "/api/status",--狀態查看,默認爲'/ api / status' StatusOUVerify: false,--若是爲true,請嘗試在Mutual TLS打開時驗證OU。 默認爲false BackendDB: "mysql",--後端數據庫類型,可選mysql或則sqlite3 SQLite3DataFile: "", --sqlite3的數據文件 SkipOrchestratorDatabaseUpdate: false,-- 若是爲true,不檢查後端數據庫模式,也不嘗試更新它。 當運行多個版本的orchestrator時頗有用 PanicIfDifferentDatabaseDeploy: false, --若是爲true,此進程發現協調器後端的數據庫由不一樣版本配置,則發生混亂 RaftBind: "127.0.0.1:10008", RaftAdvertise: "", RaftDataDir: "", DefaultRaftPort: 10008, --若是RaftNodes未指定端口,使用此端口 RaftNodes: []string{}, --raft初始化鏈接 ExpectFailureAnalysisConcensus: true, MySQLOrchestratorMaxPoolConnections: 128, --限制後端數據庫的併發數 MySQLOrchestratorPort: 3306, --後端數據庫端口 MySQLTopologyUseMutualTLS: false,--是否啓用TLS身份驗證 MySQLTopologyUseMixedTLS: true,--是否混合TLS和非TLS身份驗證 MySQLOrchestratorUseMutualTLS: false,--是否爲Orchestrator MySQL實例啓用TLS身份驗證 MySQLConnectTimeoutSeconds: 2,--數據庫鏈接超時時間,秒。 MySQLOrchestratorReadTimeoutSeconds: 30,--讀操做超時 MySQLDiscoveryReadTimeoutSeconds: 10,--發現查詢的超時 MySQLTopologyReadTimeoutSeconds: 600,--發現查詢以外查詢的超時 MySQLConnectionLifetimeSeconds: 0,--活躍狀態的的時間 DefaultInstancePort: 3306,--數據庫默認端口 TLSCacheTTLFactor: 100,--爲TLS信息緩存到期的InstancePollSeconds的因子 InstancePollSeconds: 5,--實例之間讀取間隔 InstanceWriteBufferSize: 100,--實例寫入緩衝區大小 BufferInstanceWrites: false,--在後端表上設置爲「true」以進行寫入優化,寫入可能過期並覆蓋非陳舊數據 InstanceFlushIntervalMilliseconds: 100,--實例寫入緩衝區刷新之間的最大間隔時間 SkipMaxScaleCheck: false,--若是沒有MaxScale BinlogServer,請將其設置爲「true」以保存一些無心義的查詢 UnseenInstanceForgetHours: 240,--忽略不可見的實例的小時數 SnapshotTopologiesIntervalHours: 0,--快照拓撲調用之間的小時間隔。 默認值:0(禁用) DiscoverByShowSlaveHosts: false,--在PROCESSLIST以前嘗試SHOW SLAVE HOSTS UseSuperReadOnly: false,--每當它設置read_only時,orchestrator應該是super_read_only DiscoveryMaxConcurrency: 300,--實例發現時go的最大進程數量。 DiscoveryQueueCapacity: 100000,--發現隊列的緩衝區大小。 應該大於發現的數據庫實例的數量 DiscoveryQueueMaxStatisticsSize: 120,--發現隊列的第二次統計數據的最大數量 DiscoveryCollectionRetentionSeconds: 120,--保留髮現集合信息的秒數 InstanceBulkOperationsWaitTimeoutSeconds: 10,--在進行批量操做時等待單個實例的時間 HostnameResolveMethod: "default", MySQLHostnameResolveMethod: "@@hostname", SkipBinlogServerUnresolveCheck: true, --跳過檢查未解析的主機名是否解析爲binlog服務器的相同主機名 ExpiryHostnameResolvesMinutes: 60, --主機名解析到期以前的分鐘數 RejectHostnameResolvePattern: "",--不接受解析主機名的正則表達式。 這樣作是爲了不因網絡故障而存儲錯誤 ReasonableReplicationLagSeconds: 10,--複製延遲高於該值表示異常 ProblemIgnoreHostnameFilters: []string{},--將與給定的regexp過濾器匹配的主機名最小化問題 VerifyReplicationFilters: false, --在拓撲重構以前檢查複製篩選器 ReasonableMaintenanceReplicationLagSeconds: 20,--高於此值會上移和下移 CandidateInstanceExpireMinutes: 60,--該時間以後,使用實例做爲候選副本的建議已過時。 AuditLogFile: "", --審計操做的日誌文件名。 空的時候禁用。 AuditToSyslog: false, --審計日誌是否寫入到系統日誌 AuditToBackendDB: false, --審計日誌是否入庫,表爲audit,默認true RemoveTextFromHostnameDisplay: "",--去除羣集/羣集頁面上的主機名的文本 ReadOnly: false, AuthenticationMethod: "",--身份驗證類型。可選值有: "" for none, "basic" for BasicAuth, "multi" for advanced BasicAuth, "proxy" for forwarded credentials via reverse proxy, 經過反向代理轉發憑證 "token" for token based access HTTPAuthUser: "", --HTTP基自己份驗證的用戶名,空表示禁用身份驗證 HTTPAuthPassword: "", --HTTP基自己份驗證的密碼,空表示禁用密碼 AuthUserHeader: "X-Forwarded-User",--當AuthenticationMethod爲「proxy」時,HTTP標頭指示auth用戶 PowerAuthUsers: []string{"*"},--在AuthenticationMethod ==「proxy」上,能夠更改的用戶列表。 全部其餘都是隻讀的 PowerAuthGroups: []string{},--通過身份驗證的用戶必須是unix組列表成員 AccessTokenUseExpirySeconds: 60,--必須使用已頒發token的時間 AccessTokenExpiryMinutes: 1440,--訪問的到期的時間 ClusterNameToAlias: make(map[string]string), DetectClusterAliasQuery: "",--可選查詢(在拓撲實例上執行),返回集羣的別名 DetectClusterDomainQuery: "",--可選查詢(在拓撲實例上執行),返回此集羣主服務器的VIP / CNAME /別名/任何域名 DetectInstanceAliasQuery: "",--可選查詢(在拓撲實例上執行),返回實例的別名 DetectPromotionRuleQuery: "",--可選查詢(在拓撲實例上執行),返回實例的提高規則 DataCenterPattern: "", --一個組的正則表達式模式,從主機名中提取數據中心名稱 PhysicalEnvironmentPattern: "",--一個組的正則表達式模式,從主機名中提取物理環境信息 DetectDataCenterQuery: "",--可選查詢(在拓撲實例上執行),返回實例的數據中心,覆蓋DataCenterPattern,對沒法經過主機名推斷DC很是有用 DetectPhysicalEnvironmentQuery: "",--可選查詢(在拓撲實例上執行),返回實例的物理環境。覆蓋PhysicalEnvironmentPattern,對沒法經過主機名推斷出env很是有用 DetectSemiSyncEnforcedQuery: "",--可選查詢(在拓撲實例上執行)以肯定是否對主寫入徹底強制執行半同步 SupportFuzzyPoolHostnames: true,--應該「submit-pool-instances」命令可以傳遞模糊實例列表(模糊意味着非fqdn,但足夠獨特,能夠識別)。 默認值爲「true」,表示後端數據庫上有更多查詢 InstancePoolExpiryMinutes: 60,--database_instance_pool的過時的時間 PromotionIgnoreHostnameFilters: []string{},--不使用主機名匹配模式來提高副本 ServeAgentsHttp: false,--產生另外一個專用於orchestrator-agent的HTTP接口 AgentsUseSSL: false,--當「true」orchestrator將使用SSL偵聽代理端口以及經過SSL鏈接到代理時 AgentsUseMutualTLS: false,--當「true」時,使用相互TLS服務器與代理通訊 AgentSSLValidOUs: []string{},--使用相互TLS與代理進行通訊 AgentSSLSkipVerify: false,--爲代理使用SSL AgentSSLPrivateKeyFile: "", AgentSSLCertFile: "", AgentSSLCAFile: "", UseSSL: false,--在Web端口上使用SSL UseMutualTLS: false,--「true」時使用TLS做爲服務器的Web和API鏈接 SSLValidOUs: []string{},--使用TLS交互 SSLSkipVerify: false,--使用SSL時,是否應忽略SSL認證錯誤 SSLPrivateKeyFile: "", SSLCertFile: "", SSLCAFile: "", AgentPollMinutes: 60,--代理輪詢的分鐘數 UnseenAgentForgetHours: 6,--忘記不可見的代理的小時數 StaleSeedFailMinutes: 60,--過期(無進展)被視爲失敗的分鐘數 SeedAcceptableBytesDiff: 8192,--種子源和目標數據大小之間的字節差別仍被視爲成功複製 SeedWaitSecondsBeforeSend: 2,--在代理上開始發送數據命令以前等待的秒數 AutoPseudoGTID: false, --是否自動將Pseudo-GTID條目注入主服務器 PseudoGTIDPattern: "",--在二進制日誌中查找的模式,用於建立惟一條目(僞GTID)。 爲空時,禁用基於僞GTID的重構。 PseudoGTIDPatternIsFixedSubstring: false,--如爲true,則PseudoGTIDPattern不被視爲正則表達式而是固定子字符串 PseudoGTIDMonotonicHint: "",--Pseudo-GTID條目中的子字符串,表示Pseudo-GTID條目預計會單調遞增 DetectPseudoGTIDQuery: "",--可選查詢,用於肯定是否在實例上啓用了僞gtid BinlogEventsChunkSize: 10000,--SHOW BINLOG | RELAYLOG EVENTS LIMIT的塊大小。 較小意味着更少的鎖定和工做要作 SkipBinlogEventsContaining: []string{},--掃描/比較Pseudo-GTID的binlog時,跳過包含給定文本的條目。 這些不是正則表達式(掃描binlog時會消耗太多的CPU),只需查找子字符串。 ReduceReplicationAnalysisCount: true,--若是爲true,則複製分析將報告可能首先處理問題的可能性的實例。 若是爲false,則爲每一個已知實例提供一個條目 FailureDetectionPeriodBlockMinutes: 60,--實例的故障發現保持「活動」的時間,以免實例失敗的併發「發現」; 若是有的話,這會在任何恢復過程以前。 RecoveryPeriodBlockMinutes: 60,--實例的恢復保持「活動」的時間,以免併發恢復 RecoveryPeriodBlockSeconds: 3600, --實例的恢復保持「活動」的時間,以免併發恢復 RecoveryIgnoreHostnameFilters: []string{},--恢復分析將徹底忽略與給定模式匹配的主機 RecoverMasterClusterFilters: []string{},--只對匹配這些正則表達式模式的集羣進行主恢復(「*」模式匹配全部) RecoverIntermediateMasterClusterFilters: []string{},--只對匹配這些正則表達式模式的集羣進行恢復(「*」模式匹配全部內容) ProcessesShellCommand: "bash",--執行命令腳本的Shell OnFailureDetectionProcesses: []string{},--檢測故障轉移方案時執行(在決定是否進行故障轉移以前)。 能夠而且應該使用其中一些佔位符{failureType},{failureDescription},{command},{failedHost},{failureCluster},{failureClusterAlias},{failureClusterDomain},{failedPort},{successorHost},{successorPort},{ successorAlias},{countReplicas},{replicaHosts},{isDowntimed},{autoMasterRecovery},{autoIntermediateMasterRecovery} PreGracefulTakeoverProcesses: []string{},--在主變爲只讀以前當即執行。 能夠而且應該使用其中一些佔位符:{failureType},{failureDescription},{command},{failedHost},{failureCluster},{failureClusterAlias},{failureClusterDomain},{failedPort},{successorHost},{successorPort},{ successorAlias},{countReplicas},{replicaHosts},{isDowntimed} PreFailoverProcesses: []string{},--在執行恢復操做以前當即執行。任何這些進程的失敗(非零退出代碼)都會停止恢復。提示:這使您有機會根據系統的某些內部狀態停止恢復。 能夠而且應該使用其中一些佔位符:{failureType},{failureDescription},{command},{failedHost},{failureCluster},{failureClusterAlias},{failureClusterDomain},{failedPort},{successorHost},{successorPort},{ successorAlias},{countReplicas},{replicaHosts},{isDowntimed} PostMasterFailoverProcesses: []string{},--在主恢復成功結束時執行(未定義的執行順序)。 使用與PostFailoverProcesses相同的佔位符 PostIntermediateMasterFailoverProcesses: []string{},--在成功的中間主恢復結束時執行(未定義的執行順序)。 使用與PostFailoverProcesses相同的佔位符 PostFailoverProcesses: []string{},--在成功恢復結束時執行(包括並添加到上述兩個)。 能夠而且應該使用其中一些佔位符:{failureType},{failureDescription},{command},{failedHost},{failureCluster},{failureClusterAlias},{failureClusterDomain},{failedPort},{successorHost},{successorPort},{ successorAlias},{countReplicas},{replicaHosts},{isDowntimed},{isSuccessful},{lostReplicas} PostUnsuccessfulFailoverProcesses: []string{},--在任何不成功的恢復結束時執行。(未定義的執行順序)。 能夠而且應該使用其中一些佔位符:{failureType},{failureDescription},{command},{failedHost},{failureCluster},{failureClusterAlias},{failureClusterDomain},{failedPort},{successorHost},{successorPort},{ successorAlias},{countReplicas},{replicaHosts},{isDowntimed},{isSuccessful},{lostReplicas} PostGracefulTakeoverProcesses: []string{},--在舊主位於新晉升的主以後執行。 使用與PostFailoverProcesses相同的佔位符 CoMasterRecoveryMustPromoteOtherCoMaster: true,--當'false'時,任何均可以獲得提高(候選人比其餘人更受歡迎)。 當'true'時,將促進其餘共同主人或不然失敗 DetachLostSlavesAfterMasterFailover(DetachLostReplicasAfterMasterFailover): true,--恢復過程當中可能會丟失一些副本。若是爲true,將經過detach-replica命令強制中斷其複製,以確保沒有人認爲它們徹底正常運行。 ApplyMySQLPromotionAfterMasterFailover: true,--將重置slave all並在提高的master上設置read_only = 0,默認true。 PreventCrossDataCenterMasterFailover: false,--若是爲true(默認值:false),則不容許跨DC主故障轉移,orchestrator將盡其所能僅在同一DC內進行故障轉移,不然不進行故障轉移。 MasterFailoverLostInstancesDowntimeMinutes: 0,--在主故障轉移(包括失敗的主副本和丟失的副本)以後丟失的任何服務器停機的分鐘數。 0表示禁用 MasterFailoverDetachSlaveMasterHost(MasterFailoverDetachReplicaMasterHost): false,--orchestrator是否應該在新升級的master上發出detach-replica-master-host(這樣能夠確保新master不會嘗試複製舊的master,若是它恢復生命)。 默認爲'false'。 若是ApplyMySQLPromotionAfterMasterFailover爲'true'則無心義。 FailMasterPromotionIfSQLThreadNotUpToDate: false,--若是爲true,而且發生主故障轉移,若是候選主服務器未消耗全部中繼日誌(延遲),則停止並顯示錯誤 PostponeSlaveRecoveryOnLagMinutes(PostponeReplicaRecoveryOnLagMinutes): 0,--在崩潰恢復時,滯後超過給定分鐘的副本僅在主/ IM被選出並執行進程後纔在恢復過程的後期復活。 值爲0將禁用此功能 RemoteSSHForMasterFailover: false,--orchestrator是否應該在主故障轉移時嘗試遠程-shsh relaylog-synching? 須要RemoteSSHCommand RemoteSSHCommand: "",--一個`ssh`命令,由恢復進程用於讀取/應用relaylogs。 若是提供,則此變量必須包含文本「{hostname}」。 遠程SSH登陸必須具備讀/寫中繼日誌的權限。 示例:「setuidgid remoteuser ssh {hostname}」 RemoteSSHCommandUseSudo: true,--是否orchestrator應該在SSH命令下在遠程主機上應用'sudo' OSCIgnoreHostnameFilters: []string{},--建議將忽略與給定模式匹配的副本主機名 GraphiteAddr: "", GraphitePath: "", GraphiteConvertHostnameDotsToUnderscores: true, GraphitePollSeconds: 60, URLPrefix: "", DiscoveryIgnoreReplicaHostnameFilters: []string{}, ConsulAddress: "", ConsulAclToken: "", ZkAddress: "", KVClusterMasterPrefix: "mysql/master", WebMessage: "",
按照本文的測試用例,定製了一個相關的模板(/etc/orchestrator.conf.json):
{ "Debug": true, "EnableSyslog": false, "ListenAddress": ":3000", "MySQLTopologyUser": "orchestrator", "MySQLTopologyPassword": "Aa123456", "MySQLTopologyCredentialsConfigFile": "", "MySQLTopologySSLPrivateKeyFile": "", "MySQLTopologySSLCertFile": "", "MySQLTopologySSLCAFile": "", "MySQLTopologySSLSkipVerify": true, "MySQLTopologyUseMutualTLS": false, "MySQLOrchestratorHost": "127.0.0.1", "MySQLOrchestratorPort": 3306, "MySQLOrchestratorDatabase": "orchestrator", "MySQLOrchestratorUser": "orchestrator", "MySQLOrchestratorPassword": "123456", "MySQLOrchestratorCredentialsConfigFile": "", "MySQLOrchestratorSSLPrivateKeyFile": "", "MySQLOrchestratorSSLCertFile": "", "MySQLOrchestratorSSLCAFile": "", "MySQLOrchestratorSSLSkipVerify": true, "MySQLOrchestratorUseMutualTLS": false, "MySQLConnectTimeoutSeconds": 1, "MySQLTopologyReadTimeoutSeconds": 3, "MySQLDiscoveryReadTimeoutSeconds": 3, "DefaultInstancePort": 3306, "DiscoverByShowSlaveHosts": true, "InstancePollSeconds": 3, "UnseenInstanceForgetHours": 240, "SnapshotTopologiesIntervalHours": 0, "InstanceBulkOperationsWaitTimeoutSeconds": 10, "HostnameResolveMethod": "default", "MySQLHostnameResolveMethod": "@@hostname", "SkipBinlogServerUnresolveCheck": true, "SkipMaxScaleCheck":true, "ExpiryHostnameResolvesMinutes": 60, "RejectHostnameResolvePattern": "", "ReasonableReplicationLagSeconds": 10, "ProblemIgnoreHostnameFilters": [], "VerifyReplicationFilters": false, "ReasonableMaintenanceReplicationLagSeconds": 20, "CandidateInstanceExpireMinutes": 1440, "AuditLogFile": "", "AuditToSyslog": false, "RemoveTextFromHostnameDisplay": ":3306", "ReadOnly": false, "AuthenticationMethod": "", "HTTPAuthUser": "", "HTTPAuthPassword": "", "AuthUserHeader": "", "PowerAuthUsers": [ "*" ], "ClusterNameToAlias": { "127.0.0.1": "test suite" }, "SlaveLagQuery": "", "DetectClusterAliasQuery": "SELECT cluster_name FROM meta.cluster WHERE cluster_name = left(@@hostname,4) ", "DetectClusterDomainQuery": "SELECT cluster_domain FROM meta.cluster WHERE cluster_name = left(@@hostname,4) ", "DetectInstanceAliasQuery": "SELECT @@hostname as instance_alias", "DetectPromotionRuleQuery": "", "DetectDataCenterQuery": "SELECT data_center FROM meta.cluster WHERE cluster_name = left(@@hostname,4) ", "PhysicalEnvironmentPattern": "", "PromotionIgnoreHostnameFilters": [], "DetachLostReplicasAfterMasterFailover": true, "DetectSemiSyncEnforcedQuery": "SELECT 0 AS semisync FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM performance_schema.global_variables WHERE VARIABLE_NAME = 'rpl_semi_sync_master_wait_no_slave' AND VARIABLE_VALUE = 'ON') UNION SELECT 1 FROM DUAL WHERE EXISTS (SELECT 1 FROM performance_schema.global_variables WHERE VARIABLE_NAME = 'rpl_semi_sync_master_wait_no_slave' AND VARIABLE_VALUE = 'ON')", "ServeAgentsHttp": false, "AgentsServerPort": ":3001", "AgentsUseSSL": false, "AgentsUseMutualTLS": false, "AgentSSLSkipVerify": false, "AgentSSLPrivateKeyFile": "", "AgentSSLCertFile": "", "AgentSSLCAFile": "", "AgentSSLValidOUs": [], "UseSSL": false, "UseMutualTLS": false, "SSLSkipVerify": false, "SSLPrivateKeyFile": "", "SSLCertFile": "", "SSLCAFile": "", "SSLValidOUs": [], "URLPrefix": "", "StatusEndpoint": "/api/status", "StatusSimpleHealth": true, "StatusOUVerify": false, "AgentPollMinutes": 60, "UnseenAgentForgetHours": 6, "StaleSeedFailMinutes": 60, "SeedAcceptableBytesDiff": 8192, "AutoPseudoGTID":true, "PseudoGTIDPattern": "drop view if exists `meta`.`_pseudo_gtid_hint__asc:", "PseudoGTIDPatternIsFixedSubstring": true, "PseudoGTIDMonotonicHint": "asc:", "DetectPseudoGTIDQuery": "select count(*) as pseudo_gtid_exists from meta.pseudo_gtid_status where anchor = 1 and time_generated > now() - interval 2 hour", "BinlogEventsChunkSize": 10000, "SkipBinlogEventsContaining": [], "ReduceReplicationAnalysisCount": true, "FailureDetectionPeriodBlockMinutes": 60, "RecoveryPeriodBlockSeconds": 31, "RecoveryIgnoreHostnameFilters": [], "RecoverMasterClusterFilters": ["*"], "RecoverIntermediateMasterClusterFilters": ["*"], "OnFailureDetectionProcesses": [ "echo '② Detected {failureType} on {failureCluster}. Affected replicas: {countSlaves}' >> /tmp/recovery.log" ], "PreGracefulTakeoverProcesses": [ "echo '① Planned takeover about to take place on {failureCluster}. Master will switch to read_only' >> /tmp/recovery.log" ], "PreFailoverProcesses": [ "echo '③ Will recover from {failureType} on {failureCluster}' >> /tmp/recovery.log" ], "PostMasterFailoverProcesses": [ "echo '④ Recovered from {failureType} on {failureCluster}. Failed: {failedHost}:{failedPort}; Promoted: {successorHost}:{successorPort}' >> /tmp/recovery.log" ], "PostFailoverProcesses": [ "echo '⑤ (for all types) Recovered from {failureType} on {failureCluster}. Failed: {failedHost}:{failedPort}; Successor: {successorHost}:{successorPort}' >> /tmp/recovery.log" ], "PostUnsuccessfulFailoverProcesses": [ "echo '⑧ >> /tmp/recovery.log'" ], "PostIntermediateMasterFailoverProcesses": [ "echo '⑥ Recovered from {failureType} on {failureCluster}. Failed: {failedHost}:{failedPort}; Successor: {successorHost}:{successorPort}' >> /tmp/recovery.log" ], "PostGracefulTakeoverProcesses": [ "echo '⑦ Planned takeover complete' >> /tmp/recovery.log" ], "CoMasterRecoveryMustPromoteOtherCoMaster": true, "DetachLostSlavesAfterMasterFailover": true, "ApplyMySQLPromotionAfterMasterFailover": true, "PreventCrossDataCenterMasterFailover": false, "MasterFailoverDetachSlaveMasterHost": false, "MasterFailoverLostInstancesDowntimeMinutes": 0, "PostponeSlaveRecoveryOnLagMinutes": 0, "OSCIgnoreHostnameFilters": [], "GraphiteAddr": "", "GraphitePath": "", "GraphiteConvertHostnameDotsToUnderscores": true, "RaftEnabled": true, "BackendDB": "mysql", "RaftBind": "192.168.163.131", "RaftDataDir": "/var/lib/orchestrator", "DefaultRaftPort": 10008, "RaftNodes": [ "192.168.163.131", "192.168.163.132", "192.168.163.133" ], "ConsulAddress": "", "ConsulAclToken": "" }
這裏列出說明幾個比較重要的參數:
[client] user=orchestrator_srv password=${ORCHESTRATOR_PASSWORD}
後端MySQL數據庫的用戶權限須要是:
CREATE USER 'orchestrator_srv'@'orc_host' IDENTIFIED BY 'orc_server_password'; GRANT ALL ON orchestrator.* TO 'orchestrator_srv'@'orc_host';
[client] user=orchestrator_srv password=${ORCHESTRATOR_PASSWORD}
CREATE USER 'orchestrator'@'orc_host' IDENTIFIED BY 'orc_topology_password'; GRANT SUPER, PROCESS, REPLICATION SLAVE, REPLICATION CLIENT, RELOAD ON *.* TO 'orchestrator'@'orc_host'; GRANT SELECT ON meta.* TO 'orchestrator'@'orc_host'; GRANT SELECT ON ndbinfo.processes TO 'orchestrator'@'orc_host'; -- Only for NDB Cluster
在三臺測試機上各自安裝MySQL2個實例:orch用的後端MySQL(3306)和被orch管理的MySQL(3307)。按照給出的配置模板,首先在後端數據庫的實例上建立帳號:
CREATE USER 'orchestrator'@'127.0.0.1' IDENTIFIED BY '123456'; GRANT ALL ON orchestrator.* TO 'orchestrator'@'127.0.0.1';
再在被管理的MySQL(3307)實例上 建立帳號:
CREATE USER 'orchestrator'@'%' IDENTIFIED BY 'Aa123456'; GRANT SUPER, PROCESS, REPLICATION SLAVE, RELOAD ON *.* TO 'orchestrator'@'%'; GRANT SELECT ON mysql.slave_master_info TO 'orchestrator'@'%'; GRANT SELECT ON meta.* TO 'orchestrator'@'orc_host';
其中meta庫的做用是本身的query所用到的,如:cluster、pseudo_gtid_status等,後面會有相關說明。
到此,關於orch的環境已經準備完畢,最後只須要把被管理的3臺MySQL部署成一主二從便可(rep):
Master:192.168.163.131:3307 Slave :192.168.163.132:3307 Slave :192.168.163.133:3307
最後,由於配置文件裏寫的是域名(hostname),因此須要修改三臺被管理MySQL的hosts。即:
192.168.163.131 test1 192.168.163.132 test2 192.168.163.133 test3
./orchestrator --debug --config=/etc/orchestrator.conf.json http
2. 把配置好的複製實例加入到orchestrator,由於orch能夠自動發現整個拓撲的全部實例,因此只須要添加任意一臺實例便可,若是沒有發現的話能夠再添加。
在web上添加(導航裏的Clusters -> Discover):
添加完成以後,最終的結構圖以下:
限於篇幅的緣由,本文先對orchestrator進行參數和部署作些簡單的說明,對於一些Failover和HA在放在下一篇「MySQL高可用複製管理工具 —— Orchestrator使用」中進行介紹。
https://github.com/github/orchestrator
https://www.percona.com/blog/2016/03/08/orchestrator-mysql-replication-topology-manager/