應(yīng)該是通過ndb的cluster來實現(xiàn)啊,你只需在網(wǎng)上找mysql cluster的資料就可以知道了。在mysql官方網(wǎng)站上可以下載到,如《mysql cluster維護手冊.docx》等
創(chuàng)新互聯(lián)是一家專業(yè)提供克山企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站建設(shè)、成都做網(wǎng)站、H5場景定制、小程序制作等業(yè)務(wù)。10年已為克山眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進行中。
以前參加過一個庫存系統(tǒng),由于其業(yè)務(wù)復(fù)雜性,搞了很多個應(yīng)用來支撐。這樣的話一份庫存數(shù)據(jù)就有可能同時有多個應(yīng)用來修改庫存數(shù)據(jù)。
比如說,有定時任務(wù)域xx.cron,和SystemA域和SystemB域這幾個JAVA應(yīng)用,可能同時修改同一份庫存數(shù)據(jù)。如果不做協(xié)調(diào)的話,就會有臟數(shù)據(jù)出現(xiàn)。
對于跨JAVA進程的線程協(xié)調(diào),可以借助外部環(huán)境,例如DB或者Redis。下文介紹一下如何使用DB來實現(xiàn)分布式鎖。
本文設(shè)計的分布式鎖的交互方式如下:
在使用synchronized關(guān)鍵字的時候,必須指定一個鎖對象。
進程內(nèi)的線程可以基于obj來實現(xiàn)同步。obj在這里可以理解為一個鎖對象。如果線程要進入synchronized代碼塊里,必須先持有obj對象上的鎖。這種鎖是JAVA里面的內(nèi)置鎖,創(chuàng)建的過程是線程安全的。那么借助DB,如何保證創(chuàng)建鎖的過程是線程安全的呢?
可以利用DB中的UNIQUE KEY特性,一旦出現(xiàn)了重復(fù)的key,由于UNIQUE KEY的唯一性,會拋出異常的。在JAVA里面,是 SQLIntegrityConstraintViolationException 異常。
transaction_id是事務(wù)Id,比如說,可以用
來組裝一個transaction_id,表示某倉庫某銷售模式下的某個條碼資源。不同條碼,當(dāng)然就有不同的transaction_id。如果有兩個應(yīng)用,拿著相同的transaction_id來創(chuàng)建鎖資源的時候,只能有一個應(yīng)用創(chuàng)建成功。
在寫操作頻繁的業(yè)務(wù)系統(tǒng)中,通常會進行分庫,以降低單數(shù)據(jù)庫寫入的壓力,并提高寫操作的吞吐量。如果使用了分庫,那么業(yè)務(wù)數(shù)據(jù)自然也都分配到各個數(shù)據(jù)庫上了。
在這種水平切分的多數(shù)據(jù)庫上使用DB分布式鎖,可以自定義一個DataSouce列表。并暴露一個 getConnection(String transactionId) 方法,按照transactionId找到對應(yīng)的Connection。
實現(xiàn)代碼如下:
首先編寫一個initDataSourceList方法,并利用Spring的PostConstruct注解初始化一個DataSource 列表。相關(guān)的DB配置從db.properties讀取。
DataSource使用阿里的DruidDataSource。
接著最重要的一個實現(xiàn)getConnection(String transactionId)方法。實現(xiàn)原理很簡單,獲取transactionId的hashcode,并對DataSource的長度取模即可。
連接池列表設(shè)計好后,就可以實現(xiàn)往distributed_lock表插入數(shù)據(jù)了。
接下來利用DB的 select for update 特性來鎖住線程。當(dāng)多個線程根據(jù)相同的transactionId并發(fā)同時操作 select for update 的時候,只有一個線程能成功,其他線程都block住,直到 select for update 成功的線程使用commit操作后,block住的所有線程的其中一個線程才能開始干活。
我們在上面的DistributedLock類中創(chuàng)建一個lock方法。
當(dāng)線程執(zhí)行完任務(wù)后,必須手動的執(zhí)行解鎖操作,之前被鎖住的線程才能繼續(xù)干活。在我們上面的實現(xiàn)中,其實就是獲取到當(dāng)時 select for update 成功的線程對應(yīng)的Connection,并實行commit操作即可。
那么如何獲取到呢?我們可以利用ThreadLocal。首先在DistributedLock類中定義
每次調(diào)用lock方法的時候,把Connection放置到ThreadLocal里面。我們修改lock方法。
這樣子,當(dāng)獲取到Connection后,將其設(shè)置到ThreadLocal中,如果lock方法出現(xiàn)異常,則將其從ThreadLocal中移除掉。
有了這幾步后,我們可以來實現(xiàn)解鎖操作了。我們在DistributedLock添加一個unlock方法。
畢竟是利用DB來實現(xiàn)分布式鎖,對DB還是造成一定的壓力。當(dāng)時考慮使用DB做分布式的一個重要原因是,我們的應(yīng)用是后端應(yīng)用,平時流量不大的,反而關(guān)鍵的是要保證庫存數(shù)據(jù)的正確性。對于像前端庫存系統(tǒng),比如添加購物車占用庫存等操作,最好別使用DB來實現(xiàn)分布式鎖了。
如果想鎖住多份數(shù)據(jù)該怎么實現(xiàn)?比如說,某個庫存操作,既要修改物理庫存,又要修改虛擬庫存,想鎖住物理庫存的同時,又鎖住虛擬庫存。其實也不是很難,參考lock方法,寫一個multiLock方法,提供多個transactionId的入?yún)?,for循環(huán)處理就可以了。這個后續(xù)有時間再補上。
"可以采用開源的MyCat解決方案,優(yōu)點是免費,缺點是出現(xiàn)問題可能要自己解決或者去社區(qū)尋找解決方案;
也可以采用北京萬里開源軟件有限公司的集群解決方案,后端使用開源的MySQL存儲數(shù)據(jù),優(yōu)點是有任何問題他們都可以幫忙解決,而且不用擔(dān)心系統(tǒng)后續(xù)的擴展、集群高可用等情況,他們的工程師還開發(fā)過MySQL核心代碼,找他們可以睡個安穩(wěn)覺,缺點是不免費,他們還有自己的國產(chǎn)數(shù)據(jù)庫GreatDB,100%兼容MySQL。
對于初創(chuàng)企業(yè),可以考慮選擇免費的開源解決方案,畢竟遇到的問題可能有限,如果要想長期穩(wěn)定發(fā)展,還是選擇萬里開源這樣的公司比較靠譜一些。"
1、主要解決針對大型網(wǎng)站架構(gòu)中持久化部分中,大量數(shù)據(jù)存儲以及高并發(fā)訪問所帶來是數(shù)據(jù)讀寫問題。分布式是將一個業(yè)務(wù)拆分為多個子業(yè)務(wù),部署在不同的服務(wù)器上。集群是同一個業(yè)務(wù),部署在多個服務(wù)器上。
2、著重對數(shù)據(jù)切分做了細致豐富的講解,從數(shù)據(jù)切分的原理出發(fā),一步一步深入理解數(shù)據(jù)的切分,通過深入理解各種切分策略來設(shè)計和優(yōu)化我們的系統(tǒng)。這部分中我們還用到了數(shù)據(jù)庫中間件和客戶端組件來進行數(shù)據(jù)的切分,讓廣大網(wǎng)友能夠?qū)?shù)據(jù)的切分從理論到實戰(zhàn)都會有一個質(zhì)的飛躍。
通過分布式+集群的方式來提高io的吞吐量,以及數(shù)據(jù)庫的主從復(fù)制,主主復(fù)制,負載均衡,高可用,分庫分表以及數(shù)據(jù)庫中間件的使用。
1、amoeba相當(dāng)于一個SQL請求的路由器,目的是為負載均衡、讀寫分離、高可用性提供機制,而不是完全實現(xiàn)它們。用戶需要結(jié)合使用MySQL的Replication等機制來實現(xiàn)副本同步等功能。amoeba對底層數(shù)據(jù)庫連接管理和路由實現(xiàn)也采用了可插撥的機制,第三方可以開發(fā)更高級的策略類來替代作者的實現(xiàn)。這個程序總體上比較符合KISS的思想。
2、由上一條,建議使用MySQL的Replication機制建立Master-Slave來做副本。我一開始理解有誤,使用了amoeba的virtual DB(負載均衡pool)做writePool,結(jié)果使得本應(yīng)插入同一個表中的數(shù)據(jù)被拆分地寫入了不同的物理數(shù)據(jù)庫中。這樣自然與副本的語義不符了。
3、amoeba已經(jīng)實現(xiàn)了數(shù)據(jù)的垂直切分與水平切分。水平切分方面,粒度是行。使用SQLJEP語句可以設(shè)計出復(fù)雜的切分規(guī)則,個人認為是比較強大的。垂直切分的粒度是表,可以把針對不同表的請求發(fā)送到不同的節(jié)點上執(zhí)行,但不能以列作為分片粒度。從作者的說法看,amoeba不做SQL解析和重寫。在目前的機制下似乎是難以實現(xiàn)同一個表不同的列在不同節(jié)點上的分布。不過對開發(fā)人員來說,設(shè)計良好的表結(jié)構(gòu)應(yīng)該可以實現(xiàn)簡單的基于關(guān)系屬性的負載均衡的。
MySQL做分布式需要通過ndb的Cluster來實現(xiàn)。MySQLCluster是MySQL適合于分布式計算環(huán)境的高實用、高冗余版本。 實現(xiàn)的步驟比較復(fù)雜,百度云案例:《MySQLCluster(MySQL集群)分布式》 下載地址:
網(wǎng)站題目:mysql怎么成分布式,MySQL分布式存儲
轉(zhuǎn)載來于:http://sd-ha.com/article40/dsihoeo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、品牌網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站策劃、靜態(tài)網(wǎng)站、定制網(wǎng)站
聲明:本網(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)