Memcached 安装详解【送源码包】

Memcached简介

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

常用典型架构图如下:
Memcached 安装详解【送源码包】

原理讲解:
当Web客户端发送请求到web服务器的应用程序时,应用程序会通过调用Memcached API客户端程序库接口去连接 Memcached服务器,进而查询数据。如果此时web客户端所请求的数据已经在 Memcached服务端中缓存,则 Memcached服务端会将数据返回给Web客户端;如果数据不存在,则会将Web客户端请求发送至MySQL数据库,由数据库将请求的数据返回给 Memcached以及Web客户端,与此同时Memcached服务器也会将数据进行保存,方便用户下次使用。

Memcached 特征
一、协议
memcached的服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。因此,通过telnet也能在memcached上保存数据、取得数据
下面是例子:
$ telnet localhost 11211
Trying 127.0.0.1
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set foo 0 0 3 (保存命令)
bar (数据)
STORED (结果)
get foo (取得命令)
VALUE foo 0 3 (数据)
bar (数据)

二、基于libevent的事件处理
libevent是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统:Windows/Linux/BSD/Solaris等操作系统的的事件处理。Memcached 使用libevent来进行网络并发连接的处理,能够保持在很大并发情况下,仍旧能够保持快速的响应能力。

三、储存方式与数据过期方式
1.数据储存方式:Slab Allocator
(1)先把内存分成很多个Slab,这个大小是预先规定好的,以解决内存碎片的问题。分配给Slab的内存空间被称为Page,默认是1M。一个Slab下可以有多个Page。  
(2)然后把一个Page分成很多个chunk块,chunk块是用于缓存记 录的空间。chunk的大小是先有一个基本值,然后根据增长因子(1.25)来增大。    
(3)slab class : 内存区类别(48byte-1M) , 每个类别有一个slab classId    
( 4)Memcached 里面保存着slab内空闲的chunk列表,当收到要保存的item的时候,它会根据item的大小去选择一个最合适的slab,然后找到空闲的chunk,把数据放进去。
Memcached 安装详解【送源码包】

2.理解数据过期方式:    
(1)Lazy Expiration(延迟/惰性 过期)    
Memcached不会监控记录是否过期,而是在外部来获取数据的时候,才检查记录时间戳。因此被称为Lazy Expiration    
(2)LRU(Least Recently Used )        
当空间不足的时候,Memcached会优先使用已经过期的数据空间,如果还不够,那么就会把最近最少使用的对象的空间释放出来。 不是全局的,而是针对slab,可以说是区域性的。    
(3)懒惰删除机制      
  删除item对象时,不释放内存,做删除标记,指针放入slot回收插槽,下次分配的时候直接使用。

四、新建Item分配内存的过程    
1,快速定位slab classId , 先计算Item的长度        
key键长 + flag + suffix (17字节) + value值长 + 结构大小(32字节)  取最小冗余的 slab class    
2,按顺序寻找可用的chunk        
(1)slot:检查slab回收空间slot里是否有剩余的chunk                
delete:delete时标记到slot                
exptime: get时检查的过期对象标记到slot        
(2)end page ptr:检查page中是否有剩余的chunk        
(3)memory:内存还有剩余则开辟新的slab         
(4)LRU 三,memcached的数据存储方式的缺点:    
由于chunk的大小时预先分配好的特定长度,因此如果数据不能完全填满chunk,那么剩余的空间就浪费了  

五、 Memcached缓存机制
缓存是常驻在内存的数据,能够快速进行读取。而 Memcached就是这样一款非常
出色的缓存软件,当程序写入缓存数据请求时, Memcached的API接口将Key输入路
由算法模块路由到集群中一台服务器,之后由API接口与服务器进行通信,完成一次
分布式缓存写入,如下图:
Memcached 安装详解【送源码包】

六、Memcached 分布式
Memcached分布式部署主要依赖于 Memcached的客户端来实现,多个 Memcached
服务器是独立的。分布式数据如何存储是由路由算法所决定的。当数据到达客户端程序库时,客户端的算法就依据路由算法来决定保存的Memcached服务器。读取数据时,客户端依据保存数据时的路由算法选中和存储数据时相同的服务器来读取数据。如下图:
Memcached 安装详解【送源码包】

七、 Memcached路由算法
1.求余数hash算法
求余数hash算法先用key做hash运算得到一个整数,再去做hash算法,根据余数进行路由。这种算法适合大多数据需求,但是不适合用在动态变化的环境中,比如有大量机器添加或者删除时,会导致大量对象的存储位置失效

2.一致性hash算法
一致性hash算法适合在动态变化的环境中使用。原理是按照hash算法把对应的
key通过一定的hash算法处理后,映射形成一个首尾相接的闭合循环,然后通过使用与对象存储一样的hash算法将机器也映射到环中,按顺时针方向将所有对象存储到离自己最近的机器中,如下图所示:
Memcached 安装详解【送源码包】

Memcached存在的问题:
本身没有内置分布式功能,无法实现使用多台Memcachd服务器来存储不同的数据,最大程度的使用相同的资源;无法同步数据,容易造成单点故障,这里可以通过Memcached代理实现集群功能

实验案例:
使用2台CentOS7系统完成,一台Memcached服务器,一台基于LAMP架构进行的Memcache客户端

实验环境
Memcached 安装详解【送源码包】
所有安装包下载链接:https://pan.baidu.com/s/1APlqsA45yNu1-0onYJ5cVw
密码:w38l
特别提醒:一定要特别注意软件包版本问题,否则就会出错!

实验步骤
一、安装Memcached 服务器
1.安装Libevent
简介:Libevent是一款跨平台的事件处理接口的封装,可以兼容多个操作系统的事件访问。 Memcached的安装依赖于 Libevent,因此需要先完成 Libevent的安装。

yum install gcc gcc-c++ make -y
tar xzvf   libevent-2.1.8stable.tar.gz  -C /opt
cd  /opt/  libevent-2.1.8stable
./configure \
--prefix=/usr/local/libevent
Make && make install

2.安装Memcache

 tar xf memcached-1.5.6.tar.gz -C /opt/
./configure \
--prefix=/usr/local/memcached \
make && make install
ln -s /usr/local/memcache/bin/* /usr/local/bin
 memcached -d -m 32m -p 11211 -u root    //   开启服务(-d守护进程  -m缓存大小32M  -p端口11211)
 netstat -anpt | grep memc      //查看端口 11211/tcp端口
 systemctl stop firewalld.service 
 setenforce 0

二、Memcache API 客户端安装
1.搭建LAMP架构

安装apache服务

(1) 解压各种软件包
tar xf apr-1.6.2.tar.gz -C /opt
tar xf apr-util-1.6.0.tar.gz -C /opt
tar jvxf httpd-2.4.29.tar.bz2 -C /opt
mv apr-1.6.2 httpd-2.4.29/srclib/apr
mv apr-util-1.6.0 httpd-2.4.29/srclib/apr-util

(2) 安装编译环境工具

yum -y install \
gcc \
gcc-c++ \
make \
pcre-devel \
expat-devel \
perl

(3) 编译安装

cd  /opt/httpd-2.4.29
./configure \ 
--prefix=/usr/local/httpd \   #指定安装目录
--enable-so \ #启用动态加载模块支持
--enable-rewrite \ #启用网页地址重写功能,实现伪静态
--enable-charset-lite \  #启动字符集支持,以便支持使用各种字符集编码的网页 
--enable-cgi #启用CGI脚本程序支持(通用网关接口)

make && make install  #编译安装

4.添加系统服务

cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd  #将启动脚本拷贝服务程序目录下
vim /etc/init.d/httpd  #修改启动脚本

#chkconfig: 35 85 21   #35级别自动运行  第85个启动 第21个关闭 #description: Apache is a World Wide Web server.

5.修改配置文件

vi /usr/local/httpd/conf/httpd.conf
ServerName  www.yun.com:80  #填写完全主机名
Listen 192.168.65.173:80  #监听本地IP

6.优化服务

ln -s /usr/local/httpd/conf/httpd.conf  /etc/httpd  #优化配置文件路径
ln -s /usr/local/httpd/bin/*  /usr/local/bin/  #优化命令路径
chkconfig --add httpd //将httpd加入到service管理器

7.重启服务,关闭防火墙

systemctl stop firewalld.service
setenforce 0
systemct httpd start
netstat -anpt | grep “:80”

Memcached 安装详解【送源码包】

安装MYSQL数据库

1.解压软件包,安装编译环境工具

yum -y install ncurses-devel bison libaio-devel cmake
tar xzvf mysql-5.6.26.tar.gz -C /opt

2.编译安装

cd /opt/mysql-5.6.26
cmake  \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \   #软件安装位置
-DDEFAULT_CHARSET=utf8 \   #默认字符集 
-DDEFAULT_COLLATION=utf8_general_ci \  #默认字符校验
-DEXTRA_CHARSETS=all \  #额外的编码,请使用all来编译
-DSYSCONFIDIR=/etc  \   #数据目录
-DMYSQL_DATADIR=/home/mysql/  \  #指定mysql的运行用户
-DMYSQL_UNIX_ADDR=/home/mysql/mysql.sock  

make && make install #编译安装

3.添加系统服务

cp support-files/mysql.server /etc/init.d/mysqld #添加系统服务
chmod 755 /etc/init.d/mysqld #添加执行权限
chkconfig --add /etc/init.d/mysqld #将mysqld添加为系统服务
chkconfig mysqld --level 235 on #
echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile #重新读取系统环境变量
useradd -s /sbin/nologin mysql #创建进程用户mysql
chown -R mysql:mysql /usr/local/mysql/ #修改mysql安装目录的所有者,所属组

4.初始化数据库

/usr/local/mysql/scripts/mysql_install_db \
--user=mysql \
--ldata=/var/lib/mysql \
--basedir=/usr/local/mysql \
--datadir=/home/mysql

5.建立软连接
ln -s /var/lib/mysql/mysql.sock /home/mysql/mysql.sock

6.修改配置文件

cp support-files/my-default.cnf /etc/my.cnf
vim /etc/init.d/mysqld

basedir=/usr/local/mysql
datadir=/home/mysql

7.启动服务
systemctl start mysqld
netstat -anpt | grep 3306
Memcached 安装详解【送源码包】

mysqladmin -u root password "abc123" //给数据库root账号设置密码

安装PHP

1.安装编译环境

yum -y install \
gd \
libpng \
libpng-devel \
pcre \
pcre-devel \
libxml2-devel \
libjpeg-devel

2.解压软件包
tar xjvf php-5.6.11.tar.bz2 -C /opt #解压软件包

3.编译安装

cd /opt/php-5.6.11 进入编译目录下
./configure \
--prefix=/usr/local/php5 \ #
--with-gd \
--with-zlib \
--with-apxs2=/usr/local/httpd/bin/apxs \
--with-mysql=/usr/local/mysql \
--with-config-file-path=/usr/local/php5 \
--enable-mbstring

make && make install #编译安装

3.创建PHP配置文件

cp php.ini-development /usr/local/php5/php.ini

4.建立软链接

ln -s /usr/local/php5/bin/ /usr/local/bin/ #优化命令路径(软连接)
ln -s /usr/local/php5/sbin/
/usr/local/sbin/

5.修改Apache配置文件
vim /etc/httpd.conf //
约143行检查下面这条语句是否存在,如果不存在还需要重新安装mysql,如果还没有,直接重装apache
LoadModule php5_module modules/libphp5.so

#约242行添加php首页识别:
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>

#约348添加支持PHP后缀:
<IfModule mime_module>
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
<IfModule mime_module>

6.添加PHP测试内容

vim /usr/local/httpd/htdocs/index.php

<?php
phpinfo();
?>

7.重启httpd服务,在网页测试“http://192.168.65.173/index.php
Memcached 安装详解【送源码包】

8.测试数据库

mysql -u root -pabc123 #进入数据库
CREATE DATABASE sky;
GRANT all ON sky.* TO 'skyuser'@'%' IDENTIFIED BY 'admin123';
flush privileges;
exit

9.修改站点内容

vim /usr/local/httpd/htdocs/index1.php
<?php
$link=mysql_connect('192.168.65.173','skyuser','admin123');
if($link) echo "<h1>Success!!</h1>";
else echo "Fail!!";
mysql_close();
?>

10.在网页验证
Memcached 安装详解【送源码包】

11.安装Memcached客户端

yum install autoconf -y
tar zvxf memcache-2.2.7.tgz -C /opt/
cd /opt/memcache-2.2.7
//使用PHP的phpize脚本生成配置脚本configure 再进行配置编译
/usr/local/php5/bin/phpize

Memcached 安装详解【送源码包】

12.安装编译

./configure \
--enable-memcache \
--with-php-config=/usr/local/php5/bin/php-config

make && make install

/usr/local/php5/lib/php/extensions/no-debug-zts-20131226 #复制此行

13.配置PHP添加Memcached组件
vim /usr/local/php5/php.ini
搜索extension_dir = ,增加下面2行
extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-
zts-20131226/"
extension = memcache.so

14.编写测试页面,

vim /usr/local/httpd/htdocs/index.php

<?php
$memcache = new Memcache();
$memcache->connect('192.168.65.159',11211);
$memcache->set('key','Memcache test Successfull!',0,60);
$result = $memcache->get('key');
unset($memcache);
echo $result;
?>

15.重启httpd服务,去网页验证客户端能否连接服务端
Memcached 安装详解【送源码包】


友情提醒:若此时网页打开出错,可尝试如下方法:
  [root@localhost htdocs]# service httpd restart     
  [root@localhost htdocs]# netstat -ntap | grep httpd    #查看所有httpd占用端口
  tcp        0      0 192.168.65.173:80       0.0.0.0:*       LISTEN      64008/httpd         
  tcp        0      0 192.168.65.173:80       192.168.65.176:49304    
  FIN_WAIT2   64010/httpd         
  [root@localhost htdocs]# pkill -9 httpd    #强制关闭所有httpd进程
  [root@localhost htdocs]# service httpd start    #开启httpd服务
    [root@localhost htdocs]# netstat -ntap | grep httpd     #再次查看端口
 tcp        0      0 192.168.65.173:80       0.0.0.0:*               
 LISTEN      64253/httpd         

总结:1.此实验过程时间比较长,约1个小时左右,需要耐心等待!
2.实验步骤较多,刷脚本时注意先后顺序,避免遗漏某些命令。
3.千万注意软件包版本号,换一种版本号可能无法做出实验结果!
4.在网页验证前注意查看各种服务的端口是否被占用,无法成功重 启(主要是Apache)

附加资料
Memcached官网:http://memcached.org/

Memcached教程:http://www.w3cschool.cn/memcached/

Memcached下载:http://memcached.org/downloads

猜你喜欢

转载自blog.51cto.com/13760351/2280879