设为首页 收藏本站
查看: 1231|回复: 0

[经验分享] memcached+magent实现memcached集群

[复制链接]

尚未签到

发表于 2018-12-24 13:28:11 | 显示全部楼层 |阅读模式
  首先说明下memcached存在如下问题
  本身没有内置分布式功能,无法实现使用多台Memcache服务器来存储不同的数据,最大程度的使用相同的资源;无法同步数据,容易造成单点故障。(memagent代理实现集群)
  在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 。
  Memcached单进程最大使用内存为2G,要使用更多内存,可以分多个端口开启多个Memcached进程
  最大30天的数据过期时间,设置为永久的也会在这个时间过期,常量REALTIME_MAXDELTA
  60*60*24*30控制
  最大键长为250字节,大于该长度无法存储,常量KEY_MAX_LENGTH 250控制
  单个item最大数据是1MB,超过1MB数据不予存储,常量POWER_BLOCK 1048576进行控制,
  它是默认的slab大小
  最大同时连接数是200,通过 conn_init()中的freetotal进行控制,最大软连接数是1024,通过
  settings.maxconns=1024 进行控制
  跟空间占用相关的参数:settings.factor=1.25, settings.chunk_size=48, 影响slab的数据占用和步进方式
  memcached是一种无阻塞的socket通信方式服务,基于libevent库,由于无阻塞通信,对内存读写速度非常之快。
  memcached分服务器端和客户端,可以配置多个服务器端和客户端,应用于分布式的服务非常广泛。
  memcached作为小规模的数据分布式平台是十分有效果的。
  memcached是键值一一对应,key默认最大不能超过128个字 节,value默认大小是1M,也就是一个slabs,如果要存2M的值(连续的),不能用两个slabs,因为两个slabs不是连续的,无法在内存中存储,故需要修改slabs的大小,多个key和value进行存储时,即使这个slabs没有利用完,那么也不会存放别的数据。
  集群配置
  由于Memcached服务器与服务器之间没有任何通讯,并且不进行任何数据复制备份,所以当任何服务器节点出现故障时,会出现单点故障,如果需要实现HA,则需要通过另外的方式来解决。
  通过Magent缓存代理,防止单点现象,缓存代理也可以做备份,通过客户端连接到缓存代理服务器,缓存代理服务器连接缓存连接服务器,缓存代理服务器可以连接多台Memcached机器可以将每台Memcached机器进行数据同步。如果其中一台缓存服务器down机,系统依然可以继续工作,如果其中一台Memcached机器down掉,数据不会丢失并且可以保证数据的完整性。具体可以参考:http://code.google.com/p/memagent/
  memcache集群的实现
  memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢?这完全取决于客户端的实现。
  memcached的分布式
  Memcached作为集中式Cache,就存在着集中式的致命问题:单点问题,Memcached支持多Instance分布在多台机器上,仅仅只是解决了数据全部丢失的问题,但是当其中一台机器出错以后,还是会导致部分数据的丢失,一个篮子掉在地上还是会把部分的鸡蛋打破。
  因此就需要实现一个备份机制,能够保证Memcached在部分失效以后,数据还能够依然使用,当然大家很多时候都用Cache不命中就去数据源获取的策略,但是在SIP的场景中,如果部分信息找不到就去数据库查找,那么要把SIP弄垮真的是很容易,因此SIP对于Memcached中的数据认为是可信的,因此做Cluster也是必要的。

  1.应用传入需要操作的key,通过CacheManager获取配置在Cluster中的客户端。
  2.当获得Cache Client以后,执行Cache操作。
  3.  A.如果是读取操作,当不能命中时去集群其他Cache客户端获取数据,如果获取到数据,尝试写入到本次获得的Cache客户端,并返回结果。(达到数据恢复的作用)
  B.如果是更新操作,在本次获取得Cache客户端执行更新操作以后,立即返回,将更新集群其他机器命令提交给客户端的异步更新线程对列去异步执行。(由于如果是根据key来获取Cache,那么异步执行不会影响到此主键的查询操作)
  存在的问题:如果是设置了Timeout的数据,那么在丢失以后被复制的过程中就会变成永久有效的内容。
  越来越感觉到DB力不从心,在面对千万级用户量的应用时,DB面对平凡的curd,特别是查询的时候,早已不堪重负!如何解决高并发下数据的查询效率,在应用中显的越来越重要,好了废话不多说,首先介绍下magent与memcached
  一、 magent
  magent是一款开源的Memcached代理服务器软件,其项目网址为:http://code.google.com/p/memagent/
  1. 安装:
  1.mkdir magent
  2.cd magent/
  3.wget http://memagent.googlecode.com/files/magent-0.5.tar.gz
  4.tar zxvf magent-0.5.tar.gz
  5./sbin/ldconfig
  6.sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile
  7.make
  8.cp magent /usr/bin/magent
  9.cd ../
  2. magent  命令参数说明:
  1.-h this message
  2.-u uid
  3.-g gid
  4.-p port, default is 11211. (0 to disable tcp support)
  5.-s ip:port, set memcached server ip and port
  6.-b ip:port, set backup memcached server ip and port
  7.-l ip, local bind ip address, default is 0.0.0.0
  8.-n number, set max connections, default is 4096
  9.-D do not go to background
  10.-k use ketama key allocation algorithm
  11.-f file, unix socket path to listen on. default is off
  12.-i number, max keep alive connections for one memcached server, default is20
  13.-v verbose
  二、memcached   http://memcached.org/
  1. 安装libevent

  •   tar zxvflibevent-1.4.13-stable.tar.gz
  •   cdlibevent-1.4.13-stable
  •   ./configure  --prefix=/usr
  •   make
  •   make install
  2. 安装memcached

  •   tar zxvfmemcached-1.4.5.tar.gz
  •   cdmemcached-1.4.5.tar.gz
  •   ./configure  --with-libevent=/usr
  configure 需要加 libevent的安装路径

  •   make
  •   make install
  •   安装完成后会把memcached放到/usr/local/bin/memcached
  启动: /usr/local/bin/memcached -d -m 512 -uroot  -p 11211 -c 10000  -M -f 1.1 -P /tmp/memcached.pid
  三、配置memcached  与 magent,无图无真相,一图抵千言:

  magent与memcached 是可以混搭的,不必死板的一个magent s-memcached s-memcached b-memcached
  上图此模型已经能够很好的解决一个节点,一组服务器的缓存数据服务,但是如果在北方网通架设了一组服务器,同时在南方电信又架设了另外一组服务器,那么这两组相对独立的节点之间如何做到数据的同步与共享,基于magent与memcached的解决方案如下:

  需要注意的是,两组magent的配置最好完全一致,比如:
  北方的magent配置为:magent s-memcached1s-memcached2 b-memcached3
  那么南方的magent配置也为:magent s-memcached1s-memcached2 b-memcached3
  其顺序都是一致的,因为magent在分配key到memcached上时只是简单的使用散列余数算法。
  当然如果你够懒,那么你可以直接连接备份magent,因为所有的数据上面都有。
  有个特别要注意的地方是:
  1:其中一台Memcached死掉,从magent取数据,数据会从备份的Memcached取出,保证用户不受影响.
  2:Memcached重启复活,由于这两台Memcached重启后无数据,因此magent取得的将是空值,尽管备份Memcached还有数据。可采用定时维护服务器,恢复memcached。
  3。如果Memcached死掉,备份机同时死掉,那么只能说明你够倒霉,此时此刻你或许能见到上帝。
  四、java客户端
  推荐使用:xmemcached
  http://code.google.com/p/xmemcached/
  五、缓存与DB的同步
  比较保险的做法是:查询的时候从缓存中取,add、updae、delete的时候同时操作缓存与DB。
  当然你也可以定时同步缓存与DB的数据,个人认为不同的业务应该有不同的选择!
  我在实际的应用中是同时使用这两种方式,比如用户个人信息之类的内容,就用定时同步的方式。
  六、搜索引擎+缓存+DB
  这个主题比较大,可以分为:
  1。文件结构的存储代替DB持久化存储。
  2。缓存在搜索引擎中的使用--文本库与索引库的缓存实现。
  3。使用搜索引擎进行统一的数据查询。
  4。文件同步读写。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-655342-1-1.html 上篇帖子: memcached完全剖析memcached的基础 下篇帖子: memcached1.5.7安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表