Lamp架构应用实践

    xiaoxiao2025-03-16  29

    (1)Memcached是什么? Memcached是一个开源的,支持高性能,高并发的分布式内存缓存系统,由C语言编写,总共2000多行代码。从软件名称上看,前3个字符“Mem”就是内存的意思,而接下来的后面5个字符“cache”就是缓存的意思,最后一个字符d,是daemon的意思,代表是服务器端守护进程模式服务。

    Memcached服务分为服务器端和客户端两部分,其中,服务器端软件的名字形如Memcached-1.4.24.tar.gz,客户端软件的名字形如Memcache-2.25.tar.gz

    (2)Memcached的作用

    传统场景中,多数Web应用都将数据保存到关系型数据库中(例如:MySQL),Web服务器从中读取数据并在浏览器中显示。但随着数据量的增大,访问的集中,关系型数据库的负担就会出现加重,响应缓慢,导致网站打开延迟等问题,影响用户体验。

    这时就需要Memcached软件出马了。使用Memcached的主要目的是,通过在自身内存中缓存关系型数据库的查询结果,减少数据库被访问的次数,以提高动态Web应用的速度,提高网站架构的并发能力和可扩展性。 Memcached服务的运行原理是通过在事先规划好的系统内存空间中临时缓存数据库中的各类数据,以达到减少前端业务服务对数据库的直接高并发访问,从而提升大规模网站集群中动态服务的并发访问能力。

    -生产场景的Memcached服务一般被用来保存网站中经常被读取的对象或数据,就像我们的客户端浏览器也会把经常访问的网页缓存起来一样,通过内存缓存来存取对象或数据要比磁盘存取快很多,因为磁盘是机械的,因此,在当今的IT企业中,Memcached的应用范围很广泛。

    1.2常见内存缓存服务软件 二,Memcached的用途与应用场景 2.1 Memcached常见用途工作流程

    Memcached是一种内存缓存软件,在工作中经常用来缓存数据库的查询数据,数据被缓存在事先与分配的Memcached管理的内存中,可以通过API或命令的方式存取内存中缓存的这些数据,Memcached服务内存中缓存的数据就像一张巨大的hash表,每条数据都是以key-value对的形式存在。

    2.1.1网站读取Memcached数据时工作流程

    从逻辑上来说,当程序访问后端数据库获取数据时会优先访问Memcached缓存,如果缓存中有数据就直接返回给客户端用户,如果没有合适的数据(没有命中),再去后端的数据库读取数据,读取到需要的数据后,就会把数据返回给客户端,同时还会把读取到的数据缓存到Memcached内存中,这样客户端用户再次请求相同的数据时就会直接读取Memcached缓存的数据了,这就大大地减轻了后端数据库的压力,并提高了整个网站的响应速度,提升了用户体验。

    展示了Memcached缓存系统和后端数据库系统的协作流程

    如上图所示:使用Memcached缓存查询的数据来减少数据库压力的具体工作流程如下:

    (1)Web程序首先检查客户端请求的数据是否在Memcached缓存中存在,如果存在,直接把请求的数据返回给客户端,此时不再请求后端数据库。

    (2)如果请求的数据在Memcached缓存中不存在,则程序会去请求数据库服务,把从数据库中取到的数据返回给客户端,同时把新取到的数据缓存一份到Memcached缓存中。

    2.1.2 网站更新Memcached数据时的工作流程 具体流程如下:

    (1)当程序更新或删除数据时,会首先处理后端数据库中的数据。

    (2)在处理后端数据库中数据的同时,也会通知Memcached,告诉它对应的旧数据失效,从而保证Memcached中缓存的数据始终和数据库中一致,这个数据一致性非常重要,也是大型网站分布式缓存集群最头疼的问题所在。

    (3)如果是在高并发读写场合,除了要程序通知Memcached过期的缓存失效外,还可能要通过相关机制,例如在数据库上部署相关程序(如在数据库中设置触发器使用UDFs),实现当数据库有更新时就把数据更新到Memcached服务中,这样一来,客户端在访问新数据时,因预先把更新过的数据库数据复制到Memcached中缓存起来了,所以可以减少第一次查询数据库带来的访问压力,提升Memcached中缓存的命中率,

    下图为Memcached网站作为缓存应用更新数据的流程 下图为Memcached服务作为缓存应用通过相关软件更新数据的流程

    Memcached在企业中的应用场景 2.2.1 作为数据库的查询数据缓存 (1)完整数据缓存

    例如:电商的商品分类功能不是经常变动的,因此可以事先放到Memcached里,然后再对外提供数据访问。这个过程被称之为“数据预热”。

    此时只需读取缓存,无需读取数据库就能得到Memcached缓存里的所有商品分类数据了,所以数据库的访问压力就会大大降低。 为什么商品分类数据可以事先放在缓存里呢? 因为,商品分类几乎都是由内部人员管理的,如果需要更新数据,更新数据库后,就可以把数据同时更新到Memcached里。 如果把商品分类数据做成静态化文件,然后,通过在前端Web缓存或者使用CDN加速效果更好。

    (2)热点数据缓存

    热点数据缓存一般是用于由用户更新的商品,例如淘宝的卖家,在卖家新增商品后,网站程序就会把商品写入后端数据库,同时把这部分数据,放入Memcached内存中,下一次访问这个商品的请求就直接从Memcached内存中取走了。这种方法用来缓存网站热点的数据,即利用Memcached缓存经常被访问的数据。

    提示: 这个过程可以通过程序实现,也可以在数据库上安装相关软件进行设置,直接由数据库把内容更新到Memcached中,就相当于Memcached是MySQL的从库一样。

    如果碰到电商双11,秒杀高并发的业务场景,必须要事先预热各种缓存,包括前端的Web缓存和后端的数据库缓存。 也就是先把数据放入内存预热,然后逐步动态更新。此时,会先读取缓存,如果缓存里没有对应的数据,再去读取数据库,然后把读到的数据放入缓存。如果数据库里的数据更新,需要同时触发缓存更新,防止给用户过期的数据,当然对于百万级别并发还有很多其他的工作要做。 绝大多数的网站动态数据都是保存在数据库当中的,每次频繁地存取数据库,会导致数据库性能急剧下降,无法同时服务更多的用过户(比如MySQL特别频繁的锁表就存在此问题),那么,就可以让Memcached来分担数据库的压力。增加Memcached服务的好处除了可以分担数据库的压力以外,还包括无须改动整个网站架构,只须简单地修改下程序逻辑,让程序先读取Memcached缓存查询数据即可,当然别忘了,更新数据时也要更新Memcached缓存。

    3.1 Memcached的特点 Memcached作为高并发,高性能的缓存服务,具有如下特点:

    协议简单。Memcached的协议实现很简单,采用的是基于文本行的协议,能通过telnet/nc等命令直接操作memcached服务存储数据。

    支持epoll/kqueue异步I/O模型,使用libevent作为事件处理通知机制。 简单的说,libevent是一套利用c开发的程序库,它将BSD系统的kqueue,Linux系统的epoll等事件处理功能封装成一个接口,确保即使服务器端的连接数增加也能发挥很好的性能。Memcached就是利用这个libevent库进行异步事件处理的。

    采用key/value键值数据类型。被缓存的数据以key/value键值形式存在,例如:

    benet-->36,key=benet,value=36 yunjisuan-->28,key=yunjisuan,value=28

    #通过benet key可以获取到36值,同理通过yunjisuan key可以获取28值

    全内存缓存,效率高。Memcached管理内存的方式非常高效,即全部的数据都存放于Memcached服务事先分配好的内存中,无持久化存储的设计,和系统的物理内存一样,当重启系统或Memcached服务时,Memcached内存中的数据就会丢失。

    如果希望重启后,数据依然能保留,那么就可以采用redis这样的持久性内存缓存系统。

    当内存中缓存的数据容量达到服务启动时设定的内存值时,就会自动使用LRU算法(最近最少被使用的)删除过期的缓存数据。也可以在存放数据时对存储的数据设置过期时间,这样过期后数据就自动被清除,Memcached服务本身不会监控数据过期,而是在访问的时候查看key的时间戳判断是否过期。

    可支持分布式集群 Memcached没有像MySQL那样的主从复制方式,分布式Memcached集群的不同服务器之间是互不通信的,每一个节点都独立存取数据,并且数据内容也不一样。通过对Web应用端的程序设计或者通过支持hash算法的负载均衡软件,可以让Memcached支持大规模海量分布式缓存集群应用。

    实例配置

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

    一、安装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.安装Memcached

    tar xf memcached-1.5.6.tar.gz -C /opt/ #解压软件包 ./configure \ --prefix=/usr/local/memcached \ --with-libevent=/usr/local/libevent/ 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 memcached //查看端口 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 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.修改配置文件

    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首页识别:

    <IfModule dir_module> DirectoryIndex index.php index.html </IfModule>

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

    <IfModule mime_module> AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps <IfModule mime_module>

    6.添加PHP测试内容

    vim /usr/local/httpd/htdocs/index.php <?php phpinfo(); ?>

    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 <?php $link=mysql_connect('192.168.65.173','skyuser','admin123'); if($link) echo "<h1>Success!!</h1>"; else echo "Fail!!"; mysql_close(); ?>

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