Linux系统群集——Memcache

Linux系统群集——MemcacheNoSQL 介绍 Memcached 服务介绍 Memcache 和 Redis 对比 Memcache 工作机制 Memcache 安装 Memcache 选项 Memcache 使用 Memping Me

大家好,欢迎来到IT知识分享网。

目录

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

Linux系统群集——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。

根据数据大小分配到合适的盒子里 

Linux系统群集——Memcache

查看 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     perslab       5 slab class  13: chunk size     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文件  

选项 含义
-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  perslab 5 slab class 13: chunk size  perslab 2 slab class 14: chunk size  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:  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:  accepting_conns: 1 listen_disabled_num: 0 time_in_listen_disabled_us: 0 threads: 4 conn_yields: 0 hash_power_level: 16 hash_bytes:  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  STAT version 1.4.15 STAT libevent 2.0.21-stable STAT pointer_size 64 STAT rusage_user 0.027700 STAT rusage_system 0. 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  STAT accepting_conns 1 STAT listen_disabled_num 0 STAT threads 4 STAT conn_yields 0 STAT hash_power_level 16 STAT hash_bytes  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  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做高可用。

Linux系统群集——Memcache

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

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

Linux系统群集——Memcache

7.2Repcached实现原理

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

Linux系统群集——Memcache

Linux系统群集——Memcache

在 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修复上线后再自动从另外一台同步数据即可保持数据一致性。

Linux系统群集——Memcache

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. 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/124941.html

(0)
上一篇 2025-10-01 22:00
下一篇 2025-10-01 22:20

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信