這篇文章為大家介紹了關於MySQL讀寫分離的相關知識,希望對大家有幫助。
#MySQL 作為目前世界上使用最廣泛的免費資料庫,相信所有從事系統運維的工程師都一定接觸過。
在實際的生產環境中,由單一 MySQL 作為獨立的資料庫是完全無法滿足實際需求的,無論是在安全性,高可用性以及高並發等各個方面。
因此,一般來說都是透過主從複製(Master-Slave)的方式來同步資料,再透過讀寫分離(MySQL-Proxy/Amoeba)來提升資料庫的並發負載能力#進行部署與實作。
#基本的原則是:
主資料庫處理交易性增加、變更、刪除操作(INSERT、UPDATE、DELETE)
從資料庫處理SELECT 查詢操作
資料庫複製被用來把事務性操作導致的變更同步到叢集中的從資料庫。
面對越來越大的存取壓力,單一的伺服器的效能成為瓶頸,需要分擔負載
主從只負責各自的寫和讀,極大程度的緩解X(寫入)鎖定和S(讀取)鎖定爭用
從程式庫可設定myisam 引擎,提升查詢效能以及節約系統開銷
增加冗餘,提高可用性
#應用程式內部實作讀寫分離,安裝既可以使用
減少一定部署難度
#存取壓力在一定層級以下,效能很好
架構一旦調整,程式碼要跟著變
難以實現進階應用,如自動分庫,分錶
#無法適用大型應用程式場景
#中間件層實作是指在外部中介軟體程式實作讀寫分離
常見的中間件程式
Cobar:
阿里巴巴B2B 開發的關係型分散式系統,管理將近3000 個MySQL 實例。在阿里經受住了考驗,後面由於作者的走開的原因 cobar 沒有人維護 了,阿里也開發了 tddl 替代 cobar。
MyCAT:
社群愛好者在阿里cobar 基礎上進行二次開發,解決了cobar 當時存在的一些問題,並加入了許多新的功能在其中。目前 MyCAT 社群活躍度很高,已經有一些公司在使用 MyCAT。整體來說支持度比
較高,也會一直維護下去。
OneProxy:
資料庫界大牛,前支付寶資料庫團隊領導樓總開發,基於mysql 官方的proxy 思想利用c 進行開發的,OneProxy 是一款商業收費的中間件,樓總捨去了一些功能點,專注在性能和穩定性上。有人測試
試過說在高並發下很穩定。
Vitess:
這個中間件是 Youtube 生產在使用的,但是架構很複雜。與以往中間件不同,使用 Vitess 應用改動比較大,要使用他提供語言的 API 接口,我們可以藉鏡他其中的一些設計思想。
Kingshard:
Kingshard 是前360Atlas 中間件開發團隊的陳菲利用業餘時間用go 語言開發的,目前參與開發的人員有3 個左右, 目前來看還不是成熟可以使用的產品,需要在不斷改進。
Atlas:
360 團隊基於 mysql proxy 把 lua 用 C 改寫。原版本是支援分錶, 目前已經放出了分庫分錶版本。在網路上看到一些朋友常說在高並發下會常常掛掉,如果大家要使用需要提前做好測試。
MaxScale 與MySQL Route:
這兩個中間件都算是官方的,MaxScale 是mariadb (MySQL 原作者維護的一個版本)研發的,目前版本不支援分庫分錶。 MySQL Route 是現在 MySQL 官方 Oracle 公司發佈出來的中介軟體。
優點:
架構設計更靈活
可以在程式上實作一些高階控制,如:透明化水平拆分,failover,監控可以依靠技術手段提高mysql 性能對業務代碼的影響小,同時也安全
缺點:
#MyCAT 在Linux 中部署啟動時,首先需要在Linux 系統的環境變數中設定MYCAT_HOME,操作方式如下:
sudo vim /etc/profile.d/mycat.sh
MYCAT_HOME=/usr/local/mycat PATH= $MYCAT_HOME/bin:$PATH
使環境變數生效
. /etc/profile.d/mycat.sh
vim /usr/local/mycat/conf/server.xml
##這裡定義的是在192.168.2.2 登陸mycat 的使用者名稱和密碼,名稱可以自訂。 192.168.2.2 上沒有執行 mysqld 服務,schemas裡面指定的資料庫名稱是伺服器端必須存在的資料庫!
強制所有的讀取操作都在讀取伺服器上運行,只有寫入資料時才切換到寫入伺服器
注意這裡的mycat 使用者都要在主從資料庫上192.168.2.3 和2.5 授權
GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'%' IDENTIFIED BY '123456';
或指定網段
GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'192.168.2. %' IDENTIFIED BY '123456';
#flush privileges;
如果報這個錯誤,伺服器運作正常的話,先檢查有沒有授權
ERROR 1184 (HY000): Invalid DataSource:0
## schema:邏輯函式庫,與MySQL中的Database(資料庫)對應,一個邏輯庫中定義了所包含的Table。
table:表,即實體資料庫中儲存的某一張表,與傳統資料庫不同,這裡的表格需要宣告其所儲存的邏輯資料節點DataNode,這是透過表格的分片規則定義來實現的,table可以定義其所屬的“子表(childTable)”,子表的分片依賴於與“父表”的具體分片地址,簡單的說,就是屬於父表裡某一條記錄A的子表的所有記錄都與A儲存在同一個分片上。
分片規則:是一個欄位與函數的捆綁定義,根據這個欄位的值來傳回所在儲存的分片(DataNode)的序號,每個表格可以定義一個分片規則,分片規則可以靈活擴展,預設提供了基於數字的分片規則,字串的分片規則等。
dataNode: MyCAT的邏輯資料節點,是存放table的具體物理節點,也稱為分片節點,透過DataSource來關聯到後端某個特定資料庫上,一般來說,為了高可用性,每個DataNode都設定兩個DataSource,一個主一從,當主節點宕機,系統自動切換到從節點。
dataHost:定義某個實體函式庫的存取位址,用於捆綁到dataNode上。
MyCAT目前透過設定檔的方式定義邏輯函式庫與相關設定:
MYCAT_HOME/conf/schema.xml中定義邏輯庫,表格、分片節點等內容;
MYCAT_HOME/conf /rule.xml中定義分片規則;
MYCAT_HOME/conf/server.xml中定義使用者以及系統相關變量,如連接埠等。
註解:
schema 標籤用來定義 MyCat 實例中的邏輯庫,name:後面就是邏輯庫名 MyCat 可以有多個邏輯庫,每個邏輯庫都有自己的相關配置。可以使用 schema 標籤來劃分這些不同的邏輯庫。
checkSQLschema 這個屬性預設就是 false,官方文件的意思就是是否去掉表前面的資料庫的名稱,”select * from db1.testtable” ,設定為 true 就會去掉 db1。但如果 db1 的名稱不是
schema 的名稱,那麼也不會被去掉,因此官方建議不要使用這種語法。同時預設為 false。
sqlMaxLimit 當該值設定為某個數值時。每條執行的 SQL 語句,如果沒有加上 limit 語句,MyCat 也會自動的加上所對應的值。例如設定值為100,執行”select * from test_table”,則效果為
“selelct * from test_table limit 100”.
dataNode 標籤定義了MyCat 中的資料節點,也就是我們通常說所的數據分片
停止從伺服器的slave,建立slave資料庫使用者
mysql -uroot -p123456 - e "stop slave"mysql -uroot -p123456 -e "grant replication slave on *.* to 'slave'@'%' identified by '123456'" mysql -uroot -p123456 -e "select user ,password from mysql.user"
#########mysql -uroot -p123456 -e "change master to master_host='192.168.2.3',master_user=' slave',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=245;"### mysql -uroot -p123456 -e "start slave"### mysql -uroot -p123456 -e "start slave"### mysql -uroot -p123556 slave status"##################################
##推薦學習:mysql影片教學
以上是一起聊聊Mycat實作 Mysql 叢集讀寫分離的詳細內容。更多資訊請關注PHP中文網其他相關文章!