目录
案例前置知识点
Memcached
概念
- 是一套开源的高性能分布式内存对象缓存系统
- 所有数据都存储在内存中
- 支持任意存储类型的数据
- 非关系型数据库
- 提高网站的访问速度
部署场景
Memcached是典型的 C/S 架构,因此需要构建服务端与Memcached API客户端。
如果要使用Memcached,是需要开发人员编写API接口程序,由API接口去连接另一端,运维人员只负责平台的搭建
Memcached常用架构

流程
- 当客户端访问Web服务器时,Web服务器会通过Memcached API程序去连接Memcached服务器
- 如果Memcached的数据库里有用户要请求的数据,就直接返回给用户
- 如果数据库中没有要请求的数据,就请求MySQL查询数据
- 在MySQL找到数据了就返回给Memcached,然后再返回给客户端
Memcached
Memcached经常用于为数据存储做前端缓存
对于关系型数据库(MySQL),并发I/O的数据量很大时,数据库会承载很高的压力,因为关系型数据库是基于磁盘存储数据,可能会导致客户端的数据延迟较大
但是在Web服务器和MySQL数据库中间加一个缓存服务器,那也就意味着Web服务器获取数据不是直接从MySQL获取,而是从缓存服务器获取
Memcached API
Memcached API程序通常安装在客户端,在上图的环境中,Web服务器就是Memcached的客户端,再由开发人员在网页的代码里添加连接到Memcached服务端的语句
Memcached API是前端应用程序和缓存之间一个桥梁
数据存储方式
- 数据存储方式:Slab Allocation
按组分配存储空间,每次先分配一个Slab,一个Slab的大小为1M,然后在1M的空间里根据数据划分大小相同的Chunk。
Chunk的大小是根据数据总量进行均分,均分后的每一个Chunk大小是相同的
数据过期方式
像Memcached这种基于内存的非关系型数据库,存储的数据不会一直存储下去,为了解决这种问题就有了过期方式
当数据过期以后,就会清理掉
-
LRU
- 数据空间不足时,会根据LRU的情况淘汰最近使用最少的记录
-
Lazy Expiration
- 惰性过期,指的是使用get时查看记录时间,从而检查记录是否已经过期
Memcached缓存机制
当程序写入缓存数据时,Memcached的API接口将Key输入路由算法模块路由到集群中一台服务,之后由API接口与服务器进行通信,完成一次分布式缓存写入
Memcached路由算法
求余数hash算法
- 先用Key做hash运算得到一串16进制的数字,再做hash算法,根据余数进行路由
- 适合大多数数据需求,但是不适合用在动态变化的环境中
- 消耗性能少,速度更快
一致性hash算法
- 一致性哈希算法的核心思想是将所有节点和数据项映射到一个环形的哈希空间上,从而实现数据的均匀分布。
- 当节点发生变动时,只需要对部分数据进行重新分配,这大大降低了数据迁移的成本。通过这种方式,一致性哈希算法在分布式系统中实现了高效的数据管理和负载均衡。
- 适合在动态变化的环境中使用
- 生成时消耗性能较多,解密时速度慢
Memcached分布式
- 依赖于Memcached的客户端来实现
- 多个Memcached服务器是独立的
- 分布式数据如果存储是由路由算法决定的

利用路由算法结合Key,为Key生成一个hash整数值,通过这个整数来匹配对应的哪个Memcached服务器,最后把这个数据写入到该服务器
路由:这里的路由不是路由器概念上的路由,而是通过对应算法来决定把数据写入到哪个Memcached服务器,尽量做到平均
案例
注意:
如果要做高可用的集群环境,就需要使用专门针对高可用集群的Memcached软件包
如果要做单节点的部署,用的软件包和集群环境的Memcached软件包是不一样的
也就是说如果想把单节点的Memcached服务器更改为高可用集群环境,需要重新安装Memcached
单节点Memcached缓存系统案例
案例环境
| 操作系统 |
IP 地址 |
角色 |
| Centos 7 |
192.168.10.101 |
Memcached服务器 |
| Centos 7 |
192.168.10.103 |
Memcached API和LAMP客户端 |
初步设置
打开101和103两台CentOS 7虚拟机,并连接上XShell
修改主机名
为了区分两台主机,使用hostnamectl命令设置主机名为对应的角色
在101主机设置
[root@localhost ~]# hostnamectl set-hostname memcache1
[root@localhost ~]# bash
在103主机设置
[root@localhost ~]# hostnamectl set-hostname memcached-api
[root@localhost ~]# bash
安装Memcached
在101主机(服务端)操作
为了方便实验关闭防火墙和内核安全机制
[root@memcache1 ~]# systemctl stop firewalld
[root@memcache1 ~]# setenforce 0
Memcached需要事件通知库来作为基本的运行环境,先导入该软件包到系统中
![]()
安装依赖,解压源码包,进入解压目录,指定安装参数,安装
[root@memcache1 ~]# yum -y install gcc*
[root@memcache1 ~]# tar zxvf libevent-2.1.8-stable.tar.gz
[root@memcache1 ~]# cd libevent-2.1.8-stable
[root@memcache1 libevent-2.1.8-stable]# ./configure --prefix=/usr/local/libevent
[root@memcache1 libevent-2.1.8-stable]# make && make install
再导入Memcached针对单节点的服务端源码包到系统
![]()
回到root家目录,解压源码包,进入解压目录,指定安装参数,安装
- --with-libevent:指定libevent函数库的位置
[root@memcache1 libevent-2.1.8-stable]# cd
[root@memcache1 ~]# tar zxvf memcached-1.5.1.tar.gz
[root@memcache1 ~]# cd memcached-1.5.1
[root@memcache1 memcached-1.5.1]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/
[root@memcache1 memcached-1.5.1]# make && make install
回到root家目录,编写一个能够方便管理Memcached状态的脚本,因为脚本中用到了killall命令,所以需要安装killall命令的依赖软件包
[root@memcache1 memcached-1.5.1]# cd
[root@memcache1 ~]# vim memcached_service.sh
[root@memcache1 ~]# yum -y install psmisc
脚本内容如下
#!/bin/bash
CMD="/usr/local/memcached/bin/memcached"
start(){
$CMD -d -m 128 -u root
}
stop(){
killall memcached;
}
ACTION=$1
case $ACTION in
'start')
start;;
'stop')
stop;;
'restart')
stop
sleep 2
start;;
*)
echo 'Usage:{start|stop|restart}'
esac
然后为该脚本添加执行权
[root@memcache1 ~]# chmod +x memcached_service.sh
然后使用该脚本启动Memcached,再使用

最低0.47元/天 解锁文章
135

被折叠的 条评论
为什么被折叠?



