linux高级运维之memcache服务
案例1:构建memcached服务
案例2:LNMP+memcached
案例3:PHP的本地Session信息
案例4:PHP实现session共享
memcache简介及理论基础:
关系型数据库:mysql mariadb
RDBMS即关系数据库管理系统(Relational Database Management System)
NoSQL,泛指非关系型的数据库
kv key=vaule数据库
redis mongdb
传统web架构的问题:
许多web应用都将数据保存到RDBMS中,应用从服务器中读取数据并在浏览器中显示
随着数据量的增大,访问的集中就会出现RDBMS负载加重,数据响应恶化,网站显示延迟等重大影响
数据储存位置对比
性能:CPU缓存>内存>磁盘>数据库
价格:CPU缓存>内存>磁盘>数据库
memcached是高性能的分布式缓存服务器
用来集中缓存数据库查询结果,减少数据库访问次数来提高动态web响应速度
官网:http://memcached.org/
内存管理机制:
传统的内存分配机制
使用完通过分配的内存后回收内存,这种方式容易产生内存碎片并降低操作系统对内存的管理效率
slab allocation机制
按照预先规定的大小,将分配的内存分割成特定长度的内存块(chunk)再把尺寸相同的内存块分成组(chunk集合)这些内存不会释放,可以重复利用
memcached使用名为least recently used(LRU)机制来分配空间
删除“最近最少使用”的记录
当memcached的内存空间不足时,从最近未被使用的记录中搜索,并将其空间分配给新的记录
/usr/lib/systemd/system/ 这个是systemctl的配置(启动脚本)文件的目录。
这个目录下有对应的服务才能启动服务成功 systemctl start memcached 有这个能启动
这个命令所有选项都是在这个目录下的脚本文件所影响的,可以把nginx加入进来用这个启,参考Apache模板。
ExecStart(函数连接)=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS
/etc/sysconfig/memcached
构建memcached服务
安装memcached软件,并启动服务
使用telnet测试memcached服务
对memcached进行增、删、改、查等操作
yum -y install memcached
memcached配置文件(查看即可,不需要修改)
vim /usr/lib/systemd/system/memcached.service
ExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS
vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
启动服务并查看网络连接状态验证是否开启成功
systemctl start memcached
systemctl status memcached
netstat -anptu | grep memcached 端口号11211
使用telnet访问memcached服务器
yum -y install telnet
telnet 192.168.4.5 11211
add name 0 180 10 //变量不存在则添加
set name 0 180 10 //添加或替换变量
replace name 0 180 10 //替换
get name //读取变量
append name 0 180 10 //向变量中追加数据
delete name //删除变量
stats //查看状态
flush_all //清空所有
STAT get_hits 14 hits 击中(成功)了14次
STAT get_misses 7 失败 7次
提示:0表示不压缩,180为数据缓存时间,10为需要存储的数据字节数量。
缓存过期时间:
人搜索 缓存20个 数据库
用户传视频 (音乐) ————youku
人搜索 缓存20个 数据库
1小时后
人搜索 缓存21个 数据库
####################################################################
LNMP+memcached:
部署LNMP实现PHP动态网站架构
为PHP安装memcache扩展
创建PHP页面,并编写PHP代码,实现对memcached的数据操作
安装源码包的依赖包
yum -y install gcc openssl-devel pcre-devel zlib-devel
安装完成nginx并启服务
cd lnmp_soft/
cd nginx-1.12.2/
useradd -s /sbin/nolgin/ nginx
./configure --help
./configure --prefix=/usr/local/nginx/ --user=nginx --group=nginx --with-http_ssl_module --with-stream
make && make install
ln -s /usr/local/nginx/sbin/nginx /sbin/
nginx
netstat -natulp |grep 80
修改配置文件实现动静分离
location / {
root html;
index index.php index.html index.htm;
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf;
}
安装php php-mysql(调用mariadb数据库的模块)
php-fpm php-pecl-memcache (调用memcache数据库的模块)
cd php_scripts/
yum -y install php php-mysql
yum -y install php-pecl-memcache
yum -y install php-fpm-5.4.16-42.el7.x86_64.rpm
安装mariadb(客户端) mariadb-server(服务端) mariadb-devel(依赖包)
yum -y install mariadb mariadb-server mariadb-devel
安装nosql数据库
yum -y install memcached
启服务和关防火墙
nginx mariadb php-fpm memcached 服务
nginx
systemctl restart mariadb
systemctl enable mariadb
systemctl restart php-fpm
systemctl enable php-fpm
systemctl restart memcached.service
systemctl enable memcached
setenforce 0
firewall-cmd --set-default-zone=trusted
验证:
cp mem.php /usr/local/nginx/html
curl 192.168.2.111/mem.php (结果为test)
####################################################
PHP的本地Session信息
部署Nginx为前台调度服务器
调度算法设置为轮询
后端为两台LNMP服务器
部署测试页面,查看PHP本地的Session信息
会员卡ID001
人--------------------------------------》超市会员『登记信息』
001.txt信息
002.txt信息
002.txt信息
会员卡ID002
人--------------------------------------》超市会员『登记信息』
001.txt信息
002.txt信息
002.txt信息
会员卡ID003
人--------------------------------------》超市会员『登记信息』
001.txt信息
002.txt信息
002.txt信息
firefox----------------------->登陆Session信息
(cookie=001) 001.txt信息
002.txt信息
002.txt信息
ip_hash解决:
web1 id1.txt{信息}
user(IP) proxy(代理) web2 id2.txt{信息} 公共服务器
web3 id3.txt{信息}
cookie="Hm_lvt...sessionid=287679e630584099aa29780a0f7658bd%7CP%23375184726%40qq.com%7C%7C1%7C0%7C0%7C%7C0%7C0%7C0"
//浏览器中可以看到sessionid。
步骤:
部署后端LNMP服务器相关软件(两台后端服务器操作相同)
//实现动静分离即可 不必安装memcached
启动LNMP服务器相关的服务并关闭防火墙
部署前端Nginx调度服务器
安装nginx软件
修改Nginx配置文件实现调度
nginx -s reload
关闭SELinux、防火墙
curl http://192.168.4.5/index.html //测试
部署后端LNMP服务器测试页面(两台后端服务器操作相同)
//可用修改index.php和home.php两个文件的内容,添加页面颜色属性
以区别后端两台不同的服务器:<body bgcolor=blue>
cd lnmp_soft/php_scripts/
tar -xf php-memcached-demo.tar.gz
cd php-memcached-demo
cp -a * /usr/local/nginx/html/
修改默认首页
location / {
root html;
index index.php index.html index.htm;
//这个是以顺序来找的,第一个没找到就找第二个。
}
firefox http://192.168.2.100 //填写账户信息
//这步测试时只能访问后端的web不能访问代理
而且要清空流量器的缓存才能 在/var/lib/php/session/下记录ID2 ID3等
ls /var/lib/php/session/ //查看服务器本地的Session信息
sess_ahilcq9bguot0vqsjtd84k7244 //注意这里的ID是随机的
浏览器访问前端调度器测试(不同后端服务器Session不一致)
google-chrome http://192.168.4.5 //推荐用google
//填写注册信息后,刷新,还需要再次注册,说明两台计算机使用的是本地Session
//第二台主机并不知道你再第一台主机已经登录,第一台主机的登录信息也没有传递给第二台主机
//实际情况是:能进入登录后跳转界面,一刷新会由web1变到web2,且能看出用户名不一样!!!
Welcome : haha
Welcome : xixi
这里的用户名会变化 意味着你之前登陆的用户名和帐号在另外一台web服务器上不生效了。
PHP实现session共享(续上实验)
Nginx服务器除了承担调度器外,还需要担任memcached数据库的角色,并在两台后端LNMP服务器上实现PHP的session会话共享
在上实验前端Nginx调度服务器上再搭建memcache服务器
安装Memcached服务
启动服务并查看网络连接状态验证是否开启成功
关闭SELinux、防火墙
在后端LNMP服务器上部署Session共享
yum -y install php-pecl-memcache
//因为后端两台web服务器(web1,web2)都需要连接memcached数据库,所以两台主机都需要安装PHP扩展模块
vim /etc/php-fpm.d/www.conf //修改该配置文件的两个参数
//文件的最后2行
修改前效果如下:
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
//原始文件,默认定义Sessoin会话信息本地计算机(默认在/var/lib/php/session)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
修改后效果如下:
php_value[session.save_handler] = memcache
#把php的值session对话信息交给谁处理 处理者(handler)是memcache
php_value[session.save_path] = "tcp://192.168.2.5:11211"
#传输对话信息的路径是通过tcp协议传给memcache服务器的11211这个端口
//定义Session信息存储在公共的memcached服务器上,主机参数中为memcache(没有d)
//通过path参数定义公共的memcached服务器在哪(服务器的IP和端口)
systemctl restart php-fpm