Memcached

news/2024/4/28 19:08:21

1.NoSQL介绍

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

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

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

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

数据库排名:https://db-engines.com/en/ranking

NoSQL 分类

  • Key-value Store k/v数据库

    • 性能好 O(1) , 如: redis、memcached

  • Document Store 文档数据库

    • mongodb、CouchDB

  • Column Store 列存数据库,Column-Oriented DB

    • HBase、Cassandra,大数据领域应用广泛

  • Graph DB 图数据库

    • Neo4j

  • Time Series 时序数据库

    • InfluxDB、Prometheus

2. 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 官网:http://memcached.org/

3.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,数据量非常大,并发量非常大的业务

4 Memcached 工作机制

4.1 内存分配机制

应用程序运行需要使用内存存储数据,但对于一个缓存系统来说,申请内存、释放内存将十分频繁,非常容易导致大量内存碎片,最后导致无连续可用内存可用。

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。

范例:查看Slab Class 

#-f, --slab-growth-factor=<num> chunk size growth factor (default: 1.25)
[root@centos7 ~]#memcached -u memcached -f 2 -vv
slab class   1: chunk size        96 perslab   10922
slab class   2: chunk size       192 perslab    5461
slab class   3: chunk size       384 perslab    2730
slab class   4: chunk size       768 perslab    1365
slab class   5: chunk size      1536 perslab     682
slab class   6: chunk size      3072 perslab     341
slab class   7: chunk size      6144 perslab     170
slab class   8: chunk size     12288 perslab      85
slab class   9: chunk size     24576 perslab      42
slab class  10: chunk size     49152 perslab      21
slab class  11: chunk size     98304 perslab      10
slab class  12: chunk size    196608 perslab       5
slab class  13: chunk size    524288 perslab       2
<27 server listening (auto-negotiate)
<28 server listening (auto-negotiate)

4.2 懒过期 Lazy Expiration

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

4.3 LRU (最近最少使用算法)

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

4.4 集群

        Memcached集群,称为基于客户端的分布式集群,即由客户端实现集群功能,即Memcached本身不支持集群

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

5.安装和启动

官方安装说明

Install · memcached/memcached Wiki · GitHub

5.1 yum 安装

yum  install  -y   memcached

[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.

配置文件:

[root@localhost ~]#vim /etc/sysconfig/memcached
PORT="11211"      #监听端口
USER="memcached"  #启动用户
MAXCONN="1024"    #最大连接数
CACHESIZE="64"    #最大使用内存
OPTIONS=""        #其他选项OPTIONS="" 表示该行用于定义启动 Memcached 时附加的命令行选项。当 OPTIONS 变量为空字符串时,
意味着没有指定任何额外的启动参数。Memcached 在启动时可以通过 -o 参数或者直接在配置文件中指定一系列可选配置项,这些配置项可以包括
但不限于:绑定监听地址(例如 -l 或 -o listen=127.0.0.1)
监听端口(例如 -p 或 -o port=11211)
分配给缓存的最大内存大小(例如 -m 或 -o maxmemory=64
最大并发连接数(例如 -c 或 -o maxconn=1024)如:OPTIONS="-l 192.168.1.1 -p 11212 -m 512"
Memcached 监听 192.168.1.1 地址上的 11212 端口,并分配最多 512MB 内存作为缓存空间。

5.2 编译安装

yum -y install gcc libevent-devel
wget http://memcached.org/files/memcached-1.6.6.tar.gz
tar xvf memcached-1.6.6.tar.gz
cd memcached-1.6.6/
./configure --prefix=/apps/memcached
make && make installln -s /apps/memcached/bin/memcached /usr/bin#准备用户
useradd -r -s /sbin/nologin memcachedcat >    /etc/sysconfig/memcached    << eof
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
eof#准备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
eofsystemctl daemon-reload
systemctl enable --now memcached.service
memcached --version#在多行重定向或多行字符串中,\ 在变量名前面用来确保变量名跨越多行仍然能够被正确解析。

增长因子的改变

#默认前台执行
[root@centos7 ~]#memcached -u memcached -m 1024 -c 65536 -f 2 -vv #以台方式执行
[root@centos7 ~]#memcached -u memcached -m 1024 -c 65536 -d

5.3 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

6 使用 memcached

6.1 memcached 开发库和工具

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

范例: 

#安装工具包
yum install  libmemcached -y

memping    检测连接服务器

[root@node2 ~]#memping --help
memping v1.0Ping a server to see if it is aliveCurrent options. A '=' means the option takes a value.--version Display the version of the application and then exit.--help Display this message and then exit.--quiet stderr and stdin will be closed at application startup.--verbose Give more details on the progression of the application.--debug Provide output only useful for debugging.--servers=List which servers you wish to connect to.--expire=Set the expire option for the object.--binary Switch to binary protocol.--username=Username to use for SASL authentication--password=Password to use for SASL authentication#有memcached
[root@web1 opt]#memping --servers 192.168.80.12
[root@web1 opt]#echo $?
0#无memcached
[root@web1 opt]#memping --servers 192.168.80.11
Failed to ping 192.168.80.11:11211 CONNECTION FAILURE
[root@web1 opt]#echo $?
1

memstat

[root@web1 opt]#memstat --servers=192.168.80.12
Server: 192.168.80.12 (11211)pid: 60401uptime: 1128time: 1710390057version: 1.6.6libevent: 2.0.21-stablepointer_size: 64rusage_user: 0.078410rusage_system: 0.026136max_connections: 1024curr_connections: 2total_connections: 4rejected_connections: 0connection_structures: 3response_obj_bytes: 2336response_obj_total: 2response_obj_free: 1response_obj_oom: 0read_buf_bytes: 32768read_buf_bytes_free: 16384read_buf_oom: 0reserved_fds: 20cmd_get: 0cmd_set: 0cmd_flush: 0cmd_touch: 0cmd_meta: 0get_hits: 0get_misses: 0get_expired: 0get_flushed: 0delete_misses: 0delete_hits: 0incr_misses: 0incr_hits: 0decr_misses: 0decr_hits: 0cas_misses: 0cas_hits: 0cas_badval: 0touch_hits: 0touch_misses: 0auth_cmds: 0auth_errors: 0bytes_read: 32bytes_written: 30limit_maxbytes: 67108864accepting_conns: 1listen_disabled_num: 0time_in_listen_disabled_us: 0threads: 4conn_yields: 0hash_power_level: 16hash_bytes: 524288hash_is_expanding: 0slab_reassign_rescues: 0slab_reassign_chunk_rescues: 0slab_reassign_evictions_nomem: 0slab_reassign_inline_reclaim: 0slab_reassign_busy_items: 0slab_reassign_busy_deletes: 0slab_reassign_running: 0slabs_moved: 0lru_crawler_running: 0lru_crawler_starts: 1530lru_maintainer_juggles: 1178malloc_fails: 0log_worker_dropped: 0log_worker_written: 0log_watcher_skipped: 0log_watcher_sent: 0bytes: 0curr_items: 0total_items: 0slab_global_page_pool: 0expired_unfetched: 0evicted_unfetched: 0evicted_active: 0evictions: 0reclaimed: 0crawler_reclaimed: 0crawler_items_checked: 0lrutail_reflocked: 0moves_to_cold: 0moves_to_warm: 0moves_within_lru: 0direct_reclaims: 0lru_bumps_dropped: 0

6.2  memcached 操作命令

memcached 操作命令

cat  /usr/share/doc/memcached/protocol.txt 

编译安装不在此处

[root@web1 ~]#find / -name 'protocol.txt'
/usr/lib64/xorg/protocol.txt
/opt/memcached-1.6.6/doc/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@wg ~]#telnet 192.168.80.12 11211
Trying 192.168.80.12...
Connected to 192.168.80.12.
Escape character is '^]'.stats
#显示服务状态stats items #显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)。stats slabs #用于显示各个slab的信息,包括chunk的大小、数目、使用情况等quit   #退出

例子: 添加数据

[root@wg ~]#telnet 192.168.80.12 11211
Trying 192.168.80.12...
Connected to 192.168.80.12.
Escape character is '^]'.add name 1 30 4
wang
STOREDadd  	添加
name  	键的名字
1    	flages标志  描述信息
30   	超时时间   默认秒  0 代表永久有效
4    	字节数  数据的大小、
zhou 	具体的值

例子:修改

set name 1 60 5
test显示CLIENT_ERROR bad data chunk数据格式不正确或者数据内容违反了Memcached的协议规范。

例子:调用数据

get name
VALUE name 1 4
zhou
END

例子:删除

get class
VALUE class 1 4
asdf
ENDdelete class
DELETEDget class
END

例子:清空

flush_all
OK
get mykey
ENDquit

7 memcached集群部署架构

7.1 基于 magent 的部署架构

        Magent是google开发的项目,应用端通过负载均衡服务器连接到magent,然后再由magent代理用户应用请求到memcached处理,底层的memcached为双主结构会自动同步数据,本部署方式存在magent单点问题,因此需要两个magent做高可用。

项目站点:https://code.google.com/archive/p/memagent/

此项目过于陈旧,且不稳定,当前已经废弃

7.2 Repcached 实现原理

项目站点:repcached - add data replication feature to memcached

        在 master上可以通过 -X 选项指定 replication port(默认为11212/tcp),在 slave上通过 -x 指定复制的master并连接,事实上,如果同时指定了 -x/-X, repcached先会尝试连接对端的master,但如果连接失败,它就会用 -X参数来自己 listen(成为master);如果 master坏掉, slave侦测到连接断了,它会自动 listen而成为 master;而如果 slave坏掉,master也会侦测到连接断开,它就会重新 listen等待新的 slave加入。

        从这方案的技术实现来看,其实它是一个单 master单 slave的方案,但它的 master/slave都是可读写的,而且可以相互同步,所以从功能上看,也可以认为它是双机 master-master方案

7.3 简化后的部署架构

        magent已经有很长时间没有更新,因此可以不再使用magent,直接通过负载均衡连接到memcached,仍然有两台memcached做高可用,repcached版本的memcached之间会自动同步数据,以保持数据一致性,即使其中的一台memcached故障也不影响业务正常运行,故障的memcached修复上线后再自动从另外一台同步数据即可保持数据一致性。

7.4 部署repcached

haproxy:192.168.80.7

server1:192.168.80.10

server2:192.168.80.11

server1 和 server2 可同时部署也可等server1部署好后 rsync -a /apps   192.168.80.11:/yum -y install gcc libevent libevent-devel
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
tar xf memcached-1.2.8-repcached-2.2.1.tar.gz
cd memcached-1.2.8-repcached-2.2.1
./configure --prefix=/apps/repcached --enable-replication
make会报错
#报错如下

解决办法:

vim memcached.c56 #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@localhost memcached-1.2.8-repcached-2.2.1]#make && make install做软连接
ln -s /apps/repcached/bin/memcached  /usr/bin/使用帮助
[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.6 启动 memcached

7.6.1 相关操作

server1

#创建用户
useradd -r -s /sbin/nologin memcachedmemcached -d -m 1024 -p 11211 -u memcached -c 2048 -x 192.168.80.11
#-x 192.168.80.11 为对端memcached的地址  -d  后台ss -ntl
# 查看是否启动

server2

#在server1 上 将整个目录拷贝到  server2上(若server2已经完成部署不用拷贝)
rsync -a /apps   192.168.91.101:/
# apps注意不要加/
#yum -y install gcc libevent libevent-devel
#ln -s /apps/repcached/bin/memcached  /usr/bin/useradd -r -s /sbin/nologin memcached
#创建用户memcached -d -m 1024 -p 11211 -u memcached -c 2048 -x 192.168.80.10ss -ntl
# 查看是否启动

haproxy

yum install -y haproxy
systemctl start haproxyvim /etc/haproxy/haproxy.cfglisten membind 192.168.80.7:11211mode tcpserver  m1  192.168.80.10:11211 checkserver  m2  192.168.80.11:11211 checksystemctl restart haproxy.service

测试:

[root@localhost ~]#telnet 192.168.80.7 11211
Trying 192.168.80.7...
Connected to 192.168.80.7.
Escape character is '^]'.set server 1 0 10
hello word
STOREDget server
VALUE server 1 10
hello word
END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/10513.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Uniapp + SpringBoot 开发微信H5项目 微信公众号授权登录 JAVA后台(一、配置使用微信公众平台测试公众号)

申请测试号进行调试开发&#xff0c;测试号拥有大部分服务号有的接口权限。 一、接口配置信息填写校验 这里需要填写一个URL和一个Token验证字符串 我这里是用了natapp内网穿透 将本地的后台8080端口服务映射到了 http://x7zws8.natappfree.cc https://natapp.cn/在natapp官网…

amv是什么文件格式?如何播放amv视频?

AMV文件格式源自于中国公司Actions Semiconductor&#xff0c;最初作为其MP4播放器中使用的专有视频格式。产生于数码媒体发展的需求下&#xff0c;AMV格式为小屏幕便携设备提供了一种高度压缩的视频存储方案。 AMV文件格式的主要特性与使用场景 AMV格式以其独特的特性在小尺寸…

Windows Server 各版本搭建 Web 服务器实现访问本地 Web 网站(03~19)

一、Windows Server 2003 点击左下角开始➡管理工具➡管理您的服务器&#xff0c;点击添加或删除角色 点击下一步 选择自定义&#xff0c;点击下一步 选择应用程序服务器&#xff0c;点击下一步 不勾选&#xff0c;点击下一步 这里提示插入磁盘&#xff0c;咱们提前下载好 IIS…

分布式定时任务调度xxl-job

1. xxl-job基本介绍 1.1 Quartz的体系结构 Quartz中最重要的三个对象:Job&#xff08;作业&#xff09;、Trigger&#xff08;触发器&#xff09;、Scheduler&#xff08;调度器&#xff09;。 xxl-job的调度原理:调度线程在一个while循环中不断地获取一定数量的即将触发的Tr…

Git分支管理(Git分支的原理、创建、切换、合并、删除分支)

系列文章目录 文章一&#xff1a;Git基本操作 文章目录 系列文章目录前言一、Git分支是什么二、Git分支的原理三、创建分支四、切换分支五、合并分支六、删除分支 前言 在上一篇文章中&#xff0c;我们学习了如何使用Git的一些基本操作&#xff0c;例如安装Git、创建本地仓库…

Day31:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测

目录 打包器-WebPack-使用&安全 第三方库-JQuery-使用&安全 思维导图 JS知识点&#xff1a; 功能&#xff1a;登录验证&#xff0c;文件操作&#xff0c;SQL操作&#xff0c;云应用接入&#xff0c;框架开发&#xff0c;打包器使用等 技术&#xff1a;原生开发&…