memcached介绍及实例部署

1. memcached概述

1.1 memcached简介

memcached:一个自由开源的,高性能的,分布式内存对象缓存系统。
Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。
Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。
特点:

  • 简洁
  • 便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题
  • 兼容许多开发语言
  • 本质上是一个简介的key-value存储系统。
  • 通过缓存,减少目标服务器的压力,提高其性能,提高可扩展性。

1.2 memcached工作原理

1.2.1 服务端缓存的实现

(1)memcached特性

memcached使用了BSD许可的服务端缓存实现。由两部分组成:
独立运行的memcached服务实例
用于访问这些服务实例的客户端
在这里插入图片描述

普通缓存memcached缓存
特性缓存于特定的应用实例绑定过,每个应用实例都只能访问特定的缓存实例独立运行于服务器上,每个应用实例都可以访问任意缓存
特性整个应用所能访问的缓存容量变小;缓存存在数据冗余,缓存系统整体效率偏低整个应用所能访问的缓存容量变大;缓存中无数据冗余;缓存系统整理效率较高
(2)缓存服务器根据负载情况变化而设定
现象解决办法
cpu使用率较高 ,空余内存较大在其上减少memcached实例来提高运行速率
cpu使用率不高,内存空余较少在其运行多个memcached来提高内存使用率
所有服务器均无过多内存此时需要考虑为服务器扩容+
(3)数据的存取过程

大型服务集群通常所存储的数据类型很多,读取不便
客户端对缓存信息的访问:该客户端知道服务器缓存系统中所包含的所有Memcached服务实例,在需要访问特定键值的数据时,该客户端会根据所需要读取的数据的键值,以及当前memcached缓存服务的配置来计算相应的哈希值,来判断所需要的信息在哪个memcached实例上,并从配置中读取memcache实例服务器所在的地址,向实例发出访问请求,读取所需的信息。

客户端对缓存信息的存入 :用户希望通过服务端缓存记录数据(假如为A),并为其指定键值(假如为B),memcached客户端首先会将B及当前服务端所记录的可用服务实例个数执行哈希计算,并根据结果决定存储与哪个memcached服务实例上,客户端会向该服务实例发出请求,并在其中记录数据A和键值B

注:每个memcached实例相互独立,彼此没有交互

  • 单个节点上不存在进程间的通信
  • 节点之间不存在数据同步以及消息广播
  • 便于节点的扩缩容
    这些记录在服务端的缓存中的数据时全局可见的,即一台memcached服务端缓存中添加一条新的记录,那么其他使用该缓存服务的应用实例都可以访问此记录。
(4)记录的组成及内容特性

在memcached中,每条记录由四部分组成:记录的键,有效期,一系列可选的标记及标识记录内容的数据。
由于记录内容的数据并不包含任何数据结构,因此memcached中记录的数据都需要经过序列化之后才存入。

1.2.2 内存管理

使用内存时,需要考虑如何将还存数据的生存期进行管理,其中包括如何是一个记录在缓存中过期,如何在缓存空间不够时执行数据的替换等。

(1)内存管理建模

由于内存的碎片化,在长时间的分配回收之后,被系统后所使用的内存将呈现一种不连续的散落在空间中,使得系统很难找到连续的存储空间,导致了下面的问题:

  • 增大了内存分配失败的概率
  • 内存分配工作变得更为复杂,降低运行效率。
    为了解决这些问题,memcached使用了一种叫slab的结构,在分配算法中,内存按照1MB的大小划分为页,该页内存则会继续分割为一系列具有相同大小的内存块。
(2)数据的存储

在这里插入图片描述
这样分配内存的特点:

  • 可以有效的降低由于记录的多次读写导致的碎片化
  • 由于memcached根据记录的大小选择需要插入的块类型,因此每个记录所分配的块的大小场场大于该记录所需要的内存大小,进而造成内存的浪费
    所以一般情况下,根据业务需求,通过memcached的配置文件来指定各个块的大小,从而尽可能的减少内存的浪费
    默认请框架memcached的每页大小为1MB,因此单个块最大为1MB。除此之外,memcached还限制了每个数据所对应的键的长度不超过250个字节。
(3)内存调优

一般来说,slab中各个块的大小及块大小的递增倍数可能会对记录所在位置的选择及内存利用率有很大的影响,例如在当前的实现下,各个slab中块的大小默认情况下按照1.25倍的方式递增的
数据的大小 --------- 根据数据的大小调整最小块的大小
各个数据的差异幅度 --------- 数据变动不是很大,则将块的递增倍数设置小一些

注: 由于memcached在计算到底哪个服务实例记录了特定键的数据时,并不会考虑用来组成缓存系统中各个服务器的差异性,若每个服务器只安装了一个memcached实例,则各个mamcached实例所拥有的可用内存将存在着数倍的差异。但是各个实例被选中的概率基本相同,仅此具有较大内存的memcached实例将无法被充分利用。我们可以通过在具有较大内存的服务器上部署多个memcached实例来解决这个问题。

(4)内存清理机制

LRU算法:基于计算机操作系统基础理论中:最近使用的页面数据会在未来一段时间内仍然被使用,已经很久没有使用的页面很有可能在未来较长一段时间内仍然不会被使用。故每次在内存中找出最久未使用的数据然后置换出来,存入新的数据。主要衡量指标:使用的时间,附加指标:使用的次数。

由于缓存系统拥有有限的资源,将会在某一时刻被服务所产生的数据填满,如果此时系统再次接收到还存数据的请求,那么就会根据LRU算法及数据的过期时间来决定移除数据。
memcached所使用的过期算法比较特殊,又称为延迟过期。当用户从memcached实例中读取数据时

  • 首先将通过配置所设置的过期时间来决定该数据是否过期
  • 过期则下次写入数据时且没有足够空间,则会选择此数据所在的内存块作为新数据的目标地址
  • 若写入时没有相应的记录标为过期,则LRU算法才被执行,从而用最久未使用的数据所在块来存储新的数据。

1.2.3 高可用实现原理

对于一个组成而言,其需要能够稳定地运行,并在出现异常的时候尽量使得异常的影响限制在某个特定的范围内,而不会导致整个系统不能正常工作。而且在出现异常之后,该组成需要能较为容易地恢复到正常的工作状态

由于memcache本身致力于创建一个简单的,有较强扩展性的缓存组件,因此没有强调数据的安全性,因此一旦其中一个memcache实例发生了故障,还可以从数据库及服务端再次计算得到该数据,并将其记录在其他可用的memcached实例上 。
由于memcache实例的个数变化会导致哈希计算的结果发生变化,从而导致对数据的请求可能会导向不到不正确的memcache实例上。使得memcached实例集群所提供的缓存服务全部失效,从而导致数据库的压力骤增
memcached采用的解决办法就是i使用Consistent Hashing(一致性哈希),在该算法的帮助下,memcached实例数量的变化将之可能导致其中一小部分键的哈希值发生变化。当memcached实例集群中一个实例故障时,只会丢失其中一个节点上的内容。若集群中的memcached实例较少时,这时一个实例失效会出现致命错误。一般设计此集群时都会考虑此问题,集群数量应该大于预估值。

1.2.4 memcached的特点

  • 内存要求高,所存储内容非持久化
  • 集中式cache:开辟分布式cache的传播问题,但需要非单点保证其可靠性,需要cluster的工作
  • 分布式扩展:将部署在一台服务器上的多个memcached服务端或部署在多个机器上的memcached服务端组成一个虚拟的放服务器,对于调运者来说完全透明,进而提高单击的内存利用率。
  • 特殊的内存分配机制:支持最大存储对象1M,简单的分配机制可以更容易的回收再分配,节省cpu开销
  • cache机制简单:不存在同步,消息分发,两阶段提交等
  • 客户端的重要性:给提供者提供很大的空间去扩展和设计客户端满足各种场景的需要。

1.2.5 memcached应用场景

(1)web缓存

若一个电子商务网站,左侧式商品分类,中间式搜索的列表,可以查看到商品信息和商家信息。且商品的内容不经常发生改变,实时性要求不高,此时缓存应该这样:
执行sql从数据库中查询全站的商品分类
地柜行程所需的分类tree
处理数据并显示到页面
而memcached的做法
在这里插入图片描述
当首次查询时,数据将正常的从数据库或其他资源加载,然后 memcached内,当下次访问此信息时,会直接从memcached中取出,而不是从新加载。
数据发生变化时:更新数据库中的分类信息 ----> 找到memcached中的key值,并删除 ----> 重新插入到memcached中
memcached内存储的操作时原子的,信息的更新不会导致客户端只获得部分信息,只会获得老版本信息或新版本信息。

(2)数据库缓存

在这里插入图片描述

2 应用实例部署

2.1 实例图解

在这里插入图片描述

2.2 基础环境配置

(1)环境规划

主机ip
mem192.168.10.11
web192.168.10.102
mysql192.168.10.102

(2)同步时间(三个节点都需处理)

[root@mem ~]# yum -y install ntp ntpdate
[root@mem ~]# ntpdate cn.pool.ntp.org
[root@mem ~]# hwclock --systohc

(3)处理防火墙(三个节点都需处理)

[root@mem ~]# systemctl stop firewalld
[root@mem ~]# systemctl disable firewalld
[root@mem ~]# setenforce 0   #本次有效,永久生效需要修改配置文件/etc/selinux/config

(4)web节点服务器配置

在web服务器上配置:192.168.10.102
安装mysql

# 安装mysql   ---省略
# 安装httpd
[root@web ~]# yum install httpd php php-gd php-mysql php-memcache -y
[root@web ~]# systemctl start httpd
[root@web ~]# systemctl enable httpd

在mysql端创建用户:192.168.10.15

mysql> create user 'memcached'@'%' identified with mysql_native_password by 'ABC123.com';
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

在web上测试http功能

[root@web ~]# vim /var/www/html/index.html
http测试
[root@web ~]# vim /var/www/html/index.php
<?php
phpinfo();
?>

测试:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
测试mysql:

[root@web ~]# vim /var/www/html/mysql.php
<?php
$link=mysql_connect('192.168.10.15','memcache','ABC123.com');
if($link)
echo "<h1>Success !!! </h1>";
else
echo "Fail !!!";
mysql_close();
?>

在这里插入图片描述

(5)memcache服务配置

安装memcache

# 安装libevent
[root@mem ~]# wget --no-check-certificate  https://github.com/libevent/libevent/releases/download/release-2.1.11-stable/libevent-2.1.11-stable.tar.gz
[root@mem ~]# tar xf libevent-2.1.11-stable.tar.gz -C /usr/local/src/
[root@mem ~]# yum install gcc gcc-c++
[root@mem ~]# cd /usr/local/src/libevent-2.1.11-stable/
[root@mem ~]# ./configure --prefix=/usr/local/libevent
[root@mem ~]# echo $?
0
[root@mem ~]# make
[root@mem ~]# echo $?
0
[root@mem ~]# make installl
[root@mem ~]# echo $?
0
# 安装memcached
[root@memcache ~]# wget http://www.memcached.org/files/memcached-1.6.6.tar.gz
[root@memcache ~]# tar xzf memcached-1.6.6.tar.gz -C /usr/local/src/
[root@memcache ~]# cd /usr/local/src/memcached-1.6.6
[root@mem memcached-1.6.6]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/
[root@mem memcached-1.6.6]# echo $?
0
[root@mem memcached-1.6.6]# make
[root@mem memcached-1.6.6]# echo $?
0
[root@mem memcached-1.6.6]# make install
[root@mem memcached-1.6.6]# echo $?
0
# 启动
[root@memcache ~]# /usr/local/memcached/bin/memcached -d -l 127.0.0.1 -p 11211 -u root -m 64 -c 1024 -P /var/run/memcached.pid
[root@mem ~]# ps -ef | grep memcached
root      18144      1  1 17:39 ?        00:00:00 /usr/local/memcached/bin/memcached -d -l 127.0.0.1 -p 11211 -u root -m 64 -c 1024 -P /var/run/memcached.pid
root      18155   7990  0 17:39 pts/0    00:00:00 grep --color=auto memcached
# 参数说明
-d 选项是启动一个守护进程,
-l 是监听的服务器IP地址,默认为所有网卡。
-p 是设置Memcache的TCP监听的端口,最好是1024以上的端口
-u 是运行Memcache的用户,如果当前为root 的话,需要使用此参数指定用户。
-m 是分配给Memcache使用的内存数量,单位是MB,默认64MB
-c 选项是最大运行的并发连接数,默认是1024
-P 是设置保存Memcache的pid文件,我这里是保存在 /var/run/memcached.pid
-M return error on memory exhausted (rather than removing items)
-f chunk size growth factor (default: 1.25)
-I Override the size of each slab page. Adjusts max item size(1.4.2版本新增)
也可以启动多个守护进程,但是端口不能重复

连接测试

[root@mem ~]# yum install telnet -y
[root@mem ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
stats   # ---> 输入status查看状态
...
STAT pid 18144 进程id
STAT uptime 129 总的运行时间,秒数
STAT time 1597916504 当前时间
STAT version 1.6.6 版本号
STAT libevent 2.1.11-stable
STAT pointer_size 64 当前操作系统的指针大小(32位系统一般是32bit
STAT rusage_user 0.017882 该进程累计用户时间
STAT rusage_system 0.107295 该进程累计的系统时间
STAT curr_items 330722 当前缓存中的KeyValue数量########################
STAT total_items 1129411 曾经总共经过缓存的KeyValue数量
STAT bytes 132252377 所有的缓存使用的内存量
STAT curr_connections 121 当前连接数###########################
STAT total_connections 58008 服务器运行以来接受的连接总数
STAT connection_structures 479 服务器分配的连接结构数
STAT cmd_get 92466399 总获取次数
STAT cmd_set 1129412 总的写入次数
STAT get_hits 90022544 总的命中次数
STAT get_misses 2443855 获取失败次数
STAT bytes_read 3822351834 总共读取的流量字节数
STAT bytes_written 63018557515 总的写入流量字节
STAT limit_maxbytes 4294967296 最大允许使用的内存量,字节
stats reset 清空统计数据
stats malloc 显示内存分配数据
stats maps
stats sizes
stats slabs 显示各个slab的信息,包括chunk的大小、数目、使用情况等
stats items 显示各个slab中item的数目和最老item的年龄(最后一次访问距离现在的秒数)
stats cachedump slab_id limit_num
显示某个slab中的前limit_num个key列表,显示格式如下
ITEM key_name [ value_length b; expire_time|access_time s]
其中,memcached 1.2.2及以前版本显示的是 访问时间(timestamp

基本操作

Command      Description         	  Example
get        Reads a value              get mykey
set        Set a key unconditionally  set mykey 0 60 5
add        Add a new key       		  add newkey 0 60 5
replace    Overwrite existing key     replace key 0 60 5
append     Append data to existing key  append key 0 60 15
prepend    Prepend data to existing key  prepend key 0 60 15
incr       Increments numerical key
           value by given number      incr mykey 2
decr       Decrements numerical
           key value by given number  decr mykey 5
delete     Deletes an existing key    delete mykey
flush_all  Invalidate specific items  immediately flush_all
version    Prints server version.     version
verbosity  Increases log level        verbosity

------------------------------------------------------------------------------------------------------- 返回目录

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值