初识memcached:

Memcached是一套开源的高性能分布式内存对象缓存系统,它将所有的数据都存储在内存中,因为在内存中会统一维护一张巨大的hash表,所以支持任意存储类型的数据。很多网站通过使用memcached提高网站的访问速度,尤其是对于大型的需要频繁访问数据的网站。

Memcached是典型的C/S结构,因此需要安装memcached服务端和memcached API客户端。Memcached服务端是用C语言编写的,而memcached API客户端可以用任何语言来编写,如PHP,Python,Perl等,并通过memcached协议和memcached服务端进行通信。

下面是memcached常用架构
在LAMP架构中安装Memcached高性能内存对象缓存应用(内含所有源码包)

memcached数据传输原理:

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

Memcached存储方式与数据过期方式:

(1)数据存储方式:Slab Allocation
Slab Allocation即按组分配内存,每次先分配一个Slab,相当于一个大小为1MB的页,然后在1MB的空间里根据数据划分大小相同的Chunk,该方法可以有效解决内存碎片问题,但可能会对内存空间有所浪费。
(2)数据过期方式:LRU,Laxzy Expiration
LRU是指追加的数据空间不足时,会根据LRU的情况淘汰最近最少使用的记录。Laxzy Expiration即惰性时期,是指使用get时查看记录时间,从而检查记录是否已经过期。

Memcached缓存机制

缓存是常驻在内存的数据,能够快速进行读取。当程序写入缓存数据请求时,memcached的API接口将Key输入路由算法模块路由到集群中一台服务器,之后由API接口与服务器进行通信,完成一次分布式缓存写入。

缓存结构图如下:
在LAMP架构中安装Memcached高性能内存对象缓存应用(内含所有源码包)

Memcached分布式:

Memcached分布式主要依赖于memcached的客户端来实现,多个memcached服务器是独立的。分布式数据如何存储是由路由算法所决定的。
当数据到达客户端程序库时,客户端的算法就依据路由算法来决定保存的memcached服务器。读取数据时,客户端依据保存数据时的路由算法选中和存储数据时相同的服务器来读取数据。

结构图如下:
在LAMP架构中安装Memcached高性能内存对象缓存应用(内含所有源码包)

Memcached路由算法:

(1)求余数算法
求余数hash算法先用key做hash运算得到一个整数,再去做hash算法,根据余数进行路由。这种算法适合大多数据请求,但是不适合用在动态变化的环境中,比如有大量机器添加或者删除时,会导致大量对象的存储位置失效。
(2)一致性hash算法
一致性hash算法适合在动态变化的环境中。原理是按照hash算法把对应的key通过一定的hash算法处理后,映射形成一个首位相接的闭合循环,然后通过使用与对象存储一样的hash算法将机器也映射到环中,按顺时针方向将所有对象存储到离自己最近的机器中

下面我通过实验进行说明

实验环境:
在LAMP架构中安装Memcached高性能内存对象缓存应用(内含所有源码包)
所有源码包:链接:https://pan.baidu.com/s/1_lMuD8bv17O4t3WxseVLPA
提取码:63l9

一、安装memcached服务器
1.安装Libevent

Libevent是一款跨平台的事件处理接口的封装,可以兼容多个操作系统的事件访问。Memcached的安装依赖于Libevent,因此需要先完成Libevent的安装

安装编译环境:

yum install gcc gcc-c++ make -y

解压安装包:

tar zxvf libevent-2.1.8-stable.tar.gz -C /opt

配置并安装:

cd /opt/libevent-2.1.8-stable/
./configure --prefix=/usr/local/libevent
make && make install

2.采用源代码的方式进行Memcached的编译安装,安装时需要指定Libevent的安装路径

tar zxvf memcached-1.5.6.tar.gz -C /opt

编译安装memcached

cd /opt/memcached-1.5.6/

指定安装路径

./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent

安装

make && make install

建立软链接,让系统识别memcached命令

ln -s /usr/local/memcached/bin/* /usr/local/bin

指定memcached的守护进程,缓存大小,端口和运行用户

memcached -d -m 32m -p 11211 -u root

查看memcached端口是否开启

netstat -ntap | grep memca
tcp 0 0 0.0.0.0:11211 0.0.0.0: LISTEN 23438/memcached
tcp6 0 0 :::11211 :::
LISTEN 23438/memcached

关闭防火墙

systemctl stop firewalld.service
setenforce 0

安装telnet工具用来连接Memcached

yum install telnet -y
telnet 127.0.0.1 11211 #进行连接

二、编译安装memcache客户端,需要安装LAMP
1.安装Apache

yum install gcc gcc-c++ make pcre-devel expat-devel perl -y #安装环境

解压所需要的安装包

tar xf apr-1.6.2.tar.gz -C /opt
tar xf apr-util-1.6.0.tar.gz -C /opt
tar xvf 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

指定路径,添加所需模块

cd httpd-2.4.29/
./configure \
--prefix=/usr/local/httpd \
--enable-so \
--enable-rewrite \
--enable-charset-lite \
--enable-cgi

编译并安装

make && make install

将启动脚本放到系统目录下

cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd

编辑启动脚本
vim /etc/init.d/httpd

chkconfig: 35 85 21 #在开头加入这句话35级别自动运行 第85个启动 第21个关闭

编辑配置文件

vim /usr/local/httpd/conf/httpd.conf
ServerName www.yun.com:80 #指定域名和端口
Listen 192.169.199.128:80 #指定本机地址和端口

将httpd加入到service管理器

chkconfig --add httpd

建立配置文件与命令文件的软链接

ln -s /usr/local/httpd/conf/httpd.conf /etc/
ln -s /usr/local/httpd/bin/* /usr/local/bin/

关闭防火墙

systemctl stop firewalld.service
setenforce 0

开启服务

service httpd start

2.安装MySQL
安装编译环境

yum install ncurses-devel autoconf cmake -y

解压软件包

tar zxvf mysql-5.6.26.tar.gz -C /opt

指定安装路径和功能模块

cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=all \
-DSYSCONFIDIR=/etc \
-DMYSQL_DATADIR=/home/mysql/ \
-DMYSQL_UNIX_ADDR=/home/mysql/mysql.sock

编译并安装

make && make install

将配置文件与启动脚本放到系统目录下

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

赋予执行权限

chmod 755 /etc/init.d/mysqld

添加到service便于管理

chkconfig --add /etc/init.d/mysqld
chkconfig mysqld --level 35 on

添加到系统的环境变量

echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile

添加管理用户

useradd -s /sbin/nologin mysql

将权限放给管理用户

chown -R mysql.mysql /usr/local/mysql/

初始化数据库

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

建立sock文件的软链接

ln -s /var/lib/mysql/mysql.sock /home/mysql/mysql.sock

编辑mysql配置文件

vim /etc/init.d/mysqld
basedir=/usr/local/mysql #在文件内指定这两个路径
datadir=/home/mysql

开启数据库

service mysqld start

设置MySQL的root密码

mysqladmin -uroot password '123456'

3.安装PHP
安装PHP的编译环境

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

解压安装包

tar jxvf php-5.6.11.tar.bz2 -C /opt

编译安装

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

将PHP配置文件和命令文件放到系统目录下便于系统识别

cp php.ini-development /usr/local/php5/php.ini
ln -s /usr/local/php5/bin/ /usr/local/bin/
ln -s /usr/local/php5/sbin/
/usr/local/sbin/

更改Apache主配置文件

vim /etc/httpd.conf
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps #添加这两句话让Apache支持PHP模块
<IfModule dir_module>
DirectoryIndex index.html index.php #在末尾添加默认首页的识别格式
</IfModule>

添加测试文件

vim /usr/local/httpd/htdocs/index.html
<?php
phpinfo();
?>

更改首页格式

mv index.html index.php

重启服务

service httpd restart

在网页测试“http://192.168.80.182/index.php
在LAMP架构中安装Memcached高性能内存对象缓存应用(内含所有源码包)

测试数据库能否连接PHP

mysql -uroot -p

mysql> create database sky;
Query OK, 1 row affected (0.01 sec)

mysql> grant all on sky.* to 'skyuser'@'%' identified by 'admin123'; #在MySQL数据库中给skyuser用户授权
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

编辑测试首页

vim index.php
<?php
$link=mysql_connect('192.168.199.128','skyuser','admin123');
if($link) echo "<h1>Success!!</h1>";
else echo "Fail!!";
mysql_close();
?>

再次访问“http://192.168.80.182/index.php”,显示success表示数据库可以连接PHP

在LAMP架构中安装Memcached高性能内存对象缓存应用(内含所有源码包)

5.安装memcache客户端:
解压memcache软件包

tar zxvf memcache-2.2.7.tgz -C /opt

Memcache2.2.7源码包中默认没有configure配置脚本,需要使用PHP的phpize脚本生成配置脚本configure

cd /opt/memcache-2.2.7/
/usr/local/php5/bin/phpize #增加为PHP的模块后再对memcache进行配置
Configuring for:
PHP Api Version: 20131106
Zend Module Api No: 20131226
Zend Extension Api No: 220131226

添加完成之后就会有一个configure文件
在LAMP架构中安装Memcached高性能内存对象缓存应用(内含所有源码包)

配置

./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/

将上述显示的路径添加到PHP的配置文件中

vim /usr/local/php5/php.ini
extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-zts-20131226/"
extension=memcache.so #在配置文件中添加如上两句话

重新编写测试页面测试memcached API功能,通过编写PHP测试代码调用memcache程序接口,来测试是否与memcached服务器协同工作,代码如下:

vim /usr/local/httpd/htdocs/index.php
<?php
$memcache = new Memcache();
$memcache->connect('192.168.199.129',11211);
$memcache->set('key','Memcache test Successfull!',0,60);
$result = $memcache->get('key');
unset($memcache);
echo $result;
?>

此代码的作用是在客户端连接memcached服务器,设置名为‘key’的值为‘Memcached test successful!’,并读取显示。显示成功,则表示服务器与客户端协同工作正常。

重启服务

service httpd restart

在memcache客户端进行访问

http://192.168.199.128/index.php

出现如下显示表示连接memcached服务端成功
在LAMP架构中安装Memcached高性能内存对象缓存应用(内含所有源码包)