Linux系统群集——Memcache

目录

一、NoSQL介绍

二、Memcached

1.Memcache介绍

2.Memcache 和 Redis 对比

3.Memcache 工作机制

3.1内存分配机制

3.2懒过期 Lazy Expiration

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

3.4集群

4.Memcache安装

4.1yum安装

4.2编译安装

5.Memcached选项

6.Memcached的使用

6.1Memcached开发库和工具

6.1.1Memping 

6.1.2Memstat

6.2Memcached操作命令

6.2.1add——添加数据

6.2.2set——修改数据

6.2.3get——调用数据

6.2.4delete——删除数据

6.2.5flush——清空数据

7.Memcached集群部署架构

7.1基于Magent的部署架构

7.2Repcached实现原理

7.3简化后的部署架构

7.4部署Repcached

7.5使用HAproxy高可用部署


一、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

关系型数据库:数据存放在硬盘,调度数据速率慢;

非关系型数据库:数据存放在内存,调度数据速率快。 

二、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 对比

比较类别RedisMemcache
支持的数据结构哈希、列表、集合、有序集合纯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安装

官方安装说明 https://github.com/memcached/memcached/wiki/Install

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文件  

选项含义
-uusername memcached运行的用户身份,必须普通用户

-p

绑定的端口,默认11211
-mnum 最大内存,单位MB,默认64MB
-cnum 最大连接数,缺省1024
-ddaemon  守护进程方式运行
-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实现原理

项目站点:http://repcached.sourceforge.net/

在 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.
  • 40
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值