MySQL能夠承受上億萬條的數據量的架構
最近做的搜索引擎的數據量是越來越大估計了下在中國可能涉及到的1Kw的數據量,就全球來說也就是1K億而已,最初是用的數據庫是MySQL現在來說要做些優化,最終使用的兩個方案很好用的。
1.讀寫分離;
2.縱向橫向拆分庫、表。
MySQL的基本功能中包括replication(復制)功能。所謂replication,就是確定master以及與之同步的slave服務器,再加上slave將master中寫入的內容polling過來更新自身內容的功能。這樣slave就是master的replica(復制品)。這樣就可以准備多台內容相同的服務器。
通過master和salve的replication,准備好多台服務器之后,讓應用程序服務器通過負載均衡器去處理查詢slave。這樣就能將查詢分散到多台服務器上。
應用程序實現上應該只把select等讀取之類的查詢發送給負載均衡器,而更新應當直接發送給master。要是在slave上執行更新操作,slave和master的內容就無法同步。MySQL會檢測到master和slave之間內容差異,並停止replication,這回導致系統故障。Slave可以采用LVS(linux系統自帶的負載均衡器)實現查詢的負載均衡。
使用MySQL的replication是利用的冗余化,實現冗余化需要實現的最小服務器數量是4台,三台slave和一台master,slave為什么是需要三台呢,比如一台slave死機了,現在需要修復再次上線,那么意味着你必須停止一台slave來復制MySQL的數據,如果只有兩台slave,一台壞了,你就必須停止服務,如果有三台,壞了一台,你復制數據時停止一台,還有一台可以運維。
對於數據的處理是能放入到內存中就盡量放入到內存中如果不能放入到內存中,可以利用MySQL的Partitioning。
Partitioning就是表分割也就是講A表和B表放在不同的服務器上。簡單來說,Partitioning就是充分利用局部性進行分割,提高緩存利用效率,從而實現Partitioning的效果。其中最重要的一點就是以Partitioning為前提設計的系統將表分割開,用RDBMS的方式的話,對於一對多的關系經常使用JOIN查詢將兩張表連接起來。但是如果將表分割開了之后,也就是兩張表不在同一個數據庫,不在同一個服務器上怎樣使用JOIN操作,這里需要注意的是如果是用where in操作不是省了一些麻煩了嘛。