企业架构缓存中间件分布式memcached

学习目标和内容

  1. 能够理解描述网站业务访问流程
  2. 能够理解网站业务的优化方向
  3. 能够描述内存缓存软件Memcached的作用
  4. 能够通过命令行操作Memcached
  5. 能够操作安装php的memcached扩展 extension
  6. 能够实现session存储到memcached的案列
  7. 能够实现启动memcache多实例

一、大型网站优化

1、网站常见参数

①网民、普通用户 功能多 页面多 获取到信息多

②开发人员 代码量大 数据量大 访问量大

③产品运营人员 seo(搜索引擎优化)

④运维人员 服务器 SA devops

pv 页面访问次数 页面

ip 访问ip数

uv 访问用户数(cookie埋点 useragent+IP+time token uuid)

DAU 注册用户的日活跃数

2、网站访问流程

随着网站迭代开发,访问会变慢

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共享的问题

模拟运维设计方案

根据以上业务需求,准备加入缓存中间件服务器

根据以上业务需求和方案,服务器架构升级为如下示意图

图太大了,放不下了,可以到之后下载到的课程目录里找到

三、内存缓存Memcached

1、介绍

memory cache cache in memory 缓存放入内存中

Memcached 是国外 社区 网站 LiveJournal 的开发团队开发的 高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web 应用的速度、提高可扩展性

关于缓存的过期,有效期问题,由业务编程代码实现

2、安装启动软件

官方网址:http://memcached.org/

①下载或者上传软件到服务器

②解压并编译安装

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

3、命令行连接和操作

3.1、telnet连接使用

通过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

3.2、存储命令

语法: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]

3.3、查找和计算命令

语法:get

get 命令获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空

get key1 key2 key3

语法:incr(相加)/decr(相减)

计数器 每做一次操作 +1

incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自增或自减操作

incr 与 decr 命令操作的数据必须是十进制的32位无符号整数

incr key value

decr key value

3.4、统计状态命令

语法: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,缓存没有起作用

缓存穿透、缓存雪崩

4、PHP扩展安装

为了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里的显示

5、PHP测试代码

①编辑测试文件

失效机制(了解)

①如果key过期了,value会及时删除么,空间会及时清空么?

②如果分配的存储空间,写满了,还允许写么?

6.1 Lazy Expiration

memcached 内部不会监视记录是否过期,而是在 get时查看记录的时间戳,检查记录是否过期。这种技术被称为 lazy(惰性)expiration。因此,memcached 不会在过期监视上耗费 CPU 时间

比如php的里session机制 懒惰机制 php垃圾回收机制 gc回收

6.2 LRU

memcached 会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当 memcached 的内存空间不足时,就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想

不过,有些情况下 LRU 机制反倒会造成麻烦。memcached 启动时通过“­M”参数可以禁止 LRU

小工具

查看memcached运行状态、key(item)多少了、内存使用多少了

以下两款工具,必须是安装了php和php的memcache扩展的

7.1、memcache.php

在软件共享目录,获取到上传到服务器使用

①上传文件并修改对应参数

②查看效果

7.2、memadmin

memadmin可以方便管理多个memcached

①上传文件修改参数

登录管理界面的用户名称和密码配置

②查看使用效果

四、企业案列实现

1、session入memcache共享

问:session共享入库?

使用分布式架构,负载均衡之后,请求会被分发到不同的服务器,登录或者验证码需要获取存储的session值,如果每次都随机的分配到不同web服务器,就不能够获取到session(生成在web1,校验在web2)

解决:

①ip_hash 同IP用户访问同一个web服务器

②通过session共享的方式 入mysql memcached(内存存储,最优)

文档参考

商城项目操作

web1服务器和web2服务器都需要修改,并且web服务器都要安装好memcache扩展

配置修改

存储效果

2、多实列memcache使用

memcache只有一个内存使用和并发都是有限的,通过业务拆分,不同的业务使用不同的缓存中间件。有使用多个memcached的需求.

①多台服务器使用

②单台通过监听不同的端口启动多个

搭建启动多个memcached,单台监听不同端口

3、缓存热点数据

把经常访问到的数据,发生变动较小,可以存储到内存缓存中,提供使用速度

注意修改web服务器的文件时,一定要都修改web1和web2

①修改缓存数据

修改文件