Memcached简介:
Memcached是一套开源的高性能分布式内存对象缓存系统,它将所有数据都存储在内存中,因为在内存中会维护一章巨大的hash表,所以支持任意存储类型的数据。Memcached是典型的C/S架构,因此需要安装Memcached服务端与Memcached API客户端。
存储方式与数据过期方式:
数据存储方式:
Slab Allocation
Slab Allocation即按组分配内存一个Slab,相当于一个大小为1MB的页,然后在1MB的空间里根据数据划分大小相同的Chunk,该方法可以有效的解决内存碎片问题,但可能会对内存空间有所浪费。
数据过期方式:
LRU,Laxzy Expiration
LRU是指追加的数据空间不足时,会根据LRU的情况淘汰最近最少使用的记录。Laxzy Expiration即惰性过期,是指使用get时查看记录时间,从而检查记录是否已经过期。
Memcached缓存机制:
缓存是指常驻在内存的数据,能够快速进行读取。
当程序写入缓存数据请求时,Memcached的API接口将Key输入路由算法模块路由到集群中一台服务器,之后由API接口与服务器进行通信,完成一次分布式缓存写入。
Memcached分布式:
Memcached分布式部署主要依赖于Memcached的客户端来实现,多个Memcached服务器是独立的。分布式数据如何存储是由路由算法所决定的。
当数据到达客户端程序时,客户端的算法就是依据路由算法来决定保存的Memcached服务器。读取数据时,客户端依旧保存数据时的路由算法选中和存储数据时相同的服务器来读取数据
Memcached路由算法:
(1.)求余数hash算法
求余数hash算法先用key做hash运算得到一个整数,再去做hash算法,根据余数进行路由。这种算法适合大多数数据请求,但是不适合用在动态变化的环境中,比如有大量机器添加或者删除时,会导致大量对象的存储位置失效。
(2.)一致性hash算法
一致性hash算法适合在动态变化的环境中使用。原理是按照hash算法把对应的key通过一定的hash算法处理后,映射形成一个首尾相接的闭合循环,然后通过使用与对象存储一样的hash算法将机器映射到环中,按顺时针方向将所有对象存储到离自己最近的机器中。
本案例使用两台centos7.3系统完成,一台Memcached服务器,另一台是基于LAMP架构进行Memcached扩展的Memcached API客户端,可以根据企业需求进行架构调整,环境如下:
实验环境:
操作系统 IP 角色 软件
centos7.3 192.168.1.101 Memcached libevent-1.4.12-stable.tar.gz、memcached-1.4.31.tar.gz
centos7.3 192.168.1.105 Memcached-API memcached-2.2.0.tgz
Memcached部署:
1.关闭防火墙和selinux,配置本地hosts文件和yum源以及epel源
Memcached(服务端)部署:
2.安装libevent:
Libevent是一款跨平台的事件处理接口的封装,可以兼容多个操作系统的事件访问,Memcached的安装依赖于libevent,因此需要先完成libevent的安装
事先将软件包上传至服务器
[root@memcached ~]# tar xf libevent-1.4.14b-stable.tar.gz
[root@memcached ~]# yum install gcc gcc-c++ -y # 解决依赖关系
[root@memcached ~]# cd libevent-1.4.14b-stable/
[root@memcached libevent-1.4.14b-stable]# ./configure --prefix=/usr/local/libevent && make && make install
3.安装Memcached,编译安装需要制定libevent位置
[root@memcached ~]# cd
[root@memcached ~]# tar xf memcached-1.4.31.tar.gz
[root@memcached ~]# cd memcached-1.4.31/
[root@memcached memcached-1.4.31]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
[root@memcached libevent-1.4.14b-stable]# make -j 4 && make install
4.设置Memcached服务脚本
[root@memcached libevent-1.4.14b-stable]# cd /usr/local/memcached/
[root@memcached memcached]# vim start_memcached.sh
#!/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
start
;;
*)
echo "Usage:{start|stop|restart}"
esac
注释:
-d:以守护进程的方式运行memcached服务
-m:为Memcached分配128M的内存
-u:指定运行的用户是root
5.设置脚本权限,并启动Memcached服务
[root@memcached memcached]# chmod 755 /usr/local/memcached/start_memcached.sh
[root@memcached ~]# /usr/local/memcached/start_memcached.sh start
6.服务启动后监听TCP的11211端口
[root@memcached ~]# netstat -antp | grep memcached
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 13194/memcached
tcp6 0 0 :::11211 :::* LISTEN 13194/memcached
Memcached-API(客户端)部署:
7.客户端部署LAMP环境:
安装apache:
yum install httpd httpd-devel -y
启动httpd服务并设置为开机自启动:
systemctl start httpd
systemctl enable httpd
查看端口监听情况:
netstat -anpt | grep httpd
客户端访问测试:
http://192.168.1.105
安装mariadb数据库:
yum install mariadb mariadb-devel mariadb-server mariadb-libs
启动mariadb服务并设置为开机自启动:
systemctl start mariadb
数据库安全设置
mysql_secure_installation
登录数据库测试:
mysql -uroot -p
安装php:
yum install php php-devel
vim /etc/php.ini
将php和mysql作关联:
yum install php-mysql -y
安装常用的php模块:
yum install -y php-gd php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap curl curl-devel php-bcmath
创建php测试页面:
cat > /var/www/html/info.php << EOF
<?php
phpinfo();
?>
EOF
重启httpd服务:
systemctl restart httpd
客户端测试php:
http://192.168.1.105/info.php
客户端安装Memcached的PHP扩展功能
安装autoconf软件包:
yum install autoconf -y
解压:
tar xf memcache-2.2.0.tgz
进入目录
cd memcache-2.2.0/
增加为PHP模块后再对memcache进行配置编译
/usr/bin/phpize
配置:
./configure --enable-memcache --with-php-config=/usr/bin/php-config
编译及安装:
make && make install
编辑php.ini
vim /etc/php.ini
# 732行,新增以下命令:
extension_dir = "/usr/lib64/php/modules/"
# 864行,新增以下命令
extension = memcache.so
编写测试页面,测试memcached工作是否正常:
vim /var/www/html/index.php
<?php
$memcache = new Memcache();
$memcache->connect('192.168.1.105',11211);
$memcache->set('key','Memcache test Successfull!',0,60);
$result = $memcache->get('key');
unset($memcache);
echo $result;
?>
重启httpd服务:
systemctl restart httpd
客户端进行访问测试是否成功:
http://192.168.1.105/index.php