memcached分布クラスタのアクセスアルゴリズム

4995 ワード

まず、分散クラスタとは何かを宣言します.私が書いたこのmemcachedアクセスのアルゴリズムはクラスタに適応することができて、分布式に適応することができて、ただ1つの概念の問題で、みんなはあまり葛藤する必要はありません!
私たちが達成しなければならない目的は、キャッシュを2台の異なるサーバの上に構築されたmemcachedに置くことです.だから、2つのmemcachedに同じデータが置かれている場合は、クラスタです.ビジネスによって異なるデータが置かれている場合は、分散式です.ここで言うのは分布式のアルゴリズムで、分布式とクラスタはただ1つのコードの違いにすぎません!
    
memcached分散環境の構築:
   
public class CacheHelper
    {
        //          ,         。

        private static Dictionary<string, string> Servers = new Dictionary<string, string>();
        static MemcachedClient mc = null;
        static object LOCK_OBJECT = new object();//    
 
        /// <summary>
        ///       
        /// </summary>
        static CacheHelper()
        {
            InitServer();
            //List<string> keys = Servers.Keys.ToList<string>();
            foreach (var k in Servers.Keys)
            {
                SockIOPool pool = SockIOPool.GetInstance(k);
                string[] s = new string[] { Servers[k] };
                pool.SetServers(s);//     
                pool.MaxConnections = 10000;
                pool.MinConnections = 10;
                pool.Initialize();//        
            }          
        }
 
 
        /// <summary>
        ///         ,         
        /// </summary>
        static void InitServer() {
            //      ,           
            Servers.Add("Svr1", ConfigurationManager.AppSettings["Svr1"]);
            Servers.Add("Svr2", ConfigurationManager.AppSettings["Svr2"]);
        }
 
 
        #region           2016 2 24 19:58:40
        public static MemcachedClient GetClient(string server)
        {
            MemcachedClient current = Singleton<MemcachedClient>.Instance;
           // MemcachedClient current = MemcachedClient.Instance;
            current.PoolName = server;
            return current;
        }
        #endregion
}

Memcached分布式の欠陥処理:
     
Memcachedサーバとサーバとの間には通信がなく、データコピーバックアップが行われないため、サーバノードに障害が発生すると、システムがクラッシュする可能性があります.これは、単一の障害が発生することを示しています.
構築する分散型単一の障害を予防するには、サーバアクセスを指定する必要があります(アクセスを指定することもmemcachedクラスタのキーです).これにより、ビジネスに応じて異なるサーバの上に置くだけでなく、1台のサーバでバックアップを行うことができます.しかしmemcachedClientという下位クラスにはサーバキャッシュを指定する方法がないので、自分でカプセル化しなければなりません!
ここでは、指定されたサーバ・ストレージをカプセル化するアルゴリズムを1つだけ示します.
   
 #region SetTo()              2016-2-26 17:09:53
        /// <summary>
        ///            
        /// </summary>
        /// <param name="server">   ,            IP  </param>
        /// <param name="key"></param>
        /// <param name="value"></param>
        public static void SetTo(string server, string key, object value)
        {
            MemcachedClient client = GetClient(server);
            client.PoolName = server;
            client.Set(key, value);
        }
        #endregion

指定サーバが取るアルゴリズムも似ていますが、ここでは与えません!
分散型アクセスのアルゴリズム:
    
実は本当にプロジェクトをする時、このアルゴリズムは具体的な業務によってカプセル化されています.私はここでただ例を作って、アルゴリズムを書く論理を説明します.
格納アルゴリズム:
            
#region         memcached     2016-2-26 16:31:21
            Dictionary<string, object> dic = new Dictionary<string, object>();
            Person person = new Person { UserId = "1", UserName = "   " };
            Dongdong dong = new Dongdong { UserId = "2", UserName = "  " };
            int i = 1;
            dic.Add("5", dong);
            dic.Add("6", dong);
            dic.Add("7", dong);
            dic.Add("8", dong);
 
            foreach (var item in dic)
            {
               //    
                if (i % 2 == 0)
                {
                    //6/8
                    CacheHelper.SetTo("Svr1", item.Key, item.Value);
                }
                else
                {
                    //5/7
                    CacheHelper.SetTo("Svr2", item.Key, item.Value);
                }
                i++;
            }
            #endregion

取り出しアルゴリズム:
#region          
            if (CacheHelper.IsServersExists("Svr2", "8") == true)//    KEY   
            {
                //            
                Dongdong cc = CacheHelper.GetCounterFrom("Svr2", "8") as Dongdong;
                textBox1.Text = cc.UserId.ToString() + ";" + cc.UserName.ToString();
            }
            else
            {
//           
                Dongdong cc = CacheHelper.GetCounterFrom("Svr1", "8") as Dongdong;
                textBox1.Text = cc.UserId.ToString() + ";" + cc.UserName.ToString();
            }
            #endregion

小総:
           
一つのものを研究するのは原理だけを知っていればいいのではなく、多くの資料を調べてから、あなたのニーズに合ったものを調べることができます.だからあきらめないで、休むことができて、しかし堅持しなければなりません!