Ⅰ 分布式計算系統 Maekawa演算法 13個進程怎麼劃分子集
第一個進程子集是(1.2.4.10);第二個進程子集是(2.3.5.11);以後每一列數字遞增,13以後從1重新開始。
分布式系統的類型,大致可以歸為三類:
1、分布式數據,但只有一個總資料庫,沒有局部資料庫。
2、分層式處理,每一層都有自己的資料庫。
3、充分分散的分布式網路,沒有中央控制部分,各節點之間的聯接方式又可以有多種,如鬆散的聯接,緊密的聯接,動態的聯接,廣播通知式聯接等。
(1)分布式演算法題庫擴展閱讀
衡量分布式系統的指標
1、性能:系統的吞吐能力,指系統在某一時間可以處理的數據總量,通常可以用系統每秒處理的總的數據量來衡量;系統的響應延遲,指系統完成某一功能需要使用的時間。
系統的並發能力,指系統可以同時完成某一功能的能力,通常也用QPS(query per second)來衡量。上述三個性能指標往往會相互制約,追求高吞吐的系統,往往很難做到低延遲;系統平均響應時間較長時,也很難提高QPS。
2、可用性:系統的可用性(availability)指系統在面對各種異常時可以正確提供服務的能力。
系統的可用性可以用系統停服務的時間與正常服務的時間的比例來衡量,也可以用某功能的失敗次數與成功次數的比例來衡量。可用性是分布式的重要指標,衡量了系統的魯棒性,是系統容錯能力的體現。
3、可擴展性:系統的可擴展性(scalability)指分布式系統通過擴展集群機器規模提高系統性能(吞吐、延遲、並發)、存儲容量、計算能力的特性。
好的分布式系統總在追求「線性擴展性」,也就是使得系統的某一指標可以隨著集群中的機器數量線性增長。
4、一致性:分布式系統為了提高可用性,總是不可避免的使用副本的機制,從而引發副本一致性的問題。越是強的一致的性模型,對於用戶使用來說使用起來越簡單。
Ⅱ 五大常見的MySQL高可用方案(最全)
1. 概述
我們在考慮MySQL資料庫的高可用的架構時,主要要考慮如下幾方面:
如果資料庫發生了宕機或者意外中斷等故障,能盡快恢復資料庫的可用性,盡可能的減少停機時間,保證業務不會因為資料庫的故障而中斷。
用作備份、只讀副本等功能的非主節點的數據應該和主節點的數據實時或者最終保持一致。
當業務發生資料庫切換時,切換前後的資料庫內容應當一致,不會因為數據缺失或者數據不一致而影響業務。
關於對高可用的分級在這里我們不做詳細的討論,這里只討論常用高可用方案的優缺點以及高可用方案的選型。
2. 高可用方案
2.1. 主從或主主半同步復制
使用雙節點資料庫,搭建單向或者雙向的半同步復制。在5.7以後的版本中,由於lossless replication、logical多線程復制等一些列新特性的引入,使得MySQL原生半同步復制更加可靠。
常見架構如下:
通常會和proxy、keepalived等第三方軟體同時使用,即可以用來監控資料庫的 健康 ,又可以執行一系列管理命令。如果主庫發生故障,切換到備庫後仍然可以繼續使用資料庫。
優點:
架構比較簡單,使用原生半同步復製作為數據同步的依據;
雙節點,沒有主機宕機後的選主問題,直接切換即可;
雙節點,需求資源少,部署簡單;
缺點:
完全依賴於半同步復制,如果半同步復制退化為非同步復制,數據一致性無法得到保證;
需要額外考慮haproxy、keepalived的高可用機制。
2.2. 半同步復制優化
半同步復制機制是可靠的。如果半同步復制一直是生效的,那麼便可以認為數據是一致的。但是由於網路波動等一些客觀原因,導致半同步復制發生超時而切換為非同步復制,那麼這時便不能保證數據的一致性。所以盡可能的保證半同步復制,便可提高數據的一致性。
該方案同樣使用雙節點架構,但是在原有半同復制的基礎上做了功能上的優化,使半同步復制的機制變得更加可靠。
可參考的優化方案如下:
2.2.1. 雙通道復制
半同步復制由於發生超時後,復制斷開,當再次建立起復制時,同時建立兩條通道,其中一條半同步復制通道從當前位置開始復制,保證從機知道當前主機執行的進度。另外一條非同步復制通道開始追補從機落後的數據。當非同步復制通道追趕到半同步復制的起始位置時,恢復半同步復制。
2.2.2. binlog文件伺服器
搭建兩條半同步復制通道,其中連接文件伺服器的半同步通道正常情況下不啟用,當主從的半同步復制發生網路問題退化後,啟動與文件伺服器的半同步復制通道。當主從半同步復制恢復後,關閉與文件伺服器的半同步復制通道。
優點:
雙節點,需求資源少,部署簡單;
架構簡單,沒有選主的問題,直接切換即可;
相比於原生復制,優化後的半同步復制更能保證數據的一致性。
缺點:
需要修改內核源碼或者使用mysql通信協議。需要對源碼有一定的了解,並能做一定程度的二次開發。
依舊依賴於半同步復制,沒有從根本上解決數據一致性問題。
2.3. 高可用架構優化
將雙節點資料庫擴展到多節點資料庫,或者多節點資料庫集群。可以根據自己的需要選擇一主兩從、一主多從或者多主多從的集群。
由於半同步復制,存在接收到一個從機的成功應答即認為半同步復製成功的特性,所以多從半同步復制的可靠性要優於單從半同步復制的可靠性。並且多節點同時宕機的幾率也要小於單節點宕機的幾率,所以多節點架構在一定程度上可以認為高可用性是好於雙節點架構。
但是由於資料庫數量較多,所以需要資料庫管理軟體來保證資料庫的可維護性。可以選擇MMM、MHA或者各個版本的proxy等等。常見方案如下:
2.3.1. MHA+多節點集群
MHA Manager會定時探測集群中的master節點,當master出現故障時,它可以自動將最新數據的slave提升為新的master,然後將所有其他的slave重新指向新的master,整個故障轉移過程對應用程序完全透明。
MHA Node運行在每台MySQL伺服器上,主要作用是切換時處理二進制日誌,確保切換盡量少丟數據。
MHA也可以擴展到如下的多節點集群:
優點:
可以進行故障的自動檢測和轉移;
可擴展性較好,可以根據需要擴展MySQL的節點數量和結構;
相比於雙節點的MySQL復制,三節點/多節點的MySQL發生不可用的概率更低
缺點:
至少需要三節點,相對於雙節點需要更多的資源;
邏輯較為復雜,發生故障後排查問題,定位問題更加困難;
數據一致性仍然靠原生半同步復制保證,仍然存在數據不一致的風險;
可能因為網路分區發生腦裂現象;
2.3.2. zookeeper+proxy
Zookeeper使用分布式演算法保證集群數據的一致性,使用zookeeper可以有效的保證proxy的高可用性,可以較好的避免網路分區現象的產生。
優點:
較好的保證了整個系統的高可用性,包括proxy、MySQL;
擴展性較好,可以擴展為大規模集群;
缺點:
數據一致性仍然依賴於原生的mysql半同步復制;
引入zk,整個系統的邏輯變得更加復雜;
2.4. 共享存儲
共享存儲實現了資料庫伺服器和存儲設備的解耦,不同資料庫之間的數據同步不再依賴於MySQL的原生復制功能,而是通過磁碟數據同步的手段,來保證數據的一致性。
2.4.1. SAN共享儲存
SAN的概念是允許存儲設備和處理器(伺服器)之間建立直接的高速網路(與LAN相比)連接,通過這種連接實現數據的集中式存儲。常用架構如下:
使用共享存儲時,MySQL伺服器能夠正常掛載文件系統並操作,如果主庫發生宕機,備庫可以掛載相同的文件系統,保證主庫和備庫使用相同的數據。
優點:
兩節點即可,部署簡單,切換邏輯簡單;
很好的保證數據的強一致性;
不會因為MySQL的邏輯錯誤發生數據不一致的情況;
缺點:
需要考慮共享存儲的高可用;
價格昂貴;
2.4.2. DRBD磁碟復制
DRBD是一種基於軟體、基於網路的塊復制存儲解決方案,主要用於對伺服器之間的磁碟、分區、邏輯卷等進行數據鏡像,當用戶將數據寫入本地磁碟時,還會將數據發送到網路中另一台主機的磁碟上,這樣的本地主機(主節點)與遠程主機(備節點)的數據就可以保證實時同步。常用架構如下:
當本地主機出現問題,遠程主機上還保留著一份相同的數據,可以繼續使用,保證了數據的安全。
DRBD是linux內核模塊實現的快級別的同步復制技術,可以與SAN達到相同的共享存儲效果。
優點:
兩節點即可,部署簡單,切換邏輯簡單;
相比於SAN儲存網路,價格低廉;
保證數據的強一致性;
缺點:
對io性能影響較大;
從庫不提供讀操作;
2.5. 分布式協議
分布式協議可以很好解決數據一致性問題。比較常見的方案如下:
2.5.1. MySQL cluster
MySQL cluster是官方集群的部署方案,通過使用NDB存儲引擎實時備份冗餘數據,實現資料庫的高可用性和數據一致性。
優點:
全部使用官方組件,不依賴於第三方軟體;
可以實現數據的強一致性;
缺點:
國內使用的較少;
配置較復雜,需要使用NDB儲存引擎,與MySQL常規引擎存在一定差異;
至少三節點;
2.5.2. Galera
基於Galera的MySQL高可用集群, 是多主數據同步的MySQL集群解決方案,使用簡單,沒有單點故障,可用性高。常見架構如下:
優點:
多主寫入,無延遲復制,能保證數據強一致性;
有成熟的社區,有互聯網公司在大規模的使用;
自動故障轉移,自動添加、剔除節點;
缺點:
需要為原生MySQL節點打wsrep補丁
只支持innodb儲存引擎
至少三節點;
2.5.3. POAXS
Paxos 演算法解決的問題是一個分布式系統如何就某個值(決議)達成一致。這個演算法被認為是同類演算法中最有效的。Paxos與MySQL相結合可以實現在分布式的MySQL數據的強一致性。常見架構如下:
優點:
多主寫入,無延遲復制,能保證數據強一致性;
有成熟理論基礎;
自動故障轉移,自動添加、剔除節點;
缺點:
只支持innodb儲存引擎
至少三節點;
3. 總結
隨著人們對數據一致性的要求不斷的提高,越來越多的方法被嘗試用來解決分布式數據一致性的問題,如MySQL自身的優化、MySQL集群架構的優化、Paxos、Raft、2PC演算法的引入等等。
而使用分布式演算法用來解決MySQL資料庫數據一致性的問題的方法,也越來越被人們所接受,一系列成熟的產品如PhxSQL、MariaDB Galera Cluster、Percona XtraDB Cluster等越來越多的被大規模使用。
隨著官方MySQL Group Replication的GA,使用分布式協議來解決數據一致性問題已經成為了主流的方向。期望越來越多優秀的解決方案被提出,MySQL高可用問題可以被更好的解決。
Ⅲ php的memcached分布式hash演算法,如何解決分布不均crc32這個演算法沒辦法把key值均勻的分布出去
memcached的總結和分布式一致性hash
當前很多大型的web系統為了減輕資料庫伺服器負載,會採用memchached作為緩存系統以提高響應速度。
目錄: (http://hounwang.com/lesson.html)
memchached簡介
hash
取模
一致性hash
虛擬節點
源碼解析
參考資料
1. memchached簡介
memcached是一個開源的高性能分布式內存對象緩存系統。
其實思想還是比較簡單的,實現包括server端(memcached開源項目一般只單指server端)和client端兩部分:
server端本質是一個in-memory key-value store,通過在內存中維護一個大的hashmap用來存儲小塊的任意數據,對外通過統一的簡單介面(memcached protocol)來提供操作。
client端是一個library,負責處理memcached protocol的網路通信細節,與memcached server通信,針對各種語言的不同實現分裝了易用的API實現了與不同語言平台的集成。
web系統則通過client庫來使用memcached進行對象緩存。
2. hash
memcached的分布式主要體現在client端,對於server端,僅僅是部署多個memcached server組成集群,每個server獨自維護自己的數據(互相之間沒有任何通信),通過daemon監聽埠等待client端的請求。
而在client端,通過一致的hash演算法,將要存儲的數據分布到某個特定的server上進行存儲,後續讀取查詢使用同樣的hash演算法即可定位。
client端可以採用各種hash演算法來定位server:
取模
最簡單的hash演算法
targetServer = serverList[hash(key) % serverList.size]
直接用key的hash值(計算key的hash值的方法可以自由選擇,比如演算法CRC32、MD5,甚至本地hash系統,如java的hashcode)模上server總數來定位目標server。這種演算法不僅簡單,而且具有不錯的隨機分布特性。
但是問題也很明顯,server總數不能輕易變化。因為如果增加/減少memcached server的數量,對原先存儲的所有key的後續查詢都將定位到別的server上,導致所有的cache都不能被命中而失效。
一致性hash
為了解決這個問題,需要採用一致性hash演算法(consistent hash)
相對於取模的演算法,一致性hash演算法除了計算key的hash值外,還會計算每個server對應的hash值,然後將這些hash值映射到一個有限的值域上(比如0~2^32)。通過尋找hash值大於hash(key)的最小server作為存儲該key數據的目標server。如果找不到,則直接把具有最小hash值的server作為目標server。
為了方便理解,可以把這個有限值域理解成一個環,值順時針遞增。
如上圖所示,集群中一共有5個memcached server,已通過server的hash值分布到環中。
如果現在有一個寫入cache的請求,首先計算x=hash(key),映射到環中,然後從x順時針查找,把找到的第一個server作為目標server來存儲cache,如果超過了2^32仍然找不到,則命中第一個server。比如x的值介於A~B之間,那麼命中的server節點應該是B節點
可以看到,通過這種演算法,對於同一個key,存儲和後續的查詢都會定位到同一個memcached server上。
那麼它是怎麼解決增/刪server導致的cache不能命中的問題呢?
假設,現在增加一個server F,如下圖
此時,cache不能命中的問題仍然存在,但是只存在於B~F之間的位置(由C變成了F),其他位置(包括F~C)的cache的命中不受影響(刪除server的情況類似)。盡管仍然有cache不能命中的存在,但是相對於取模的方式已經大幅減少了不能命中的cache數量。
虛擬節點
但是,這種演算法相對於取模方式也有一個缺陷:當server數量很少時,很可能他們在環中的分布不是特別均勻,進而導致cache不能均勻分布到所有的server上。
如圖,一共有3台server – 1,2,4。命中4的幾率遠遠高於1和2。
為解決這個問題,需要使用虛擬節點的思想:為每個物理節點(server)在環上分配100~200個點,這樣環上的節點較多,就能抑制分布不均勻。
當為cache定位目標server時,如果定位到虛擬節點上,就表示cache真正的存儲位置是在該虛擬節點代表的實際物理server上。
另外,如果每個實際server的負載能力不同,可以賦予不同的權重,根據權重分配不同數量的虛擬節點。
// 採用有序map來模擬環
this.consistentBuckets = new TreeMap();
MessageDigest md5 = MD5.get();//用MD5來計算key和server的hash值
// 計算總權重
if ( this.totalWeight for ( int i = 0; i < this.weights.length; i++ )
this.totalWeight += ( this.weights[i] == null ) ? 1 : this.weights[i];
} else if ( this.weights == null ) {
this.totalWeight = this.servers.length;
}
// 為每個server分配虛擬節點
for ( int i = 0; i < servers.length; i++ ) {
// 計算當前server的權重
int thisWeight = 1;
if ( this.weights != null && this.weights[i] != null )
thisWeight = this.weights[i];
// factor用來控制每個server分配的虛擬節點數量
// 權重都相同時,factor=40
// 權重不同時,factor=40*server總數*該server權重所佔的百分比
// 總的來說,權重越大,factor越大,可以分配越多的虛擬節點
double factor = Math.floor( ((double)(40 * this.servers.length * thisWeight)) / (double)this.totalWeight );
for ( long j = 0; j < factor; j++ ) {
// 每個server有factor個hash值
// 使用server的域名或IP加上編號來計算hash值
// 比如server - "172.45.155.25:11111"就有factor個數據用來生成hash值:
// 172.45.155.25:11111-1, 172.45.155.25:11111-2, ..., 172.45.155.25:11111-factor
byte[] d = md5.digest( ( servers[i] + "-" + j ).getBytes() );
// 每個hash值生成4個虛擬節點
for ( int h = 0 ; h < 4; h++ ) {
Long k =
((long)(d[3+h*4]&0xFF) << 24)
| ((long)(d[2+h*4]&0xFF) << 16)
| ((long)(d[1+h*4]&0xFF) << 8 )
| ((long)(d[0+h*4]&0xFF));
// 在環上保存節點
consistentBuckets.put( k, servers[i] );
}
}
// 每個server一共分配4*factor個虛擬節點
}
// 採用有序map來模擬環
this.consistentBuckets = new TreeMap();
MessageDigest md5 = MD5.get();//用MD5來計算key和server的hash值
// 計算總權重
if ( this.totalWeight for ( int i = 0; i < this.weights.length; i++ )
this.totalWeight += ( this.weights[i] == null ) ? 1 : this.weights[i];
} else if ( this.weights == null ) {
this.totalWeight = this.servers.length;
}
// 為每個server分配虛擬節點
for ( int i = 0; i < servers.length; i++ ) {
// 計算當前server的權重
int thisWeight = 1;
if ( this.weights != null && this.weights[i] != null )
thisWeight = this.weights[i];
// factor用來控制每個server分配的虛擬節點數量
// 權重都相同時,factor=40
// 權重不同時,factor=40*server總數*該server權重所佔的百分比
// 總的來說,權重越大,factor越大,可以分配越多的虛擬節點
double factor = Math.floor( ((double)(40 * this.servers.length * thisWeight)) / (double)this.totalWeight );
for ( long j = 0; j < factor; j++ ) {
// 每個server有factor個hash值
// 使用server的域名或IP加上編號來計算hash值
// 比如server - "172.45.155.25:11111"就有factor個數據用來生成hash值:
// 172.45.155.25:11111-1, 172.45.155.25:11111-2, ..., 172.45.155.25:11111-factor
byte[] d = md5.digest( ( servers[i] + "-" + j ).getBytes() );
// 每個hash值生成4個虛擬節點
for ( int h = 0 ; h < 4; h++ ) {
Long k =
((long)(d[3+h*4]&0xFF) << 24)
| ((long)(d[2+h*4]&0xFF) << 16)
| ((long)(d[1+h*4]&0xFF) << 8 )
| ((long)(d[0+h*4]&0xFF));
// 在環上保存節點
consistentBuckets.put( k, servers[i] );
}
}
// 每個server一共分配4*factor個虛擬節點
}
// 用MD5來計算key的hash值
MessageDigest md5 = MD5.get();
md5.reset();
md5.update( key.getBytes() );
byte[] bKey = md5.digest();
// 取MD5值的低32位作為key的hash值
long hv = ((long)(bKey[3]&0xFF) << 24) | ((long)(bKey[2]&0xFF) << 16) | ((long)(bKey[1]&0xFF) << 8 ) | (long)(bKey[0]&0xFF);
// hv的tailMap的第一個虛擬節點對應的即是目標server
SortedMap tmap = this.consistentBuckets.tailMap( hv );
return ( tmap.isEmpty() ) ? this.consistentBuckets.firstKey() : tmap.firstKey();
更多問題到問題求助專區(http://bbs.hounwang.com/)
Ⅳ 剛剛了解,誰能告訴我區塊鏈是什麼通俗解釋一下區塊鏈技術的方法
大家共同記賬的方式,也被稱為「分布式」或「去中心化」,因為人人都記賬,且賬本的准確性由程式演算法決定,而非某個權威機構。
這就是區塊鏈,核心講完了,區塊鏈就這么簡單,一個共同記賬的賬本
區塊鏈技術六大核心演算法:
區塊鏈核心演算法一:拜占庭協定
拜占庭的故事大概是這么說的:拜占庭帝國擁有巨大的財富,周圍10個鄰邦垂誕已久,但拜占庭高牆聳立,固若金湯,沒有一個單獨的鄰邦能夠成功入侵。任何單個鄰邦入侵的都會失敗,同時也有可能自身被其他9個鄰邦入侵。拜占庭帝國防禦能力如此之強,至少要有十個鄰邦中的一半以上同時進攻,才有可能攻破。然而,如果其中的一個或者幾個鄰邦本身答應好一起進攻,但實際過程出現背叛,那麼入侵者可能都會被殲滅。於是每一方都小心行事,不敢輕易相信鄰國。這就是拜占庭將軍問題。
區塊鏈核心演算法二:非對稱加密技術
在上述拜占庭協定中,如果10個將軍中的幾個同時發起消息,勢必會造成系統的混亂,造成各說各的攻擊時間方案,行動難以一致。誰都可以發起進攻的信息,但由誰來發出呢?其實這只要加入一個成本就可以了,即:一段時間內只有一個節點可以傳播信息。當某個節點發出統一進攻的消息後,各個節點收到發起者的消息必須簽名蓋章,確認各自的身份。
區塊鏈核心演算法三:容錯問題
我們假設在此網路中,消息可能會丟失、損壞、延遲、重復發送,並且接受的順序與發送的順序不一致。此外,節點的行為可以是任意的:可以隨時加入、退出網路,可以丟棄消息、偽造消息、停止工作等,還可能發生各種人為或非人為的故障。我們的演算法對由共識節點組成的共識系統,提供的容錯能力,這種容錯能力同時包含安全性和可用性,並適用於任何網路環境。
區塊鏈核心演算法四:Paxos 演算法(一致性演算法)
Paxos演算法解決的問題是一個分布式系統如何就某個值(決議)達成一致。一個典型的場景是,在一個分布式資料庫系統中,如果各節點的初始狀態一致,每個節點都執行相同的操作序列,那麼他們最後能得到一個一致的狀態。為保證每個節點執行相同的命令序列,需要在每一條指令上執行一個「一致性演算法」以保證每個節點看到的指令一致。一個通用的一致性演算法可以應用在許多場景中,是分布式計算中的重要問題。 節點通信存在兩種模型:共享內存和消息傳遞。Paxos演算法就是一種基於消息傳遞模型的一致性演算法。
區塊鏈核心演算法五:共識機制
區塊鏈共識演算法主要是工作量證明和權益證明。拿比特幣來說,其實從技術角度來看可以把PoW看成重復使用的Hashcash,生成工作量證明在概率上來說是一個隨機的過程。開采新的機密貨幣,生成區塊時,必須得到所有參與者的同意,那礦工必須得到區塊中所有數據的PoW工作證明。與此同時礦工還要時時觀察調整這項工作的難度,因為對網路要求是平均每10分鍾生成一個區塊。
區塊鏈核心演算法六:分布式存儲是一種數據存儲技術,通過網路使用每台機器上的磁碟空間,並將這些分散的存儲資源構成一個虛擬的存儲設備,數據分散的存儲在網路中的各個角落。所以,分布式存儲技術並不是每台電腦都存放完整的數據,而是把數據切割後存放在不同的電腦里。就像存放100個雞蛋,不是放在同一個籃子里,而是分開放在不同的地方,加起來的總和是100個。想了解更多可以多利用網路搜索,網路搜索結果-小知識
Ⅳ 微服務架構的分布式事務問題如何處理
分布式系統架構中,分布式事務問題是一個繞不過去的挑戰。而微服務架構的流行,讓分布式事問題日益突出!
下面我們以電商購物支付流程中,在各大參與者系統中可能會遇到分布式事務問題的場景進行詳細的分析!