本文共 8766 字,大约阅读时间需要 29 分钟。
* Memcached是一套开源的高性能分布式内存对象缓存系统,它将所有的数据都存储在内存中,因为在内存中会统一维护一张巨大的Hash表,所以支持任意存储类型的数据。很多网站通过使用Memcached提高网站的访问速度,尤其是对于大型的需要频繁访问数据的网站。* Memcached是典型的C/S架构需要安装Memcached服务端与MemcachedAPI客户端。* Memcached服务端是用C语言编写的,而MemcachedAPI客户端可以用任何语言来编写,如PHP、Python、Perl等,并通过Memcached协议与Memcached服务端进行通信。
当web客户端发送请求到web服务器的应用程序时,应用程序会通过用MemcachedAPI客户端程序库接口去连接Memcached服务器,进而查询数据。如果此时web客户端所请求的数据已经在Memcached服务端中缓存,则Memcached服务端会将数据返回给web客户端;如果数据不存在,则会将web客户端请求发送至MySQL数据库,由数据库将请求的数据返回给Memcached以及web客户端,与此同时Memcached服务器也会将数据进行保存,以方便用户下次请求使用。
* 协议简单* 基于libevent的事件处理* 内置内存存储方式* memcached不互相通信的分布式
为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。 由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。 另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。 memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
* Memcached 分布式主要依赖 Memcached 的客户端来实现,多个Memcached 客户端服务器是独立的。分布式数据怎么杨来存储是由路由算法决定。* 当数据到达客户端程序库时,客户端的算法就依据路由算法来决定保存的 Memcached 服务器。读取数据时,客户端依据保存数据的路由算法选择和储存数据时相同的服务器来读取数据。
**由于网站的高并发读写需求,传统的关系型数据库开始出现瓶颈,例如:**1、对数据库的高并发读写:关系型数据库本身就是个庞然大物,处理过程非常耗时(如解析SQL语句,事务处理等)。如果对关系型数据库进行高并发读写(每秒上万次的访问),那么它是无法承受的。2、对海量数据的处理:对于大型的SNS网站,每天有上千万次的数据产生(如twitter, 新浪微博)。对于关系型数据库,如果在一个有上亿条数据的数据表种查找某条记录,效率将非常低。# 使用memcache能很好的解决以上问题。在实际使用中,通常把数据库查询的结果保存到Memcache中,下次访问时直接从memcache中读取,而不再进行数据库查询操作,这样就在很大程度上减少了数据库的负担。保存在memcache中的对象实际放置在内存中,这也是memcache如此高效的原因。
实验环境准备:
主机 | 操作系统 | IP地址 | 主要软件包 |
---|---|---|---|
Memcached API 客户端 | CentOS 7 | 192.168.138.128 | apr-1.6.2.tar/apr-util-1.6.0.tar/httpd-2.4.29.tar/mysql-5.6.26.tar/php-5.6.11.tar/memcache-2.2.7 |
Memcached 服务端 | CentOS 7 | 192.168.138.138 | libevent-2.1.8-stable.tar.gz 、 memcached-1.5.6.tar.gz |
安装 Memcached 服务端:
1.安装LibeventLibevent是一款跨平台的事件处理接口的封装,可以兼容多个操作系统的事件访问。 Memcached的安装依赖于Libevent,因此需要先完成Libevent的安装。将下载好的软件包通过winSCP工具复制到根目录下(以下所有的软件包都通过此方法导入,不再一一说明):
解压软件包并开始编译安装:* tar xvf libevent-2.1.8-stable.tar.gz -C /opt/ #解压到 /opt 目录下* cd /opt/libevent-2.1.8-stable/ ./configure --prefix=/usr/local/libevent #指定安装路径* make && make install #开始制作,编译安装到此Libevent 安装完毕!
2.安装 Memcached(采用源码的方式进行安装Memcached的编译安装,安装时需要制定Libevent的安装路径)* tar xvf memcached-1.5.6.tar.gz -C /opt/* cd /opt/memcached-1.5.6/ ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent #指定安装路径(这里安装需要注意的是,需要指定 Libevent 的安装路径,因为 Memcached 需要依赖它)* make && make install安装完成!
3.Memcached 优化与启动:* ln -s /usr/local/memcached/bin/* /usr/local/bin/ #建立软连接,方便使用它的命令* memcached -d -m 32m -p 11211 -u root #启动 memcached(-d:守护进程、-m:指定缓存大小为32M 、-p:指定默认端口11211 、 -u:指定 登陆用户为 root)* netstat -antp | grep memcached #查看启动监听端口
4.关闭防火墙、SE功能:* systemctl stop firewalld.service* setenforce 0
5.Memcached 连接:* yum install telnet -y #需要安装 telnet 软件* telnet 127.0.0.1 11211 #开始连接本地memcached 11211端口
6.这里将Memcached的一些基本操作命令整理出来如下:* add username 0 0 7 #第一个0:不设置序列号,第二个0:无过期时间,第3个值是,字符长度* get username #查看username这个值的有效长度* gets username #查看username 这个值的有效长度和更新因子* set username 0 0 8 #更新username这个值,有这个值则更新,无则创建* replace username 0 0 6 #更新username,但是这个username必须存在* cas username 0 0 7 4 #检查更新,更新因子必须和查询的因子一样才能更新* append username 0 0 7 #在原有的值后面追加* prepend username 0 0 2 #在原有的值前面追加* delete username #删除username* flush_all #清除所有缓存数据* stats #显示状态信息* quit #退出
到此 Memcached 服务端安装完毕,下面就需要开始安装 Memcached API 客户端。
安装 Memcached API 客户端:1.为了使得程序可以直接调用Memcached库和接口,可以使用Memcached扩展组件将Memcached添加为PHP的一个模块。此扩展使用了Libmemcached库提供的API与Memcached服务端进行交互。
**首先客户端需要搭建 LAMP 架构,这里整理出一个 LAMP安装启动脚本,只需将需要的软件包放入/root/目录下,执行脚本即可完成LAMP平台部署**#!/bin/bash#安装LAMP环境#手工编译安装apache服务systemctl stop firewalld.servicesetenforce 0yum -y install gcc gcc-c++ pcre-devel expat-devel perltar xvf httpd-2.4.29.tar.bz2tar xvf apr-1.6.2.tar.gztar xvf apr-util-1.6.0.tar.gzmv apr-1.6.2/ httpd-2.4.29/srclib/aprmv apr-util-1.6.0/ httpd-2.4.29/srclib/apr-utilcd httpd-2.4.29/./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgimake && make install#优化httpd服务cp /usr/local/httpd/bin/apachectl /etc/init.d/httpdsed -i '1a #chkconfig:23 85 40\n#description:apache is a web server' /etc/init.d/httpdchmod 755 /etc/init.d/httpdchkconfig --add httpdchkconfig httpd onln -s /usr/local/httpd/conf/httpd.conf /etc/httpd.confsed -i '/^#Listen/c Listen 192.168.138.128:80' /usr/local/httpd/conf/httpd.confsed -i '/Listen 80/s/^/#/' /usr/local/httpd/conf/httpd.confsed -i '/^#ServerName/s/^#//' /usr/local/httpd/conf/httpd.confln -s /usr/local/httpd/bin/* /usr/local/bin/apachectl -tservice httpd startnetstat -natp | grep 80#安装MYSQLyum -y install ncurses-devel cmake bison libaio-devel autoconfcd ~/tar xvf mysql-5.6.26.tar.gzcd mysql-5.6.26/cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DEXTRA_CHARSETS=all -DSYSCONFDIR=/etc -DMYSQL_UNIX_ADDR=/home/mysql/mysql.sock -DMYSQL_DATADIR=/home/mysqlmake && make install#优化mysql服务\cp support-files/my-default.cnf /etc/my.cnfcp support-files/mysql.server /etc/init.d/mysqldchmod 755 /etc/init.d/mysqldchkconfig --add /etc/init.d/mysqldchkconfig mysqld --level 235 onecho "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profilesource /etc/profileuseradd -M -s /sbin/nologin mysqlchown -R mysql.mysql /usr/local/mysql#初始化mysql数据库/usr/local/mysql/scripts/mysql_install_db --user=mysql --ldata=/var/lib/mysql --datadir=/home/mysql --basedir=/usr/local/mysqlln -s /usr/local/mysql/bin/* /usr/local/binsed -i '/^datadir=/c datadir=/home/mysql' /etc/init.d/mysqldsed -i '/^basedir=/c basedir=/usr/local/mysql' /etc/init.d/mysqld#read -p '开启mysql服务(y/n)' w#if [ $w == y ]#thenservice mysqld startnetstat -antp | grep 3306#fi#安装phpyum -y install gd gd-devel libxml2-devel libjepg-devel libpng-devel libpng zlib-develcd ~/tar xvf php-5.6.11.tar.bz2cd php-5.6.11/./configure --prefix=/usr/local/php5 --with-mysql=/usr/local/mysql --with-apxs2=/usr/local/httpd/bin/apxs --with-gd --with-zlib --with-config-file-path=/usr/local/php5 --enable-mbstringmake && make installcp php.ini-development /usr/local/php5/php.iniln -s /usr/local/php5/bin/* /usr/local/bin/ln -s /usr/local/php5/sbin/* /usr/local/sbin/#配置httpd能够识别支持phpsed -i -e '/AddType application\/x-gzip .gz .tgz/a AddType application\/x-httpd-php .php\nAddType application\/x-httpd-php-source .phps' /usr/local/httpd/conf/httpd.confsed -i '/ DirectoryIndex index.html/c DirectoryIndex index.html index.php' /usr/local/httpd/conf/httpd.confservice httpd restartecho -e " " >/usr/local/httpd/htdocs/index.htmlmv /usr/local/httpd/htdocs/index.html /usr/local/httpd/htdocs/index.phpecho "LAMP环境搭建好了,在网页测试\"http://192.168.138.128/index.php\""
2.LAMP架构搭建完成之后需要重启一下Apache和MySQL,然后再测试访问PHP:* service httpd stop* service httpd start* systemctl stop mysqld.service* systemctl start mysqld.service
3.测试数据库工作是否正常:进入MySQL给页面赋予权限:* mysql -uroot -p* create database sky;* grant all on sky.* to 'skyuser'@'%' identified by 'admin123'; * flush privileges;
* 编写代码,用网页测试数据库:* vim /usr/local/httpd/htdocs/index.php Success!!";else echo "Fail!!";mysql_close();?>到此LAMP 也搭建完成,下面需要安装 Memcached 客户端软件。
3.安装 Memcached 客户端* yum install autoconf -y* tar xvf memcache-2.2.7.tgz -C /opt # 解压软件包* cd /opt/memcache-2.2.7*提示: memcache-2.2.7.tgz 源码包中默认是没有 configure 配置脚本,需要使用 PHP 的 phpize 脚本生成配置脚本 ,否则没办法 ./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/ #记录好这条路径 ,后边需要指向PHP配置文件。* 修改PHP配置文件,添加 Memcached 组件:* cd /root/php-5.6.11/* cp php.ini-development /usr/local/php5/php.ini* 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 connect('192.168.138.138',11211); #客户端连接 memcached 服务器$memcache->set('key','Memcache test Successfull!',0,60); #设置名为 “key”的键的值为Memcache test Successfull ,并读取显示。显示成功$result = $memcache->get('key');unset($memcache);echo $result;?>测试访问服务器:
到此高性能内存对象缓存 Memcached 搭建成功!
下篇是 Memcached主主复制及 Memcached服务高可用配置。转载于:https://blog.51cto.com/13721050/2292360