這篇文章為大家介紹了關於MySQL讀寫分離的相關知識,希望對大家有幫助。

MySQL 讀寫分離的概述
#MySQL 作為目前世界上使用最廣泛的免費資料庫,相信所有從事系統運維的工程師都一定接觸過。
在實際的生產環境中,由單一 MySQL 作為獨立的資料庫是完全無法滿足實際需求的,無論是在安全性,高可用性以及高並發等各個方面。
因此,一般來說都是透過主從複製(Master-Slave)的方式來同步資料,再透過讀寫分離(MySQL-Proxy/Amoeba)來提升資料庫的並發負載能力#進行部署與實作。
讀寫分離工作原理


#為什麼要讀寫分離
-
面對越來越大的存取壓力,單一的伺服器的效能成為瓶頸,需要分擔負載
主從只負責各自的寫和讀,極大程度的緩解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
- #一個徹底開源的,面向企業應用開發的大資料庫叢集
- 支援事務、ACID、可以取代MySQL 的加強版資料庫
- 一個可以視為MySQL 叢集的企業級資料庫,用來取代昂貴的Oracle 叢集
- 一個融合記憶體快取技術、NoSQL 技術、HDFS 大數據的新SQL Server
- 結合傳統資料庫與新分散式資料倉儲的新一代企業級資料庫產品
- 一個新穎的資料庫中間件產品

MyCat 服務安裝與設定
- #MyCat 有提供編譯好的安裝包,支援Windows、Linux、Mac、Solaris 等系統上安裝與運行
- 官方下載主頁http://www.mycat.org.cn/


實驗架構:- 192.168.2.2 Mycat CentOS 8.3.2011
- 192.168.2.3 #62# 192.168.2.5 從伺服器 CentOS 7.6
-
- 執行Mycat 需要JDK 1.7 或以上版本
-
-

下載
- wget http://dl.mycat.org.cn/1.6.7.6/20210303094759/Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz
##tar xf Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz -C /usr/local/- sudo useradd -M -N -s /sbin/nologin mycat && echo "123456" | passwd --stdin mycat
- sudo chown -R mycat. /usr/local/mycat/
-
-


- bin 程式目錄,Linux 下運作:./mycat console,首先要chmod x *
註:mycat 支援的指令{ console | start | stop | restart | status | dump }
conf目錄下存放設定檔:server.xml 是Mycat 伺服器參數調整和使用者授權的設定文件,schema.xml 是邏輯庫定義和表以及分片定義的設定文件,rule.xml 是分片規則的設定文件,分片規則的具體一些參數資訊單獨存放為文件,也在這個目錄下,設定檔修改,需要重啟Mycat 生效。
lib 目錄下主要存放 mycat 依賴的一些 jar 檔案。
日誌存放在logs/mycat.log 中,每天一個文件,日誌的配置是在conf/log4j.xml 中,根據自己的需要,可以調整輸出等級為debug,在debug 等級下,會輸出更多的訊息,方便排查問題。
MyCat 服務啟動與啟動設定
#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

- #啟動服務
- /usr/local/mycat/bin/mycat start
- cat /usr/local /mycat/logs/wrapper.log


#mycat 的使用者帳號和授權資訊是在conf/server.xml 檔案中設定


-
-
-
-
##這裡定義的是在192.168.2.2 登陸mycat 的使用者名稱和密碼,名稱可以自訂。 192.168.2.2 上沒有執行 mysqld 服務,schemas裡面指定的資料庫名稱是伺服器端必須存在的資料庫!
#############編輯MyCAT 的設定檔schema.xml,關於dataHost 的設定信息如下:#########備份原先的設定檔######\cp /usr/local/mycat/conf/schema.xml{,.bak}######編輯設定檔#########vim /usr/local/mycat/conf/schema.xml### ### ### ### 注意這裡的網址,錯寫會啟動失敗! ###### ### ### ” "dn1" dataHost="dthost" database="mydata"/>### ### /heartbeat>### ### >###### ####
強制所有的讀取操作都在讀取伺服器上運行,只有寫入資料時才切換到寫入伺服器
注意這裡的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 中的資料節點,也就是我們通常說所的數據分片





#########################################

- 重新啟動服務
- /usr/local/mycat/bin/mycat restart
Stopping Mycat-server...
Stopped Mycat -server.
Starting Mycat-server...
tail /usr/local/mycat/logs/wrapper.log

設定MySQL 主從
- 在2台伺服器上分別安裝、設定mariadb,具體步驟請參考:https://blog.csdn.net/gaofei0428/ article/details/103829676?spm=1001.2014.3001.5501
首先在主資料庫端 192.168.2.3 編輯/etc/my.cnf
#/etc/my.cnf- [mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-bin=/data/mysql/mysql-bin
server-id=1 binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=test
innodb_flush_log_at_trx_commit=1
binlog-do-db=
mydatadata ## replicate-do-db=mydata
lower_case_table_names=1 開啟大小寫符合
- ##注意需要同步的資料庫必須事先存在
-


- ##啟動無誤後在然後在從伺服器192.168.2.5 上配置/etc/my.cnf
vim /etc/my.cnf 1
[mysqld] datadir=/var/lib/mysql- # socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-bin=/data/mysql/mysql-bin
# server-id=2
relay-log-index=/data/mysql/slave-relay-bin.index
relay-log=/data/mysql/slave-relay-bin
lower_case_table_names=1
read_only =1 開啟唯讀模式,防止資料回寫,不會影響slave 同步複製
lower_case_table_names=1 開啟大小寫符合-
-


停止從伺服器的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"##################################
測試
#首先匯出主伺服器192.168.2.3 的所有程式庫的備份
#mysqldump -uroot -p --all-databases > /tmp/all_dbs.sql
然後在從伺服器192.168.2.5 匯入
##mysql -uroot -p < ; /tmp/all_dbs.sql
在主資料庫端192.168.2.3 新增一些數據,觀測從資料庫是否同步-


#如果同步出錯,則需要在從伺服器stop slave,然後重新change master -





-
#回到mycat 伺服器192.168.2.2
- #嘗試登陸
- #mysql -uroot -p123456 -h192.168.2.2 -P8066
- 8066 為mycat 執行階段的連接埠號碼


- 測試讀取與寫入分離
mysql -uroot -p123456 -h192.168.2.2 -P9066 -e "show @@datasource"-
- 9066為mycat 管理連接埠
- #select * from mydata.mylist;

- 寫入資料或變更資料
insert into mydata.mylist values(10,'test');-

模擬故障,先停止從伺服器192.168.2.5
#systemctl stop mariadb.service-

在192.168.2.2 上嘗試寫入資料- insert into mydata.mylist values( 7,'gf');
-





######################################## #######開啟從伺服器192.168.2.5#####################模擬主伺服器192.168.2.3 宕機######### #################




- #新增多個庫
- vim cat /usr/local/mycat /conf/server.xml
-
mydata,wordpress

- vim /usr/local/mycat/conf/schema.xml
-

- 新增完重啟服務
- #/usr/local/mycat/bin/mycat restart
- tail / usr/local/mycat/logs/wrpper.log


- 已報錯處理
#Startup failed: Timed out waiting for a signal from the JVM.
JVM did not exit on request, terminated
# 解決方案
在wrapper.conf中加入
wrapper.startup.timeout=300 //逾時時間300秒
wrapper.ping.timeout=120
-
##推薦學習:mysql影片教學
以上是一起聊聊Mycat實作 Mysql 叢集讀寫分離的詳細內容。更多資訊請關注PHP中文網其他相關文章!