Memcached + LAMP 架构安装详解【送源码包】

网友投稿 251 2022-10-14

Memcached + LAMP 架构安装详解【送源码包】

Memcached简介

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

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

Memcached 特征一、协议memcached的服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。因此,通过telnet也能在memcached上保存数据、取得数据下面是例子:

$ telnet localhost 11211Trying 127.0.0.1Connected 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,把数据放进去。

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路由算法

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

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

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

所有安装包下载链接:密码: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 -C /opt mv apr-1.6.2 httpd-2.4.29/srclib/apr mv apr-util-1.6.0 -y install \ gcc \ gcc-c++ \ make \ pcre-devel \ expat-devel \ perl

3 .编译安装

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

4.添加系统服务

cp /usr/local//etc/init.d/ #将启动脚本拷贝服务程序目录下 vim /etc/init.d/ #修改启动脚本 #chkconfig: 35 85 21 #35级别自动运行 第85个启动 第21个关闭 #description: Apache is a World Wide Web server.

5.修改配置文件

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

6.优化服务

ln -s /usr/local/ /etc/ #优化配置文件路径 ln -s /usr/local/ /usr/local/bin/ #优化命令路径 chkconfig --add //将stop firewalld.service setenforce 0 systemct start netstat -anpt | grep “:80”

安装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/profilesource /etc/profile #重新读取系统环境变量useradd -s /sbin/nologin mysql #创建进程用户mysqlchown -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 mysqldmysqladmin -u root password "abc123" //给数据库root账号设置密码netstat -anpt | grep 3306

安装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/\--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/ //约143行检查下面这条语句是否存在,如果不存在,要重新安装mysql,如果还没有,直接重装apacheLoadModule php5_module modules/libphp5.so #约242行添加php首页识别:DirectoryIndex index.php index.html #约348行添加支持PHP后缀:AddType application/x-.php AddType application/x-.phps

6.添加PHP测试内容

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

8.测试数据库

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

9.修改站点内容

vim /usr/local/echo "Success!!";else echo "Fail!!";mysql_close();?>

11.安装Memcached客户端

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

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 connect('192.168.65.159',11211);$memcache->set('key','Memcache test Successfull!',0,60);$result = $memcache->get('key');unset($memcache);echo $result;?>

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

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

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

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:HashiCorp Consul 与 Kubernetes 服务目录同步
下一篇:利用Nomad构建弹性基础设施: 容错和中断恢复
相关文章

 发表评论

暂时没有评论,来抢沙发吧~