memcache 高可用群集配置

Memcache概述

Memcache是互联网领域使用极为广泛的开源分布式对象缓存系统,其目的是为了创建内存缓存系统来应对其网站LiveJournal.com所承载的巨大访问流量。作为一个极为实用的开源系统软件,Memcache在降低Live-Journal.com网站数据库负载的同时,也被众多高并发访问网站采用为主流的缓存解决方案。
Memcache利用系统内存对客户端经常进行反复读写和访问的数据进行缓存,来减轻后端数据库的访问负载和提高客户端的数据访问效率。Memcache中缓存的数据经过HASH之后被存放到位于内存上的HASH表内,而HASH表中的数据以Key-Value的形式存放。由于Memcache没有实现访问认证及安全管理控制,因此在面向Internet的系统架构中,Memcache服务器通常位于用户的安全区域。
多个Memcache节点服务器可以组成Memcache集群,在Memcache集群中,Memcache客户端的API通过32Bit的循环冗余校验码(CRC-32)将存储数据的键值对进行HASH计算后,存储到不同的Memcached节点服务器上,而当Memcached服务器节点的物理内存剩余空间不足时,Memcached将使用最近最少使用算法(LRU,LeastRecentlyUsed)对最近不活跃的数据进行清理,从而整理出新的内存空间存放需要存储的新数据。

Memcache的工作原理

Memcache的客户端根据用户访问请求中的Key,到Memcached服务器的内存HASH表中获取对应此Key的Value, Memcache客户端取到值之后直接返回给用户,而不用再到数据库中进行数据查询。当然,内存HASH表中不可能预知和存储全部客户端需要的Key-Value值对,因此,如果在Memcache服务器中没有找到与请求中的Key对应的Value,则转向后端数据库进行查询,并将查询到的Value与Key进行HASH后存入Memcached服务器中,从而保证曾经存储过的数据一定能被查询到,并将数据库中查询到的数据缓存到Memcache服务器中,从而提高下一次缓存查询的命中率。
工作流程:
1,用户终端向Web服务器发起请求(Web服务器中部署有Memcache客户端), Web服务器中的Memcache客户端向Memcached服务器发起查询请求,查询目标为用户请求中包含的Key所对应的Value。
2,如果Memcache客户端在Memcached服务器中查询到与请求Key对应的Value,则直接返回结果,本次数据查询过程结束,即整个过程不会访问数据库。通常,如果客户端针对特定Key发起的查询已不是首次查询,采取的便是这类请求响应过程,因为Memcached服务器缓存中总会命中曾经查询过的Key-Value对。
3,如果没有查询到数据,则表明Memcached服务器没有缓存请求中的Key对应的Value,即本次缓存查询未命中,但是查询到此并不结束,而是转向数据库中继续查询该值,并将查询到的数据返回给客户端,同时将该数据缓存到Memcached服务器的HASH表中,以便客户端再次发起相同请求时,该值在Memcached服务器中能够直接命中,而无需再次查询数据库。
4,当数据库中存放的永久数据发生更新时,Memcached服务器中缓存的值也需要同时更新,从而保证Memcached缓存服务器中的数据与数据库中的真实值具有一致性。

Memcache的功能特点

Memcache之所以能够应用于各种高负荷访问流量的集群场景中,除了其使用和部署简单之外,还具有很多优越的特性。
(1)协议简单。Memcache是一种基于文本行的协议,这使得与Memcache缓存系统的交互变得很简单,只需通过Telnet连接到Memcached服务器,就可以通过命令执行数据的存取和访问操作。
(2)基于Libevent的事件处理 Libevent是通过C语言开发的程序库,Libevent将BSD系统的Kqueue和Linux系统的Epoll等事件处理功能封装成一个统一的接口,与传统的数据库Select查询语句相比,使用Libevent极大提高了性能。
(3)内存数据存储管理Memcache缓存系统的所有数据均保存在内存中,数据存取速率比硬盘IO要快很多。当分配给Memcached的内存耗尽后,Memcache缓存系统自动根据数据失效日期进行失效数据的清理,同时利用LRU算法对最近最少使用数据进行清理。但是,由于数据全部储存在内存中,如果重启Memcached服务器,则储存数据会丢失。
(4)节点相互独立的分布式集群Memcache缓存系统可以由多个Memcached服务器节点构成,但是这些Memcached服务器节点彼此之间不进行心跳通信,也就是说任意两个节点之间不会进行数据同步,同时一个Memcached节点故障后其上存储的数据也不会转移到其他节点构成高可用。Memcached服务器节点彼此之间独立存取数据,增加Memcached服务器数量的目的只是以Scale-out的形式扩容整个Memcache缓存系统的容量,增加节点数量并不能为整个集群带来数据的高可用性。

Memcache集群概述

Memcache集群的配置极为简单,因为Memcache集群无需在Memcached服务器端进行配置,数据的分布存储完全取决于Memcache客户端的节点选取算法,即数据在集群节点中的存储与提取完全取决于客户端的节点选取算法,而不是服务器端集群配置的。
在Memcache集群中,服务器端只需运行Memcached服务,客户端只需在应用程序的配置文件中指定要访问的Memcached服务器节点IP地址和端口组成的列表。Memcache尽管是分布式缓存服务器系统,但服务器端的集群节点之间并没有太多的交互,各个服务器端节点之间独立存取数据,即Memcached服务器节点之间不会互相进行心跳检测,或者进行彼此数据的拷贝镜像。

(1)当应用程序向Memcache集群存储数据时,Memcache客户端会根据请求存储数据的Key-Value值对,利用一定算法从Memcached集群存储节点中选取某一个Memcached服务器节点来存储数据,当算法选定该节点后,对应Key的Value就会被存储到该节点中。
(2)当应用程序向Memcache集群提取数据时,Memcache客户端会根据请求提取数据的Key值,采用与存储该Key-Value值对时完全一样的算法来选取存储该Key值的Memcached服务器节点,理论上,如果Key值不变,则选取到的节点就是存储该Key值的节点。当找到存储Key值的Memcached节点后,Memcache便会到该节点提取对应的Value并返回给客户端。

Memcache集群的数据存取过程可以看出,Memcache客户端在选取缓存节点时所采用的算法对数据的最终存储位置有着决定性的作用,而节点选取算法也是Memcache缓存系统中最重要的部分。
Memcache缓存系统中最常使用的两个算法分别是余数HASH算法和一致性HASH算法。

Memcache集群高可用

由于Memcache集群中的Memcached服务器节点之间没有任何心跳检测机制,并且也不进行任何数据镜像备份,所以当任何一个Memcached服务器节点出现故障时,都会降低整个Memcache集群缓存系统的命中率。尽管节点故障后可以正常恢复,但是缓存在其中的数据已经丢失,并且节点恢复重新加入集群时,由于集群节点数目再次发生变化,所以不管采用的是余数HASH还是一致性HASH算法,都会再次降低缓存命中率,即集群节点的退出和重新加入可能会反复降低集群的缓存命中率。如果用户仍然无法忍受缓存系统的这种单点故障,尤其在大规模访问的业务高峰期,Memcached节点的故障可能会使得某些请求反应相当缓慢,并极大影响客户的使用体验,为了解决Memcache集群系统的单点故障,用户需要借助其他软件来实现Memcache集群系统的高可用。

Memcache最常使用的高可用方式是Memcached节点代理,其中最常使用的代理软件为Magent。Magent是一款开源并且简单实用的Memcached服务器代理软件,通过Magent缓存代理,可以防止缓存系统的单点故障,同时将缓存代理服务器配置为主备模式,即可实现代理服务器的高可用。在配置有Magent代理的Memcache缓存系统中,当客户端发起缓存数据请求时,客户端将首先连接到缓存代理服务器,然后缓存代理服务器再连接到Memcached服务器,Magent缓存代理服务器可以连接多台后端Memcached服务器,进而可以将相同的缓存数据同时存储到多个Memcached服务器,最终实现缓存数据的同步存储。如果其中某一台Memcached缓存服务器宕机,Magent缓存代理就会将其上的缓存数据从另外的Memcached服务器中提取,即最终的缓存数据不会丢失,因而缓存系统命中率不会发生变化。

Memcache集群配置

memcache服务端: 一台主配置 ,一台备配置,两台数据同步。
memcache客户端:一台客户端,检验群集高可用主备模式 是否成功 。

1:memcache服务端–主服务器

(1)首先把memcache源码包及相关的通知通知库,magent代理软件的包从官网下载下来,这里通过samba方式挂载解压相关的包。

扫描二维码关注公众号,回复: 10180487 查看本文章
# tar zxvf memcached-1.5.6.tar.gz -C /opt/
# tar zxvf libevent-2.1.8-stable.tar.gz -C /opt/
# tar zxvf magent-0.5.tar.gz -C /opt/magent

(2)然后配置 编译安装 memcache,通知通知库,magent

# cd /opt/libevent-2.1.8-stable
# ./configure --prefix=/usr/
# make && make install
# cd opt/memcached-1.5.6
# ./configure --with-libevent=/usr
# make && make install
# mkdir /opt/magent
# cd /opt/magent	      配置magent代理插件
# vim ketama.h
	前两句改下:
	#ifndef SSIZE_MAX
	#define SSIZE_MAX 32767

# vim Makefile
把-levent 改为 -levent -lm

# make	编译
之后就会产生magent可执行程序

(3)关闭防火墙和增强性安全功能 ,并下载keepalived软件

# systemctl stop firewalld
# setenforce 0
# yum install keepalived -y
# yum install openssh-clients -y

(4)配置keepalived高可用(主服务器和从服务器的routerID 优先级等不一样)

# cd /etc/keepalived/
# vim keepalived.conf
(1)router_id 改为 router_id MAGENT_HA
(2)下面4dd删除
 }号不要删
(3)interface eht0 改为 interface ens33
(4)virtual_ipaddress {	   定义修改漂移地址,剩余两个2dd全删除
      192.168.188.200
     }

(5)在global_defs 段上面添加一段函数:
 vrrp_script magent {
 script  "/opt/shell/magent.sh"   指定脚本位置(待会儿创建)
 interval 2      		  时间间隔2秒
 }

(6)在 auth_pass 1111 
     }  下面添加一段,为了调函数:
track_script {     
magent
}

(7)virtual_ipaddress {
      .................
  }
}
下面的都删掉

在这里插入图片描述
(5)创建keepalived配置文件中的magent 脚本,并给执行权限 开启keepalived服务

# mkdir /opt/shell	创建脚本
# cd /opt/shell
# vi magent.sh		
   #!/bin/bash
   K=`ps -ef | grep keepalived | grep -v grep | wc -l`
   if [ $K -gt 0 ]; then 
   magent -u root -n 51200 -l 192.168.188.200 -p 12000 -s 192.168.188.136:11211 -b 192.168.188.137:11211
   else 
   pkill -9 magent
    fi

# chmod +x magent.sh
# systemctl start keepalived.service
# netstat -ntap | grep 12000	端口起的慢

在这里插入图片描述
在这里插入图片描述
(6)从服务器下载好keepalived之后,将编译好的magent程序和keepalived配置文件复制到从服务器

# cp magent /usr/bin  	
# scp magent [email protected]:/usr/bin   把magent程序同步复制到从服务器上

先把从服务器的配置文件备份好,在scp传过去
# cd /etc/keepalived/
# scp keepalived.conf [email protected]:/etc/keepalived/

(7)查看主备是否配置成功

# cat /var/log/messages 			 查看日志文件
Transition to MASTER STATE  说明主从设置成功

# ip addr      确认漂移地址是否生效

在这里插入图片描述
(8)开启memcache ,并测试是否可以连接本地数据库

# memcached -m 512k -u root -d -l 192.168.188.136 -p 11211 		  启动memcache
# netstat - ntap | grep 11211

# yum install telnet -y
# telnet 192.168.188.136 11211   先连本地数据库测试

在这里插入图片描述
在这里插入图片描述

2:memcache服务端–从服务器

主从服务器配置不同之处:从服务器不需要安装magent代理,因为主服务器已经把编译好的magent程序scp复制到从服务器上,且keepalived配置中的routerID 优先级不同。

(1)关闭防火墙和增强性安全功能 ,并下载keepalived软件

# systemctl stop firewalld
# setenforce 0
# yum install keepalived -y
# yum install openssh-clients -y

(2)把memcache源码包及相关的通知通知库 从官网下载下来,这里通过samba方式挂载解压相关的包。

# tar zxvf memcached-1.5.6.tar.gz -C /opt/
# tar zxvf libevent-2.1.8-stable.tar.gz -C /opt/

(3)然后配置 编译安装 memcache,通知通知库

# cd /opt/libevent-2.1.8-stable
# ./configure --prefix=/usr/
# make && make install
# cd opt/memcached-1.5.6
# ./configure --with-libevent=/usr
# make && make install

(4)配置keepalived高可用(主服务器和从服务器的routerID 优先级等不一样)

# cd /etc/keepalived/
# mv keepalived.conf keepalived.conf.bak

# vim keepalived.conf
修改:
router_id MAGENT_HB
state BACKUP
virtual_router_id 52     
priority 90

在这里插入图片描述
(5)创建keepalived配置文件中的magent 脚本,并给执行权限 开启keepalived服务

# mkdir /opt/shell	创建脚本
# cd /opt/shell
# vi magent.sh
   #!/bin/bash
   K=`ps -ef | grep keepalived | grep -v grep | wc -l`
   if [ $K -gt 0 ]; then 
   magent -u root -n 51200 -l 192.168.188.200 -p 12000 -s 192.168.188.136:11211 -b 192.188.137.132:11211
   else 
   pkill -9 magent
    fi

# chmod +x magent.sh
# systemctl start keepalived.service
# netstat -ntap | grep 12000	端口起的慢

在这里插入图片描述
(6)查看主备是否配置成功

# cat /var/log/messages  验证主从
Entering BACKUP STATE  说明主从设置成功

# ip addr      确认漂移地址是否生效

在这里插入图片描述
(7)开启memcache ,并测试是否可以连接本地数据库

# memcached -m 512k -u root -d -l 192.168.188.137 -p 11211   启动
# netstat -ntap | grep 11211

# yum install telnet -y
# telnet 192.168.188.137 11211   先连本地测试

在这里插入图片描述
在这里插入图片描述

3:memcache客户端(测试)

memcache客户端:直接连接主从服务端配置的漂移地址,进入群集。并进行操作。

# service firewalld stop
# setenforce 0
# yum install telnet -y
客户端连接
# telnet 192.168.188.200 12000  漂移地址
输入 add username 0 0 7
输入 1234567

在这里插入图片描述
memcache服务端 主备两台服务器 都可以看到客户端操作存储的数据。

在这里插入图片描述
在这里插入图片描述

验证:
把主服务器的keepalived关闭,然后在客户端用get user查看,还可以看到数据,说明从服务器在运行。

在这里插入图片描述
在这里插入图片描述

发布了56 篇原创文章 · 获赞 6 · 访问量 1864

猜你喜欢

转载自blog.csdn.net/weixin_45691464/article/details/104831356
今日推荐