目录
一、NoSQL介绍
NoSQL是对 Not Only SQL、非传统关系型数据库的统称。
NoSQL一词诞生于1998年,2009年这个词汇被再次提出指非关系型、分布式、不提供ACID的数据库设计模式。
随着互联网时代的到来,数据爆发式增长,数据库技术发展日新月异,要适应新的业务需求。
而随着移动互联网、物联网的到来,大数据的技术中NoSQL也同样重要。
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
-
关系型数据库:数据存放在硬盘,调度数据速率慢;
非关系型数据库:数据存放在内存,调度数据速率快。
二、Memcached
1.Memcache介绍
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/
2.Memcache 和 Redis 对比
比较类别 | Redis | Memcache |
---|---|---|
支持的数据结构 | 哈希、列表、集合、有序集合 | 纯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,数据量非常大,并发量非常大的业务 |
3.Memcache 工作机制
3.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
[root@localhost ~]#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)
3.2懒过期 Lazy Expiration
memcached不会监视数据是否过期,而是在取数据时才看是否过期,如果过期,把数据有效期限标识为0,并不清除该数据。以后可以覆盖该位置存储其它数据。
3.3 LRU(最近最少使用算法)
当内存不足时,memcached会使用LRU(Least Recently Used)机制来查找可用空间,分配给新记录使用
3.4集群
Memcached集群,称为基于客户端的分布式集群,即由客户端实现集群功能,即Memcached本身不支持集群
Memcached集群内部并不互相通信,一切都需要客户端连接到Memcached服务器后自行组织这些节点,并决定数据存储的节点。
Memcache不支持集群
4.Memcache安装
4.1yum安装
[root@localhost ~]#yum info memcached
#yum源的Memcache版本信息
已加载插件:fastestmirror, langpacks
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
Determining fastest mirrors
* base: mirrors.ustc.edu.cn
* epel: mirror.earthlink.iq
* extras: mirrors.ustc.edu.cn
* updates: mirrors.ustc.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 ~]#yum install memcached -y
[root@localhost ~]#rpm -ql memcached
/etc/sysconfig/memcached
#主配置文件
/usr/bin/memcached
/usr/bin/memcached-tool
/usr/lib/systemd/system/memcached.service
/usr/share/doc/memcached-1.4.15
/usr/share/doc/memcached-1.4.15/AUTHORS
/usr/share/doc/memcached-1.4.15/CONTRIBUTORS
/usr/share/doc/memcached-1.4.15/COPYING
/usr/share/doc/memcached-1.4.15/ChangeLog
/usr/share/doc/memcached-1.4.15/NEWS
/usr/share/doc/memcached-1.4.15/README.md
/usr/share/doc/memcached-1.4.15/protocol.txt
/usr/share/doc/memcached-1.4.15/readme.txt
/usr/share/doc/memcached-1.4.15/threads.txt
/usr/share/man/man1/memcached-tool.1.gz
/usr/share/man/man1/memcached.1.gz
[root@localhost ~]#cat /etc/sysconfig/memcached
PORT="11211"
#监听端口
USER="memcached"
#启动用户
MAXCONN="1024"
#最大连接数
CACHESIZE="64"
#最大使用内存
OPTIONS=""
#设置服务器的IP 不写内容代表任何IP都可以
[root@localhost ~]#id memcached
uid=990(memcached) gid=985(memcached) 组=985(memcached)
#安装Memcache服务后 会自动新建一个用户
[root@localhost ~]#systemctl start memcached.service
[root@localhost ~]#systemctl status memcached.service
● memcached.service - Memcached
Loaded: loaded (/usr/lib/systemd/system/memcached.service; disabled; vendor preset: disabled)
Active: active (running) since 四 2024-03-14 11:36:55 CST; 7s ago
Main PID: 3221 (memcached)
CGroup: /system.slice/memcached.service
└─3221 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024
3月 14 11:36:55 localhost.localdomain systemd[1]: Started Memcached.
3月 14 11:36:55 localhost.localdomain systemd[1]: Starting Memcached...
[root@localhost ~]#ss -natpl|grep 11211
LISTEN 0 128 *:11211 *:* users:(("memcached",pid=3221,fd=26))
LISTEN 0 128 :::11211 :::* users:(("memcached",pid=3221,fd=27))
#Memcache服务使用的是TCP协议
Memcached服务只支持Telnet连接
[root@node2 ~]#yum install telnet -y
[root@node2 ~]#telnet 192.168.241.11 11211
Trying 192.168.241.11...
Connected to 192.168.241.11.
Escape character is '^]'.
set name 1 10 3
#set 重新配置
#name自定义的内容
#1代表flages标志 描述信息
#10代表数据停留时间 为10s
#3代表字节数 数据的大小
cxk
#具体数据内容
STORED
get name
#调用数据
VALUE name 1 3
#数据特性 属于自定义名字 flages是1 字节长度为3
cxk
#数据内容为cxk
END
get name
#已经超过数据停留时间
END
quit
#退出telnet连接
Connection closed by foreign host.
4.2编译安装
[root@node2 ~]#yum install gcc libevent-devel -y
#安装依赖环境
[root@node2 ~]#cd /opt
[root@node2 opt]#ls
[root@node2 opt]#wget http://memcached.org/files/memcached-1.6.6.tar.gz
[root@node2 opt]#ls
memcached-1.6.6.tar.gz
[root@node2 opt]#tar xf memcached-1.6.6.tar.gz
[root@node2 opt]#ls
memcached-1.6.6 memcached-1.6.6.tar.gz
[root@node2 opt]#cd memcached-1.6.6/
[root@node2 memcached-1.6.6]#./configure --prefix=/apps/memcached
[root@node2 memcached-1.6.6]#make && make install
[root@node2 memcached-1.6.6]#ls /apps/memcached/
bin include share
[root@node2 memcached-1.6.6]#ln -s /apps/memcached/bin/ /usr/bin/
[root@node2 memcached-1.6.6]#useradd -r -s /sbin/nologin memcached
#Memcache服务必须以普通用户身份运行
[root@node2 memcached-1.6.6]#cat > /etc/sysconfig/memcached << eof
> PORT="11211"
> USER="memcached"
> MAXCONN="1024"
> CACHESIZE="64"
> OPTIONS=""
> eof
[root@node2 memcached-1.6.6]#cat /etc/sysconfig/memcached
#写入Memcache服务的配置文件
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
[root@node2 memcached-1.6.6]#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@node2 memcached-1.6.6]#cat /lib/systemd/system/memcached.service
#将Memcache服务交给systemd管理
[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
###注意!!!-p \${PORT} -u \${USER} -m \${CACHESIZE} -c \${MAXCONN} \$OPTIONS必须要加\转义 不然输入的内容为空 这里的变量与/etc/sysconfig/memcached的配置文件相对应
[root@node2 memcached-1.6.6]#systemctl daemon-reload
[root@node2 memcached-1.6.6]#systemctl enable --now memcached.service
Created symlink from /etc/systemd/system/multi-user.target.wants/memcached.service to /usr/lib/systemd/system/memcached.service.
[root@node2 memcached-1.6.6]#systemctl status memcached.service
● memcached.service - memcached daemon
Loaded: loaded (/usr/lib/systemd/system/memcached.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2024-03-13 23:57:56 EDT; 5s ago
Main PID: 5814 (memcached)
CGroup: /system.slice/memcached.service
└─5814 /apps/memcached/bin/memcached -p 11211 -u memcached -m 64...
Mar 13 23:57:56 node2.localdomain systemd[1]: Started memcached daemon.
Mar 13 23:57:56 node2.localdomain systemd[1]: Starting memcached daemon...
5.Memcached选项
[root@localhost ~]#memcached -h
memcached 1.4.15
-p <num> TCP port number to listen on (default: 11211)
-U <num> UDP port number to listen on (default: 11211, 0 is off)
-s <file> UNIX socket path to listen on (disables network support)
-a <mask> access mask for UNIX socket, in octal (default: 0700)
-l <addr> interface to listen on (default: INADDR_ANY, all addresses)
<addr> may be specified as host:port. If you don't specify
a port number, the value you specified with -p or -U is
used. You may specify multiple addresses separated by comma
or by using -l multiple times
-d run as a daemon
-r maximize core file limit
-u <username> assume identity of <username> (only when run as root)
-m <num> max memory to use for items in megabytes (default: 64 MB)
-M return error on memory exhausted (rather than removing items)
-c <num> max simultaneous connections (default: 1024)
-k lock down all paged memory. Note that there is a
limit on how much memory you may lock. Trying to
allocate more than that would fail, so be sure you
set the limit correctly for the user you started
the daemon with (not for -u <username> user;
under sh this is done with 'ulimit -S -l NUM_KB').
-v verbose (print errors/warnings while in event loop)
-vv very verbose (also print client commands/reponses)
-vvv extremely verbose (also print internal state transitions)
-h print this help and exit
-i print memcached and libevent license
-P <file> save PID in <file>, only used with -d option
-f <factor> chunk size growth factor (default: 1.25)
-n <bytes> minimum space allocated for key+value+flags (default: 48)
-L Try to use large memory pages (if available). Increasing
the memory page size could reduce the number of TLB misses
and improve the performance. In order to get large pages
from the OS, memcached will allocate the total item-cache
in one large chunk.
-D <char> Use <char> as the delimiter between key prefixes and IDs.
This is used for per-prefix stats reporting. The default is
":" (colon). If this option is specified, stats collection
is turned on automatically; if not, then it may be turned on
by sending the "stats detail on" command to the server.
-t <num> number of threads to use (default: 4)
-R Maximum number of requests per event, limits the number of
requests process for a given connection to prevent
starvation (default: 20)
-C Disable use of CAS
-b <num> Set the backlog queue limit (default: 1024)
-B Binding protocol - one of ascii, binary, or auto (default)
-I Override the size of each slab page. Adjusts max item size
(default: 1mb, min: 1k, max: 128m)
-S Turn on Sasl authentication
-o Comma separated list of extended or experimental options
- (EXPERIMENTAL) maxconns_fast: immediately close new
connections if over maxconns limit
- hashpower: An integer multiplier for how large the hash
table should be. Can be grown at runtime if not big enough.
Set this based on "STAT hash_power_level" before a
restart.
修改memcached 运行参数,可以使用下面的选项修改/etc/sysconfig/memcached文件
选项 | 含义 |
---|---|
-u | username memcached运行的用户身份,必须普通用户 |
-p | 绑定的端口,默认11211 |
-m | num 最大内存,单位MB,默认64MB |
-c | num 最大连接数,缺省1024 |
-d | daemon 守护进程方式运行 |
-f | 增长因子Growth Factor,默认1.25 |
-v | 详细信息,-vv能看到详细信息 |
-M | 使用内存直到耗尽,不许LRU |
-U | 设置UDP监听端口,0表示禁用UDP |
[root@localhost ~]#memcached -u memcached -m 1024 -c 65536 -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 393216 perslab 2
slab class 14: chunk size 1048576 perslab 1
failed to listen on TCP port 11211: Address already in use
[root@localhost ~]#memcached -u memcached -m 1024 -c 65536 -d
#默认后台执行
6.Memcached的使用
6.1Memcached开发库和工具
与memcached通信的不同语言的连接器。libmemcached提供了C库和命令行工具。
[root@localhost ~]#yum install libmemcached -y
#安装工具包
6.1.1Memping
[root@localhost ~]#memping --help
memping v1.0
Ping a server to see if it is alive
Current 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
[root@localhost ~]#memping --servers=192.168.241.22
[root@localhost ~]#echo $?
0
[root@node2 memcached-1.6.6]#systemctl stop memcached.service
[root@localhost ~]#memping --servers=192.168.241.22
Failed to ping 192.168.241.22:11211 CONNECTION FAILURE
[root@localhost ~]#echo $?
1
6.1.2Memstat
[root@localhost ~]#memstat --servers=192.168.241.22
Server: 192.168.241.22 (11211)
pid: 6133
uptime: 20
time: 1710389654
version: 1.6.6
libevent: 2.0.21-stable
pointer_size: 64
rusage_user: 0.002391
rusage_system: 0.009564
max_connections: 1024
curr_connections: 2
total_connections: 3
rejected_connections: 0
connection_structures: 3
response_obj_bytes: 1168
response_obj_total: 1
response_obj_free: 0
response_obj_oom: 0
read_buf_bytes: 16384
read_buf_bytes_free: 0
read_buf_oom: 0
reserved_fds: 20
cmd_get: 0
cmd_set: 0
cmd_flush: 0
cmd_touch: 0
cmd_meta: 0
get_hits: 0
get_misses: 0
get_expired: 0
get_flushed: 0
delete_misses: 0
delete_hits: 0
incr_misses: 0
incr_hits: 0
decr_misses: 0
decr_hits: 0
cas_misses: 0
cas_hits: 0
cas_badval: 0
touch_hits: 0
touch_misses: 0
auth_cmds: 0
auth_errors: 0
bytes_read: 17
bytes_written: 15
limit_maxbytes: 67108864
accepting_conns: 1
listen_disabled_num: 0
time_in_listen_disabled_us: 0
threads: 4
conn_yields: 0
hash_power_level: 16
hash_bytes: 524288
hash_is_expanding: 0
slab_reassign_rescues: 0
slab_reassign_chunk_rescues: 0
slab_reassign_evictions_nomem: 0
slab_reassign_inline_reclaim: 0
slab_reassign_busy_items: 0
slab_reassign_busy_deletes: 0
slab_reassign_running: 0
slabs_moved: 0
lru_crawler_running: 0
lru_crawler_starts: 255
lru_maintainer_juggles: 70
malloc_fails: 0
log_worker_dropped: 0
log_worker_written: 0
log_watcher_skipped: 0
log_watcher_sent: 0
bytes: 0
curr_items: 0
total_items: 0
slab_global_page_pool: 0
expired_unfetched: 0
evicted_unfetched: 0
evicted_active: 0
evictions: 0
reclaimed: 0
crawler_reclaimed: 0
crawler_items_checked: 0
lrutail_reflocked: 0
moves_to_cold: 0
moves_to_warm: 0
moves_within_lru: 0
direct_reclaims: 0
lru_bumps_dropped: 0
6.2Memcached操作命令
/usr/share/doc/memcached-1.4.15//protocol.txt
#操作命令帮助路劲
五种基本 memcached 命令执行最简单的操作。这些命令和操作包括:
- set
- add
- flush
- get
- delete
前三个命令是用于操作存储在Memcached中的键值的标准修改命令,都使用如下语法:
command <key> <flags> <expiration time> <bytes>
command set/add/replace
- key key 用于查找缓存值
- flags 可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
- expiration time 在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes 在缓存中存储的字节数
- value 存储的值(始终位于第二行)
add key flags exptime bytes
增加key,过期时间为秒,bytes为存储数据的字节数
[root@node2 ~]#telnet 192.168.241.11 11211
Trying 192.168.241.11...
Connected to 192.168.241.11.
Escape character is '^]'.
stats
#查看服务状态
STAT pid 3221
STAT uptime 2676
STAT time 1710390089
STAT version 1.4.15
STAT libevent 2.0.21-stable
STAT pointer_size 64
STAT rusage_user 0.027700
STAT rusage_system 0.110803
STAT curr_connections 10
STAT total_connections 12
STAT connection_structures 11
STAT reserved_fds 20
STAT cmd_get 2
STAT cmd_set 1
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 1
STAT get_misses 1
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 55
STAT bytes_written 39
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT bytes 0
STAT curr_items 0
STAT total_items 1
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 0
END
add name 1 20 3
cxk
STORED
stats items
#显示各个slab中item的数目和存储市场(最后一次访问距离现在的秒数)
STAT items:1:number 1
STAT items:1:age 5
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:1:reclaimed 0
STAT items:1:expired_unfetched 0
STAT items:1:evicted_unfetched 0
END
stats slabs
#显示各个slab的信息,包括chunk的大小、数目、使用情况等
STAT 1:chunk_size 96
STAT 1:chunks_per_page 10922
STAT 1:total_pages 1
STAT 1:total_chunks 10922
STAT 1:used_chunks 1
STAT 1:free_chunks 10921
STAT 1:free_chunks_end 0
STAT 1:mem_requested 72
STAT 1:get_hits 1
STAT 1:cmd_set 2
STAT 1:delete_hits 0
STAT 1:incr_hits 0
STAT 1:decr_hits 0
STAT 1:cas_hits 0
STAT 1:cas_badval 0
STAT 1:touch_hits 0
STAT active_slabs 1
STAT total_malloced 1048512
END
6.2.1add——添加数据
[root@node2 ~]#telnet 192.168.241.11 11211
Trying 192.168.241.11...
Connected to 192.168.241.11.
Escape character is '^]'.
add name 1 0 3
#添加 键名为name的键 flages标志位1 永不超时 3字节的内容
wyb
#具体数据内容
STORED
6.2.2set——修改数据
set name 1 0 3
#修改键名为name的键 flages标志位1 永不超时 3字节长度
cxk
#修改的内容为cxk
STORED
6.2.3get——调用数据
get name
#调用 键名为name的数据
VALUE name 1 3
#name数据的信息
cxk
#具体数据内容 (此处由于set修改之后 所以显示的为set修改后的数据内容)
END
6.2.4delete——删除数据
get name
VALUE name 1 3
cxk
END
delete name
DELETED
get name
#删除之后再调用数据 显示为空
END
6.2.5flush——清空数据
add name 1 0 3
cxk
STORED
add class 1 0 3
wyb
STORED
get name
VALUE name 1 3
cxk
END
get class
VALUE class 1 3
wyb
END
flush_all
OK
get name
END
get class
END
7.Memcached集群部署架构
7.1基于Magent的部署架构
Magent是google开发的项目,应用端通过负载均衡服务器连接到magent,然后再由magent代理用户应用请求到memcached处理,底层的memcached为双主结构会自动同步数据,本部署方式存在magent单点问题,因此需要两个magent做高可用。
项目站点:https://code.google.com/archive/p/memagent/
此项目过于陈旧,且不稳定,当前已经废弃
7.2Repcached实现原理
在 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
[root@localhost ~]#yum -y install gcc libevent libevent-devel
#安装依赖环境
[root@localhost opt]#ls
[root@localhost opt]#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@localhost opt]#ls
memcached-1.2.8-repcached-2.2.1.tar.gz
[root@localhost opt]#tar xf memcached-1.2.8-repcached-2.2.1.tar.gz
[root@localhost opt]#cd memcached-1.2.8-repcached-2.2.1/
[root@localhost memcached-1.2.8-repcached-2.2.1]#./configure --prefix=/apps/repcached --enable-replication
如果直接执行make会出现如下报错
[root@localhost memcached-1.2.8-repcached-2.2.1]#make
make all-recursive
make[1]: 进入目录“/opt/memcached-1.2.8-repcached-2.2.1”
Making all in doc
make[2]: 进入目录“/opt/memcached-1.2.8-repcached-2.2.1/doc”
make[2]: 对“all”无需做任何事。
make[2]: 离开目录“/opt/memcached-1.2.8-repcached-2.2.1/doc”
make[2]: 进入目录“/opt/memcached-1.2.8-repcached-2.2.1”
gcc -DHAVE_CONFIG_H -I. -DNDEBUG -g -O2 -MT memcached-memcached.o -MD -MP -MF .deps/memcached-memcached.Tpo -c -o memcached-memcached.o `test -f 'memcached.c' || echo './'`memcached.c
memcached.c: 在函数‘add_iov’中:
memcached.c:697:30: 错误:‘IOV_MAX’未声明(在此函数内第一次使用)
if (m->msg_iovlen == IOV_MAX ||
^
memcached.c:697:30: 附注:每个未声明的标识符在其出现的函数内只报告一次
make[2]: *** [memcached-memcached.o] 错误 1
make[2]: 离开目录“/opt/memcached-1.2.8-repcached-2.2.1”
make[1]: *** [all-recursive] 错误 1
make[1]: 离开目录“/opt/memcached-1.2.8-repcached-2.2.1”
make: *** [all] 错误 2
解决办法是修改源码配置信息
[root@localhost memcached-1.2.8-repcached-2.2.1]#ls
aclocal.m4 config.status Makefile.am scripts
assoc.c config.sub Makefile.in slabs.c
assoc.h configure memcached.c slabs.h
AUTHORS configure.ac memcached_dtrace.d stamp-h1
AUTHORS.repcached COPYING memcached_dtrace.h stats.c
ChangeLog daemon.c memcached.h stats.h
ChangeLog.repcached depcomp memcached.spec t
compile doc missing thread.c
config.guess install-sh NEWS TODO
config.h items.c README t.rep
config.h.in items.h replication.c
config.log Makefile replication.h
[root@localhost memcached-1.2.8-repcached-2.2.1]#vim memcached.c
[root@localhost memcached-1.2.8-repcached-2.2.1]#sed -n '56,59p' memcached.c
#ifndef IOV_MAX
#if defined(__FreeBSD__) || defined(__APPLE__)
# define IOV_MAX 1024
#endif
[root@localhost memcached-1.2.8-repcached-2.2.1]#sed -n '56,60p' memcached.c
#ifndef IOV_MAX
#if defined(__FreeBSD__) || defined(__APPLE__)
# define IOV_MAX 1024
#endif
#endif
#需要将57和59行删除
[root@localhost memcached-1.2.8-repcached-2.2.1]#vim memcached.c
[root@localhost memcached-1.2.8-repcached-2.2.1]#sed -n '56,58p' memcached.c
#ifndef IOV_MAX
# define IOV_MAX 1024
#endif
#最终56-60行留下这些内容即可
再次编译
[root@localhost memcached-1.2.8-repcached-2.2.1]#make && make install
[root@localhost memcached-1.2.8-repcached-2.2.1]#ln -s /apps/repcached/bin/memcached /usr/bin/
[root@localhost memcached-1.2.8-repcached-2.2.1]#useradd -r -s /sbin/nologin memcached
[root@localhost memcached-1.2.8-repcached-2.2.1]#memcached -d -m 1024 -p 11211 -u memcached -c 2048 -x 192.168.241.22
#-x 192.168.241.22 为远端的192.168.241.22 后台启动
[root@localhost memcached-1.2.8-repcached-2.2.1]#ss -ntlap|grep 11211
LISTEN 0 128 *:11211 *:* users:(("memcached",pid=4848,fd=7))
LISTEN 0 128 :::11211 :::* users:(("memcached",pid=4848,fd=8))
可以使用rsync远程拷贝命令将配置同步到远端
[root@localhost ~]#rsync -a /apps 192.168.241.22:/
The authenticity of host '192.168.241.22 (192.168.241.22)' can't be established.
ECDSA key fingerprint is SHA256:CcASxxV4CvFA+6w68th3aaCYGbGB3UwaAK1xifsM/Pk.
ECDSA key fingerprint is MD5:d6:ee:2e:4d:f6:34:c5:14:0e:ef:99:8c:54:48:c6:be.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.241.22' (ECDSA) to the list of known hosts.
root@192.168.241.22's password:
[root@node2 opt]#ls /
apps boot etc lib media opt root sbin sys usr
bin dev home lib64 mnt proc run srv tmp var
[root@node2 opt]#ln -s /apps/repcached/bin/memcached /usr/bin/
[root@node2 opt]#useradd -r -s /sbin/nologin memcached
[root@node2 ~]#yum -y install gcc libevent libevent-devel
#安装依赖库
[root@node2 opt]#memcached -d -m 1024 -p 11211 -u memcached -c 2048 -x 192.168.241.11
[root@node2 opt]#ss -natpl|grep 11211
LISTEN 0 128 *:11211 *:* users:(("memcached",pid=4211,fd=9))
LISTEN 0 128 :::11211 :::* users:(("memcached",pid=4211,fd=10))
[root@node2 opt]#yum install telnet -y
[root@node2 opt]#telnet 192.168.241.11 11211
Trying 192.168.241.11...
Connected to 192.168.241.11.
Escape character is '^]'.
add name 1 0 3
cxk
STORED
quit
Connection closed by foreign host.
查看数据是否同步
[root@node3 ~]#yum install telnet -y
[root@node3 ~]#telnet 192.168.241.22 11211
Trying 192.168.241.22...
Connected to 192.168.241.22.
Escape character is '^]'.
get name
VALUE name 1 3
cxk
END
quit
Connection closed by foreign host.
[root@node3 ~]#telnet 192.168.241.11 11211
Trying 192.168.241.11...
Connected to 192.168.241.11.
Escape character is '^]'.
get name
VALUE name 1 3
cxk
END
quit
Connection closed by foreign host.
7.5使用HAproxy高可用部署
[root@node3 ~]#yum install haproxy.x86_64 -y
[root@node3 ~]#systemctl start haproxy.service
[root@node3 ~]#systemctl status haproxy.service
● haproxy.service - HAProxy Load Balancer
Loaded: loaded (/usr/lib/systemd/system/haproxy.service; disabled; vendor preset: disabled)
Active: active (running) since 四 2024-03-14 14:22:43 CST; 4s ago
Main PID: 37006 (haproxy-systemd)
CGroup: /system.slice/haproxy.service
├─37006 /usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haprox...
├─37011 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/ha...
└─37012 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/ha...
3月 14 14:22:43 node3.node3 systemd[1]: Started HAProxy Load Balancer.
3月 14 14:22:43 node3.node3 systemd[1]: Starting HAProxy Load Balancer...
3月 14 14:22:44 node3.node3 haproxy-systemd-wrapper[37006]: haproxy-system...
Hint: Some lines were ellipsized, use -l to show in full.
[root@node3 ~]#vim /etc/haproxy/haproxy.cfg
[root@node3 ~]#sed -n '87,91p' /etc/haproxy/haproxy.cfg
listen mem
bind 192.168.241.23:11211
mode tcp
server m1 192.168.241.11:11211 check
server m2 192.168.241.22:11211 check
[root@node3 ~]#systemctl restart haproxy.service
[root@node3 ~]#systemctl status haproxy.service
● haproxy.service - HAProxy Load Balancer
Loaded: loaded (/usr/lib/systemd/system/haproxy.service; disabled; vendor pr
Active: active (running) since 四 2024-03-14 14:40:37 CST; 2s ago
Main PID: 37572 (haproxy-systemd)
CGroup: /system.slice/haproxy.service
├─37572 /usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cf
├─37574 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haprox
└─37576 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haprox
3月 14 14:40:37 node3.node3 systemd[1]: Started HAProxy Load Balancer.
3月 14 14:40:37 node3.node3 systemd[1]: Starting HAProxy Load Balancer...
3月 14 14:40:38 node3.node3 haproxy-systemd-wrapper[37572]: haproxy-systemd-wra
3月 14 14:40:38 node3.node3 haproxy-systemd-wrapper[37572]: [WARNING] 073/14403
3月 14 14:40:38 node3.node3 haproxy-systemd-wrapper[37572]: [WARNING] 073/14403
Hint: Some lines were ellipsized, use -l to show in full.
[root@node3 ~]#ss -natpl|grep 11211
LISTEN 0 128 192.168.241.23:11211 *:* users:(("haproxy",pid=37576,fd=7))
#此为HAproxy服务在代为监听
测试
[root@node3 ~]#telnet 192.168.241.23 11211
Trying 192.168.241.23...
Connected to 192.168.241.23.
Escape character is '^]'.
get name
VALUE name 1 3
cxk
END
add class 1 0 3
wyb
STORED
quit
Connection closed by foreign host.
[root@node2 opt]#telnet 192.168.241.22 11211
Trying 192.168.241.22...
Connected to 192.168.241.22.
Escape character is '^]'.
get name
VALUE name 1 3
cxk
END
get class
VALUE class 1 3
wyb
END
quit
Connection closed by foreign host.