天天看點

mysql高可用詳解(二):MySQL Replicant

MySQL Replicant庫是由作者們開發的用于管理複制的簡單庫。

Replicant庫的基本思想是建立一個伺服器間的連接配接模型(可以使用任何的計算機,比如筆記本電腦),設計這個庫可以通過更改模型來管理連接配接。例如:想要把slave重新連接配接到其他的master,隻需要把模型中的slave重新連接配接就可以了,這個庫會發送适合的指令完成這個工作;

【使用庫建立拓撲】

MASTER=Server(

)

SLAVES=[

         Server(

),

Server(

)

]

【使用庫重定向slave】

import my_deployment

from mysql.replicant.commands import change_master

for slave in my_deployment.slaves:

         slave.stop()

         change_master(slave,my_deployment.master)

         slave.start()

【基本類和函數】

要想使用這個庫,首先需要了解一些常用的概念的基本定義,例如用異常來報告錯誤,用簡單對象來表示位置和使用者資訊;

庫中給出了完成的異常清單。所有異常都繼承自同一個基類Error。涉及的異常有如下:

EmptyRowError:

當select查詢不傳回任何行的時候抛出這個異常

NoOptionError:

當ConfigManager找不到配置項的時候抛出該異常;

SlaveNotRunningError:

當slave應該運作但是沒有運作的時候抛出這個異常;

NotMasterError:

當伺服器不是master并且操作非法的時候抛出這個異常;

NotSlaveError:

當伺服器不是slave并且操作非法的時候抛出這個異常;

【Position 和 GTID】

這些類表示binlog位置,包括檔案名和檔案内的位元組偏移,或者全局事務辨別符(GTID,MySQL 5.6引入)。使用表示方法将binlog位置以一種可以解析的表示形式輸出出來,因而binlog位置可以存儲在二級存儲中,或者在你需要檢視的時候才用;

注意:如果不采用全局事務辨別符,那麼不同伺服器上的位置可能有所差別,是以比較不同伺服器上的位置是沒有用的。是以,如果試圖比較不同類型的位置,将會抛出異常;

【User類】

代表使用者,包括使用者名和密碼,可用于多種類型的賬号,比如MySQL使用者賬号、shell賬号、複制使用者等

【對各種作業系統的支援】

為了支援不同的作業系統,你可以用一組類将它們之間的差別抽象出去。基本思想是為不同的作業系統上的任務實作其各自的類方法。這樣隻需要這些方法就可以停止和啟動伺服器了;

Machine類:機器的基類,存儲機器的共同資訊,一個機器執行個體至少包括以下成員:

Machine.defaults_file:該機器上my.cnf檔案的預設存儲位置;

Machine.start_server(server):啟動伺服器的方法;

Machine.stop_server(server):停止伺服器的方法

Linux:負責處理運作在Linux機器上的伺服器,通過存儲在/etc/init.d位置的init(8)腳本來啟動和停止伺服器;

Solaris:負責處理運作在Solaris機器上的伺服器,svadm(1M)指令來啟動和停止伺服器;

【伺服器Server】

Server類定義了接口中進階函數實作所需的所有基本功能,包括如下幾項:

Server(name,…):Server類表示系統中的一個伺服器,整個系統中的每一個伺服器都對應一個對象。這裡是一些重要的參數:

Name:伺服器名字

host、port和socket:

host:伺服器所在主機位址;

port:MySQL用戶端連接配接伺服器用的端口;

socket:用于同一台主機上的連接配接;

ssh_user和sql_user:

         使用使用者和密碼的組合連接配接機器或者伺服器。這些使用者用來執行管理性的指令,例如啟動和停止伺服器。讀寫配置檔案,或者在伺服器上執行SQL指令;

machine:

存儲作業系統特定原語的對象。這個參數允許使用不同的方法來啟動和停止伺服器或者執行其他的任務

server_id:

存儲伺服器辨別的可選參數,在每個伺服器的配置檔案中定義。如果配置檔案也中沒有定義,那麼這個伺服器就不參與複制架構,既不是master也不是slave;

config_manager:

該選項存儲配置管理器的引用;從這個選項可以查詢到伺服器配置的相關資訊;

【Server.connect()和Server.disconnect()】

在會話中執行指令之前使用connect方法連接配接伺服器,然後在結束會話之後使用disconnect方法斷開連接配接;

在某些情況下,即使SQL指令執行結束還需要保持伺服器連接配接有效,這個時候這兩個方法就很有效。舉例來講,執行FLUSH TABLES WITH READ LOCK 的時候,如果連接配接失效了,鎖就會自動的釋放。

【Server.ssh(command,args…)和Server.sql(command,args…)】

用于在伺服器上執行shell指令或者SQL指令;

ssh和sql方法都傳回一個疊代類型,ssh傳回指令執行結果行的list,而sql傳回内部類Row對象的list。Row類定義_iter_和next方法疊代結果行;

【Server.fetch_config()和Server.replace_config()】

fetch_config和replace_config方法将遠端伺服器中的配置檔案讀到記憶體中,這樣使用者可以增删配置選項或者更改某些選項的值;

【Server.start()和Server.stop()】

start和stop方法向machine對象發送相應的資訊,取決于伺服器使用的作業系統。這兩個方法分别完成啟動和停止伺服器的功能;

【伺服器角色】

根據角色的不同,伺服器的工作方法也略有不同。例如:master要求slave通過複制使用者來連接配接而slave不需要使用者賬戶,除非slave同時擔任master角色并且有其他的slave請求連接配接。為了靈活的獲得伺服器配置,引入一些代表不同角色的類;

在伺服器上使用imbue方法的時候,伺服器将接受合适的指令去正确的配置那個角色。注意:在整個部署周期中伺服器可能變換角色,是以這裡賦予的角色隻是用于最初的部署配置。在部署中,伺服器總有一個指定的角色,是以伺服器還有一個關聯的角色;

如果伺服器角色改變,可能需要從伺服器删除某些配置。是以還需要為角色定義一個unimbue方法,在伺服器轉換角色的時候使用;

MySQL Replicant庫中定義了以下三種角色:

1》Role:

這是所有角色的基類。每個派生類都需要定義imbue和unimbue方法(可選),為伺服器賦予角色。為了幫助派生類完成一些常見的任務,Role類還定義了很多幫助函數,包括:

Role.imbue(server):

         通過執行适當的代碼,該方法為伺服器賦予新的角色;

Role.unimbue(server):

         在賦予其他角色之前,這個方法進行一些清理的工作;

Role._create_repl_user(server,user):

         該方法在伺服器上建立一個複制使用者,并向它授予必要的權限,擔任複制slave的角色;

Role._enable_binlog(server,config):

         通過将log-in和log-bin-index設定為适當的值,該方法在伺服器上啟用二進制日志。如果log-bin已經設定過了,那麼這個方法什麼都不做;

Role._disable_binlog(server,config):

         通過清空配置檔案中log-bin和log-bin-index的值,該方法禁用二進制日志;

2》Vagabond:

         這是伺服器的預設角色,不參與複制部署。是以,這種vagabond伺服器不承擔任何的職責;

3》Master:

         這是master伺服器角色。這個角色會設定伺服器辨別符,啟用二進制日志,并為slave建立複制使用者。複制使用者的使用者名和密碼将存儲在伺服器上,當slave請求連接配接的時候,這個類會查找複制使用者名;

4》Final:

         這是final類型slave(即沒有二進制日志的slave)的角色。如果伺服器被賦予這個角色,将會獲得伺服器辨別符,二進制日志被禁用,而且連接配接master的時候使用CHANGE MASTER指令;

注意:在寫回配置檔案之前需要停止伺服器,并且在寫完之後重新啟動伺服器。當伺服器在運作的時候,配置檔案是隻讀的,并且讀完即關閉。為了保證檔案的安全性,在修改它之前需要先停止伺服器;

一個重要的設計理念是:角色不存儲任何與伺服器相關的資訊。是以,要得到一份完整的master清單,需要向role對象添加master;但由于伺服器的角色在整個部署周期中是随時間變化的,是以僅在系統搭建的時候使用角色。由于角色可以包含參數,是以同樣的資訊可用于配置多台伺服器;

【小結】

介紹了如何建立庫來簡化伺服器的管理,并簡單介紹了MySQL Replicant庫;

繼續閱讀