英文不好只能读 麦马凯去的!!!
一、大型网站优化
1、网站访问流程
随着网站迭代开发,访问会变慢LNMP架构中网站应用访问流程
浏览器(app)=>web服务器=后端服务(php)=>数据库(mysql)
访问流程越多,访问速度和出现问题的几率也越大
优化访问速度,就需要减少访问步骤或者提高单步骤(开发写的代码有适合一个循环全是单例)的速度
2、如何优化
根据网页的访问流程,可以进行以下优化:
①提高web服务器并发 负载均衡 (多台服务器架构) nginx
②页面静态化 把经常访问,但是数据不经常发生变动的动态页面,制作为静态页面
③内存缓存优化把经常访问的数据,加载到内存中使用(计算机中最快的是CPU,内存,最后才是磁盘)
④数据库优化很多时候,还需要取数据库信息,所以优化数据库本身
(符合业务需求的sql写法不同效率不同)
二、业务需求及解决方法
发布产品类型:互联网动态站点商城
用户数量:10000-12000(用户量猛增)
PV :100000-500000 (24小时访问次数总和)
QPS:50-100*(每秒访问次数)
DAU:2000(每日活跃用户数)
随着业务量增加,访问量越来越大,用户在访向某些页面数据时,通过慢查询日志发现慢查询SQL,经过优化之后效果还是不够明显。而此类数据发生变动的频率又较小,故提出使用缓存中间件(一般会将数据存储到内存中)的方式,降低MysQL的读压力,提高整个业务架构集群的稳定和快速响应能力
慢查询日志,默认环境下,是关闭的,需要手动开启
mysql>set global slow_query_log=on;
设置慢查询阈值
set global long_query_time=1;//尽可能小,默认10s,但是业务环境最好是1s
slow_query_log_file:慢查询日志文件名
log_output参数是指定日志的存储方式,查看方式:show variables like '%log_output%';
log_output='FILE'表示将日志存入文件,默认值是'FILE';log_output='TABLE'表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中.
缓存中间件可以解决
①session共享(session不一致)
②缓存热点数据 首页面的分类信息
三、缓存服务器基础环境配置
修改主机名:vim /etc/sysconfig/network
配置网卡信息:vim /etc/sysconfig/network-scripts/ifcfg-eth0
配置域名解析:整个架构的服务器ip都配置一下域名解析,包括自己
重启reboot
mycat、nginx、php、mysqld都不用启动
四、memcached介绍与安装
Memcached是国外开发的高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性
缓存的过期和有效期由业务代码实现
官方网址: http://memcached.org/
①上传软件到服务器
软件包名称memcached-1.5.8.tar.gz
②解压并编译安装
#memcache依赖libevent安装libevent-devel解决
shell > yum -y install libevent-devel
#编译安装memcached
shell > tar xvf memcached-1.5.8.tar.gz
shell > cd memcached-1.5.8
shell > ./configure --prefix=/usr/local/memcached
shell > make && make install
![](https://img-blog.csdnimg.cn/img_convert/52fec35b885f423fa3f913a389dba5e1.png)
yum info memcached 查看软件版本
yum -y install libevent-devel 安装源码编译依赖包
![](https://img-blog.csdnimg.cn/img_convert/9d4da7bb08194720bae96030621c3f2a.png)
③查看软件启动参数,并启动
cd /usr/local/memcached/bin
./ memcached -h //在bin目录查看参数
-p是设置Memcache监听的端口,最好是1024以上的端口;
-d是启动一个守护进程(后台进程);
-m是分配给Memcache使用的内存数量,单位是MB;
-u是运行Memcache的用户;
-l是监听的服务器IP地址,可以有多个地址;
-c是最大运行的并发连接数,默认是1024;
-P是设置保存Memcache的pid文件
启动memcached
#进入memcached文件目录
shell > cd /usr/local/memcached/bin
#后台启动memcached 参数-d(守护进程)
shell > ./memcached -uroot -d
#进程查看是否启动成功
shell > ps aux |grep memcached
netstat nltp |grep memcached //查看端口号默认11211
五、memcached使用
1、命令行连接和操作
1.1、telnet连接使用
memcached启动默认占用tcp端口11211,可以通过telnet连接使用
#安装telnet客户端
shell > yum -y install telnet
#通过telnet连接11211端口
shell > telnet 127.0.0.1 11211
#连接之后敲击多次,如果看到error,即为连接成功
#显示error的原因是,没有输入命令,所以memcached服务器回复error
1.2、存储命令
add:key存在即什么都不做,不存在即添加
replace:key存在即添加,不存在即什么都不做
语法:set
set命令用于将value(数据值)存储在指定的key(键)中
如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用
set key flag exptime bytes
value
STORED //数据存储成功
flag默认没有意义 0,exptime过期时间0,永不过期 bytes数据大小(一个字母就一个字节)
如果add的 key 已经存在,则不会更新数据(过期的key 会更新),之前的值将仍然保持相同,并且您将获得响应NOT_STORED,replace刚好相反
![](https://img-blog.csdnimg.cn/img_convert/613b5c637f76434eb5d23b35d627f106.png)
1.3、删除命令
delete key 删除已经存在的key
语法: flush_all
注意此命令,在业务线上环境禁止执行。如果执行,可能会造成所有缓存清空不存在,所有的数据请求都直接到了数据库服务器。造成数据库压力瞬间变大,数据库宕机。
flush_all 命令用于清理缓存中的所有key=>value(键=>值)对
1.4、查找和计算命令
![](https://img-blog.csdnimg.cn/img_convert/9db3b271e07547a98117dd5dd0242c26.png)
语法: incr(相加)/decr (相减)计数器每做一次操作+1
incr与decr命令用于对已存在的 key(键)的数字值进行自增或自减操作incr与decr命令操作的数据必须是十进制的32位无符号整数
incr key value
decr key value
1.5、统计状态命令
缓存命中率:命中数(get获取到数据)/获取次数(get的次数)
get_hits/cmd_get,如果命中率低,业务代码缓存有问题,命中率为0,缓存没有起作用(和开发沟通业务代码有问题)
缓存穿透
访问的数据,数据库不存在的数据,每次都不能够生成缓存,每次请求都直接访问数据库,穿透了缓存,缓存没有起到作用。数据库压力没有得到缓解。(恶意攻击)
解决方案,数据库查不到的,也做一个空缓存。缓存雪崩
缓存具有失效时间,如果缓存失效时间都是一样,本来应该请求缓存的,但是因为缓存失效了,全部请求到了数据库,数据库压力剧增,可能会造成数据库宕机,进而造成系统崩溃。
解决方案,设置缓存的失效时间均匀分布。
stats的参数参考
pid: memcache服务器进程ID
uptime:服务器已运行秒数
time:服务器当前Unix时间戳
启动时间: time-uptime
version: memcache版本
pointer_size:操作系统指针大小
rusage_user:进程累计用户时间
rusage_system:进程累计系统时间
curr_connections:当前连接数量
total_connections: Memcached运行以来连接总数
connection_structures: Memcached分配的连接结构数量
cmd_get: get命令请求次数
cmd_set: set命令请求次数
cmd_flush: flush命令请求次数
get_hits: get命令命中次数
![](https://img-blog.csdnimg.cn/img_convert/8977a7acca02481fa667468e23ecbb1e.png)
bytes_read:读取总字节数
bytes_written:发送总字节数
limit_maxbytes:分配的内存总大小(字节)
accepting_conns:服务器是否达到过最大连接(0/1)
listen_disabled_num:失效的监听数
threads:当前线程数
conn_yields:连接操作主动放弃数目
bytes:当前存储占用的字节数
curr_items:当前存储的数据总数
total_items:启动以来存储的数据总数
1.6、memcached监控工具
memcached_tool.php软件,可以查看memcached运行状态、key(item)的数量了、内存使用量等需要php的运行环境
①上传memcached_tool.php到web服务器 上传到虚拟机主机可以访问的目录即可。
本次上传到了server01服务器的/usr/local/nginx/html/tp5shop/public下
②修改连接参数
shell > vim /usr/local/nginx/html/tp5shop/public/memcached_tool.php
![](https://img-blog.csdnimg.cn/img_convert/461446cb6aa64374989d3c4f74233919.png)
vim /usr/local/nginx/html/tp5shop/public/memcached_tool.php
修改配置文件
![](https://img-blog.csdnimg.cn/img_convert/db71c022501b4cb3bb47bb1babaedb8c.png)
![](https://img-blog.csdnimg.cn/img_convert/1c60aa7765d44b18b54ebd5672a13f8a.png)
1.7、失效机制(了解)
①如果key过期了,value会及时删除么,空间会及时清空么?
②如果分配的存储空间,写满了,还允许写么?
Lazy Expiration
memcached 内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为lazy (惰性) expiration。因此,memcached不会在过期监视上耗费CPU时间
比如php的里session机制懒惰机制php垃圾回收机制gc回收 python变量垃圾回收机制编程语言中,变量分配栈空间(变量名称)堆空间(变量值)
memcached1.4.25之后就不是懒惰机制了。
2 LRU
memcached会优先使用已超时记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为Least Recently Used (LRu))机制来分配空间。顾名思义,这是删除“最近最少使用"”"的记录的机制。因此,当memcached的内存空间不足时,就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想
不过,有些情况下LRU机制反倒会造成麻烦。memcached启动时通过“M"参数可以禁止LRU
如果缓存命中率低,然后key多,考虑加大内存
六、PHP使用memcached
1、PHP扩展安装
在LNMP架构中,如果需要使用到memcached。首先需要安装对应的扩展,php7以上需要安装memcached扩展。官方扩展地址: http://pecL.php.net/
①上传PHP扩展源码包
需要在web服务器上安装扩展,server01和server03
memcached-3.1.3.tgz php的扩展
libmemcached-1.0.18.tar.gz php扩展的依赖
②解压编译安装
shell > tar xvf memcached-3.1.3.tgz
shell > cd memcached-3.1.3
#扩展源码包和php关联生成configure文件
#如果执行找不到phpize,说明之前没有给php安装目录bin目录配置环境变量,重新配置即可
shell > phpize
#执行看依赖
shell > ./configure
#解决libmemcached依赖
shell > yum install -y libmemcached-devel;
#编译安装php的memcached扩展
shell > cd /root/ memcached-3.1.3
shell > ./configure --with-libmemcached-dir=/usr/local/libmemcached
--disable-memcached-sasl
shell > make && make install
![](https://img-blog.csdnimg.cn/img_convert/942e92385a414166a0567557682c36a6.png)
![](https://img-blog.csdnimg.cn/img_convert/9a0e403015c04b73ab7509c789d68113.png)
#解决libmemcached依赖
shell > tar xvf libmemcached-1.0.18.tar.gz
shell > cd libmemcached-1.8.18
shell >./configure --prefix=/usr/local/libmemcached && make && make install
#源码编译php扩展
shell > tar xvf memcached-3 . 1. 3.tgz
shell > cd memcached-3 .1 .3
#扩展源码包和php关联生成configure文件
#如果执行找不到phpize,说明之前没有给php安装目录bin目录配置环境变量,重新配置即可
shell > phpize
#编译安装php的memcached扩展
shell > ./configure --with-libmemcached-dir=usr/local/libmemcached
--disable-memcached-sasl
shell > make && make install
php添加环境变量(方便php、phpize、phpconfig查找使用)
shell > echo 'PATH=/usr/local/php/bin:$PATH' >> /etc/profile
shell > source /etc/profile
php扩展安装memcached的脚本(仅供供参考)
![](https://img-blog.csdnimg.cn/img_convert/a6e4b73130aa4fd189989fd1c7ecdaca.png)
编译完成 生成的扩展文件需要在php.ini配置文件开启
![](https://img-blog.csdnimg.cn/img_convert/98a37f3343c04e0c9225e4e0ca41f942.png)
重启php-fpm服务
插入模式输入7 yy可以复制7行
检查扩展文件是否存在
![](https://img-blog.csdnimg.cn/img_convert/75c9ed88789f46baa2595d46af54ad33.png)
命令行可以看到扩展文件只能证明/usr/local/php/etc/php.ini扩展文件已经开启了
还需要reload nginx和php-fpm
![](https://img-blog.csdnimg.cn/img_convert/8fa9aac79e694938b389fdbb015467b3.png)
2、PHP测试连接memcached
![](https://img-blog.csdnimg.cn/img_convert/9b49ab9804854b9d828e0148f29cb305.png)
以上错误是因为web服务器没有开启memcached扩展文件
extension=memcached.so
php测试连接memcached缓存服务器的代码
<?php
//实例化类
$mem = new memcached( );
//调用连接memcached方法注意连接服务器地址和端口号
$mem->addServer('192.168.17.107',11211);
//存数据
var_dump ($mem->set('name','lnmp'));
//取数据
var_dump ($mem->get('name'));
七、真实案例实现
1、session共享存储到memcached
session共享:
分布式负载均衡架构中,web服务器间的session是不共享(默认session存储在本地的文件的),会造成session校验不一致。校验验证码不通过,登录之后session不一致,造成无法判断是否登录。
解决方案:
1、session生成校验在同一台服务器nginx调度算法 ip_hash
2、session共亨多台web服务器可以调用到session(写入memcached缓存中)
①修改项目配置文件
server01和server03都需要修改,并且web服务器都要安装好memcached扩展
vim /usr/local/nginx/html/tp5shop/application/config.php
![](https://img-blog.csdnimg.cn/img_convert/b3d9079bd7404bee8ba843019ac7b595.png)
修改完成之后,之后的请求所生成的session,就被写入到memcached中了。
![](https://img-blog.csdnimg.cn/img_convert/f1398372a1364eb4b6e9cb24b2d949c1.png)
![](https://img-blog.csdnimg.cn/img_convert/72a43825f0974fb79acad1d10d52d313.png)
②访问测试
在memcached中,Isession_id作为key,session的内容作为value进行存储。都是在业务代码中实现,服务架构中,只要按需配置即可。
2、缓存热点数据
把经常访问到的数据,发生变动较小,可以存储到内存缓存中,提高使用速度
有缓存,直接返回数据
浏览器 =>web服务器=>php=>内存缓存
没有缓存,读数据库,并缓存数据,返回数据
注意修改web服务器的文件时,一定要都修改web1和web2
②修改项目缓存配置
shell > vim /usr /local/nginx/html/tp5shop/application
这个最好让开发一起修改,涉及到业务代码的问题越清楚业务就越能改
![](https://img-blog.csdnimg.cn/img_convert/e9f55cfbc41340468e568516233d2892.png)