首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 分散式快取實戰:Memcached 叢集部署、容錯策略與備援架構設計

     編輯:關於.NET

前言

Memcached 是高效能分散式記憶體快取系統。本文涵蓋 .NET 客戶端整合、連接池配置、基本操作封裝、三大容錯策略比較,以及備援叢集架構設計。

基本用法封裝


public User GetUser(int userId)
{
    UserInfo user = cacheService.Get("UserInfo:" + userId) as UserInfo;
    if (user == null)
    {
        user = dao.GetUser(userId);
        cacheService.Set("UserInfo:" + userId, user);
    }
    return user;
}

連接池初始化配置


string[] serverlist = { "192.168.1.11:11211", "192.168.1.12:11211", "192.168.1.13:11211" };

SockIOPool pool = SockIOPool.GetInstance();
pool.SetServers(serverlist);
pool.InitConnections = 3;
pool.MinConnections = 3;
pool.MaxConnections = 5;
pool.SocketConnectTimeout = 1000;
pool.SocketTimeout = 3000;
pool.MaintenanceSleep = 30; // 秒
pool.Failover = true;       // 容錯切換
pool.Nagle = false;         // 關閉 Nagle 演算法
pool.Initialize();

MemcachedProvider 介面實作


public class MemcachedProvider : ICache
{
    private MemcachedClient mc = new MemcachedClient();
    public void Set(string key, object o) { mc.Set(key, o); }
    public object Get(string key) { return mc.Get(key); }
}

Memcached 關鍵限制

資料分散機制

  • Client 端一致性雜湊演算法決定 Key 所屬節點
  • 3 台 4GB 節點 ≈ 12GB 可用快取 (視分散均勻度而定)
  • 演算法品質直接影響記憶體利用率與熱點分佈

Memcached UML 類別圖

三大節點失效容錯策略

策略一:熱備節點 (Hot Standby)

  • 應用程式零修改
  • 失效節點 IP 遷移至新啟動的備援節點
  • 缺點:切換期間快取不可用、拋出例外、資料庫壓力暴增

策略二:動態移除組態節點

  • 修改組態檔移除失效 IP,應用程式重啟生效
  • 缺點:需 Application Reset、運維複雜、不適合高可用需求

策略三:專用備援叢集 (推薦)

備援叢集物理節點圖

架構設計

  • 主叢集:3 台標準節點,負責正常讀寫
  • 備援叢集:1 台高規格節點 (更多記憶體、更強網路),完整鏡像所有快取資料
  • 寫入雙寫:同步寫入主叢集 + 非同步寫入備援叢集
  • 讀取優先主叢集,失敗回退備援叢集

雙連接池初始化


// 主叢集
SockIOPool pool = SockIOPool.GetInstance("NormalServers");
pool.SetServers(new[] { "192.168.1.11:11211", "192.168.1.12:11211", "192.168.1.13:11211" });
/* 相同配置 */ pool.Initialize();

// 備援叢集
SockIOPool backupPool = SockIOPool.GetInstance("BackupServers");
backupPool.SetServers(new[] { "192.168.1.14:11211" });
/* 相同配置 */ backupPool.Initialize();

雙寫/回退讀取實作


public class MemcachedProvider : ICache
{
    private static MemcachedClient GetNormalClient() 
    { var mc = new MemcachedClient(); mc.PoolName = "NormalServers"; return mc; }
    
    private static MemcachedClient GetBackupClient() 
    { var mc = new MemcachedClient(); mc.PoolName = "BackupServers"; return mc; }

    public void Set(string key, object o)
    {
        try { GetNormalClient().Set(key, o); }
        catch { /* 記錄/通知 */ }
        try { GetBackupClient().Set(key, o); } // 可改為非同步
        catch { /* 記錄/通知 */ }
    }

    public object Get(string key)
    {
        object o = null;
        try { o = GetNormalClient().Get(key); }
        catch { /* 記錄/通知 */ }
        if (o != null) return o;
        try { o = GetBackupClient().Get(key); }
        catch { /* 記錄/通知 */ }
        return o;
    }
}

策略比較總結

限制項目數值應對策略
Key 最大長度250 字元Key 設計規範、雜湊縮短
Value 最大大小1 MB客戶端分塊、壓縮、外部儲存
冗餘機制無內建應用層實作備援 (見下文)
策略實作複雜度停機時間資料一致性資源成本推薦場景
熱備節點低中 (IP 遷移)切換期間遺失低非關鍵快取、可容忍短暫失效
組態移除低長 (需重啟)完整低維護窗口充足、非 7x24
備援叢集中近零強一致 (雙寫)高 (額外節點)核心業務、高可用、金融/電商

作者:cnblogs Aaron

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved