一 Memcached 介绍
(一)Memcached 简单介绍
弊端 不能持久化 (不支持存在硬盘里)
Memcached 只支持能序列化的数据类型,不支持持久化,基于Key-Value的内存缓存系统
memcached 虽然没有像redis所具备的数据持久化功能,比如RDB和AOF都没有,但是可以通过做集群同步的方式,让各memcached服务器的数据进行同步,从而实现数据的一致性,即保证各memcached的数据是一样的,即使有任何一台 memcached 发生故障,只要集群中有一台 memcached 可用就不会出现数据丢失,当其他memcached 重新加入到集群的时候,可以自动从有数据的memcached 当中自动获取数据并提供服务
Memcached 借助了操作系统的 libevent 工具做高效的读写。libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥高性能。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能
Memcached 支持最大的内存存储对象为1M,超过1M的数据可以使用客户端压缩或拆分报包放到多个key中,比较大的数据在进行读取的时候需要消耗的时间比较长,memcached 最适合保存用户的session实现session共享
Memcached存储数据时, Memcached会去申请1MB的内存, 把该块内存称为一个slab, 也称为一个page
Memcached 支持多种开发语言,包括:JAVA,C,Python,PHP,C#,Ruby,Perl等
Memcached 官网:memcached - a distributed memory object caching system
(二)Memcached 和 Redis 比较
比较类别 | Redis | memcached |
支持的数据结构 | 哈希、列表、集合、有序集合 | 纯kev-value |
持久化支持 | 有 | 无 |
高可用支持 | redis支持集群功能,可以实现主动复制,读写分离官方也提供了sentinel集群管理工具,能够实现主从服务监控,故障自动转移,这一切,对于客户端都是透明的,无需程序改动,也无需人工介入 | 需要二次开发 |
存储value容量 | 最大512M | 最大1M |
内存分配 | 临时申请空间,可能导致碎片 | 预分配内存池的方式管理内存,能够省去内存分配时间 |
虚拟内存使用 | 有自己的VM机制,理论上能够存储比物理内存更多的数据,当数据超量时,会引发swap,把冷数据刷到磁盘上 | 所有的数据存储在物理内存里 |
网络类型 | 非阻塞IO复用模型,提供一些非KV存储之外的排序聚合功能,在执行这些功能时,复杂的CPU计算,会阻塞整个IO调度 | 非阻塞IO复用模型 |
水平扩展支持 | redis cluster 可以横向扩展 | 暂无 |
多线程 | Redis6.0之前是只支持单线程 | Memcached支持多线程,CPU利用方面Memcache优于redis |
单机QPS | 约10W | 约60W |
源代码可读性 | 代码清爽简洁 | 可能是考虑了太多的扩展性,多系统的兼容性,代码不清爽 |
适用场景 | 复杂数据结构、有持久化、高可用需求、value存储内容较大 | 纯KV,数据量非常大,并发量非常大的业务 |
(三) 生产环境架构
memcached 速度快 放在前面 提升用户体验
二 Memcached 工作机制
(一)内存分配机制
应用程序运行需要使用内存存储数据,但对于一个缓存系统来说,申请内存、释放内存将十分频繁,非常容易导致大量内存碎片,最后导致无连续可用内存可用。
Memcached采用了Slab Allocator机制来分配、管理内存。
- Page:分配给Slab的内存空间,默认为1MB,分配后就得到一个Slab。Slab分配之后内存按照固定字节大小等分成chunk。
- Chunk:用于缓存记录k/v值的内存空间。Memcached会根据数据大小选择存到哪一个chunk中,假设chunk有128bytes、64bytes等多种,数据只有100bytes存储在128bytes中,存在少许浪费。
- Chunk最大就是Page的大小,即一个Page中就一个Chunk
- Slab Class:Slab按照Chunk的大小分组,就组成不同的Slab Class, 第一个Chunk大小为 96B的Slab为Class1,Chunk 120B为Class 2,如果有100bytes要存,那么Memcached会选择下图中Slab Class 2 存储,因为它是120bytes的Chunk。Slab之间的差异可以使用Growth Factor 控制,默认1.25。
自己的话理解就是:
划分若干个部分 以96kb为第一个盒子 第二个盒子乘以1.25
96kb 120kb 150kb 以此类推 最大盒子1024kb
把数据按照大小 放对应的盒子
(二)懒过期 Lazy Expiration
memcached不会监视数据是否过期,而是在取数据时才看是否过期,如果过期,把数据有效期限标识为0,并不清除该数据。以后可以覆盖该位置存储其它数据。
(三)LRU (最近最少使用算法)
当内存不足时,memcached会使用LRU(Least Recently Used)机制来查找可用空间,分配给新记录使用
自己的话理解就是 : 像内存一样 一直使用的数据放在最上面 不用的会被替换掉
(四)集群
Memcached集群,称为基于**客户端**的分布式集群,即由客户端实现集群功能,即Memcached本身不支持集群
Memcached集群内部并不互相通信,一切都需要客户端连接到Memcached服务器后自行组织这些节点,并决定数据存储的节点。
三 安装 memcached
(一) yum 安装
1, yum 安装
2,找到配置文件
3,编辑配置文件
配置文件不用改动
[root@localhost ~]#vim /etc/sysconfig/memcached PORT="11211" #监听端口 USER="memcached" #启动用户 MAXCONN="1024" #最大连接数 CACHESIZE="64" #最大使用内存 OPTIONS="" #其他选项
(二) 编译安装
1, 安装 依赖环境
2,从官网下载 压缩包
3,解压缩 并去到解压后的文件
4,指明安装目录
5,安装
6,做软连接方便补全
7,生成程序用户
8 写配置文件
cat > /etc/sysconfig/memcached << eof PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="" eof
9 写service 文件
cat > /lib/systemd/system/memcached.service << eof [Unit] Description=memcached daemon Before=httpd.service After=network.target [Service] EnvironmentFile=/etc/sysconfig/memcached ExecStart=/apps/memcached/bin/memcached -p \${PORT} -u \${USER} -m \${CACHESIZE} -c \${MAXCONN} \$OPTIONS [Install] WantedBy=multi-user.target eof
10 启动 memcached 数据库
四 memcached 常见选项
-u username memcached运行的用户身份,必须普通用户
-p 绑定的端口,默认11211
-m num 最大内存,单位MB,默认64MB
-c num 最大连接数,缺省1024
-d 守护进程方式运行
-f 增长因子Growth Factor,默认1.25
-v 详细信息,-vv能看到详细信息
-M 使用内存直到耗尽,不许LRU
-U 设置UDP监听端口,0表示禁用UDP
#默认前台执行 [root@centos7 ~]#memcached -u memcached -m 1024 -c 65536 -f 2 -vv #以后台方式执行 [root@centos7 ~]#memcached -u memcached -m 1024 -c 65536 -d
五 memcached 开发库和工具
--help 查看选项
(一) memping 检测连接服务器
检测数据库是否存在
(二)memstat
查看数据库状态
六 memcached 内部操作
(一)增删改数据
set 修改数据
add 添加数据
get 调用数据
delete 删除数据
此处class 可以理解为变量 ky35 为变量值
(二)查数据
stats
#显示服务状态
stats items
#显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)。
stats slabs
#用于显示各个slab的信息,包括chunk的大小、数目、使用情况等
七 memcached集群部署架构
(一)架构图
magent已经有很长时间没有更新,因此可以不再使用magent,直接通过负载均衡连接到memcached,仍然有两台memcached做高可用,repcached版本的memcached之间会自动同步数据,以保持数据一致性,即使其中的一台memcached故障也不影响业务正常运行,故障的memcached修复上线后再自动从另外一台同步数据即可保持数据一致性。
(二) 主从复制 (高可用)
注意! memcached 只能用 1.28版本 另一台下二阶软件 repcached1.28版本
两台机器做数据库高可用
1 实验环境
77装memcached 99装repcached 做数据库高可用
2 实验步骤
99机器:
[root@centos7 ~]# yum -y install gcc libevent libevent-devel [root@centos7 ~]# wget https://jaist.dl.sourceforge.net/project/repcached/repcached/2.2.1-1.2.8/memcached-1.2.8-repcached-2.2.1.tar.gz [root@centos7 ~]# tar xf memcached-1.2.8-repcached-2.2.1.tar.gz [root@centos7 ~]# cd memcached-1.2.8-repcached-2.2.1 [root@centos7 memcached-1.2.8-repcached-2.2.1]# ./configure --prefix=/apps/repcached --enable-replication [root@centos7 memcached-1.2.8-repcached-2.2.1]# make #报错如下
1,安装编译环境
2,下载安装包 解压
3, ./configure 指明安装目录 添加replicaton 模块
4,make 会报错
5,解决办法:
[root@centos7 memcached-1.2.8-repcached-2.2.1]# vim memcached.c 56 #ifndef IOV_MAX 57 #if defined(__FreeBSD__) || defined(__APPLE__) 58 # define IOV_MAX 1024 59 #endif 60 #endif #改为如下内容,即删除原有的原第57,59行 56 #ifndef IOV_MAX 57 # define IOV_MAX 1024 58 #endif
vim memcached.c 删除原有的原第57,59行
6, make && make install 不会报错
7,做软连接
8,创建程序用户
9, 后台启动 -d 后台 -x 和谁同步
10 ss -ntl 查看是否启动
l指 -l, --listening display listening sockets
11把 /apps 的内容同步 到77机器
77机器:
1, tree 看到内容 已被同步过来
2,创建用户
3,做软连接
4 安装库否则起不来
5, 与99机器同步 后台启动
6, ss -ntl 查看是否启动
3 实验结果
在99 机器的数据库上加niubi
在77 机器上也能调用
(三)haproxy 做memcached 数据库 反向代理
1,实验环境
77 99 做数据库真实服务器 66 装haproxy做代理服务器
2, 实验步骤
66机器
1 安装haproxy
2, vim /etc/haproxy/haproxy.cfg 写配置文件
3,重启 连接66机器的 11211 端口
4,我们通过66代理服务器 也能得到数据库真实服务器的内容