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

注:

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

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

安装

1
(base) sv@sv-NF5280M5:/home/sv$ sudo apt-get install memcached

二、Memcached

1、Memcached 介绍

1.1 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 是一个高性能、分布式的内存对象缓存系统,用于减轻数据库负载,提升动态Web应用的性能。它基于内存键值存储系统设计,通过在内存中存储数据来减少对慢速数据库的访问次数,从而提高网站或应用程序的速度和响应能力

尽管 Memcached 在功能上有时被当作一种辅助数据库使用,但其主要角色是作为一个高性能、分布式的缓存层,适用于实时性要求高且数据可以容忍一定程度丢失的应用场景

1.2 Memcached 特性

分布式缓存: 可以在多台服务器上分布数据,允许构建大规模的缓存系统

内存中存储: 数据存储在内存中,因此读写速度非常快

简单的键值存储: 它使用简单的键值对存储方式,适合于存储对象、文本和其他数据类型

缓存数据过期: 可以为缓存的数据设置过期时间,确保缓存中的数据不会永远存在

支持多种语言: 提供了多种编程语言的客户端库,便于在不同的应用程序中使用

减轻数据库负载: 通过缓存频繁访问的数据,可以显著减轻数据库的负载,提高网站或应用程序的性能

LRU(最近最少使用)淘汰策略:当内存达到预设上限时,Memcached 将根据 LRU 算法自动删除最近最少使用的数据,为新数据腾出空间

非持久化:Memcached 不支持持久化存储,主要用于临时缓存

高性能: 由于数据存储在内存中,因此具有非常高的读取和写入性能

开源: Memcached 是一个开源项目,可以自由使用和修改

1.3 Memcached 和 Redis 区别

image-20240527192201465

1.4 Memcached 工作机制

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

image-20240527211045176


简单说

Memcached采用的Slab Allocator机制是一种特别适合于处理大量小数据对象的内存管理机制。它把内存划分为多个相同大小的Slab,然后每个Slab再划分为多个相同大小的Chunk,用于存储数据。

以书店为例,你可以把Memcached想象成一个大书店,Slab就像书店里的书架,Chunk就像书架上的格子,而数据就像书本。

这个书店里有很多种类型的书架(Slab),每个书架的大小都是固定的,比如说1MB。每个书架又被划分成很多个大小相同的格子(Chunk),比如说有的书架的格子大小是96B,有的是120B等等。这些不同格子大小的书架被分别组织在不同的区域(Slab Class)。

当有一本新书(数据)需要上架时,书店会根据这本书的大小,选择一个合适的书架,然后在这个书架上找一个空的格子来放这本书。比如说,如果这本书的大小是100B,书店就会选择120B的书架来存储,因为96B的格子太小放不下,而120B的格子又是最接近100B的。

通过这种方式,Memcached可以有效地管理内存,尽量减少内存的浪费,并且由于每个格子的大小是固定的,所以在内存分配和回收时,可以避免复杂的内存管理操作,提高了系统的性能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(base) sv@sv-NF5280M5:/home/sv$ 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
<26 server listening (auto-negotiate)
1.4.2 懒惰期 Lazy Expiration

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

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

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

1.4.4 集群

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

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

2、安装 Memcached

1
(base) sv@sv-NF5280M5:/home/sv$ sudo apt-get install memcached
1
[root@localhost ~]#rpm -ql memcached   #查看memcached的相关文件

查看memcached信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
(base) sv@sv-NF5280M5:/home/sv$ apt show memcached
Package: memcached
Version: 1.5.22-2ubuntu0.3
Priority: optional
Section: web
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Chris Lamb <lamby@debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 340 kB
Pre-Depends: init-system-helpers (>= 1.54~)
Depends: adduser, libssl1.1 (>= 1.1.0), lsb-base, perl, perl:any, libc6 (>= 2.17), libevent-2.1-7 (>= 2.1.8-stable), libsasl2-2 (>= 2.1.27+dfsg)
Suggests: libanyevent-perl, libcache-memcached-perl, libmemcached, libterm-readkey-perl, libyaml-perl
Homepage: https://memcached.org/
Download-Size: 128 kB
APT-Manual-Installed: yes
APT-Sources: http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 Packages
Description: High-performance in-memory object caching system
Danga Interactive developed memcached to enhance the speed of LiveJournal.com,
a site which was already doing 20 million+ dynamic page views per day for 1
million users with a bunch of webservers and a bunch of database servers.
memcached dropped the database load to almost nothing, yielding faster page
load times for users, better resource utilization, and faster access to the
databases on a memcache miss.
.
memcached optimizes specific high-load serving applications that are designed
to take advantage of its versatile no-locking memory access system. Clients
are available in several different programming languages, to suit the needs
of the specific application. Traditionally this has been used in mod_perl
apps to avoid storing large chunks of data in Apache memory, and to share
this burden across several machines

在Ubuntu上,Memcached的配置文件通常位于/etc/memcached.conf。如果你想要查看Memcached的配置,你可以使用以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
(base) sv@sv-NF5280M5:/home/sv$ cat /etc/memcached.conf
# memcached default config file
# 2003 - Jay Bonci <jaybonci@debian.org>
# This configuration file is read by the start-memcached script provided as
# part of the Debian GNU/Linux distribution.

# Run memcached as a daemon. This command is implied, and is not needed for the
# daemon to run. See the README.Debian that comes with this package for more
# information.
-d

# Log memcached's output to /var/log/memcached
logfile /var/log/memcached.log

# Be verbose
# -v

# Be even more verbose (print client commands as well)
# -vv

# Start with a cap of 64 megs of memory. It's reasonable, and the daemon default
# Note that the daemon will grow to this size, but does not start out holding this much
# memory
-m 64

# Default connection port is 11211
-p 11211

# Run the daemon as root. The start-memcached will default to running as root if no
# -u command is present in this config file
-u memcache

# Specify which IP address to listen on. The default is to listen on all IP addresses
# This parameter is one of the only security measures that memcached has, so make sure
# it's listening on a firewalled interface.
-l 127.0.0.1

# Limit the number of simultaneous incoming connections. The daemon default is 1024
# -c 1024

# Lock down all paged memory. Consult with the README and homepage before you do this
# -k

# Return error when memory is exhausted (rather than removing items)
# -M

# Maximize core file limit
# -r

# Use a pidfile
-P /var/run/memcached/memcached.pid

image-20240527211807087

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(base) sv@sv-NF5280M5:/home/sv$ systemctl start memcached.service
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
启动“memcached.service”需要认证。
Authenticating as: sv,,, (sv)
Password:
==== AUTHENTICATION COMPLETE ===
(base) sv@sv-NF5280M5:/home/sv$ systemctl status memcached.service
● memcached.service - memcached daemon
Loaded: loaded (/lib/systemd/system/memcached.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-05-27 19:15:06 CST; 2h 3min ago
Docs: man:memcached(1)
Main PID: 89046 (memcached)
Tasks: 10 (limit: 76739)
Memory: 1.5M
CGroup: /system.slice/memcached.service
└─89046 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1 -P /var/run/memcached/memcached.pid

5月 27 19:15:06 sv-NF5280M5 systemd[1]: Started memcached daemon.
(base) sv@sv-NF5280M5:/home/sv$ ss -natp | grep memcached
LISTEN 0 1024 [::]:11211 [::]:* users:(("memcached",pid=89397,fd=26))

3、memcached选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
(base) sv@sv-NF5280M5:/home/sv$ memcached -h
memcached 1.5.22
-p, --port=<num> TCP port to listen on (default: 11211)
-U, --udp-port=<num> UDP port to listen on (default: 0, off)
-s, --unix-socket=<file> UNIX socket to listen on (disables network support)
-A, --enable-shutdown enable ascii "shutdown" command
-a, --unix-mask=<mask> access mask for UNIX socket, in octal (default: 700)
-l, --listen=<addr> interface to listen on (default: INADDR_ANY)
if TLS/SSL is enabled, 'notls' prefix can be used to
disable for specific listeners (-l notls:<ip>:<port>)
-d, --daemon run as a daemon
-r, --enable-coredumps maximize core file limit
-u, --user=<user> assume identity of <username> (only when run as root)
-m, --memory-limit=<num> item memory in megabytes (default: 64)
-M, --disable-evictions return error on memory exhausted instead of evicting
-c, --conn-limit=<num> max simultaneous connections (default: 1024)
-k, --lock-memory lock down all paged memory
-v, --verbose verbose (print errors/warnings while in event loop)
-vv very verbose (also print client commands/responses)
-vvv extremely verbose (internal state transitions)
-h, --help print this help and exit
-i, --license print memcached and libevent license
-V, --version print version and exit
-P, --pidfile=<file> save PID in <file>, only used with -d option
-f, --slab-growth-factor=<num> chunk size growth factor (default: 1.25)
-n, --slab-min-size=<bytes> min space used for key+value+flags (default: 48)
-L, --enable-largepages try to use large memory pages (if available)
-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, --threads=<num> number of threads to use (default: 4)
-R, --max-reqs-per-event maximum number of requests per event, limits the
requests processed per connection to prevent
starvation (default: 20)
-C, --disable-cas disable use of CAS
-b, --listen-backlog=<num> set the backlog queue limit (default: 1024)
-B, --protocol=<name> protocol - one of ascii, binary, or auto (default: auto-negotiate)
-I, --max-item-size=<num> adjusts max item size
(default: 1m, min: 1k, max: 1024m)
-S, --enable-sasl turn on Sasl authentication
-F, --disable-flush-all disable flush_all command
-X, --disable-dumping disable stats cachedump and lru_crawler metadump
-W --disable-watch disable watch commands (live logging)
-Y, --auth-file=<file> (EXPERIMENTAL) enable ASCII protocol authentication. format:
user:pass\nuser2:pass2\n
-e, --memory-file=<file> (EXPERIMENTAL) mmap a file for item memory.
use only in ram disks or persistent memory mounts!
enables restartable cache (stop with SIGUSR1)
-Z, --enable-ssl enable TLS/SSL
-o, --extended comma separated list of extended options
most options have a 'no_' prefix to disable
- maxconns_fast: immediately close new connections after limit (default: enabled)
- hashpower: an integer multiplier for how large the hash
table should be. normally grows at runtime. (default starts at: 0)
set based on "STAT hash_power_level"
- tail_repair_time: time in seconds for how long to wait before
forcefully killing LRU tail item.
disabled by default; very dangerous option.
- hash_algorithm: the hash table algorithm
default is murmur3 hash. options: jenkins, murmur3
- no_lru_crawler: disable LRU Crawler background thread.
- lru_crawler_sleep: microseconds to sleep between items
default is 100.
- lru_crawler_tocrawl: max items to crawl per slab per run
default is 0 (unlimited)
- no_lru_maintainer: disable new LRU system + background thread.
- hot_lru_pct: pct of slab memory to reserve for hot lru.
(requires lru_maintainer, default pct: 20)
- warm_lru_pct: pct of slab memory to reserve for warm lru.
(requires lru_maintainer, default pct: 40)
- hot_max_factor: items idle > cold lru age * drop from hot lru. (default: 0.20)
- warm_max_factor: items idle > cold lru age * this drop from warm. (default: 2.00)
- temporary_ttl: TTL's below get separate LRU, can't be evicted.
(requires lru_maintainer, default: 61)
- idle_timeout: timeout for idle connections. (default: 0, no timeout)
- slab_chunk_max: (EXPERIMENTAL) maximum slab size in kilobytes. use extreme care. (default: 512)
- watcher_logbuf_size: size in kilobytes of per-watcher write buffer. (default: 256)
- worker_logbuf_size: size in kilobytes of per-worker-thread buffer
read by background thread, then written to watchers. (default: 64)
- track_sizes: enable dynamic reports for 'stats sizes' command.
- no_hashexpand: disables hash table expansion (dangerous)
- modern: enables options which will be default in future.
currently: nothing
- no_modern: uses defaults of previous major version (1.4.x)
- ssl_chain_cert: certificate chain file in PEM format
- ssl_key: private key, if not part of the -ssl_chain_cert
- ssl_keyformat: private key format (PEM, DER or ENGINE) (default: PEM)
- ssl_verify_mode: peer certificate verification mode, default is 0(None).
valid values are 0(None), 1(Request), 2(Require)
or 3(Once)
- ssl_ciphers: specify cipher list to be used
- ssl_ca_cert: PEM format file of acceptable client CA's
- ssl_wbuf_size: size in kilobytes of per-connection SSL output buffer
(default: 16)

修改memcached 运行参数,可以使用下面的选项修改/etc/sysconfig/memcached文件

image-20240527212039815

1
2
3
4
5
6
7
[root@localhost ~]#memcached -u memcached -m 1024 -c 65536 -f 2 -vv
#设置默认前台执行,
-u memcached:设置 Memcached 以 memcached 用户身份运行
-m 1024:为 Memcached 分配最大内存为 1024 MB(即1GB),用于缓存数据
-c 65536:设置最大并发连接数为 65536,这意味着同时可以有这么多的客户端连接到 Memcached 实例
-f 2:设置核心文件大小限制,这里的“2”表示如果 Memcached 进程崩溃,将创建一个大小为当前内存两倍的核心转储文件,以便于调试。但在一些系统中,这个参数可能已经被弃用或不支持
-vv:开启详细模式(verbose mode),让 Memcached 在运行时输出更多的信息和日志
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(base) sv@sv-NF5280M5:/home/sv$ 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 524288 perslab 2
failed to listen on TCP port 11211: Address already in use
1
2
3
[root@localhost ~]#memcached -u memcached -m 1024 -c 65536 -d
#设置默认后台执行,
-d:该选项会让 Memcached 在后台作为守护进程运行(daemonize),这样在终端窗口关闭后,Memcached 服务依然会继续运行,提供缓存服务

4、Memcached的基本使用方法

4.1 Memcached开发库和工具

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

1
2
[root@localhost ~]#yum install  libmemcached -y 
#安装工具包
1
2
3
4
[root@localhost ~]#memping --servers 172.16.12.10    #检测172.16.12.10设备的memcached服务是否能通
[root@localhost ~]#echo $?
[root@localhost ~]#systemctl stop memcached.service
[root@localhost ~]#memping --servers 172.16.12.10
4.1.2 Memstat

用于获取 Memcached 服务的统计信息

1
[root@localhost ~]#memstat --servers=172.16.12.10

image-20240527212252442

4.2 memcached操作命令

1
2
/usr/share/doc/memcached-1.4.15//protocol.txt
#操作命令帮助文档

Memcached服务只支持Telnet连接

1
[root@localhost ~]#yum install -y telnet   #安装telnet服务

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

  • set
  • add
  • flush
  • get
  • delete
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#前三个命令是用于操作存储在 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
4.2.1 显示服务状态
1
2
3
4
5
6
[root@localhost ~]#telnet 172.16.12.10 11211
stats #显示服务状态

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

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

image-20240527212638674

image-20240527212646738

image-20240527212656266

4.2.2 添加数据
1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]#telnet 172.16.12.10 11211
add name 1 10 5
hello

#说明
add 添加
name 键的名字
1 flages标志,描述信息
10 超时时间,默认0秒代表永久有效
4 字节数,数据的大小
hello 具体的值
4.2.3 修改数据
1
2
3
4
5
6
7
set name 1 0 5

#修改键名为name的键,flages标志位1,永不超时,且长度为5字节

world

#修改的内容为world
4.2.4 调用数据
1
2
3
get name

#调用键名为name的数据
4.2.5 删除数据
1
2
3
delete name

#删除键名为name的数据
4.2.6 清空数据
1
2
3
flush_all

#清空所有的数据

三、memcached 集群部署架构

1、基于magent的部署架构

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

image-20240527212832617

2、Repcached实现原理

1
项目站点: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方案。

简单说

这段描述主要在解释repcached(一个memcached的复制版本)中的master-slave复制机制,以及如何通过-X和-x选项来设置复制端口和复制的master。

首先,我们可以将master和slave理解为一对伙伴,他们之间通过网络互相通信和协调工作。在repcached中,master负责提供数据,而slave则从master那里复制数据。

在启动repcached的时候,可以通过-X选项在master上指定复制端口(默认为11212/tcp),这个端口就像是master的“电话号码”,slave可以通过这个“电话号码”连接到master。同样,可以通过-x选项在slave上指定要复制的master,也就是告诉slave要向哪个master“打电话”。

有一个有趣的地方是,如果同时指定了-X和-x,repcached会先尝试作为slave连接到master,但如果连接失败,它就会变成master,开始等待别的slave来连接。

另外,repcached还有一个自动故障转移的特性。如果master坏掉了,slave会侦测到连接断了,然后它会自动变成master,开始等待新的slave加入。而如果slave坏掉了,master也会侦测到连接断开,它就会重新等待新的slave加入。

这种机制保证了当一方出现故障时,系统仍然可以继续运行,只不过角色会发生变化。这就是repcached的master-slave复制机制和故障转移机制。

3、简化后的部署架构

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

image-20240527213406322

关注:和redis的对比,内存机制,libevent,分布式集群

为什么memcached的QPS比redis高?

Memcached是全内存的数据缓冲系统,Redis虽然支持数据的持久化,但是全内存才是其高性能的本质。作为基于内存的存储系统来说,机器物理内存的大小就是系统能够容纳的最大数据量。如果需要处理的数据量超过了单台机器的物理内存大小,就需要构建分布式集群来扩展存储能力。

Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。


Memcached和Redis在设计和使用上都有一些不同,这些不同可能会影响它们的QPS(每秒查询率)。

Memcached可以利用多核处理器的优势,因为它可以在多个核心中运行多个线程。这使得Memcached在处理大量并发请求时,能够更好地分摊负载,从而提高了QPS。

而对于Redis来说,它是单线程的,只会使用一个核心。尽管Redis在小数据存储时的性能可能会优于Memcached,但在处理大数据时,尤其是在100k以上的数据中,Memcached的性能可能会更高。

因此,如果你的应用主要处理大型数据并且需要高并发,Memcached可能会是一个更好的选择,它的QPS可能会比Redis高。

memcached关机数据就没有了

内存机制?

Memcacahed的Slab Allocation机制

首先对于开发人员来说不匹配的malloc和free容易造成内存泄露;其次频繁调用会造成大量内存碎片无法回收重新利用,降低内存利用率;

然后作为系统调用,其系统开销远远大于一般函数调用。所以,为了提高内存的管理效率,高效的内存管理方案都不会直接使用malloc/free调用。

Memcached默认使用Slab Allocation机制管理内存,其主要思想是按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的key-value数据记录,以完全解决内存碎片问题。

Slab Allocation机制只为存储外部数据而设计,也就是说所有的key-value数据都存储在Slab Allocation系统里,而Memcached的其它内存请求则通过普通的malloc/free来申请,因为这些请求的数量和频率决定了它们不会对整个系统的性能造成影响。

Redis内存分配机制

Redis的内存管理主要通过源码中zmalloc.h和zmalloc.c两个文件来实现的。

集群与分布式方面?

Memcached本身并不支持分布式,因此只能在客户端通过像一致性哈希这样的分布式算法来实现Memcached的分布式存储,关于分布式一致性哈希算法见总结:【分布式一致性hash算法】。当客户端向Memcached集群发送数据之前,首先会通过内置的分布式算法计算出该条数据的目标节点,然后数据会直接发送到该节点上存储。但客户端查询数据时,同样要计算出查询数据所在的节点,然后直接向该节点发送查询请求以获取数据。

Redis主从复制

学习自:

Memcached-分布式内存对象缓存系统

Memcached与Redis对比及其优劣分析