Memcache缓存数据库以及lnmp+memcache实现session共享

一、传统Web架构的问题:许多Web应用的数据存放在RDBMS(关系型数据库)中,应用服务器从中读取数据并在浏览器中显示,随着数据量的增大,访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影响。

mysql sqlserver oracle

数据库,数据表,数据列。表和表关系--关系型数据库

缺点:数据存在硬盘里,读写较慢

NOSQL缓存数据库(比上面的快300倍)

KV数据库:key=value;key=value;i=33;j=55相互之间没关系,关系简单,没有复杂的表以及结构

优点:数据存在内存里,读取快,关系简单

缺点:无法保存。重启就没有了

目前做法:在传统数据库前加缓存数据库,若客户请求的数据能在缓存数据库中找到则直接返回,若找不到,从传统数据库中查找并记录在缓存数据库中

Ps:手机常用数据裤:sqlite,迷你数据库

数据存储位置对比:

性能:CPU缓存>内存>硬盘>数据库

数据库优点:无与伦比的查询能力,因此数据库里只存放字符内容

可将文件,视频,音乐等文件用关键词描述组成数据库的方便查找

二、memcached缓存服务器

用途:用来集中缓存数据库查询结果,减少数据库访问次数,以提高动态web应用的相应数度。

Ps: /usr/lib/systemd/system/下有xxx.service文件才有systemctl 指令,一般rpm源码包安装都没有,可手动在目录下复制类似的文件进行修改。

构建memcached服务

1.yum安装软件包memcached

2.Memcache配置文件(无需修改,了解)

/usr/lib/systemd/system/memcached.service

ExexStart=/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS //systemctl启动命令

/etc/sysconfig/memcached//存放启动的变量内容

Ps:用户上传视频-------》优库 上传完往往无法立刻搜索到,本身已有缓存,还没过期,过会再搜索。缓存过期,重新从数据库搜索到内容

人搜索------缓存20个----数据库

用户上传视频-------》优库

人搜索,从缓存中搜索------缓存还是20个----无法找到上传视频

过会,缓存过期

人搜索------缓存21.22.23个----重新查找数据库--耗时比之前慢了一点,用于重新缓存

3.启动服务并查看网络连接状态验证是否开启成功,并关闭防火墙和selinux

Systemctl start memcached

Systemctl status memcached

Netstat -anptu | grep memcached

netstat命令可以查看系统中启动的端口信息,该命令常用选项如下:

-a显示所有端口的信息

-n以数字格式显示端口号

-t显示TCP连接的端口

-u显示UDP连接的端口

-l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口

-p显示监听端口的服务名称是什么(也就是程序名称)

注意:在RHEL7系统中,使用ss命令可以替代netstat,功能与选项一样。

4.安装并使用telnet访问memcached服务器来测试memcached服务器功能,包括增删改查等操作(没有mysql之类的连接工具)

Telnet 192.168.4.5 11211

add myname 0 180 10 //新建,myname不存在则添加,存在则报错,防止数据覆盖;

replace myname 0 180 10 //覆盖替换,如果myname不存在则报错

set myname 0 180 10 //添加或替换变量,add与replace结合

get myname //读取变量

append myname 0 180 10 //向变量中追加10个数据,加上原来的一共20

delete myname //删除变量

stats //查看状态

flush_all //清空所有

quit //退出登录

0表示不压缩,180为数据缓存时间,10为需要存储的数据字节数量。

三、由于telnet使用麻烦,工作中使用不方便,需要用php连接数据库比较方便,而php连接前提得有LNMP,最终实现LNMP+memchched

构建:

1.搭建好lnmp

2.安装php连接memcache数据库的扩展包并重启php

Yum list | grep memcache ----> php-pecl-memcache

3.修改nginx配置文件,设置动静分离,使得客户端可访问动态php页面

4.访问测试文件(mem.php),验证是否连接成功

四、session,cookie

Session:存储在服务器端,保存用户名、密码等信息

Cllkies:由服务端下发给客户端,保存在客户端的一个文件里,保存的内容主要包括:SessionID,账号名,过期时间,路径和域

例子:

人---------------------》超市(登记信息办卡)

卡(id号)-----------001.txt【存信息文件】

用户(浏览器)------------------->web服务器

Cookie=001(卡号)

请求头信息内有cookie说明不是第一次访问

存在问题:用户访问代理服务器,服务器轮询到不同的web服务器,每次访问到达不同的服务器,需要多个session和cookie

解决:使用另一台服务器存储session信息并返回cookie给客户端,web服务器从此服务器读取session信息,实验中调度器兼存储服务器使用

项目:通过Nginx调度器负载后端两台Web服务器,实现以下目标:

1.部署Nginx为前台调度服务器

2.调度算法设置为轮询

3.后端为两台LNMP服务器

4.部署测试页面,查看PHP本地的Session信息

方案:使用4台虚拟机,其中一台作为Nginx前端调度器服务器,两台虚拟机部署为LNMP

服务器Web1,Web2,还有一台测试访问的客户机。

实施方法:

1.部署后端LNMP服务器相关软件

--gcc openssl-devel pcre-devel zlib-devel

--源码包nginx

--mariadb mariadb-server mariadb-devel

--php php-mysql php-fpm(压缩包内,yum里没有)

2.修改Nginx配置文件(默认首页添加php,动静分离实现动态网页的访问)

3.启动LNMP相关服务,关闭防火墙和selinux

--nginx mariadb php-fpm

Systemctl status 服务名 //确认服务开启

4.部署前端Nginx调度服务器

A.源码包安装nginx

B.修改nginx配置文件(只做轮询,无需不提供web服务)

通过upstream定义后端服务器地址池,默认调度策略为轮询,使用proxy_pass调用upstream定义的服务器地址池:

http下:

Upstream webs{

Server 192.168.2.100:80;

Server 192.168.2.200:80;

}

Server{

Location / {

Proxy_pass http://webs;

}

}

C.重新加载nginx并通过浏览器访问测试页面(curl 192.168.4.5看是否轮询)

5.在web1和web2上将测试页面替换成目标页面(将目标页面的相关文件复制到网页根目录下)

6.目前完成的效果为客户端访问前端调度器,进入登陆页面,填写信息后刷新。还需要再次注册,说明两台计算机使用的是本地的Session,造成问题的原因出现在第二台主机并不知道用户已经在第一台主机登陆,第一台主机的登陆信息也没有传递给第二台主机。

7.完善:PHP实现session共享,通过修改php-fpm配置文件,事项session会话共享,本例使用memcached服务器共享session,为节省虚拟机数量,前端服务器作为作为共享服务器使用。

A.搭建memcache服务

B.启动服务,关防火墙,selinux

C.在web1和web2上安装连接memcache数据库的php扩展模块--php-pecl-memcache

D.修改/etc/php-fpm.d/www.conf配置文件最后两行

Php_value[session.save_handler]=files-->memcache

//定义session信息从本地修改为存储在公共的memcache服务器上,主机参数中为memcache,没有d,d为服务,在服务器上开启

Php_value[session.save_path]=/var/lib/php/session-->”tcp://192.168.4.5:11211”//通过path参数定义公共的memcached服务器在哪(通过tcp协议寻找ip以及提供memcached服务的端口)

E.重启php-fpm服务,并在客户端访问,效果应为登陆一次后,在不同的web服务器上均显示后续内容,无需重复登陆。


分享到:


相關文章: