您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)Mycat如何實(shí)現(xiàn)Mysql集群讀寫分離的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
MySQL 作為目前世界上使用最廣泛的免費(fèi)數(shù)據(jù)庫,相信所有從事系統(tǒng)運(yùn)維的工程師都一定接觸過。
在實(shí)際的生產(chǎn)環(huán)境中,由單臺(tái) MySQL 作為獨(dú)立的數(shù)據(jù)庫是完全不能滿足實(shí)際需求的,無論是在安全性,高可用性以及高并發(fā)等各個(gè)方面。
因此,一般來說都是通過主從復(fù)制(Master-Slave)的方式來同步數(shù)據(jù),再通過讀寫分離(MySQL-Proxy/Amoeba)來提升數(shù)據(jù)庫的并發(fā)負(fù)載能力進(jìn)行部署與實(shí)施。
基本的原理是:
主數(shù)據(jù)庫處理事務(wù)性增、改、刪操作(INSERT、UPDATE、DELETE)
從數(shù)據(jù)庫處理 SELECT 查詢操作
數(shù)據(jù)庫復(fù)制被用來把事務(wù)性操作導(dǎo)致的變更同步到集群中的從數(shù)據(jù)庫。
面對越來越大的訪問壓力,單臺(tái)的服務(wù)器的性能成為瓶頸,需要分擔(dān)負(fù)載
主從只負(fù)責(zé)各自的寫和讀,極大程度的緩解 X(寫)鎖和 S(讀)鎖爭用
從庫可配置 myisam 引擎,提升查詢性能以及節(jié)約系統(tǒng)開銷
增加冗余,提高可用性
一般有兩種方式實(shí)現(xiàn)
應(yīng)用程序?qū)訉?shí)現(xiàn),網(wǎng)站的程序?qū)崿F(xiàn)
應(yīng)用程序?qū)訉?shí)現(xiàn)指的是在應(yīng)用程序內(nèi)部及連接器中實(shí)現(xiàn)讀寫分離
應(yīng)用程序內(nèi)部實(shí)現(xiàn)讀寫分離,安裝既可以使用
減少一定部署難度
訪問壓力在一定級(jí)別以下,性能很好
架構(gòu)一旦調(diào)整,代碼要跟著變
難以實(shí)現(xiàn)高級(jí)應(yīng)用,如自動(dòng)分庫,分表
無法適用大型應(yīng)用場景
中間件層實(shí)現(xiàn)是指在外部中間件程序?qū)崿F(xiàn)讀寫分離
常見的中間件程序
Cobar:
阿里巴巴 B2B 開發(fā)的關(guān)系型分布式系統(tǒng),管理將近 3000 個(gè) MySQL 實(shí)例。 在阿里經(jīng)受住了考驗(yàn),后面由于作者的走開的原因 cobar 沒有人維護(hù) 了,阿里也開發(fā)了 tddl 替代 cobar。
MyCAT:
社區(qū)愛好者在阿里 cobar 基礎(chǔ)上進(jìn)行二次開發(fā),解決了 cobar 當(dāng)時(shí)存在的一些問題,并且加入了許多新的功能在其中。目前 MyCAT 社區(qū)活躍度很高,已經(jīng)有一些公司在使用 MyCAT??傮w來說支持度比
較高,也會(huì)一直維護(hù)下去。
OneProxy:
數(shù)據(jù)庫界大牛,前支付寶數(shù)據(jù)庫團(tuán)隊(duì)領(lǐng)導(dǎo)樓總開發(fā),基于 mysql 官方 的 proxy 思想利用 c 進(jìn)行開發(fā)的,OneProxy 是一款商業(yè)收費(fèi)的中間件,樓總舍去了一些功能點(diǎn),專注在性能和穩(wěn)定性上。有人測
試過說在高并發(fā)下很穩(wěn)定。
Vitess:
這個(gè)中間件是 Youtube 生產(chǎn)在使用的,但是架構(gòu)很復(fù)雜。 與以往中間件不同,使用 Vitess 應(yīng)用改動(dòng)比較大,要使用他提供語言的 API 接口,我們可以借鑒他其中的一些設(shè)計(jì)思想。
Kingshard:
Kingshard 是前 360Atlas 中間件開發(fā)團(tuán)隊(duì)的陳菲利用業(yè)余時(shí)間 用 go 語言開發(fā)的,目前參與開發(fā)的人員有 3 個(gè)左右, 目前來看還不是成熟可以使用的產(chǎn)品,需要在不斷完善。
Atlas:
360 團(tuán)隊(duì)基于 mysql proxy 把 lua 用 C 改寫。原有版本是支持分表, 目前已經(jīng)放出了分庫分表版本。在網(wǎng)上看到一些朋友經(jīng)常說在高并發(fā)下會(huì)經(jīng)常掛掉,如果大家要使用需要提前做好測試。
MaxScale 與 MySQL Route:
這兩個(gè)中間件都算是官方的,MaxScale 是 mariadb (MySQL 原作者維護(hù)的一個(gè)版本)研發(fā)的,目前版本不支持分庫分表。MySQL Route 是現(xiàn)在 MySQL 官方 Oracle 公司發(fā)布出來的一個(gè)中間件。
優(yōu)點(diǎn):
架構(gòu)設(shè)計(jì)更靈活
可以在程序上實(shí)現(xiàn)一些高級(jí)控制,如:透明化水平拆分,failover,監(jiān)控可以依靠技術(shù)手段提高 mysql 性能對業(yè)務(wù)代碼的影響小,同時(shí)也安全
缺點(diǎn):
需要一定的開發(fā)運(yùn)維團(tuán)隊(duì)的支持。
一個(gè)徹底開源的,面向企業(yè)應(yīng)用開發(fā)的大數(shù)據(jù)庫集群
支持事務(wù)、ACID、可以替代 MySQL 的加強(qiáng)版數(shù)據(jù)庫
一個(gè)可以視為 MySQL 集群的企業(yè)級(jí)數(shù)據(jù)庫,用來替代昂貴的 Oracle 集群
一個(gè)融合內(nèi)存緩存技術(shù)、NoSQL 技術(shù)、HDFS 大數(shù)據(jù)的新型 SQL Server
結(jié)合傳統(tǒng)數(shù)據(jù)庫和新型分布式數(shù)據(jù)倉庫的新一代企業(yè)級(jí)數(shù)據(jù)庫產(chǎn)品
一個(gè)新穎的數(shù)據(jù)庫中間件產(chǎn)品
MyCat 有提供編譯好的安裝包,支持 Windows、Linux、Mac、Solaris 等系統(tǒng)上安裝與運(yùn)行
官方下載主頁 http://www.mycat.org.cn/
實(shí)驗(yàn)架構(gòu):
192.168.2.2 Mycat CentOS 8.3.2011
192.168.2.3 主服務(wù)器 CentOS 7.6
192.168.2.5 從服務(wù)器 CentOS 7.6
運(yùn)行 Mycat 需要JDK 1.7 或者以上版
下載 Mycat
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" | sudo passwd --stdin mycat
sudo chown -R mycat. /usr/local/mycat/
bin 程序目錄,Linux 下運(yùn)行:./mycat console,首先要 chmod +x *
注:mycat 支持的命令{ console | start | stop | restart | status | dump }
conf 目錄下存放配置文件:server.xml 是 Mycat 服務(wù)器參數(shù)調(diào)整和用戶授權(quán)的配置文件,schema.xml 是邏輯庫定義和表以及分片定義的配置文件,rule.xml 是分片規(guī)則的配置文件,分片規(guī)則的具體一些參數(shù)信息單獨(dú)存放為文件,也在這個(gè)目錄下,配置文件修改,需要重啟 Mycat 生效。
lib 目錄下主要存放 mycat 依賴的一些 jar 文件。
日志存放在 logs/mycat.log 中,每天一個(gè)文件,日志的配置是在 conf/log4j.xml 中,根據(jù)自己的需要,可以調(diào)整輸出級(jí)別為 debug,在 debug 級(jí)別下,會(huì)輸出更多的信息,方便排查問題。
MyCAT 在 Linux 中部署啟動(dòng)時(shí),首先需要在 Linux 系統(tǒng)的環(huán)境變量中配置 MYCAT_HOME,操作方式如下:
sudo vim /etc/profile.d/mycat.sh
MYCAT_HOME=/usr/local/mycat PATH=$MYCAT_HOME/bin:$PATH
使環(huán)境變量生效
. /etc/profile.d/mycat.sh
啟動(dòng)服務(wù)
/usr/local/mycat/bin/mycat start
cat /usr/local/mycat/logs/wrapper.log
vim /usr/local/mycat/conf/server.xml
備份原先的配置文件
\cp /usr/local/mycat/conf/schema.xml{,.bak}
編輯 配置文件
vim /usr/local/mycat/conf/schema.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"> 注意這里的網(wǎng)址,錯(cuò)寫會(huì)啟動(dòng)失敗!
<schema name="mydata" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'>
</schema>
<dataNode name="dn1" dataHost="dthost" database="mydata"/>
<dataHost name="dthost" maxCon="500" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<writeHost host="c7_2_3" url="192.168.2.3:3306" user="mycat" password="123456"> 寫服務(wù)器
</writeHost>
<writeHost host="c7_2_5" url="192.168.2.5:3306" user="mycat" password="123456"> 讀服務(wù)器
</writeHost>
</dataHost>
</mycat:schema>
強(qiáng)制所有的讀操作都在讀服務(wù)器上運(yùn)行,只有寫入數(shù)據(jù)時(shí)才切換到寫服務(wù)器
注意這里的 mycat 用戶都要在 主從數(shù)據(jù)庫 上 192.168.2.3 和 2.5 授權(quán)
GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'%' IDENTIFIED BY '123456';
或者指定網(wǎng)段
GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'192.168.2.%' IDENTIFIED BY '123456';
flush privileges;
如果報(bào)這個(gè)錯(cuò)誤,服務(wù)器運(yùn)行正常的話,首先檢查有沒有授權(quán)
ERROR 1184 (HY000): Invalid DataSource:0
schema:邏輯庫,與MySQL中的Database(數(shù)據(jù)庫)對應(yīng),一個(gè)邏輯庫中定義了所包括的Table。
table:表,即物理數(shù)據(jù)庫中存儲(chǔ)的某一張表,與傳統(tǒng)數(shù)據(jù)庫不同,這里的表格需要聲明其所存儲(chǔ)的邏輯數(shù)據(jù)節(jié)點(diǎn)DataNode,這是通過表格的分片規(guī)則定義來實(shí)現(xiàn)的,table可以定義其所屬的“子表(childTable)”,子表的分片依賴于與“父表”的具體分片地址,簡單的說,就是屬于父表里某一條記錄A的子表的所有記錄都與A存儲(chǔ)在同一個(gè)分片上。
分片規(guī)則:是一個(gè)字段與函數(shù)的捆綁定義,根據(jù)這個(gè)字段的取值來返回所在存儲(chǔ)的分片(DataNode)的序號(hào),每個(gè)表格可以定義一個(gè)分片規(guī)則,分片規(guī)則可以靈活擴(kuò)展,默認(rèn)提供了基于數(shù)字的分片規(guī)則,字符串的分片規(guī)則等。
dataNode: MyCAT的邏輯數(shù)據(jù)節(jié)點(diǎn),是存放table的具體物理節(jié)點(diǎn),也稱之為分片節(jié)點(diǎn),通過DataSource來關(guān)聯(lián)到后端某個(gè)具體數(shù)據(jù)庫上,一般來說,為了高可用性,每個(gè)DataNode都設(shè)置兩個(gè)DataSource,一主一從,當(dāng)主節(jié)點(diǎn)宕機(jī),系統(tǒng)自動(dòng)切換到從節(jié)點(diǎn)。
dataHost:定義某個(gè)物理庫的訪問地址,用于捆綁到dataNode上。
MyCAT目前通過配置文件的方式來定義邏輯庫和相關(guān)配置:
MYCAT_HOME/conf/schema.xml中定義邏輯庫,表、分片節(jié)點(diǎn)等內(nèi)容;
MYCAT_HOME/conf/rule.xml中定義分片規(guī)則;
MYCAT_HOME/conf/server.xml中定義用戶以及系統(tǒng)相關(guān)變量,如端口等。
注解:
schema 標(biāo)簽用于定義 MyCat 實(shí)例中的邏輯庫,name:后面就是邏輯庫名 MyCat 可以有多個(gè)邏輯庫,每個(gè)邏輯庫都有自己的相關(guān)配置??梢允褂?schema 標(biāo)簽來劃分這些不同的邏輯庫。
checkSQLschema 這個(gè)屬性默認(rèn)就是 false,官方文檔的意思就是是否去掉表前面的數(shù)據(jù)庫的名稱,”select * from db1.testtable” ,設(shè)置為 true 就會(huì)去掉 db1。但是如果 db1 的名稱不是
schema 的名稱,那么也不會(huì)被去掉,因此官方建議不要使用這種語法。同時(shí)默認(rèn)設(shè)置為 false。
sqlMaxLimit 當(dāng)該值設(shè)置為某個(gè)數(shù)值時(shí)。每條執(zhí)行的 SQL 語句,如果沒有加上 limit 語句,MyCat 也會(huì)自動(dòng)的加上所對應(yīng)的值。例如設(shè)置值為 100,執(zhí)行”select * from test_table”,則效果為
“selelct * from test_table limit 100”.
dataNode 標(biāo)簽定義了 MyCat 中的數(shù)據(jù)節(jié)點(diǎn),也就是我們通常說所的數(shù)據(jù)分片
重新啟動(dòng)服務(wù)
/usr/local/mycat/bin/mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...
tail /usr/local/mycat/logs/wrapper.log
在2臺(tái)服務(wù)器上分別安裝、配置mariadb,具體步驟請參閱:https://blog.csdn.net/gaofei0428/article/details/103829676?spm=1001.2014.3001.5501
/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=mydata
replicate-do-db=mydata
lower_case_table_names=1 開啟大小寫匹配
注意需要同步的數(shù)據(jù)庫必須事先存在
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 開啟只讀模式,防止數(shù)據(jù)回寫,不會(huì)影響 slave 同步復(fù)制
lower_case_table_names=1 開啟大小寫匹配
重啟 從數(shù)據(jù)庫服務(wù)后進(jìn)行以下操作
停止從服務(wù)器的slave,創(chuàng)建slave數(shù)據(jù)庫用戶
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 "show slave status"
在主數(shù)據(jù)庫端 192.168.2.3 添加一些數(shù)據(jù),觀測從數(shù)據(jù)庫是否同步
在從服務(wù)器端查看
如果同步出錯(cuò),需要在從服務(wù)器 stop slave,然后重新 change master
使用 slave 用戶登陸測試
嘗試登陸
mysql -uroot -p123456 -h292.168.2.2 -P8066
8066 為 mycat 運(yùn)行時(shí)的端口號(hào)
mysql -uroot -p123456 -h292.168.2.2 -P9066 -e "show @@datasource"
9066為 mycat 管理端口
select * from mydata.mylist;
insert into mydata.mylist values(10,'test');
systemctl stop mariadb.service
在 192.168.2.2 上嘗試寫入數(shù)據(jù)
insert into mydata.mylist values(7,'gf');
在 主服務(wù)器 192.168.2.3 上查看
開啟 從服務(wù)器 192.168.2.5
模擬 主服務(wù)器 192.168.2.3 宕機(jī)
查詢正常,嘗試寫入數(shù)據(jù)
查詢正常但是不能寫入
添加多個(gè)庫
vim cat /usr/local/mycat/conf/server.xml
<!--多個(gè)庫指定標(biāo)簽用逗號(hào)隔開 -->
<property name="schemas">mydata,wordpress</property>
vim /usr/local/mycat/conf/schema.xml
<schema name="wordpress" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn2'>
</schema>
<dataNode name="dn2" dataHost="dthost1" database="wordpress"/>
添加完重啟服務(wù)
/usr/local/mycat/bin/mycat restart
tail /usr/local/mycat/logs/wrpper.log
報(bào)錯(cuò)處理
Startup failed: Timed out waiting for a signal from the JVM.
JVM did not exit on request, terminated
解決辦法
在wrapper.conf中添加
wrapper.startup.timeout=300 //超時(shí)時(shí)間300秒
wrapper.ping.timeout=120
感謝各位的閱讀!關(guān)于“Mycat如何實(shí)現(xiàn)Mysql集群讀寫分離”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。