|
memcached
缓存服务器:
1.缓存:cache,无持久存储功能
2.行挂失缓存bypass,而不是代理式缓存
3.仅提供缓存功能,存什么,怎么存全有客户端决定
4.k/v cache,只能存储可序列化数据
5.存储项是非常简单的:key,value,flag,expire time(过期时间)单数上限:1M
6.功能的实现一把依赖于memcached,一半是client
7.不能高可用,挂了缓存就丢失了
8.O(1)的执行效率
9.分布式缓存互不通信的分布式集群
分布式系统请求路由方法:取膜法,一致性哈希算法
10.缓存耗尽时基于LRU(最近最少使用)清理
缓存过期项:惰性清理机制,新的直接覆盖旧的
memcached协议
客户端要拥有连接memcached的适配器php-memcached
yum安装就好
配置文件/etc/sysconfig/memcached
默认监听11211/tcp,11211/udp
主程序 /usr/bin/memcached
协议格式:
文本格式
二进制格式
telnet文本交互:
常用命令
统计类:stats items | slabs |sizes
存储类:set,add,replace,append,perpend
获取数据类:get,delete,incr/decr
清空:flesh_all
add mykey 0 30 5 添加mykey
hello 内容hello
set mykey 0 30 5 设置mykey的值
hello
get mykey 获取mykey值
0:标志位
30:缓存ttl值时长,30秒后无法获得
5:整个数据的长度
append mykey 0 300 11 追加内容,注意长度的修改,是指添加了多少个字符而不是添加到
prepend mkkey 0 300 3 同上,只不过是在前边添加,想要两个值之间带空格就在字符数多几个字符
incr key_name # 将key的值+1 key值要是数字
decr # -1
(常用于微博微信之类的赞转发之类的计数)
flush all 清空缓存
程序常用选项
-m #:缓存空间大小,单位mb默认64
-c #:并发连接数,默认1024
-u username:程序运行者身份,一般要用普通用户
-p Port:监听的tcp端口
-u Port:监听的udp端口
-l ip_addr:监听的IP地址,默认本机所有IP地址
-M :一旦缓存空间耗尽的时候,想请求存储缓存项换回错误信息,而非使用默认的lru算法
-f factor :用来指明chunk的增长因子,默认是1.25
-vv:详细内容
-t #:线程数量,默认为4,最好解析请求(提取请求首部中的URL及其他首部)---->查询缓存--->新鲜度检测(是不是在有效期)--->检查元数据是不是改变,如果没改变--->构建响应报文-->发送响应--->记录日志(类似于httpd的combined)
过期检查机制:
每个缓存都是会有服务器加一个过期时间.在这个时间内都是有缓存返回的,如果过期了或者没有缓存,就反代到后端服务器,后端服务器发送数据和过期时间给缓存和请求
首部:HTTP/1.0
Expire:绝对时间:xxx-xxx
HTTP/1.1
Cache-Control:maxage=相对时长,过多长时间过期
Cache-Control:s-maxage=公共缓存时长
条件检查机制:validation
(1)LASTMODIFIED:最近修改时间
IF MOFIFIED SINCE:从上次开始是不是修改过时间
请求数据到缓存服务器上,如果超出有效时间,缓存服务器向后端服务器发送一个请求报文,询问是不是修改了,如果是,就由后端服务器来发送数据,没有的话就是有缓存发送
(2)Etag:资源标签
if-none-match:标签有没变换
基本上和上边相同,只是寻问的是标签有没有变化
两者结合:超时有效时长的,向后端服务器发送条件检查
开源解决方案:
squid:
varnish:在非常大的并发连接数下,varnish不是很稳定
varnish:绝大多数站点都是varnish www.varnish-cache.org 最新稳定版本4.1.3 (分支5.0|4.1|4.0)
Architecture 图
组织架构
management进程
child/cache进程:包含多种类型的线程
accept worker expiry
shared memeory log:
统计数据的计数器
日志区域
配置接口:VCL
VCL complier--->c complier------->shared object
上午第二节课
环境文件
配置文件
/etc/varnish/default.vcl配置缓存工作(child/cache)
/etc/varnish/varnish.params配置varnish自身(端口之类的)
主程序
CLI interface
varnishadm
shared log
/usr/bin/varnishhist
/usr/bin/varnishlog
/usr/bin/varnishncsa
/usr/bin/varnishstat
/usr/bin/varnishtest
/usr/bin/varnishtop
varnishtest:模拟varnish的客户端,测试varnish的工作是不是正常
systemd unitfile
varnish.service
varnishlog
varnishncsa:日志持久化服务,每个多长时间读取次日志
varnish的缓存存储机制
(1)malloc[,size]
内存存储
(2)file[path[,size[,granularity]]]
文件存储,黑盒,重启后缓存失效
(3)persistent,path,size
文件存储,黑盒,重启不失效,但是还在测试
varnish程序的选项
(1)程序选项 /etc/varnish/varnish.params
-a IP地址:port
服务接口,不能是127,默认6081
-T IP地址:port
管理接口,默认6082
-s [name]=type[,options]
定义缓存存储机制
-u user
-g group
定义运行身份
-f config
VCL配置文件
-F
前台运行
(2)运行时参数(运行时可以更改的)
-p param=value
-r param[,param..]运行时不可以更改,只读
大多数运行参数都有默认值不用设定,必要设定时候要在varnish.params定义,在程勋运行前定义
在底下的DEMON_OPTS
例如:
#DAEMON_OPTS="-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300"
具体配置
6081可以改
6082是管理接口,也可以改
#DAEMON_OPTS="-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300"
最小/最大线程池数量,超时时间
VARNISH_STORAGE="file,/var/lib/varnish/varnish_storage.bin,1G"
文件存储
VARNISH_STORAGE="malloc,1G"
内存存储
事实上大多时候都不需要更改直接使用,主要还是VCL
varnish_reload_vcl:vcl配置文件重载程序
varnishadm -S /etc/varnish/sercet -T address:port
help获取命令列表
配置文件相关
vcl.list:列出vcl文件有哪些
load:装载,加载并编译
vcl.load testconfig1 default.vcl
use:激活
vcl.use testconfig1 激活了,生效了
discard:删除,最好先激活另一个后在删除上一个
运行时参数
param.show:显示参数列表
show显示某个参数配置
set设定
缓存存储
storage.list
后端服务器:
backend.list
VCL:域专有类型的配置语言
state engine:状态引擎
VCL有多个状态引擎.且之间存在相关性,但是彼此间互相隔离,每个状态引擎可使用return指明关联至那个下一级引擎
图
vcl_recv--->vcl_pipe
收到后不知道做什么直接送到后端
vcl_recv--->vcl_error
收到后不允许给他数据或者直接请求就是错的
vcl_pass:多加的处理逻辑,可以额外做一些处理的设定
vcl_purge:缓存的修剪
varnish 4:
vcl_recv ---->vcl_hash
(1)hit:vcl_hit--->vcl_deliver
(2)pass,hit for pass:vcl_pass--->vcl_backend_fetch-->_response-->vcl_deliver
(3)miss:vcl_miss--->[vcl_pass--->]vcl_backend_fetch-->_response-->vcl_deliver
(4)purge:vcl_purge--->vcl_synth
(5)pipe:vcl_pipe
(6)busy:vcl_waiting
vcl语法格式
(1)支持注释符
//:单行注释
/*...*/:多行注释
#:注释
(2)sub $name:定义子例程;sub vcl_recv{..}只对vcl_recv有效
(3)不支持循环,但是支持条件判断
(4)有大量的內建变量,生效位置有特定要求
(5)使用终止语句return决定下一个状态引擎;但是没有返回值
(6)操作符
=:赋值
==:等值判断
!:取反
~:匹配
&&:逻辑与
||:逻辑或
>,=, |
|