电竞比分网-中国电竞赛事及体育赛事平台

分享

Mycat

 美好生活谷 2019-04-09

mysql主從實(shí)現(xiàn)

Mycat不負(fù)責(zé)任何的數(shù)據(jù)同步問題,mysql的主從復(fù)制還得從mysql層面來實(shí)現(xiàn);如果沒有實(shí)現(xiàn)mysql的主從復(fù)制,后文就都成

如果想學(xué)習(xí)Java工程化、高性能及分布式、深入淺出。微服務(wù)、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java高級(jí)交流:854630135,群里有阿里大牛直播講解技術(shù),以及Java大型互聯(lián)網(wǎng)技術(shù)的視頻免費(fèi)分享給大家。

Mycat - 實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離與高可用

了。

mysql的主從復(fù)制是實(shí)現(xiàn)讀寫分離的基礎(chǔ),具體的搭建過程請(qǐng)參考:mysql5.7.18的安裝與主從復(fù)制,本文就不展示詳細(xì)的搭建過程了。我的mysql主從信息如下

master:192.168.1.210;slave:192.168.1.211; 需要復(fù)制的數(shù)據(jù)庫:mycat_db

Mycat - 實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離與高可用

Mycat搭建

Mycat是什么?是數(shù)據(jù)庫中間件,介于數(shù)據(jù)庫與應(yīng)用之間,進(jìn)行數(shù)據(jù)處理與交互的中間件服務(wù),可以簡單的理解成數(shù)據(jù)庫代理,我們的應(yīng)用只需要與數(shù)據(jù)庫中間件交互,而無需關(guān)注復(fù)雜的數(shù)據(jù)庫部署。

Mycat - 實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離與高可用

如上圖所示,數(shù)據(jù)被分到多個(gè)分片數(shù)據(jù)庫后,應(yīng)用如果需要讀取數(shù)據(jù),就需要處理多個(gè)數(shù)據(jù)源的數(shù)據(jù)。如果沒有數(shù)據(jù)庫中間件,那么應(yīng)用將直接面對(duì)分片集群,數(shù)據(jù)源切換、事務(wù)處理、數(shù)據(jù)聚合都需要在應(yīng)用層直接處理,原本該是專注于業(yè)務(wù)的應(yīng)用,將會(huì)花大量的工作來處理分片后的問題,最重要的是每個(gè)應(yīng)用處理將是完全的重復(fù)造輪子。所以有了數(shù)據(jù)庫中間件,應(yīng)用只需要關(guān)注業(yè)務(wù)處理,大量的通用的數(shù)據(jù)聚合、事務(wù)、數(shù)據(jù)源切換都由數(shù)據(jù)庫中間件來處理。更多Mycat信息,請(qǐng)查閱《Mycat權(quán)威指南》。

192.168.1.212上搭建Mycat

JDK的安裝

Mycat依賴jdk,我們需要先安裝jdk,必須是JDK7或更高版本;具體安裝過程就不做展示了,大家可參考:virtualBox安裝centos,并搭建tomcat。

Mycat安裝

安裝包:Mycat-server-1.6.6.1-release-20181031195535-linux.tar,在/opt目錄下

[root@centos212 opt]# cp Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz -C /usr/local

[root@centos212 local]# useradd mycat

[root@centos212 local]# chown -R mycat:mycat /usr/local/mycat

[root@centos212 local]# passwd mycat

修改mycat內(nèi)存配置

如果想學(xué)習(xí)Java工程化、高性能及分布式、深入淺出。微服務(wù)、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java高級(jí)交流:854630135,群里有阿里大牛直播講解技術(shù),以及Java大型互聯(lián)網(wǎng)技術(shù)的視頻免費(fèi)分享給大家。

我的linux虛擬機(jī)配置的內(nèi)存大小是1GB,大家需要根據(jù)自己的實(shí)際情況進(jìn)行配置

[root@centos212 local]# vi mycat/conf/wrapper.conf

wrapper.java.additional.10=-Xmx4G (大約在36行)wrapper.java.additional.11=-Xms1G改成wrapper.java.additional.10=-Xmx1Gwrapper.java.additional.11=-Xms256M

配置hostname(若已配置則忽略)

[root@centos212 local]# vi /etc/sysconfig/network

追加一行:HOSTNAME=你的主機(jī)名(xxxx),我的主機(jī)名是centos212

[root@centos212 local]# vi /etc/hosts

在127.0.0.1和::1末尾追加你的主機(jī)名(xxxx),如下圖所示,

Mycat - 實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離與高可用

將MyCat配置到環(huán)境變量中

[root@centos212 local]# vi /etc/profile

增加如下內(nèi)容

MYCAT_HOME=/usr/local/mycat

PATH=$MYCAT_HOME/bin:$PATH

Mycat - 實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離與高可用

保存后退出,執(zhí)行source命令使配置生效

[root@centos212 local]# source /etc/profile

配置mycat

server.xml和rule.xml先不修改,用默認(rèn)的即可;只需要簡單配置下schema.xml

<?xml version='1.0'?><!DOCTYPE mycat:schema SYSTEM 'schema.dtd'><mycat:schema xmlns:mycat='http://cat/'> <schema name='TESTDB' checkSQLschema='false' sqlMaxLimit='100' dataNode='dn1'> </schema> <!-- <dataNode name='dn1$0-743' dataHost='localhost1' database='db$0-743' /> --> <dataNode name='dn1' dataHost='localhost1' database='test_db' /> <dataHost name='localhost1' maxCon='1000' minCon='10' balance='0' writeType='0' dbType='mysql' dbDriver='native' switchType='1' slaveThreshold='100'> <heartbeat>select user()</heartbeat> <writeHost host='hostM1' url='192.168.1.210:3306' user='root' password='123456' /> </dataHost></mycat:schema>

默認(rèn)有兩個(gè)賬號(hào)可以連接mycat的TESTDB,root:123456和user:user(在server.xml中),user賬號(hào)只有只讀權(quán)限。

啟動(dòng)mycat

[root@centos212 local]# mycat start

搭建結(jié)果展示

Mycat - 實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離與高可用

可以看到,通過mycat我們成功往192.168.1.210的test_db庫中創(chuàng)建了一張tbl_user表。

mysql讀寫分離、高可用實(shí)現(xiàn)

本文不涉及復(fù)雜的數(shù)據(jù)庫部署,只是簡單的mysql主從部署(單主單從),Mycat實(shí)現(xiàn)mysql的讀寫分離與高可用;mysql主從復(fù)制已經(jīng)搭建好,Mycat也已經(jīng)搭建好,剩下的就是配置Mycat,將Mycat與我們的mysql整合起來,結(jié)構(gòu)圖如下

Mycat - 實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離與高可用

如圖所示,writeHost表示主節(jié)點(diǎn),readHost表示從節(jié)點(diǎn),Mycat內(nèi)部定期對(duì)一個(gè)dataHost里所有的writeHost與readHost節(jié)點(diǎn)發(fā)起心跳檢測(cè)(writeHost與readHost都可以配置多個(gè),至于數(shù)據(jù)同步的問題則需要我們從mysql層面實(shí)現(xiàn)了,Mycat并不提供數(shù)據(jù)同步的支持,本文只講mysql一主一從),正常情況下,Mycat會(huì)將第一個(gè)writeHost作為寫節(jié)點(diǎn),所有的DML SQL會(huì)發(fā)送給此節(jié)點(diǎn),若Mycat開啟了讀寫分離,則Select SQL會(huì)根據(jù)讀寫分離策略發(fā)往readHost(+writeHost)執(zhí)行。當(dāng)一個(gè)dataHost里面配置了多個(gè)writeHost時(shí),如果第一個(gè)writeHost宕機(jī),則Mycat會(huì)在默認(rèn)的3次心跳檢查失敗后,自動(dòng)切換到下一個(gè)可用的writeHost,以此類推。

這存在一個(gè)問題,就是當(dāng)宕機(jī)的writeHost恢復(fù)后,怎么重新加入Mycat,要不要恢復(fù)為原來的寫節(jié)點(diǎn)? 最佳建議方式是:保持現(xiàn)有狀態(tài)不變,改旗易幟,恢復(fù)后的mysql節(jié)點(diǎn)作為從節(jié)點(diǎn),跟隨新的主節(jié)點(diǎn),重新配置主從同步,原來跟隨該節(jié)點(diǎn)做同步的從節(jié)點(diǎn)也同樣換帥,重新配置同步源,這些節(jié)點(diǎn)的數(shù)據(jù)手工完成同步后,再加入Mycat里。

配置Mycat,實(shí)現(xiàn)mysql讀寫分離與高可用

此種需求下,Mycat的配置非常簡單,不用針對(duì)每個(gè)表進(jìn)行配置,只需要在schema.xml中的元素上增加dataNode='defaultDN'屬性,并配置此dataNode對(duì)應(yīng)的真實(shí)物理數(shù)據(jù)庫的database,然后dataHost開啟讀寫分離功能即可。具體配置如下,server.xml和rule.xml先不修改,用默認(rèn)的即可;只需要簡單配置下schema.xml

Mycat - 實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離與高可用

View Code

重啟mycat:[root@centos212 logs]# mycat restart,mycat數(shù)據(jù)庫TESTDB內(nèi)容如下

Mycat - 實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離與高可用

測(cè)試結(jié)果展示

讀寫分離

一般情況,查詢會(huì)走slave節(jié)點(diǎn),其他走master節(jié)點(diǎn),對(duì)master節(jié)點(diǎn)數(shù)據(jù)庫的增、刪、改操作最終會(huì)同步到slave節(jié)點(diǎn),但這個(gè)同步所需要的時(shí)間不好掌握(網(wǎng)絡(luò)延時(shí)等因素),如果延時(shí)太長,我們新增一條數(shù)據(jù)后立即去查詢,很有可能會(huì)查詢不到剛新增的的數(shù)據(jù);如果對(duì)數(shù)據(jù)的實(shí)時(shí)性要求比較高的查詢,我們可以強(qiáng)制查詢走master節(jié)點(diǎn),如下所示

強(qiáng)制走master:/*!mycat:db_type=master*/ select * from tbl_user;強(qiáng)制走slave:/*!mycat:db_type=slave*/ select * from tbl_user

另外我們可以配置mycat,根據(jù)主從延時(shí)時(shí)長來決定查詢走master還是slave,具體配置可查閱《Mycat權(quán)威指南》。

讀寫分離示例如下:

Mycat - 實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離與高可用

如果想學(xué)習(xí)Java工程化、高性能及分布式、深入淺出。微服務(wù)、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java高級(jí)交流:854630135,群里有阿里大牛直播講解技術(shù),以及Java大型互聯(lián)網(wǎng)技術(shù)的視頻免費(fèi)分享給大家。

可以看到,一般查詢走的是slave;增、刪、改走master,然后同步到slave;我們也可以強(qiáng)制走master,還是slave。示例中我手動(dòng)的將slave中的王五改成了王五_1,是為了更好的展示查詢請(qǐng)求是走的master還是slave,真實(shí)情況是不會(huì)出現(xiàn)這種情況的。

高可用

我們手動(dòng)停掉master上的mysql服務(wù),看看mycat能不能自動(dòng)的切換到下一個(gè)writeHost,示例如下

Mycat - 實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離與高可用

mycat將master從hostM1切換到hostM2需要一定的時(shí)間,切換過程中如果強(qiáng)制從master操作,會(huì)拋出連接異常(java.net.ConnectException: 拒絕連接),這是屬于正常情況。當(dāng)切換完成之后,就可以正常操作mycat了,而我們的操作方式無需做任何改變(應(yīng)用無需做任何變化,仍按之前的方式訪問mycat即可)。

宕機(jī)的master節(jié)點(diǎn)修復(fù)后,如何重新加入mycat,這個(gè)問題在前面已經(jīng)講過,該節(jié)點(diǎn)及其readHost節(jié)點(diǎn)全部以slave的形式加入到其他writeHost的readHost中,修改schema.xml,而不要去修改dnindex.properties,另外還得從mysql層面修改同步源。

總結(jié)

1、數(shù)據(jù)的同步在mysql層面實(shí)現(xiàn)的,mycat不負(fù)責(zé)任何的數(shù)據(jù)庫同步;

2、mycat的搭建比較簡單,但也有一些注意點(diǎn):依賴JDK以及其版本,hostname配置等等。期間如果遇到什么問題,盡量百度,就不要google了,Mycat是中國制造,百度搜索的資料更全;

3、數(shù)據(jù)庫的讀寫分離是mycat最常用的場(chǎng)景之一,配置比較簡單,細(xì)心一點(diǎn),實(shí)現(xiàn)起來應(yīng)該不難;

4、讀寫分離往往還伴隨著高可用,同樣mycat也支持mysql的高可用,能夠自動(dòng)的進(jìn)行master的切換;

5、關(guān)于mycat自身的高可用與負(fù)載均衡,請(qǐng)上飛機(jī):Mycat - 高可用與負(fù)載均衡實(shí)現(xiàn),滿滿的干貨??;

如果想學(xué)習(xí)Java工程化、高性能及分布式、深入淺出。微服務(wù)、Spring,MyBatis,Netty源碼分析的朋友可以加我的Java高級(jí)交流:854630135,群里有阿里大牛直播講解技術(shù),以及Java大型互聯(lián)網(wǎng)技術(shù)的視頻免費(fèi)分享給大家。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多