设为首页 收藏本站
查看: 1733|回复: 0

[经验分享] Memcached + LAMP 架构安装详解【送源码包】

[复制链接]

尚未签到

发表于 2018-12-24 11:46:44 | 显示全部楼层 |阅读模式
  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 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 (数据)
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客户端
  实验环境


  所有安装包下载链接:https://pan.baidu.com/s/1APlqsA45yNu1-0onYJ5cVw
密码: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 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
  2.安装编译环境工具

yum -y install \
gcc \
gcc-c++ \
make \
pcre-devel \
expat-devel \
perl
  3 .编译安装

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

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

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

ln -s /usr/local/httpd/conf/httpd.conf  /etc/httpd  #优化配置文件路径
ln -s /usr/local/httpd/bin/*  /usr/local/bin/  #优化命令路径
chkconfig --add httpd //将httpd加入到service管理器
  7.重启服务,关闭防火墙

systemctl stop firewalld.service
setenforce 0
systemct httpd start
netstat -anpt | grep “:80”

  8.去网页测试Apache网页


安装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/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.修改配置文件

  cp support-files/my-default.cnf /etc/my.cnf   
vim  /etc/init.d/mysqld
  basedir=/usr/local/mysql     
datadir=/home/mysql

  7.启动服务

  systemctl start mysqld
mysqladmin -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/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  //
约143行检查下面这条语句是否存在,如果不存在,要重新安装mysql,如果还没有,直接重装apache
LoadModule php5_module  modules/libphp5.so
  #约242行添加php首页识别:

DirectoryIndex index.php index.html

  #约348行添加支持PHP后缀:

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps


  6.添加PHP测试内容

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

  7.重启httpd服务,在网页测试“http://192.168.65.173/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/httpd/htdocs/index1.php


  10.在网页验证

  11.安装Memcached客户端

  yum install autoconf -y
tar 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
  

  15.重启httpd服务,去网页验证客户端能否连接服务端


友情提醒:若此时网页打开出错,可尝试如下方法:
[root@localhost htdocs]# service httpd restart     
[root@localhost htdocs]# netstat -ntap | grep httpd    #查看所有httpd占用端口
tcp        0      0 192.168.65.173:80       0.0.0.0:*       LISTEN      64008/httpd         
tcp        0      0 192.168.65.173:80       192.168.65.176:49304   
FIN_WAIT2   64010/httpd         
[root@localhost htdocs]# pkill -9 httpd    #强制关闭所有httpd进程
[root@localhost htdocs]# service httpd start    #开启httpd服务
[root@localhost htdocs]# netstat -ntap | grep httpd     #再次查看端口
tcp        0      0 192.168.65.173:80       0.0.0.0:*               
LISTEN      64253/httpd         
  总结:1.此实验过程时间比较长,约1个小时左右,需要耐心等待!
2.实验步骤较多,刷脚本时注意先后顺序,避免遗漏某些命令。
3.千万注意软件包版本号,换一种版本号可能无法做出实验结果!
4.在网页验证前注意查看各种服务的端口是否被占用,无法成功重     启(主要是Apache)

  附加资料
Memcached官网:http://memcached.org/
  Memcached教程:http://www.w3cschool.cn/memcached/
  Memcached下载:http://memcached.org/downloads




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-655266-1-1.html 上篇帖子: memcached 常见问题 翻译 下篇帖子: IX memcached
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表