為了在區域性性的基礎上實現分散,常用的方法叫做partitioning(分割槽)。partitioning就是將乙個資料庫分割到多台伺服器上。分割的方法很多,最簡單的就是「
以表為單位進行分割
」。比如entry和bookmark表經常同時訪問,因此放到同一臺伺服器上。其他幾個同類表也放到同一臺伺服器1上,這樣幾個表每個大小約2gb,這樣準備一台16gb左右記憶體的機器,就能將全部表放在記憶體上。tag和keyword表都很大,都有10gb左右。將他們放伺服器1的話,16gb記憶體就無法全部快取了。因此將他們放在伺服器2上了。
其他的方法還有「
從資料的中間分割
」。將某個特定的表分割為多個小表,這就是從資料中間分割。具體來說就是根據id(id:~)的起始字母進行分割槽。例如id的起始字母為a~c的人的資料在伺服器1上。d~f的資料在伺服器2上。所以id:naoya就在n~p的伺服器上。id:yaotti跟我的id:naoya不同,放在其他伺服器上。基本上就是這樣分割。 這種分割方式的問題是,當需要改變粒度時,必須將資料合併一次,十分麻煩。除此之外,應用程式只需做一點改動,根據id開頭字母決定訪問哪個資料庫實現起來很簡單。
還有個有點特別的方式---「
根據使用者將系統分成島
」。指的是根據http請求的user-agent和url進行分割。例如,一般使用者分配到島1,部分api請求分配到島2,google bot,yahoo!等爬蟲則分配到島3。之所以這樣分配是因為爬蟲會訪問很久很久以前的網頁,這種情況下快取很難奏效。
只有在大量請求同一頁面時,才容易通過快取提高效能
,對於這種大範圍訪問,快取也無能為力。相反一般使用者的訪問通常幾種在首頁或熱門鏈結頁面等最新或最受歡迎的頁面上,訪問十分頻繁,很容易快取。
這樣,將容易快取的請求和不容易快取的請求放在不同的島上處理,整體快取效率就會提高。
分布式 分布式鎖
本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...
分布式 分布式事務
是資料庫執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。事務的acid四大特性 原子性 atomicity 事務作為乙個整體被執行。一致性 consistency 從乙個一致的狀態轉換到另乙個一致的狀態。隔離性 isolation 多個事務併發執行時,併發事務之間互相影響的程度。永續性 d...
分布式之分布式事務
被人問到分布式事務,之前學rabbitmq 的時候學到過rabbitmq 高階的事務,因為沒有用過,所有沒有回答好。這裡總結一下。1.單機版事務。事務的四大特性 acid a.原子性 b.一致性 c.隔離性 d.永續性 單機事務可以通過設定事務的隔離級別 參見spring 的事務隔離級別 2.分布式...