热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:超简单的memcached集群搭建

篇首语:本文由编程笔记#小编为大家整理,主要介绍了超简单的memcached集群搭建相关的知识,希望对你有一定的参考价值。  Mem

篇首语:本文由编程笔记#小编为大家整理,主要介绍了超简单的memcached集群搭建相关的知识,希望对你有一定的参考价值。


    Memcached虽然能够通过分布式缓存,实现其中memcached宕掉不会丢失全部缓存数据,但部分数据还是难逃一劫。    我们可以利用magent代理memcached实现主从备份来保证缓存数据完好无损,而且magent还可以作为从继续使用,单大体工作原理如下:

   1. magent每次写数据都会写到主memcached和从memcached上,并且向主从memcached写的算法一样;

   2. 当主memcached宕掉,magent会向从memcached中读取数据。

   3. 当主memcached恢复后,magent将重新向主memcached中读取数据;此时由于主memcached刚刚恢复,其中并无数据,因此导致部分数据无法读取,这也是magent的一大缺点。


   针对magent的缺点有几种想法:

     1. 在生产环境中主memcached宕掉的可能性非常小,大部分时间都是工作的;而从memcached只是在主memcached宕掉后才使用,因此从memcached分配的空间不可能和主memcached一样,这样无疑是在浪费宝贵的内存空间。

     2. 既然从memcached分配空间较小而随着存入的数据会越来越多,会导致缓存的数据不断被过期驱逐内存,因此在主memcached宕掉后,只能暂时起到缓解数据库压力的作用。

     3. memcached宕掉后,不宜直接将其启动,还是在数据库压力比较小的时候再启动吧,就当预热缓存,

       总结:我引入magent除了主从方面,还考虑到magent--magent实现memcached入口的负载均衡,也就是说读写请求按照一定的算法分配到magent入口上,既能达到高可用,还能起到负载均衡。


memcached集群架构图

技术分享图片

magent1,magent2作为memcached的总入口,我们使用算法来实现负载均衡,分配读写请求,无论使用哪个入口分配到后端的memcached是一样的,因为他们分配memcached使用的都是同一个算法consistent-hash

后端memcached1memcached2,memcached3,memcached4多位4个主memcached

magent3作为从,同时也是从memcached的入口,其后端还有两个memcached5,memcached6;magent3, memcached5,memcacched6共同组成从memcached


工作流程:

magent1magent2接受写请求,将key分别写入mecached1-mecached4中,同时也将key写入从memcached上,也就是magent3上,magent3再分别写入mecached5mecached6中;主和从都是用的同一个分配算法

magent1,magent2接受读请求,将分别向主memcached中进行读取,而不想从memcached中读取;

一旦mecached1-mecached4中有一个memcached宕掉,此时magent1magent2将向从memcached,也就是magent3中读取数据,达到缓存数据不丢失的效果;

当主中的memcache恢复后,将再次加入主memcached中,此时magent1magent2将不会向从memcached中读数据了,但是写仍正常进行;

 


1. 安装libevent

 

     memcached 依赖libevent库,在安装memcached之前检查下系统是否已安装libevent库,如果没有则需要先安装 libevent

     libevent是一个事件触发的网络库,适用于windowslinuxbsd等多种平台,内部使用selectepollkqueue等系统调用管理事件机制

tar zxvf libevent-1.4.9-stable.tar.gz  
cd libevent-1.4.9-stable  
./configure --prefix=/usr/local/libevent
make
make install
cd ..


2. 安装memcached

tar zxvf memcached-1.2.8.tar.gz
cd memcached-1.2.8
./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
make && make install
cd ..
memcached -u root -d -m 200 -l 127.0.0.1 -p 11211 -P /var/run/memcached.pid

如果启动的时候报错:

 /usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

需要修改:

ln -s /usr/local/libevent/lib/libevent-2.0.so.5 /lib64/libevent-2.0.so.5

3. 安装magent

mkdir magent  
cp magent-0.5.tar.gz magent  
cd magent  
tar zxvf magent-0.5.tar.gz
#vim ketama.h   
在开头加入  
ifndef SSIZE_MAX  
define SSIZE_MAX      32767  
endif

#vim Makefile  
CFLAGS = -Wall -O2 -g 改为 CFLAGS = -lrt -Wall -O2 -g

mkdir /usr/lib64  
cp /usr/local/lib/libevent.a /usr/lib64
ln -s /usr/lib64/libm.so /usr/lib64/libm.a  
/sbin/ldconfig  
sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile  
make  
cp magent /usr/bin/magent  
cd ..

#执行magent出现以下则表示成功

#magent
please provide -s "ip:port" argument
 
memcached agent v0.4 Build-Date: Oct 24 2016 11:08:20
Usage:
  -h this message
  -u uid
  -g gid
  -p port, default is 11211. (0 to disable tcp support)
  -s ip:port, set memcached server ip and port
  -b ip:port, set backup memcached server ip and port
  -l ip, local bind ip address, default is 0.0.0.0
  -n number, set max connections, default is 4096
  -D don't go to background
  -k use ketama key allocation algorithm
  -f file, unix socket path to listen on. default is off
  -i number, set max keep alive connections for one memcached server, default is 20
  -v verbose

启动memcached各节点:

memcached1-memcached6

 

之前已经启动一个节点,需要把之前的节点先kill掉。

 

#memcached -u root -d -p 11211 -m 1024 -c 102400 -x 127.0.0.1 -X 11111
#memcached -u root -d -p 11212 -m 1024 -c 102400 -x 127.0.0.1 -X 11111
#memcached -u root -d -p 11213 -m 1024 -c 102400 -x 127.0.0.1 -X 11111
#memcached -u root -d -p 11214 -m 1024 -c 102400 -x 127.0.0.1 -X 11111
#memcached -u root -d -p 11215 -m 1024 -c 102400 -x 127.0.0.1 -X 11111
#memcached -u root -d -p 11216 -m 1024 -c 102400 -x 127.0.0.1 -X 11111
 
# ps -ef | grep memcached                                        
root      21929      1  0 15:41 ?        00:00:00 memcached -u root -d -l 127.0.0.1 -p 11211 -x 127.0.0.1 -X 11111
root      21931      1  0 15:41 ?        00:00:00 memcached -u root -d -l 127.0.0.1 -p 11212 -x 127.0.0.1 -X 11111
root      21957      1  0 15:48 ?        00:00:00 memcached -u root -d -l 127.0.0.1 -p 11213 -x 127.0.0.1 -X 11111
root      21959      1  0 15:48 ?        00:00:00 memcached -u root -d -l 127.0.0.1 -p 11214 -x 127.0.0.1 -X 11111
root      21961      1  0 15:48 ?        00:00:00 memcached -u root -d -l 127.0.0.1 -p 11215 -x 127.0.0.1 -X 11111
root      21963      1  0 15:48 ?        00:00:00 memcached -u root -d -l 127.0.0.1 -p 11216 -x 127.0.0.1 -X 11111


 

-p:指定tcp 监听端口

-d:后台运行memcached

-m:指定最大运行内存,默认64M

-c:是最大的并发连接数

-x        #设置从哪个IP上进行数据同步,也就是设置MasterIP

-X        #设置数据同步的端口号,默认11212.11212已经被使用的话,

          #需要通过这个参数来设置,否则memcached无法启动

 

 

记得启动memcached各个节点的时候,一定要加-x -X设置数据同步IP和端口,不能会报错:replication: failed to initialize replication server socket

faild to replication init

 

 

magent3:
#magent -u root -n 102400 -l 192.168.16.20 -p 12002 -s 192.168.16.20:11215 -s 192.168.16.20:11216
 
magent1: 
#magent -u root -n 102400 -l 192.168.16.20 -p 12000 -s 192.168.16.20:11211 -s 192.168.16.20:11212 -s 192.168.16.20:11213 -s 192.168.16.20:11214 -b 192.168.16.20:12002
 
magent2:
#magent -u root -n 102400 -l 192.168.16.20 -p 12001 -s 192.168.16.20:11211 -s 192.168.16.20:11212 -s 192.168.16.20:11213 -s 192.168.16.20:11214 -b 192.168.16.20:12002
 
# ps -ef | grep magent
root      20302      1  0 15:28 ?        00:00:00 magent -u root -n 102400 -l 192.168.16.20 -p 12002 -s 192.168.16.20:11215 -s 192.168.16.20:11216
root      21886      1  0 15:39 ?        00:00:00 magent -u root -n 102400 -l 192.168.16.20 -p 12000 -s 192.168.16.20:11211 -s 192.168.16.20:11212 -s 192.168.16.20:11213 -s 192.168.16.20:11214 -b 192.168.16.20:12002
root      21890      1  0 15:39 ?        00:00:00 magent -u root -n 102400 -l 192.168.16.20 -p 12001 -s 192.168.16.20:11211 -s 192.168.16.20:11212 -s 192.168.16.20:11213 -s 192.168.16.20:11214 -b 192.168.16.20:12002


 

 

magent1magent2算法:

1.可以根据magent总入口的个数(此处为2),使用除以2取余的方式,若为0分配到magent1,若为1分配到magent2,这样会实现将请求平均分配到magent1magent2

 

注:

1.memcached读写的数据多,一定将关掉防火墙或将防火墙设置为不使用跟踪链接表,否则会导致/var/log/message报错“kernel: nf_conntrack: table full, dropping packet”,

2.使用service iptables stop关掉,并且不能用iptables -L -vnx查看,因此使用此命令会将防火墙开启,虽然规则是清空的,但仍会记录连接跟踪表。



推荐阅读
  • 电信网为不能访问联通服务器的网站_老板说网站慢,我们总结了三大阶段提升性能...
    作者:李平来源:https:www.cnblogs.comleefreemanp3998757.html前言在前一篇随笔《大型网站系统架构的演化》中&# ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • 大厂首发!思源笔记docker
    JVMRedisJVM面试内存模型以及分区,需要详细到每个区放什么?GC的两种判定方法GC的三种收集方法:标记清除、标记整理、复制算法的 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了python面试题——数据库和缓存(46题)相关的知识,希望对你有一定的参考价值。1、列举常见的关系型数据库和非关系型都有那些? ... [详细]
  • 开发笔记:Memcached高性能内存对象缓存系统
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Memcached高性能内存对象缓存系统相关的知识,希望对你有一定的参考价值。一、Memcached概述 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
author-avatar
零开始1023_511
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有