Memcached简介

Memcached是高性能的分布式内存缓存服务器,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等, 由国外社区网站 LiveJournal 的开发团队开发。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
官方网站:http://www.danga.com/memcached/

常用典型架构如下:

LAMP+Memcached高性能缓存服务_第1张图片

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

Memcached特点

  • 协议简单
  • 基于libevent的事件处理
  • 内置内存存储方式
  • memcached不互相通信的分布式
    libevent: http://www.monkey.org/~provos/libevent/

协议简单

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 (数据)

基于libevent的事件处理

libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能 封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。 memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。

内置内存存储方式

为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。 由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。 另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。 memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。

数据存储方式:Slab Allocation
LAMP+Memcached高性能缓存服务_第2张图片

Slab Allocation即按组分配内存,每次先分配一个slab,相当于一个大小为1MB的页,然后在1MB的空间里根据数据划分大小相同的chunk,该方法可以有效解决内存碎片问题,但可能会对空间有所浪费。

memcached不互相通信的分布式

memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。 各个memcached不会互相通信以共享信息。

Memcached缓存机制和分布式

缓存机制:
LAMP+Memcached高性能缓存服务_第3张图片

Memcached是一款非常出色的缓存软件,当程序写入缓存数据请求时, Memcached的API接口将Key输入路
由算法模块路由到集群中一台服务器,之后由API接口与服务器进行通信,完成一次分布式缓存写入。

分布式
LAMP+Memcached高性能缓存服务_第4张图片

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

实验环境

本实验用2台CentOS7:

主机 IP地址 角色 主要软件包
Memcached 192.168.37.128 Memcached​ 服务器 libevent-2.1.8-stable.tar.gzmemcached-1.5.6.tar.gz
Memcached ​API 192.168.37.130 Memcached​ API客户端 http-2.4.29.tar.gz;mysql-5.6.26.tar.gz;php-5.6.11.tar.bz2;memcache-2.2.7.tar.gz

实验部署

一、memcached服务端

1、安装编译环境

yum install gcc gcc-c++ make

2、解压安装包

tar zxvf memcached-1.5.6.tar.gz -C /opt
tar zxvf libevent-2.1.8-stable.tar.gz -C /opt #libevent:事件通知库

3、手工编译安装libevent、memcached

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

cd /opt/memcached-1.5.6/
./configure \
--prefix=/usr/local/memcached \
--with-libevent=/usr/local/libevent/
make && make install

4、建立软连接

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

5、开启memcached

systemctl stop firewalld.service
setenforce 0
memcached -d -m 32m -p 11211 -u root
#-d: 指定守护进程 -m:缓存大小 -p:端口 -u:指定管理用户
netstat -ntap | grep memc

LAMP+Memcached高性能缓存服务_第5张图片

二、LAMP搭建

(一)Apache搭建
1、安装环境包

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

2、解压安装包

tar xzvf http-2.4.29.tar.gz -C /opt
tar xzvf apr-1.4.6.tar.gz -C /opt #支持Apache上层应用跨平台,提供底层接口库
tar xzvf apr-util-1.4.1.tar.gz -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

3、手工编译安装

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

make && make install

4、编辑启动脚本

grep -v "#" /usr/local/httpd/bin/apachectl > /etc/init.d/httpd     #过滤配置文件中注释信息,拷贝到服务程序目录下
vi /etc/init.d/httpd       #在文件最前面插入下面的行
#!/bin/sh
    # chkconfig:2345 85 21
    #description:Apache is a World Wide Web server.

chmod +x /etc/init.d/httpd
chkconfig --add httpd            **#将httpd加入系统服务**

5、优化服务,使系统识别命令

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

6、编辑httpd主配置文件

vim /usr/local/httpd/conf/httpd.conf     
  ServerName www.yun.com:80
  Listen 192.168.37.130:80

7、开启httpd服务

systemctl stop firewalld.service
setenforce 0
apachectl -t #检查语法
service httpd start

LAMP+Memcached高性能缓存服务

(二)Mysql搭建

1、安装环境包

yum -y install ncurses-devel autoconf cmake

2、手工编译安装mysql

tar zxvf mysql-5.6.26.tar.gz -C /opt #解压软件包
cd /opt/mysql-5.6.26
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

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、编辑配置文件

vi /etc/init.d/mysqld
    basedir=/usr/local/mysql
    datadir=/home/mysql

7、启动mysql服务

service mysqld start
netstat -ntap | grep 3306

LAMP+Memcached高性能缓存服务_第6张图片

(三)php搭建

1、安装环境包

yum -y install gd libpng pcre libxml2-devel libjpeg-devel libpng-devel fontconfig-devel openssl-devel bzip2-devel

2、手工编译安装php

tar xjvf 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

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
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps #/etc/httpd.conf 查看是否有php5

LAMP+Memcached高性能缓存服务_第7张图片

DirectoryIndex index.php index.html

LAMP+Memcached高性能缓存服务
6、修改apache首页测试php


mv index.html index.php      #与httpd配置文件中设置要相同

6、重启httpd服务,测试

访问:http://192.168.37.130/index.php

LAMP+Memcached高性能缓存服务_第8张图片

(四)测试数据库

1、创建数据库test

create database a

2、test数据库给auser用户授权

grant all on a.* to 'auser'@'%' identified by '123123'; #授权
flush privileges; #刷新权限

LAMP+Memcached高性能缓存服务_第9张图片
3、再次修改apache首页访问数据库

vim /usr/local/httpd/htdocs/index.php     
Success!!";
else echo "Fail!!";
mysql_close();
?>

4、重启apache服务,测试数据库连接
LAMP+Memcached高性能缓存服务_第10张图片

(五)安装客户端

1、安装环境包
yum install autoconf -y
2、手工编译安装memcached

tar zxvf memcache-2.2.7.tar.gz -C /opt
cd /opt/memcache-2.2.7/       #注意:无configure

/usr/local/php5/bin/phpize   #增加为PHP模板后再对memcache进行配置

./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/  #安装完成后复制此行

LAMP+Memcached高性能缓存服务_第11张图片
3、为PHP添加memcached组件

vim /usr/local/php5/php.ini
   extension_dir = "ext"  #此行下添加
   extension_dir ="/usr/local/php5/lib/php/extensions/no-debug-zts-20131226/"                       #复制内容添加到此处
   extension = memcache.so

LAMP+Memcached高性能缓存服务_第12张图片
4、修改apache首页

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

5、重启apache服务,测试
LAMP+Memcached高性能缓存服务_第13张图片