①网民、普通用户 功能多 页面多 获取到信息多
②开发人员 代码量大 数据量大 访问量大
③产品运营人员 seo(搜索引擎优化)
④运维人员 服务器 SA devops
pv 页面访问次数 页面
ip 访问ip数
uv 访问用户数(cookie埋点 useragent+IP+time token uuid)
DAU 注册用户的日活跃数
随着网站迭代开发,访问会变慢
LNMP架构中网站应用访问流程
浏览器=>web服务器=>后端服务(php)=>数据库(mysql)
访问流程越多,访问速度和出现问题的几率也越大
优化访问速度,就需要减少访问步骤
根据网页的访问流程,可以进行一下优化:
①提高web 服务器并发 负载均衡(多台服务器架构) nginx
②页面静态化 把经常访问,但是数据不经常发生变动的动态页面,制作为静态页面
③内存缓存优化 把经常访问的数据,加载到内存中使用
④数据库优化 很多时候,还需要取数据库信息,所以优化数据库本身
时间:2016.6.-2016.9
发布产品类型:互联⽹动态站点 商城
⽤户数量: 10000-12000(⽤户量猛增)
PV : 100000-500000(24⼩时访问次数总和)
QPS: 50-100*(每秒访问次数)
DAU: 2000(每⽇活跃⽤户数)
随着业务量增加,访问量越来越大,用户在访问某些页面数据时,通过慢查询日志发现慢查询SQL,经过优化之后效果还是不够明显。而此类数据发生变动的频率又较小,故提出使用缓存中间件(一般会将数据存储到内存中)的方式,降低MySQL的读压力,提高整个业务架构集群的稳定和快速响应能力
在tp5shop商城业务中,在两个点使用:
①首页栏目项加载
②负载均衡后,web服务器间session共享的问题
根据以上业务需求,准备加入缓存中间件服务器
根据以上业务需求和方案,服务器架构升级为如下示意图
图太大了,放不下了,可以到之后下载到的课程目录里找到
memory cache cache in memory 缓存放入内存中
Memcached 是国外 社区 网站 LiveJournal 的开发团队开发的 高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web 应用的速度、提高可扩展性
关于缓存的过期,有效期问题,由业务编程代码实现
①下载或者上传软件到服务器
②解压并编译安装
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
遇到依赖问题
shell > yum -y install libevent-devel
如果libevent通过yum装不上,也可以通过源码编译的方式安装
libevent指定安装路径
shell > ./configure --prefix=/usr/local/libevent
memcached安装参数,指定对应的libevent库地址(安装地址非源码包)
shell > ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
安装后,可以查看目录
③查看软件启动参数,并启动
shell > cd /usr/local/memcached/bin
shell > ./memcached -h
-p是设置Memcache监听的端口,,最好是1024以上的端口;
-d是启动一个守护进程;
-m是分配给Memcache使用的内存数量,单位是MB;
-u是运行Memcache的用户;
-l是监听的服务器IP地址,可以有多个地址;
-c是最大运行的并发连接数,默认是1024;
-P是设置保存Memcache的pid文件
启动memcached
shell > cd /usr/local/memcached/bin
shell > ./memcached -uroot -d
通过telnet进行连接使用,如果没有可以yum -y install telnet安装
Tip:nosql相关介绍
nosql not only sql (不仅仅是sql) 泛指非关系数据库
sql 关系型数据库 mysql oracle sqlsever postgresql ~~~~
国内三大nosql数据库:
memcached redis 作为缓存中间件来使用 数据存储到内存中
mongodb document(文档存储) bison binary json {name:devops,age:8,sex:’男’}
memcached的存储方式和结构为,key=>value格式,存储和获取数据value值,也就是对于key进行操作
例如:存储一个名字name devops
key=>value name:devops
语法:set
set 命令用于将 value(数据值) 存储在指定的 key(键) 中
如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用
devops
set key flag exptime bytes
value
flag 服务端提供的一个标识,默认没什么意义,默认可以传个0,这个标识是为了编程语言一个状态,例如:flag(0,1) 代表是否采用压缩机制 0代表不压缩,1代表压缩
bytes 字节 计算机存储的最小单位 KB MB GB TB BB YB ZB
字符 纯英文和数字 一个字符代表一个字节 1b
中文汉字 字符编码格式 GBK 一个字符2个字节 UFT-8 一个字符3个字节
语法:add
add 命令用于将 value(数据值) 存储在指定的 key(键) 中
如果 add 的 key 已经存在,则不会更新数据(过期的 key 会更新),之前的值将仍然保持相同,并且您将获得响应 NOT_STORED
add key flag exptime bytes
value
语法:replace
replace 命令用于替换已存在的 key(键) 的 value(数据值)
如果 key 不存在,则替换失败,并且您将获得响应 NOT_STORED
replace key flag exptime bytes
value
语法:append
append 命令用于向已存在 key(键) 的 value(数据值) 后面追加数据
append key flag exptime bytes
value
语法:prepend
prepend 命令用于向已存在 key(键) 的 value(数据值) 前面追加数据
prepend key exptime bytes value
语法:delete
delete 命令用于删除已存在的 key(键)
delete key
语法:flush_all
flush_all 命令用于清理缓存中的所有 key=>value(键=>值) 对
该命令提供了一个可选参数 time,用于在制定的时间后执行清理缓存操作
flush_all [time]
语法:get
get 命令获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空
get key1 key2 key3
语法:incr(相加)/decr(相减)
计数器 每做一次操作 +1
incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自增或自减操作
incr 与 decr 命令操作的数据必须是十进制的32位无符号整数
incr key value
decr key value
语法:stats
stats 命令用于返回统计信息例如 PID(进程号)、版本号、连接数等
stats
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命令命中次数
get_misses:get命令未命中次数
delete_misses:delete命令未命中次数
delete_hits:delete命令命中次数
incr_misses:incr命令未命中次数
incr_hits:incr命令命中次数
decr_misses:decr命令未命中次数
decr_hits:decr命令命中次数
cas_misses:cas命令未命中次数
cas_hits:cas命令命中次数
cas_badval:使用擦拭次数
auth_cmds:认证命令处理的次数
auth_errors:认证失败数目
bytes_read:读取总字节数
bytes_written:发送总字节数
limit_maxbytes:分配的内存总大小(字节)
accepting_conns:服务器是否达到过最大连接(0/1)
listen_disabled_num:失效的监听数
threads:当前线程数
conn_yields:连接操作主动放弃数目
bytes:当前存储占用的字节数
curr_items:当前存储的数据总数
total_items:启动以来存储的数据总数
evictions:LRU释放的对象数目
reclaimed:已过期的数据条目来存储新数据的数目
缓存命中率:命中数(get获取到数据)/获取次数(get的次数)
get_hits/cmd_get,如果命中率低,业务代码缓存有问题,命中率为0,缓存没有起作用
缓存穿透、缓存雪崩
为了LNMP架构中,可以使用memcached缓存,业务代码为php,需要安装php的扩展,来实现php操作memcached extension
①下载或者上传PHP扩展库
②解压编译安装
shell > tar xvf memcache-3.0.8.tgz
shell > cd memcache-3.0.8
shell > phpize
shell > ./configure
shell > make && make install
PHP扩展编译安装,需要使用到phpize和php-config,把php的bin目录配置到PATH中,如果没有配置,可以按照如下配置到/etc/profile,注意生效重载source /etc/profile
③在php.ini配置文件里开启
shell > vim /usr/local/php/etc/php.ini
重启php-fpm服务
④查看phpinfo里的显示
①编辑测试文件
①如果key过期了,value会及时删除么,空间会及时清空么?
②如果分配的存储空间,写满了,还允许写么?
memcached 内部不会监视记录是否过期,而是在 get时查看记录的时间戳,检查记录是否过期。这种技术被称为 lazy(惰性)expiration。因此,memcached 不会在过期监视上耗费 CPU 时间
比如php的里session机制 懒惰机制 php垃圾回收机制 gc回收
memcached 会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当 memcached 的内存空间不足时,就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想
不过,有些情况下 LRU 机制反倒会造成麻烦。memcached 启动时通过“M”参数可以禁止 LRU
查看memcached运行状态、key(item)多少了、内存使用多少了
以下两款工具,必须是安装了php和php的memcache扩展的
在软件共享目录,获取到上传到服务器使用
①上传文件并修改对应参数
②查看效果
memadmin可以方便管理多个memcached
①上传文件修改参数
登录管理界面的用户名称和密码配置
②查看使用效果
问:session共享入库?
使用分布式架构,负载均衡之后,请求会被分发到不同的服务器,登录或者验证码需要获取存储的session值,如果每次都随机的分配到不同web服务器,就不能够获取到session(生成在web1,校验在web2)
解决:
①ip_hash 同IP用户访问同一个web服务器
②通过session共享的方式 入mysql memcached(内存存储,最优)
文档参考
商城项目操作
web1服务器和web2服务器都需要修改,并且web服务器都要安装好memcache扩展
配置修改
存储效果
memcache只有一个内存使用和并发都是有限的,通过业务拆分,不同的业务使用不同的缓存中间件。有使用多个memcached的需求.
①多台服务器使用
②单台通过监听不同的端口启动多个
搭建启动多个memcached,单台监听不同端口
把经常访问到的数据,发生变动较小,可以存储到内存缓存中,提供使用速度
注意修改web服务器的文件时,一定要都修改web1和web2
①修改缓存数据
修改文件