成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

”MySQL官方驅(qū)動“主從分離的主從分離

假如你日后的工作,需要快速實現(xiàn)MySQL的讀寫分離功能,你一定會想起這篇文章。如果你再次回到這里,證明你已經(jīng)迫切需要一個簡單快捷的解決方案了--那就是MySQL官方驅(qū)動層實現(xiàn)的讀寫分離,偏小眾,但很有效。

泰山網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),泰山網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為泰山上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的泰山做網(wǎng)站的公司定做!

JDBC驅(qū)動

我們經(jīng)常使用的MySQL驅(qū)動jar包,其實默認有非常棒的功能,那就是主從分離和HA。如果你只是需要一個主從分離、failover的功能,不要sharding。一個驅(qū)動就夠了,不需要引入什么中間層。

這個東西就是Replication協(xié)議。Mysql JDBC Connector在5.1.X版本之后增加了這些功能,以支持“multi-host”集群拓撲的訪問范式。這個功能是在驅(qū)動層實現(xiàn)的,而既然是驅(qū)動層,那就不可避免有一些驅(qū)動層的問題。

我們平常的jdbc連接是這樣

jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8?復制代碼

而經(jīng)過協(xié)議改造后的jdbc連接,長得要長一些、大一些!

jdbc:mysql:replication://127.0.0.1:3306,127.0.0.1:3307,127.0.0.1:3308/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=false&loadBalanceStrategy=random?復制代碼

當然,也可以有ipv6的寫法,更加直觀

jdbc:mysql://address=(type=master)(host=master1host),address=(type=master)(host=master2host),address=(type=slave)(host=slave1host)/db?復制代碼

8.0的文檔看這里:?dev.mysql.com/doc/connect…?說明:

協(xié)議的第一個連接,表示主庫Master?后面的一堆連接,表示從庫Slave,當然可以有多個 當你把Master連接也放在后面的一堆里,那么它也擁有了“讀庫“的屬性了 后面有一堆參數(shù),來控制這所有連接,到底要如何相處

這樣,所謂的主從分離功能,只要配置好這個連接串,就枯木逢春了。

代碼層

首先你要改驅(qū)動類,再也不是Driver了,而是這個

com.mysql.jdbc.ReplicationDriver?復制代碼

這種情況下 DataSource.getConnection() 獲取的連接,實際上是ReplicationConnection,這個連接是虛擬的,和真實的數(shù)據(jù)庫連接是個1對多的關(guān)系,所以記得給每一個MySQL都做上相應(yīng)的機器授權(quán)。

那么如何來區(qū)別本次請求是讀是寫呢?靠的其實是Connection中的readonly屬性,這個屬性是通過請求header中的“readonly”傳遞的。所以如果請求中有寫入操作,這整個的事務(wù)就一定是readonly=false的。

對于Spring來說,就可以使用@Transactional注解來控制這個屬性了。一個事務(wù)不可能跨兩個連接,所以是讀是寫,有最高層決定。

以下代碼片段展示了你應(yīng)該配置的一些元素,沒錯,就是注解。

public?interface?UserManager?{?????public?UserDO?get(int?id);?????public?void?insert(UserDO?user);?????public?void?update(int?id);?}?復制代碼
@Component?public?class?UserManagerImpl?implements?UserManager{?????@Autowired?????private?UserDao?userDao;?????...?????@Override?????@Transactional(readOnly?=?false,propagation?=?Propagation.REQUIRED)?????public?void?insert(UserDO?user)?{?????????this.userDao.insert(user);?????}?}?復制代碼

是不是很簡單?等等,別高興太早。

參數(shù)

不要覺得是官方驅(qū)動,就可以任性的用。這套jdbc驅(qū)動的參數(shù)還是非常豐富的,學習的代價也就高了些。在一些小流量下運行的很好,但在高并發(fā)環(huán)境下會頻繁發(fā)生問題。這里只挑最重要的說下。

一個虛擬連接,對應(yīng)著一個真正的主庫連接和多個從庫連接。對于主機的存活和重新上線,我們要考慮三種情況:

  • Master都死掉了

  • Slave都死掉了

  • Master、Slave全都死掉了

無論哪種情況,MySQL驅(qū)動都表現(xiàn)出一些奇怪的行為,默認參數(shù)是不好使的。

你可能以為驅(qū)動也就是管理一下幾個連接而已,但情況比這復雜的多。首先給張圖看下這個復雜的關(guān)系。

”MySQL官方驅(qū)動“主從分離的主從分離cdn.xitu.io/2018/12/12/167a1008f7f54e06?imageView2/0/w/1280/h/960/format/webp/ignore-error/1">1、readFromMasterWhenNoSlaves?當所有的salve死掉后,此參數(shù)用來控制主庫是否參與讀。如果從庫的流量很大,配置此參數(shù)對主庫有很大風險;但如果你關(guān)掉,請求則會快速失敗。 2、loadBalanceStrategy?策略用來指定從庫的輪詢規(guī)則。有輪詢,也有權(quán)重,也可以指定具體的策略實現(xiàn)。當你維護或者遷移某個實例時,先置空流量,這會非常有用。或許,你會給某DB一個預熱的可能。 3、allowMasterDownConnections?如果主機當機,當連接池獲取新的連接時,會失敗。但如果打開此參數(shù),則虛擬連接只會創(chuàng)建Slave連接組,整個連接會降級為只讀,不論你設(shè)置了什么注解。 4、allowSlavesDownConnections?如果沒有只讀庫了,是否允許創(chuàng)建新的連接。在這種情況下,此參數(shù)開啟,讀操作有很大可能會失敗。 5、retriesAllDown?當所有的hosts都無法連接時重試的最大次數(shù)(依次循環(huán)重試),默認為120。重試次數(shù)達到閾值仍然無法獲取有效鏈接,將會拋出SQLException。 6、autoReconnect?實例既然有下線、就有上線。上線以后要能夠繼續(xù)服務(wù),此參數(shù)用來控制斷線情況下自動重連而不拋出異常。這會破壞事務(wù)的完整性,但還是默認開啟。

然而MySQL驅(qū)動提供了更加豐富的參數(shù)來控制這個過程,如果你的業(yè)務(wù)要求比較苛刻,這些參數(shù)可能要測個遍才會放心。 但大多數(shù)情況下,它運行的很好。

管理

僅有配置參數(shù),此協(xié)議就算一個半成品而已。所幸,此驅(qū)動提供了JMX管理的方式,可以基于其做一些配置變更之類的功能。市面上并沒有這種配置管理工具,可能還是因為它太小眾了。

?public?abstract?void?addSlaveHost(String?groupFilter,?String?host)?throws?SQLException;??public?abstract?void?removeSlaveHost(String?groupFilter,?String?host)?throws?SQLException;??public?abstract?void?promoteSlaveToMaster(String?groupFilter,?String?host)?throws?SQLException;??public?abstract?void?removeMasterHost(String?groupFilter,?String?host)?throws?SQLException;??public?abstract?String?getMasterHostsList(String?group);??public?abstract?String?getSlaveHostsList(String?group);??public?abstract?String?getRegisteredConnectionGroups();??public?abstract?int?getActiveMasterHostCount(String?group);??public?abstract?int?getActiveSlaveHostCount(String?group);??public?abstract?int?getSlavePromotionCount(String?group);??public?abstract?long?getTotalLogicalConnectionCount(String?group);??public?abstract?long?getActiveLogicalConnectionCount(String?group);?復制代碼

我們順便提一下阿里的德魯伊數(shù)據(jù)庫連接池。如圖,某些功能,只支持默認的單連接,對multi-host支持還是有限。

”MySQL官方驅(qū)動“主從分離的主從分離

結(jié)尾

MySQL 5.1.x官方驅(qū)動出了這么個東西以后,其實宣告了很多小公司自研的某些小中間件的死亡。翻來服務(wù),改寫JDBC,不過就是為了管理個連接集合。

本文對象為專注基礎(chǔ)設(shè)施研發(fā)的同學。有人看到的,不過是一堆參數(shù)而已;而真正去深入使用的人,會感到背脊通徹的寒冷。

當它小眾時,你對它不屑一顧。然而當你一旦采用了某種方案,你卻希望全世界都是關(guān)于它的描寫。人生從來就沒那么幸運,很多坑,還需要自己來踩。

當前題目:”MySQL官方驅(qū)動“主從分離的主從分離
標題來源:http://jinyejixie.com/article48/ggsehp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、網(wǎng)頁設(shè)計公司、全網(wǎng)營銷推廣、網(wǎng)站制作、虛擬主機、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
克东县| 朝阳区| 开鲁县| 延长县| 资源县| 阳谷县| 中方县| 龙泉市| 哈巴河县| 樟树市| 定远县| 澳门| 陆丰市| 贵州省| 房山区| 溧水县| 重庆市| 睢宁县| 永定县| 库车县| 承德市| 乌拉特中旗| 肇州县| 汝城县| 渭南市| 乡城县| 康定县| 越西县| 晴隆县| 拉萨市| 景洪市| 通许县| 东乌珠穆沁旗| 古丈县| 繁昌县| 饶河县| 温州市| 宜春市| 秀山| 浮山县| 乌苏市|