組建MySQL集羣的幾種方案
LVS+Keepalived+MySQL(有腦裂問題?但彷佛不少人推薦這個)
DRBD+Heartbeat+MySQL(有一臺機器空餘?Heartbeat切換時間較長?有腦裂問題?)
MySQL Proxy(不夠成熟與穩定?使用了Lua?是否是用了他作分表則能夠不用更改客戶端邏輯?)
MySQL Cluster (社區版不支持INNODB引擎?商用案例不足?)
MySQL + MHA (若是配上異步複製,彷佛是不錯的選擇,又和問題?)
MySQL + MMM (彷佛反映有不少問題,未實踐過,誰能給個說法)node
回答:mysql
無論哪一種方案都是有其場景限制 或說 規模限制,以及優缺點的。算法
1. 首先反對你們作讀寫分離,關於這方面的緣由解釋太屢次數(增長技術複雜度、可能致使讀到落後的數據等),只說一點:99.8%的業務場景沒有必要作讀寫分離,只要作好數據庫設計優化 和配置合適正確的主機便可。sql
2.Keepalived+MySQL --確實有腦裂的問題,還沒法作到準確判斷mysqld是否HANG的狀況;數據庫
3.DRBD+Heartbeat+MySQL --一樣有腦裂的問題,還沒法作到準確判斷mysqld是否HANG的狀況,且DRDB是不須要的,增長反而會出問題;後端
3.MySQL Proxy -- 不錯的項目,惋惜官方半途夭折了,不建議用,沒法高可用,是一個寫分離;服務器
4.MySQL Cluster -- 社區版本不支持NDB是錯誤的言論,商用案例確實很少,主要是跟其業務場景要求有關係、這幾年發展有點亂不過如今已經上正規了、對網絡要求高;網絡
5.MySQL + MHA -- 能夠解決腦裂的問題,須要的IP多,小集羣是能夠的,可是管理大的就麻煩,其次MySQL + MMM 的話且坑不少,有MHA就不必採用MMM架構
建議:
1.如果雙主複製的模式,不用作數據拆分,那麼就能夠選擇MHA或 Keepalive 或 heartbeat
2.如果雙主複製,還作了數據的拆分,則能夠考慮採用Cobar;
3.如果雙主複製+Slave,還作了數據的拆分,須要讀寫分類,能夠考慮Amoeba;併發
高可用性 :比較高
高可擴展性 :無
高一致性 :比較高
延遲性 :比較小
併發性 :無
事務性 :無
吞吐率 :比較高
數據丟失 :不丟失
可切換 :能夠切換
高可用性 :比較高
高可擴展性 :無
高一致性 :比較高
延遲性 :比較小
併發性 :無
事務性 :無
吞吐率 :比較高
數據丟失 :不丟失
可切換 :能夠切換
高可用性 : 很高
高可擴展性 : 可擴展,不能大規模擴展,也無需大規模擴展
高一致性 : 比較高
延遲性 : 比較大
併發性 : 比較小
事務性 : 有
吞吐率 : 比較小
數據丟失 : 不丟失
可切換 : 無關
高可用性 : 很高
高可擴展性 : 無關 可擴展,不能大規模擴展,也無需大規模擴展
高一致性 : 很高
延遲性 : 比較大
併發性 : 比較小
事務性 : 有
吞吐率 : 比較小
數據丟失 : 不丟失
可切換 : 無關
以上純屬我的理解,若有異議,也是沒問題的;
另外按照master是否服務具體業務來分分佈式能夠分爲兩類:
基於這些方案的特色,如何設計一個牛逼滴分佈式系統 ?
這裏的牛逼包括
好了 你能夠開始噴了 , 怎麼可能。
paxos一致性協議,可用性很高,一致性很高,事務性很不錯 , 那麼涉及到各類服務均可以用他,很是好。
master和metadata元數據採用paxos一致性協議,全部節點也採用paxos一致性協議 , 客戶端保持這些信息。架構以下所示 ,master, metadata, node 都實現了paxos協議,也即經過paxos接口訪問
分佈式數據庫就是一個例子,貌似目前流行的數據庫都尚未支持paxos協議的,有誰能夠開發下。節點採用paxos的話,有個問題沒想清楚,paxos如何sql結合使用?另外節點的性能會受一點影響。下降一點要求吧,節點採用主主複製,或者環形複製吧。master檢查節點存活,而且作切換,通知客戶端。
架構以下所示 ,master, metadata,實現了paxos協議,也即經過paxos接口訪問;node的各個節點是複製關係,服務節點掛掉的時候,須要master檢測,而且作切換處理。
若是是分佈式系統,好比文件系統,或者本身開發的系統, 那節點能夠考慮用paxos協議哦。 每一個節點採用3個實例,或者你有資源,採用5個實例。
分佈式數據庫的sql實現
也是一個難點,即一個複雜的sql,如何實現?
子句的處理邏輯和處理順序 :
鏈接,包括內鏈接,左鏈接,右鏈接,半鏈接,外鏈接
以以下sql爲例:
某一註冊時間範圍內的用戶的全部登陸信息
select t1.u_id,t1.u_name,t2.login_product
from tab_user_info t1 join tab_login_info t2
on (t1.u_id=t2.u_id and t1.u_reg_dt>=? and t1.u_reg_dt<=?)
生成的執行計劃爲:
因爲是join,全部的表都要進行查詢操做,而且爲每張表打上本身的標籤,具體實施的時候能夠加個表名字字段,在全部存儲節點上執行
select u_id,u_name from tab_user_info t where u_reg_dt>=? and t1.u_reg_dt<=?
select u_id, login_product from tab_login_info t
執行完成以後,這種狀況下因爲須要按照u_id進行數據洗牌,考慮到u_id的惟一值比較多,因此各個存儲節點上須要按照u_id進行劃分,
例若有N個計算節點,那麼按照(最大u_id-最小u_id)/N平均劃分,將不一樣存儲節點上的同一範圍的u_id,劃分到同一個計算節點上
而後在計算節點上執行以下操做
select t1.u_id,t1.u_name,t2.login_product
from tab_user_info t1 join tab_login_info t2
on (t1.u_id=t2.u_id)
關於分佈式sql如何實現的問題,有不少未盡事宜。有興趣的能夠相互討論。歡迎切磋
幾點補充:
1.對於須要嚴格保證強一致的場合來講,至少在 MySQL 5.7 以前,DRBD 仍是有意義的。5.7 聽說能實現真同步複製,若真能實現,就再也不須要 DRBD 了。
2.網絡分區時的腦裂問題必須避免,應使用基於多數派的選舉算法來推選 Master。方案不少,好比用 ZooKeeper、etcd、Consul 等進行服務選舉,推選出 Master。
3.MHA 沒深刻了解過,但印象裏其 Master(Arbiter)節點貌似有單點問題?沒記錯的話此節點用於完成 MySQL 的主節點選舉工做,它本身不 HA 仍是有隱患。MySQL大型分佈式集羣一、主要解決針對大型網站架構中持久化部分中,大量數據存儲以及高併發訪問所帶來是數據讀寫問題。分佈式是將一個業務拆分爲多個子業務,部署在不一樣的服務器上。集羣是同一個業務,部署在多個服務器上。
二、着重對數據切分作了細緻豐富的講解,從數據切分的原理出發,一步一步深刻理解數據的切分,經過深刻理解各類切分策略來設計和優化咱們的系統。這部分中咱們還用到了數據庫中間件和客戶端組件來進行數據的切分,讓廣大網友可以對數據的切分從理論到實戰都會有一個質的飛躍。