现在的位置: 首页 > 综合 > 正文

ASP.NET版Memcached监控工具(转)

2013年04月03日 ⁄ 综合 ⁄ 共 4196字 ⁄ 字号 评论关闭

转自:http://blog.csdn.net/zhoufoxcn/archive/2011/03/29/6287304.aspx

在上一篇文章《使用Memcached提高.NET应用程序的性能》中周公讲述如何在.NET中使用Memcached来提高.NET应用程序的性能。在实际的使用中有可能出现Memcached因为某些不可预知的原因挂掉,一旦出现这样的情况,就会再次给数据库增加巨大的压力,因此需要监控Memcached的运行情况。周公在网上找过,在网上有PHP版的Memcached监控工具,打开那个PHP页面就可以看到各个Memcached的运行情况,一旦不能获取到这些数据,说明Memcached不可访问,不可访问的原因可能是因为网络故障或者Memcached挂掉了,虽然原因不同,但是结果是一样的。参照了Enyim Memcached和PHP版Memcached监控工具的实现,周公实现了一个.NET版的监控工具。
实现思路
上一篇文章《使用Memcached提高.NET应用程序的性能》中周公讲述了可以通过Telnet来获取Memcached的运行状况,通过"stats"命令得到Memcached的数据,如果得不到相应的数据就证明Memcached不可访问。
其中向Memcached发送"stats"命令得到的数据的意义如下:
pid:32u,服务器进程ID。 
uptime:32u, 服务器运行时间,单位秒。 
time :32u, 服务器当前的UNIX时间。
version :string, 服务器的版本号。 
curr_items :32u, 服务器当前存储的内容数量 Current number of items stored by the server 
total_items :32u, 服务器启动以来存储过的内容总数。
bytes :64u, 服务器当前存储内容所占用的字节数。
curr_connections :32u, 连接数量。 
total_connections :32u, 服务器运行以来接受的连接总数。
connection_structures:32u, 服务器分配的连接结构的数量。 
cmd_get :32u, 取回请求总数。 
cmd_set :32u, 存储请求总数。 
get_hits :32u, 请求成功的总次数。
get_misses :32u, 请求失败的总次数。
bytes_read :64u, 服务器从网络读取到的总字节数。
bytes_written :64u, 服务器向网络发送的总字节数。
limit_maxbytes :32u, 服务器在存储时被允许使用的字节总数。
上面的描述中32u和64u表示32位和64位无符号整数,string表示是string类型数据。
在本篇中我们通过Socket而不是Telnet连接到Memcached,然后解析返回的数据。
程序代码
为了便于管理和维护,在本示例中使用了单页模式,也就是所有的代码都在一个ASPX页面中,没有对应的aspx.cs页面。
程序代码如下:

  1. <%@ Page Language="C#" %>  
  2. <%@ Import Namespace="System" %>  
  3. <%@ Import Namespace="System.IO" %>  
  4. <%@ Import Namespace="System.Net" %>  
  5. <%@ Import Namespace="System.Net.Sockets" %>  
  6. <%@ Import Namespace="System.Collections.Generic" %>  
  7. <%@ Import Namespace="System.Threading" %>  
  8. <%@ Import Namespace="System.Security" %>  
  9. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  10.   
  11. <mce:script runat="server"><!--  
  12. /*  
  13.  * 作者:周公  
  14.  * 日期:2011-03-27  
  15.  * 原文出处:http://blog.csdn.net/zhoufoxcn 或http://zhoufoxcn.blog.51cto.com  
  16.  * 版权说明:本文可以在保留原文出处的情况下使用于非商业用途,周公对此不作任何担保或承诺。  
  17.  * */  
  18.       
  19.     /// <summary>  
  20.     /// Memcached服务器监控类  
  21.     /// </summary>  
  22.     public class MemcachedMonitor  
  23.     {  
  24.         /// <summary>  
  25.         /// 连接Memcached的超时时间  
  26.         /// </summary>  
  27.         public TimeSpan ConnectionTimeout { get; set; }  
  28.         /// <summary>  
  29.         /// 接收Memcached返回数据的超时时间  
  30.         /// </summary>  
  31.         public TimeSpan ReceiveTimeout { get; set; }  
  32.         private List<IPEndPoint> serverList;  
  33.         public MemcachedMonitor(ICollection<IPEndPoint> list)  
  34.         {  
  35.             ConnectionTimeout = TimeSpan.FromSeconds(10);  
  36.             ReceiveTimeout = TimeSpan.FromSeconds(20);  
  37.             serverList = new List<IPEndPoint>();  
  38.             serverList.AddRange(list);  
  39.         }  
  40.   
  41.         public List<MemcachedServerStats> GetAllServerStats()  
  42.         {  
  43.             List<MemcachedServerStats> resultList = new List<MemcachedServerStats>();  
  44.             foreach (IPEndPoint endPoint in serverList)  
  45.             {  
  46.                 resultList.Add(GetServerStats(endPoint, ConnectionTimeout, ReceiveTimeout));  
  47.             }  
  48.             return resultList;  
  49.         }  
  50.   
  51.         public static MemcachedServerStats GetServerStats(IPEndPoint ip, TimeSpan connectionTimeout, TimeSpan receiveTimeout)  
  52.         {  
  53.             MemcachedSocket socket = new MemcachedSocket(ip, connectionTimeout, receiveTimeout);  
  54.             MemcachedServerStats stats = socket.GetStats();  
  55.             return stats;  
  56.         }  
  57.   
  58.         public static IPEndPoint Parse(string hostName,int port)  
  59.         {  
  60.             IPHostEntry host=Dns.GetHostEntry(hostName);  
  61.             IPEndPoint endPoint = null;  
  62.             foreach (IPAddress ip in host.AddressList)  
  63.             {  
  64.                 if (ip.AddressFamily == AddressFamily.InterNetwork)  
  65.                 {  
  66.                     endPoint = new IPEndPoint(ip, port);  
  67.                     break;  
  68.                 }  
  69.             }  
  70.             return endPoint;  
  71.         }  
  72.     }  
  73.     /// <summary>  
  74.     /// Memcached服务器运行状态数据类,只有当IsReachable为true时获取的数据才有意义,否则表示不可访问或者Memcached挂了  
  75.     /// </summary>  
  76.     public class MemcachedServerStats  
  77.     {  
  78.         private Dictionary<string, string> results;  
  79.         /// <summary>  
  80.         /// 是否可访问,如果不可访问表示网络故障或者Memcached服务器Down掉了  
  81.         /// </summary>  
  82.         public bool IsReachable { get; set; }  
  83.         /// 
【上篇】
【下篇】

抱歉!评论已关闭.