Memcached

NoSQL是对 Not Only SQL、非传统关系型数据库的统称。

NoSQL一词诞生于1998年,2009年这个词汇被再次提出指非关系型、分布式、不提供ACID的数据库设计模式。

随着互联网时代的到来,数据爆发式增长,数据库技术发展日新月异,要适应新的业务需求。

而随着移动互联网、物联网的到来,大数据的技术中NoSQL也同样重要。

数据库排名:DB-Engines Ranking - popularity ranking of database management systems

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

 客户去搜访问的数据,select表示搜索数据,去数据库里面找数据,如果redis/memcached里面有数据,则直接返回,如果没有再去mysql里面去捞数据,捞完数据之后,放在redis/maemcached里面快照,保存

架构图:redis/memcached是为了加快数据的读取,因为mysql是存在硬盘上面的,如果读取myslq,数据太慢了

Memcached Redis 比较

比较类别Redismemcached
支持的数据结构哈希、列表、集合、有序集合纯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采用了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。

懒过期 Lazy Expiration

 memcached不会监视数据是否过期,而是在取数据时才看是否过期,如果过期,把数据有效期限标识为0,并不清除该数据。以后可以覆盖该位置存储其它数据。

LRU (最近最少使用算法)

当内存不足时,memcached会使用LRU(Least Recently Used)机制来查找可用空间,分配给新记录使用

集群

Memcached集群,称为基于客户端的分布式集群,即由客户端实现集群功能,即Memcached本身不支持集群(如果memcached想要使用集群,需要下载Repcached

Memcached集群内部并不互相通信,一切都需要客户端连接到Memcached服务器后自行组织这些节点,并决定数据存储的节点。

安装memcached

1.yum安装

[root@localhost ~]#yum info    memcached
已加载插件:fastestmirror, langpacks
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
Determining fastest mirrors
 * base: mirrors.nju.edu.cn
 * extras: mirrors.nju.edu.cn
 * updates: mirrors.nju.edu.cn
可安装的软件包
名称    :memcached
架构    :x86_64
版本    :1.4.15
发布    :10.el7_3.1
大小    :85 k
源    :base/7/x86_64
简介    : High Performance, Distributed Memory Object Cache
网址    :http://www.memcached.org/
协议    : BSD
描述    : memcached is a high-performance, distributed memory object caching
         : system, generic in nature, but intended for use in speeding up dynamic
         : web applications by alleviating database load.

 随后,开启

 

查看端口号跟使用的协议

memcached使用的端口号是11211(表示监听所有地址) 使用的是tcp

memcached没有客户端,所有要用telnet去连接

 所以要先别的终端(类似客户端)下载telnet

客户端去远程连接memcached服务器

2.编译安装

[root@centos7 ~]#yum -y install gcc libevent-devel
[root@centos7 ~]#wget http://memcached.org/files/memcached-1.6.6.tar.gz
[root@centos7 ~]#tar xvf memcached-1.6.6.tar.gz
[root@centos7 ~]#cd memcached-1.6.6/
[root@centos7 memcached-1.6.6]#./configure --prefix=/apps/memcached
[root@centos7 memcached-1.6.6]#make && make install


[root@centos7 ~]#echo 'PATH=/apps/memcached/bin:$PATH' > /etc/profile.d/memcached.sh
[root@centos7 ~]#. /etc/profile.d/memcached.sh


#准备用户
[root@centos7 ~]#useradd -r -s /sbin/nologin memcached


[root@centos7 ~]#cat >    /etc/sysconfig/memcached    << eof
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
eof


#准备service文件
[root@centos7 ~]#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

[root@centos7 ~]#systemctl daemon-reload 
[root@centos7 ~]#systemctl enable --now memcached.service
[root@centos7 memcached-1.6.6]#memcached --version
memcached 1.6.6

 

 

 

 下载成功之后,做一个软连接

 随后,建立一个用户,以普通用户的身份去运行

 并且编译安装,是没有memcached的主配置文件的

所以,要去建立一个

 然后要让systemctl去管理memcached,写一个systemctl的配置文件

随后,开启服务

查看版本 

 

 

增长因子的改变



```bash
#默认前台执行
[root@centos7 ~]#memcached -u memcached -m 1024 -c 65536 -f 2 -vv 

#以后台方式执行
[root@centos7 ~]#memcached -u memcached -m 1024 -c 65536 -d
```

 

memcached 启动程序说明

修改memcached 运行参数,可以使用下面的选项修改/etc/sysconfig/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 

使用 memcached

与memcached通信的不同语言的连接器。libmemcached提供了C库和命令行工具。

范例:

#安装工具包
[root@node2 ~]#yum install  libmemcached -y 

在服务端下载此安装包 

 

memping 检测连接服务器 192.168.68.5同时也下载的memcached ,并且开启了服务

这是另一台主机开启了memcached 

然后第一台去memping第二台主机 显示0,表示成功

当第二天服务器关闭时

然后第一台再去memping第二台被关闭memcached服务的主机,就显示不通了

 

 memstat --servers 可以查看服务端的基本信息

 

memcached 操作命令

[root@centos7 ~]#cat /usr/share/doc/memcached-版本号/protocol.txt

四种基本 memcached 命令执行最简单的操作。这些命令和操作包括:

  • set     重新设置

  • add    新加一个数据

  • get      调用

  • delete   删除数据

 

#前三个命令是用于操作存储在 memcached 中的键值对的标准修改命令,都使用如下所示的语法:
command <key> <flags> <expiration time> <bytes>
<value>

#参数说明如下:
command set/add/replace
key     key 用于查找缓存值
flags     可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
expiration time     在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
bytes     在缓存中存储的字节数
value     存储的值(始终位于第二行)
#增加key,过期时间为秒,bytes为存储数据的字节数
add key flags exptime bytes  

例子: 显示服务状态

[root@node2 ~]#telnet 192.168.91.100 11211
Trying 192.168.91.100...
Connected to 192.168.91.100.
Escape character is '^]'.

stats
#显示服务状态

stats items #显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)。


stats slabs #用于显示各个slab的信息,包括chunk的大小、数目、使用情况等

 

添加数据

add name 1 30 4
zhou
STORED


add      添加
name      键的名字
1        flages标志  描述信息
30       超时时间   默认秒  0 代表永久有效
4        字节数  数据的大小、
zhou     具体的值

 

例子:修改

set name 1 60 5
test 

例子:调用数据

get name
VALUE name 1 4
zhou
END

例子:删除

get class
VALUE class 1 4
ky35
END
delete class
DELETED
get class
END 

例子:清空

flush_all
OK
get mykey
END
qui 

在第一台主机上面先下载telnet服务,然后去远程连接第二台主机

 

 

部署repcached

[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 #报错如下

     make报错解决方法

[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

 

 

 因为源码包自身版本低,所以要修改版本

 随后,再重新编译

#创建用户
[root@centos7 ~]#useradd -r -s /sbin/nologin memcached


#后台启动
[root@centos7 ~]#memcached -d -m 1024 -p 11211 -u memcached -c 2048 -x 192.168.91.101
#-x 192.168.91.101 为对端memcached的地  -d  后台


[root@centos7 ~]#ss -ntl
# 查看是否启动

 

随后,做一个软连接

 

 然后创建memcached的用户

 

 

 主机2操作

在server1 上 将整个目录拷贝到  server2上
[root@localhost ~]#rsync -a /apps   192.168.91.101:/
# apps注意不要加/  



其余操作在server2上
[root@centos7 ~]#useradd -r -s /sbin/nologin memcached
#创建用户

[root@centos7 ~]# yum -y install gcc libevent libevent-devel
#安装库否则起不来

[root@node2 ~]#ln -s /apps/repcached/bin/memcached  /usr/bin/
# 做软连接
[root@centos7 ~]#memcached -d -m 1024 -p 11211 -u memcached -c 2048 -x 192.168.91.100

[root@centos7 ~]#ss -ntl
# 查看是否启动

然后另一台服务器不用编译memcached,直接将第一台服务器拷贝到第二台上

 

随后,进入主机2 去查看

 

这边有apps了,说明centos2 也编译安装过memcached,然后再重新做软连接根创建用户即可

 还要再安装一个依赖库,要不然memcached运行不起来

随后再与第一台主机同步

 

 出现11211,及成功

[root@localhost ~]#memcached -h 
memcached 1.2.8
repcached 2.2.1

-x <ip_addr>  hostname or IP address of peer repcached   (同步的意思)
-X <num:num>  TCP port number for replication. <listen:connect> (default: 11212)
 

 最后验证,打开一个客户端 

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值