THINKPAD怎么鉴别机器是国行水货还是水货?

件商品,共计
(诚邀合作 共赢财富)
独家推出全新OEM分销体系
极具杀伤力的价格,超大利润
负载均衡(SLB)快速安装指南
简单介绍负载均衡器(SLB)是西维数码针对弹性云主机免费提供的一种基于4层的网络负载均衡服务(以下简称为负载均衡)。负载均衡将同一机房的多台服务器,通过设置组建为一个高性能,高可靠,高可用的应用服务器池,将访问服务器的请求分发到云服务池的云服务器.&负载均衡是为弹性云量身订做的,从多角度充分发挥弹性云服务器的性能,用户只需按向导提示输入弹性云服务器的IP地址等信息,系统即可自动部署负载均衡,无需人工干预,即刻使用体验负载均衡。&负载均衡将自动检查部署在负载均衡中的服务器健康状态,自动隔离服务异常的弹性云服务器,彻底解决服务器的单点故障问题,同时有效的提高了整个系统的高可用性,此外,负载均衡器可将Web服务器、数据库服务器等隐藏在后端,能有效提升系统的安装性。另外,如果服务器状态恢复,负载均衡将在极短的时间内将此服务器加入到服务器池,以便提供服务。&初次使用&&注意:在部署负载均衡之前,您需要确认您有三台或三台以上的弹性云服务器,并且都在处于同一物理机房。应用场景:假设您的网站是asp.net+sqlserver开发,访问量比较大,想通过负载均衡来提升系统的稳定性。建议这样安排服务器的使用:一台linux 6.4 的云主机做前端的负载均衡服务器。这个主机对CPU、内存要求不高,但是对带宽需求很大,您的网站的所有流入、流出流量都会经过这台服务器。所以需要它具有高带宽。推荐配置:2核、2G内存、10M带宽, 使用分布式集群存储。文件服务器1台,所有的网页文件都存放在这台服务器上,通过“文件共享”的方式给其他web服务器提供服务。此服务器要求硬盘较大,其他方面均无重要需要求,外网带宽选购2~3M左右,能满足平时ftp更新即可。Web服务器3~5台,安装win系统,在IIS中统一配置为使用 文件共享服务器做为网站主目录。如\\192.168.5.2\web\ ,web服务器通过内网跟前端的负载均衡器连接,不需要太大的带宽,用最低的1M带宽即可。数据库服务器1~2台,& sqlserver数据库运行在专用的数据库服务器上,通过内网连接。数据库服务器的外网带宽1M即可,CPU和内存建议要8核、8G以上。如果数据库非常重要,可以一台做为平时正常使用,另外一台通过sqlserver的“镜像”功能实时同步备份.&注:如果您的web服务器是linux平台,可以考虑nfs文件共享或rsync自动同步数据等方案来保证网站数据的一致性。负载均衡将按以下的步骤部署:&&&& 环境设置――下载程序――设置安装&本文档旨在指导用户如何第一次部署和使用负载均衡:环境设置使用负载均衡,您需要一台服务器的系统为linux,我们强烈建议您将安装负载均衡的服务器系统设置为CentOS 6.4 64位。如下图 1-1 所示。您也可通过“客户管理中心”-&“业务管理”-&“独立IP主机管理”,选择现有的弹性云服务器,单击右侧的“管理”, 如图 1-2 所示。在服务器管理界面,选择“重装”,并选择红框中的系统类型,如图1-3所示图 1-1&图 1-2&图1-3&2、下载程序&注意:下载程序只需要在部署为负载均衡服务的服务器上进行,位于服务器池的服务器不需要下载安装。&下载程序之前,您需要先远程连接到需要操作的服务器,我们建议您参考& & 的linux远程登录部分操作,使用ssh远程登录器连接您要安装负载均衡的服务器。&&&& 现在我们假设您已经登录到了需要部署负载均衡服务的服务器,您现在在远程窗口的命令行提示符输入& wget -O instslb 接下来输入 chmod 744 instslb& ,效果如图2-1所示图2-1&设置安装在正式安装之前,您需要先确认安装文件,您可输入“ls Cl instslb”来确认,如图3-1所示图3-1&红框显示的即为安装文件,如果出现如图3-2,请重复步骤2.下载程序图3-2接下来,执行程序,输入“./instslb”,将出现如图3-3的提示图3-3注意:执行程序的服务器在安装结束后将自动成为负载均衡服务器,如果您要取消操作,请按住“ctrl”和”c”键,如果您看到的不是中文,而是乱码,您需要确认您的远程登录客户端的编码为GB2312,如图3-4图3-4在提示符后输入您需要加入到负载均衡的服务器数量,需要提醒您的是,安装负载均衡的服务器也可以作为对外服务的网站服务器,也就是说,您也可以添加安装负载均衡的服务器内网IP到服务器池(不过我们推荐您尽量使用专用的服务器做为负载均衡服务器)。&输入添加的服务器数量以后,您将看到图3-5的以下提示图3-5注意:此IP地址为服务器的“内部IP地址”,而非公网地址,您可在产品服务器管理界面的首页查看到,如图3-7的红框所示,我们强烈建议您在此之前,先收集所有需要添加到服务器池的服务器“内部IP地址”。图3-7在输入IP地址以后,程序将自动检查IP的合法性和连通性,输入正确的IP地址后,系统将提示您输入下一个加入服务器池的IP地址,如图3-6图3-6输入所有的IP地址以后,系统将自动完成剩下的操作,到最后出现以下信息图3-7特别注意:如果您加入到服务器池的服务器为linux服务器,您需要将红框的命令复制下来,加入到服务器池的所有linux服务器上执行,如果您的服务器类型为windows操作系统,您需要以下一点额外的操作。&情况1 如果您的服务器是windows 2003 操作系统,请按如下步骤设置:&&& 点击“开始”,选择“设置”,再选择“控制面板”,打开“网络连接”。在打开的“网络连接”窗口中,双击“本地连接”,点击“属性”,下拉垂直滚动条,选择“Interner 协议(TCP/IP)”,再点击“属性”。在弹出的对话框中,点击“高级”,添加一个新的默认网关,如图3-8所示图3-8在红框中添加对应的作为负载均衡器的“内部IP地址”,也就是图3-7中显示的“负载均衡器的内部IP地址”,然后取消勾选“自动跃点”,在“跃点”的空白中,填上数字“1”,最后点击“添加”。&情况2如果您的服务器是windows 操作系统,请按如下步骤设置:&&& &点击“开始”。选择“控制面板”,如下图3-9图3-9在弹出的窗口中,选择“查看网络状态和任务”,点击“修改适配器设置”,单击“本地连接”,再点击“属性”,下拉垂直滚动条,选择“Internet 协议版本4 (TCP/IPv4)”,再点击“属性”,在弹出的窗口中,选择“高级”,在出现的“高级TCP/IP 设置”窗口中添加默认网关,具体操作如图3-12的数字所示,在红框中添加对应的作为负载均衡器的“内部IP地址”,也就是图3-11中显示的“负载均衡器的内部IP地址”,然后点击“添加”。&至此负载均衡服务就配置完成了,等调试完成后,您可以将域名解析到“负载均衡”服务器的外网IP。&为了保证业务的高可靠性,负载均衡服务器也可以做双机热备,若有这方面的需求,请联系我们协助。&负载均衡器使用常见问题:&问: 如何查看SLB中的服务器的状态?答: &我们结合上例的应用场景详细讲解, 假设您的网站是还是基于asp.net+sqlserver开发,目前已经通过负载均衡来提升系统的稳定性,现在需要查看下负载均衡的状态和各服务器的状态,您需要先登录到安装了负载均衡服务的服务器,然后您在远程登录窗口输入“./instslb”,接下来将出现如下图所示的界面图4-1上图中显示了当前负载均衡的整体状态,各个服务器运行情况,如果其中某台服务器出现故障,您将看到如下界面图4-2&& “负载均衡VIP”表示整个负载均衡对外的IP地址,测试访问正常后,您需要将您的域名解析到此IP地址,负载均衡才能正常工作。“服务器列表”下列出了当前配置在服务器池的所有服务器,并且显示的是服务器内部IP地址。“当前状态”显示各服务器在负载均衡中的健康状态,“运行中”表示健康状态正常,“异常”表示当前这台服务器不能正常对外提供服务。这时您需要检查维护这台服务器,当服务器能正常提供服务时,系统将自动做出正确的诊断结果。&问: 如何在SLB增加或删除一台或多台服务器?答:& 在设置操作时,您需要填写添加的服务器数量和内网IP地址。下面我们通过上例的应用场景继续讲解。假设您的网站是基于asp.net+sqlserver开发,访问量越来越大,目前已经通过负载均衡来提升系统的稳定性,现在需要添加一台新的服务器到负载均衡,并假设该服务器的内部IP地址为192.168.162.129现在我们假设您已经登录到了需要部署负载均衡服务的服务器,您在远程登录窗口输入“./instslb”,将出现负载均衡状态显示的界面,如图4-1,接下来请按m键,系统将提示您输入需要添加的服务器数量图4-3接下来您只需要按照安装步骤,“设置安装”来操作,就可以了,设置以后,通过状态显示,您将看到新的服务器是添加成功,工作正常,最后效果如下图4-3所示图4-4&&& &&&接下来,如果我们需要添加同时又删除服务器,您也只需要确定添加或删除的具体的服务器数量,并输入对应的内部IP地址即可。&&问:如何查看负载均衡服务器上的实时流量情况?答: 按如下命令安装即可wget downinfo.myhostadmin.net/vnstat-1.10.tar.gz tar xzvf vnstat-1.10.tar.gz cd vnstat-1.10 make && make install安装完成后运行:vnstat Cl 即可查看流量。vnstat Cl Ci eth0& 查0号网卡流量vnstat Cl Ci eth1& 查1号网卡流量&问: 如何查看负载均衡器上各服务器的实时流量?答: 按如下命令执行即可ipvsadm &-L --rate,您将看到对应IP地址的服务器当前流量(InBPS/OutBPS)。&此外,我们列出以下负载均衡下的常用命令,以供您快速查看和操作:&ipvsadm &CLc&&&&&&&&&&&&&& &查看当前负载均衡的网络会话连接ipvsadm& -L& --thresholds &&&&&查看当前活动的网络会话数ipvsadm& -L& --stats&&& &&&&&&查看负载均衡运行的各服务总体流量(InBytes/OutBytes)&问: 如果负载均衡本身发生单点故障该怎么办?答: 如果您对网站的服务质量要求很高,并担心负载均衡的容错问题,则可使用负载均衡双机热备的解决方案。但前提要求您必须要有至少两台系统为linux的服务器可以使用,并且还需要单独购买一个独立的IP地址用来做负载均衡的虚拟IP地址, 以便对外提供服务。另外您的前端的2台linux弹性云服务器和所购买的IP需要位于同一个IP 的C段。 比如必须都是211.149.158.* ,如果您购买的机器不在同一个网段,请,申请更换到同一个网段之内。&现在您需要对这两台linux服务器分别做一下设置。./instslb &Cm 1 设置主负载均衡器./instslb& -m&& 设置从负载均衡器 (通常在主负载均衡器出现问题时,自动启用)输入命令后,您将看到如下图所示的界面图5-1上面输入的IP是指单独购买的IP。 (所购买的IP不需要在机器的网卡上绑定,只需要在上面的程序中指定即可)接下来的设置和普通负载均衡器的设置相同,具体操作请参考前面的”设置安装”部分。注意:负载均衡对外服务的IP只是用于将到达负载均衡器的访问流量分发到服务器池中各服务器,不作为远程操作服务器的IP地址,请特别留意!&设置完成后,请提交,申请将负载均衡的IP解除arp绑定,这样才能正常使用。在我们解除了该ip的arp绑定后,您的负载均衡双机灾备容错就可以正常使用了。&最后,再次感谢您对西部数码的支持,如在操作中有问题,请在“客户管理中心”提交“”,谢谢!&若对负载均衡架构需要技术咨询的,请联系SLB技术支持专员:028-3&
编辑:西部数码
& && 相关文章
&&&&&&&&&&&&&&&&17260人阅读
大规模Web 2.0架构(42)
在中,主要教大家如何搭建在windows& IIS 7.5下搭建php环境,使用常见的两种memcached性能监视工具。通过自己动手实践,观察监控工具上数据,相信大家对于memcached的了解一定深入了很多。但是同样还有些疑惑。本文将用图文的方式,继续讲解memcached在集群环境下的使用技巧。曾经看到过这样的文字(大概是翻译过来的,算是比较权威的)memcached如何处理容错的?不处理!:) 在memcached节点失效的情况下,集群没有必要做任何容错处理。如果发生了节点失效,应对的措施完全取决于用户。节点失效时,下面列出几种方案供您选择:* 忽略它! 在失效节点被恢复或替换之前,还有很多其他节点可以应对节点失效带来的影响。* 把失效的节点从节点列表中移除。做这个操作千万要小心!在默认情况下(余数式哈希算法),客户端添加或移除节点,会导致所有的缓存数据不可用!因为哈希参照的节点列表变化了,大部分key会因为哈希值的改变而被映射到(与原来)不同的节点上* 启动热备节点,接管失效节点所占用的IP。这样可以防止哈希紊乱(hashing chaos)。根据上面的说法,memcached其中一个节点失效以后,memcached本身是没有任何策略维持失效转发的,这对于大型系统是一个无法接受的事实。Memcached基于一 个存储键/值对的hashmap。其守护进程是用C写的,但是客户端可以用任何语言来编写(本文使用C#作为例子),并通过memcached协议与守护进程通信。可 & & & & & 能这些东西都太高深了,我们暂不做研究。 &虽然 Memcached作为一个分布式缓存数据服务,但是每个服务之间根本没有进行相互通信,这里可能与 我理解的分布式有点区别,可能是我才疏学浅,也可能是每个人思考问题的角度不同。Memcached&客户端就是通过一种分布式算法将数据保存到不同的Memcached服务器上,将数据进行缓存。Memcached分布式环境下,每个服务器端本身没有相互相连的关系,数据分布其实是由客户端来维持的(通俗点说,是客户端按照自己的分布算法,将数据分配 给指定的服务端去存储,取值的时候,客户端再找指定的服务器拿数据。任何环境下,服务端都不可能主动去找客户端拿“东西”或者去操作客户端。B/S模式也 是的,web服务器不可能主动找浏览器拿东西,更不可能对浏览器端做任何操作)。memcached的服务端更不会这么聪明,自动去查找、匹配当前环境 中分布的其他服务器。而且,据我所知,Memcached本身并没有为集群提供真的高可用方案,因为我个人认为,使用集群环境,通常是为了满足以下的需求:1.压力分载 (负载均衡)&&& 2.失效转发(故障转移)。而memcached本身并不具备这两点,这对于以“分布式缓存”号称的memcached来说,是非常致命的。对于笔者来说,也是一种沉痛的打击啊(o(∩_∩)o 哈哈)。理论上来讲,客户端连接多个memcached服务端的时候,默认的数据分布是这样的:理论上的,%33+33%+34%=100%,看上去数据分布还还很均衡,读取的时候,分别访问从三台服务器内存,再组成完整的数据。这样的数据分发架构,倒真正做到了“负载均衡”。降低了三台服务器的内存使用率,让三台服务器同时为客户端提供服务,这难道不是完美的负载均衡吗?如果没有配置监视工具,也可以参照下面的代码: public void testMemcachedProviders()
int runs = 100;
int start = 200;
string keyBase = &testKey&;
string obj = &This is a test of an object blah blah es, serialization does not seem to slow things down so much.
The gzip compression is horrible horrible performance, so we only use it for very large objects.
I have not done any heavy benchmarking recently&;
//Response.Write(obj);
//循环记时往服务器缓存上插入数据
等会我们要观察一下数据都存到哪个服务器上的Memcached server上了
long begin = DateTime.Now.T
for (int i = i & start + i++)
// DistCache.Add(keyBase + i, obj);
long end = DateTime.Now.T
long time = end -
//计算存储这些数据花了多长时间
//Response.Write(runs + & sets: & + new TimeSpan(time).ToString() + &ms&+&&br/&&);
//开始取数据,并记时
begin = DateTime.Now.T
int hits = 0;
int misses = 0;
for (int i = i & start + i++)
string str = (string)DistCache.Get(keyBase + i);
if (str != null)
//成功取到数据
//丢失次数
end = DateTime.Now.T
time = end -
//获取这些数据花了多长时间
Response.Write(runs + & gets: & + new TimeSpan(time).ToString() + &ms&+&&br/&&);
Response.Write(&Cache hits: & + hits.ToString() + &&br/&&);
Response.Write(&Cache misses: & + misses.ToString() + &&br/&&);
Response.Write(&--------------------------------------------------------\r\n&);
}使用上面的测试代码,可以打印输出处理时间,get/set次数。分别注释掉配置文件中指定memcached服务器配置后,再读取测试,可以清楚的看到数据分布比例。我本地开启了3个memcached服务,分别指向不同端口,数据的分布比例是这样的: 37%,43%,20%。没有理论上的那么均衡。有过分布式集群架构的朋友,肯定会想到,那万一发生了“单点故障”(就像sqlserver集群中的,单个节点上的数据库服务器宕机),那不是玩完了?按照上图所示,一台服务器宕机了,就有33%的数据丢失了。那不就玩完了。如果是某银行采用这种架构,发生如此杯具,那架构师岂不是要被群众拿刀砍死。那到底该如何解决这个问题呢?我翻阅了很多中文甚至英文的资料,好像真的没有官方或者很权威的解决方案。提供了如下两种思路。解决方案1:本地备份缓存&&& 在本地放一份缓存,同时也在分布式Memcached上放一份缓存,如果当其中一台节点当机了,客户端程序直接读取本地的缓存,本地客户端维护一个HashMap即可,这样的方案虽然很简陋,但是可以满足一部分场景的需要,当你很急需的时候可以作为临时方案暂时替代一下。解决方案2:采用缓存代理服务器&&& 采用 缓存代理,防止单点现象,缓存代理也可以做备份,通过客户端连接到缓存代理服务器,缓存代理服务器连接缓存服务器,缓存代理服务器可以连接多台Memcached机器可以将每台Memcached机器进行数据同步。这样的架构比较完善了,如果其中一台缓存代理服务器down机,系统依然可以继续工作,如果其中一台Memcached机器down掉,数据不会丢失并且可以保证数据的完整性,以上描述的系统架构如图所示:在笔者的实践中,沿袭了第一种方案的思想。由于笔者项目使用的是windows的服务器,而第二种方案中的magent代理软件,好像只支持linux平台。在客户端还是配置多台服务器,但是让其中任意的一台服务器做备份,去读取并append另外几台服务器的数据,这样依赖,该台备份服务器上就始终存储了一份完整的数据。当发生意外情况的时候,直接读取备份服务器上的数据。等服务器故障恢复后,再从客户端,将数据合理的分发出去。在.NET平台下,就不能选用 Memcached Client或者Memcached Providers之类封装得太完善的client啦!涉及到很多基本的操作,这里推荐使用.NET memcached client library这个比较原始的类库client。我始终觉得,最原始的,往往就是最灵活的。 public void testClientLib()
string[] servers = { &127.0.0.1:11211&, &127.0.0.1:11212&,&127.0.0.1:11213& };//多台服务器构成集群,端口号就是memcached.ini中的listener_port=11212
string[] serversOne = { &127.0.0.1:11211& };//测试服务器列表
//初始化池
SockIOPool pool = SockIOPool.GetInstance();
// pool.SetServers(servers);
pool.SetServers(serversOne);//测试服务器
pool.InitConnections = 3;
pool.MinConnections = 3;
pool.MaxConnections = 5;
pool.SocketConnectTimeout = 1000;
pool.SocketTimeout = 3000;
pool.MaintenanceSleep = 30;
pool.Failover =
pool.Nagle =
pool.Initialize();
//初始化客户端
Memcached.ClientLibrary.MemcachedClient mc = new Memcached.ClientLibrary.MemcachedClient();
mc.EnableCompression =
string keybase = &test&;
//if (mc.Get(keybase) == null)
//尝试添加数据
#region 单个key的情况,value值增大,数据不会自动分布,全都集中在一台服务器上
//List&int& list = new List&int&();
//for (int i = 0; i & 100; i++)
list.Add(i);
//bool reslut =
mc.Add(&test&, list);
//if (reslut)
Response.Write(&Add cache success&);
#endregion
#region 多个key的情况,数据会自动均衡的分布
三台服务器 33%,33%,34%
//for (int i = 0; i & 100; i++)
bool result = mc.Add(keybase + i, i);
if (!result) {
Response.Write(&Add cache faild&);
#endregion
//object value = mc.Get(&test&);
int count = 0;
for (int i = 0; i & 100; i++)
object value = mc.Get(keybase + i);
if(value!=null)
Response.Write(&服务器存储数据量:&+count);
pool.Shutdown();
}通过本地备份的方式,解决单点故障:using S
using System.Collections.G
using System.L
using System.T
using System.C
using System.W
using Memcached.ClientL
namespace MemcachedPro
class MemcacheProvider
MemcachedClient mainC
MemcachedClient backupC
/// &summary&
/// 在构造函数中,初始化客户端(主/备)
/// &/summary&
public MemcacheProvider()
//主服务器客户端
mainClient = new MemcachedClient();
mainClient.PoolName = GetMainPollName();
mainClient.EnableCompression =
//备份服务器客户端
backupClient = new MemcachedClient();
backupClient.PoolName = GetBackUpPollName();
backupClient.EnableCompression =
/// &summary&
/// 初始化主服务器pool
/// &/summary&
/// &returns&&/returns&
string GetMainPollName()
//string[] Servers = { &127.0.0.1:11211& };//测试服务器列表
string strServers = ConfigurationManager.AppSettings[&memcacheMainServer&];
string[] Servers = strServers.Split(';');
//初始化池
SockIOPool pool = SockIOPool.GetInstance(&p1&);
pool.SetServers(Servers);//测试服务器
pool.InitConnections = 3;
pool.MinConnections = 3;
pool.MaxConnections = 5;
pool.SocketConnectTimeout = 1000;
pool.SocketTimeout = 3000;
pool.MaintenanceSleep = 30;
pool.Failover =
pool.Nagle =
pool.Initialize();
return &p1&;
/// &summary&
/// 初始化备份服务器pool
/// &/summary&
/// &returns&&/returns&
public string GetBackUpPollName()
// string[] Servers = { &127.0.0.1:11212& };//备份服务器列表
string strServers = ConfigurationManager.AppSettings[&memcacheBackupServer&];
string[] Servers = strServers.Split(';');
//初始化池
SockIOPool pool = SockIOPool.GetInstance(&p2&);
pool.SetServers(Servers);//测试服务器
pool.InitConnections = 3;
pool.MinConnections = 3;
pool.MaxConnections = 5;
pool.SocketConnectTimeout = 1000;
pool.SocketTimeout = 3000;
pool.MaintenanceSleep = 30;
pool.Failover =
pool.Nagle =
pool.Initialize();
return &p2&;
/// &summary&
/// 设置值
/// &/summary&
/// &param name=&key&&&/param&
/// &param name=&value&&&/param&
/// &returns&&/returns&
public bool SetCache(string key, object value)
bool result =
//设置到主服务器组
result = mainClient.Set(key, value);
//设置备份
result = backupClient.Set(key, value);
catch (Exception)
//发送短信或者邮件提醒
/// &summary&
/// &/summary&
/// &param name=&key&&&/param&
/// &returns&&/returns&
public object GetCache(string key)
object value =
//先读主服务器
value = mainClient.Get(key);
//如果没取到值
if (value == null)
//发送短信或者邮件提醒:可能主服务器宕机了
//从备份服务器取值
value = backupClient.Get(key);
if (value == null)
//从备份服务器取值也失败,发送短信或者邮件提醒
catch (Exception)
//发送短信或者邮件提醒
/// &summary&
/// 当主服务器恢复运行后(数据已经丢失了),将备份服务器中的缓存同步到主服务器
/// &/summary&
/// &returns&&/returns&
public bool RestoreCache()
bool result =
好了,由于篇幅有限。本文就到此了。& 本文出自blog.csdn.net/dinglang_2009 ,转载请注明出处
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:785274次
积分:9266
积分:9266
排名:第1501名
原创:141篇
转载:15篇
评论:373条
丁码农,非知名架构师。略懂互联网高性能、高并发、高可用的分布式系统架构设计与实现。 在服务化、分库分表、消息中间件、性能调优、分布式搜索、NoSql等方面有一定的研究和实践经验。
微信扫码,向我提问分布式缓存出于如下考虑,首先是缓存本身的水平线性扩展问题,其次是缓存大并发下的本身的性能问题,再次避免缓存的单点故障问题(多副本和副本一致性)。分布式缓存的核心技术包括首先是内存本身的管理问题,包括了内存的分配,管理和回收机制。其次是分布式管理和分布式算法,其次是缓存键值管理和路由。
什么是Memcached
许多Web应用程序都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大,访问的集中,就会出现REBMS的负担加重,数据库响应恶化,网站显示延迟等重大影响。Memcached是高性能的分布式内存缓存服务器。一般的使用目的是通过缓存数据库查询结果,减少数据库的访问次数,以提高动态Web应用的速度、提高扩展性。如图:
Memcached作为高速运行的分布式缓存服务器具有以下特点。
协议简单:memcached的服务器客户端通信并不使用复杂的MXL等格式,而是使用简单的基于文本的协议。基于libevent的事件处理:libevent是个程序库,他将Linux的epoll、BSD类操作系统的kqueue等时间处理功能封装成统一的接口。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。内置内存存储方式:为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached,重启操作系统会导致全部数据消失。另外,内容容量达到指定的值之后memcached回自动删除不适用的缓存。Memcached不互通信的分布式:memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。他的分布式主要是通过客户端实现的。
Memcached的内存管理
最近的memcached默认情况下采用了名为SlabAllocatoion的机制分配,管理内存。在改机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。但是这中方式会导致内存碎片,加重操作系统内存管理器的负担。
Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,已完全解决内存碎片问题。SlabAllocation&的原理相当简单。将分配的内存分割成各种尺寸的块(chucnk),并把尺寸相同的块分成组(chucnk的集合)如图:
而且slab allocator 还有重复使用已分配内存的目的。也就是说,分配到的内存不会释放,而是重复利用。
Slab Allocation 的主要术语
&& &Page:分配给Slab 的内存空间,默认是1MB。分配给Slab 之后根据slab 的大小切分成chunk.&& &Chunk :用于缓存记录的内存空间。&& &SlabClass:特定大小的chunk 的组。
在Slab 中缓存记录的原理
Memcached根据收到的数据的大小,选择最合适数据大小的Slab (图2)memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。
Memcached在数据删除方面有效里利用资源
Memcached删除数据时数据不会真正从memcached中消失。Memcached不会释放已分配的内存。记录超时后,客户端就无法再看见该记录(invisible透明),其存储空间即可重复使用。
LazyExpriationmemcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术称为lazyexpiration.因此memcached不会再过期监视上耗费CPU时间。
对于缓存存储容量满的情况下的删除需要考虑多种机制,一方面是按队列机制,一方面应该对应缓存对象本身的优先级,根据缓存对象的优先级进行对象的删除。
LRU:从缓存中有效删除数据的原理
Memcached会优先使用已超时的记录空间,但即使如此,也会发生追加新纪录时空间不足的情况。此时就要使用名为LeastRecently Used(LRU)机制来分配空间。这就是删除最少使用的记录的机制。因此当memcached的内存空间不足时(无法从slabclass)获取到新空间时,就从最近未使用的记录中搜索,并将空间分配给新的记录。
Memcached分布式
Memcached虽然称为“分布式“缓存服务器,但服务器端并没有“分布式”的功能。Memcached的分布式完全是有客户端实现的。现在我们就看一下memcached是怎么实现分布式缓存的。
例如下面假设memcached服务器有node1~node3三台,应用程序要保存键名为“tokyo”“kanagawa”“chiba”“saitama”“gunma”的数据。
首先向memcached中添加“tokyo”。将“tokyo”传给客户端程序库后,客户端实现的算法就会根据“键”来决定保存数据的memcached服务器。服务器选定后,即命令它保存“tokyo”及其值。
同样,“kanagawa”“chiba”“saitama”“gunma”都是先选择服务器再保存。
接下来获取保存的数据。获取时也要将要获取的键“tokyo”传递给函数库。函数库通过与数据保存时相同的算法,根据“键”选择服务器。使用的算法相同,就能选中与保存时相同的服务器,然后发送get命令。只要数据没有因为某些原因被删除,就能获得保存的值。
这样,将不同的键保存到不同的服务器上,就实现了memcached的分布式。memcached服务器增多后,键就会分散,即使一台memcached服务器发生故障无法连接,也不会影响其他的缓存,系统依然能继续运行。
Memcached的缓存分布策略:
ConsistentHashing的简单说明
Consistent Hashing如下所示:首先求出memcached服务器(节点)的哈希值,并将其配置到0~232的圆(continuum)上。 然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过232仍然找不到服务器,就会保存到第一台memcached服务器上。
从上图的状态中添加一台memcached服务器。余数分布式算法由于保存键的服务器会发生巨大变化而影响缓存的命中率,但Consistent Hashing中,只有在continuum上增加服务器的地点逆时针方向的第一台服务器上的键会受到影响。
因此,Consistent Hashing最大限度地抑制了键的重新分布。 而且,有的ConsistentHashing的实现方法还采用了虚拟节点的思想。 使用一般的hash函数的话,服务器的映射地点的分布非常不均匀。因此,使用虚拟节点的思想,为每个物理节点(服务器) 在continuum上分配100~200个点。这样就能抑制分布不均匀,最大限度地减小服务器增减时的缓存重新分布。
缓存多副本
缓存多副本主要是用于在缓存数据存放时存储缓存数据的多个副本,以防止缓存失效。缓存失效发生在以下几种情况:
1.&&&缓存超时被移除(正常失效)2.&&&缓存由于存储空间限制被移除(异常失效)3.&&&由于缓存节点变化而导致的缓存失效(异常失效)
在缓存多副本的情况下,需要重新考虑缓存的分布式分布策略。其次缓存的多个副本实际本身是可能的多个读的节点,可以做为分布式的并行读,这是另外一个可以考虑的问题。
缓存数据的一致性问题
缓存数据尽量只读,因此缓存本身是不适合大量写和更新操作的数据场景的。对于读的情况下,如果存在数据变化,一种是同时更新缓存和数据库。一种是直接对缓存数据进行失效处理。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:185次
排名:千里之外

我要回帖

更多关于 ps4国行机器 的文章

 

随机推荐