1 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
2. Memcached
Memcached 只支持能序列化的数据类型,不支持持久化,基于Key-Value的内存缓存系统。memcached 虽然没有像redis所具备的数据持久化功能,比如RDB和AOF都没有,但是可以通过做集群同步的方式,让各memcached服务器的数据进行同步,从而实现数据的一致性,即保证各memcached的数据是一样的,即使有任何一台 memcached 发生故障,只要集群中有一台 memcached 可用就不会出现数据丢失,当其他memcached 重新加入到集群的时候,可以自动从有数据的memcached 当中自动获取数据并提供服务。
Memcached存储数据时,Memcached会去申请1MB的内存,把该块内存称为一个slab,也称为一个page
Memcached 支持多种开发语言,包括:JAVA,C,Python,PHP,C#,Ruby,Perl等
Memcached 官网:memcached - a distributed memory object caching system
3. Memcached 和 Redis 比较
相似之处:
① 内存存储:Memcached 和 Redis 都是将数据存储在内存中,以提供快速的数据访问。
② 键值存储:Memcached 和 Redis 都是使用键值对的方式来存储数据。
③ 分布式:Memcached 和 Redis 都支持分布式存储,可以在多台服务器上运行。
不同之处:
关系型数据库:数据存放在硬盘,调度数据速率慢;
非关系型数据库:数据存放在内存,调度数据速率快。
4. Memcached 工作机制
① 数据存储:Memcached 将数据存储在内存中,以提供快速的数据访问。当应用程序需要访问数据时,它首先检查内存中是否有这个数据。如果内存中有这个数据,应用程序就可以直接从内存中获取数据,而不需要访问数据库。
② 数据分片:Memcached 将数据分片存储在多台服务器上。这样可以提高系统的可扩展性和性能。例如,如果你有 10 GB 的数据,你可以将这 10 GB 的数据分片存储在 10 台服务器上,每台服务器存储 1 GB 的数据。
③ 数据访问:当应用程序需要访问数据时,它首先计算数据的键,然后根据这个键选择一个服务器。然后,应用程序就可以直接从这个服务器获取数据。
④ 数据更新:当应用程序更新数据时,它首先计算数据的键,然后根据这个键选择一个服务器。然后,应用程序就可以直接在这个服务器上更新数据。
⑤ 数据失效:Memcached 有一个失效机制,当数据过期时,Memcached 会自动删除这个数据。这样可以避免内存被无用的数据占满。
虽然 Memcached 可以提供快速的数据访问,但它也有一些限制。例如,由于数据存储在内存中,所以 Memcached 的存储空间是有限的。另外,由于 Memcached 是一个分布式系统,所以它可能会受到网络延迟的影响。
5 安装和启动
Install · memcached/memcached Wiki · GitHub
5.1 yum 安装
[root@mcb-11-4 ~]# yum info memcached
[root@mcb-11-4 ~]# systemctl stop firewalld
[root@mcb-11-4 ~]# setenforce 0
[root@mcb-11-4 ~]# yum install memcached -y
[root@mcb-11-4 ~]# vim /etc/sysconfig/memcached
PORT="11211" #监听端口
USER="memcached" #启动用户
MAXCONN="1024" #最大连接数
CACHESIZE="64" #最大使用内存
OPTIONS="" #其他选项
[root@mcb-11-4 ~]# id memcached
uid=990(memcached) gid=985(memcached) 组=985(memcached)
[root@mcb-11-4 ~]# systemctl start memcached
[root@mcb-11-4 ~]# ss -natul
客户机
[root@mcb-11-8 ~]#telnet 192.168.11.4 11211
Trying 192.168.11.4...
Connected to 192.168.11.4.
Escape character is '^]'.
set name 1 10 4
abcd
STORED
get name
END
get name
END
quit
Connection closed by foreign host.
5.2 编译安装
[root@centos7 ~]#yum -y install gcc libevent-devel
[root@centos7 ~]#wget http://memcached.org/files/memcached-1.6.6.tar.gz
[root@centos7 ~]#tar xvf memcached-1.6.6.tar.gz
[root@centos7 ~]#cd memcached-1.6.6/
[root@centos7 memcached-1.6.6]#./configure --prefix=/apps/memcached
[root@centos7 memcached-1.6.6]#make && make install
[root@mcb-11-8 memcached-1.6.6]#ls /apps/memcached/
bin include share
[root@mcb-11-8 memcached-1.6.6]#ls /apps/memcached/bin
memcached
[root@mcb-11-8 memcached-1.6.6]#ln -s /apps/memcached/bin/memcached /usr/bin
[root@mcb-11-8 memcached-1.6.6]#useradd -r -s /sbin/nologin memcached
#-r 随机类型;-s shell类型
[root@mcb-11-8 memcached-1.6.6]#cat > /etc/sysconfig/memcached << eof
> PORT="11211"
> USER="memcached"
> MAXCONN="1024"
> CACHESIZE="64"
> OPTIONS=""
> eof
[root@mcb-11-8 memcached-1.6.6]#cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
单引号不识别变量,
[root@mcb-11-8 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@mcb-11-8 memcached-1.6.6]#systemctl start memcached
[root@mcb-11-8 memcached-1.6.6]#systemctl daemon-reload
[root@mcb-11-8 memcached-1.6.6]#systemctl status memcached.service
● memcached.service - memcached daemon
Loaded: loaded (/usr/lib/systemd/system/memcached.service; disabled; vendor preset: disabled)
Active: active (running) since 四 2024-03-14 17:49:45 CST; 25s ago
[root@mcb-11-8 memcached-1.6.6]#systemctl start memcached
[root@mcb-11-8 memcached-1.6.6]#systemctl stop memcached
[root@mcb-11-8 memcached-1.6.6]#systemctl status memcached.service
● memcached.service - memcached daemon
Loaded: loaded (/usr/lib/systemd/system/memcached.service; disabled; vendor preset: disabled)
Active: inactive (dead)
[root@mcb-11-8 memcached-1.6.6]#memcached -u memcached -m 1024 -c 65536 -f 2 -vv
slab class 1: chunk size 96 perslab 10922
[root@mcb-11-8 memcached-1.6.6]#free -h
total used free shared buff/cache available
Mem: 3.7G 894M 359M 10M 2.5G 2.5G
Swap: 4.0G 0B 4.0G
增长因子的改变
#默认前台执行
[root@centos7 ~]#memcached -u memcached -m 1024 -c 65536 -f 2 -vv
#以台方式执行
[root@centos7 ~]#memcached -u memcached -m 1024 -c 65536 -d
5.3 memcached 启动程序说明
修改memcached 运行参数,可以使用下面的选项修改/etc/sysconfig/memcached文件
memcached 常见选项
-u username memcached运行的用户身份,必须普通用户
-p 绑定的端口,默认11211
-m num 最大内存,单位MB,默认64MB
-c num 最大连接数,缺省1024
-d 守护进程方式运行
-f 增长因子Growth Factor,默认1.25
-v 详细信息,-vv能看到详细信息
-M 使用内存直到耗尽,不许LRU
-U 设置UDP监听端口,0表示禁用UDP
6 使用 memcached
6.1 memcached 开发库和工具
与memcached通信的不同语言的连接器。libmemcached提供了C库和命令行工具。
范例:
[root@mcb-11-8 memcached-1.6.6]#yum install libmemcached -y
memping 检测连接服务器
[root@mcb-11-8 memcached-1.6.6]#memping --help
6.2 memcached 操作命令
memcached 操作命令
[root@centos7 ~]#cat /usr/share/doc/memcached
-
set
-
add
-
get
-
delete
7 memcached集群部署架构
7.1 基于 magent 的部署架构
项目站点:https://code.google.com/archive/p/memagent/
此项目过于陈旧,且不稳定,当前已经废弃
7.2 Repcached 实现原理
项目站点:repcached - add data replication feature to memcached
7.3 简化后的部署架构
magent已经有很长时间没有更新,因此可以不再使用magent,直接通过负载均衡连接到memcached,仍然有两台memcached做高可用,repcached版本的memcached之间会自动同步数据,以保持数据一致性,即使其中的一台memcached故障也不影响业务正常运行,故障的memcached修复上线后再自动从另外一台同步数据即可保持数据一致性。
7.4 部署repcached
[root@mcb-11-8 ~]#systemctl stop firewalld
[root@mcb-11-8 ~]#setenforce 0
setenforce: SELinux is disabled
[root@mcb-11-8 ~]#cd /data
[root@mcb-11-8 data]#ls
[root@mcb-11-8 data]#rz -E
rz waiting to receive.
[root@mcb-11-8 data]#ls
memcached-1.2.8-repcached-2.2.1.tar.gz
[root@mcb-11-8 data]#ls
memcached-1.2.8-repcached-2.2.1.tar.gz
[root@mcb-11-8 data]#tar xf memcached-1.2.8-repcached-2.2.1.tar.gz
[root@mcb-11-8 data]#ls
memcached-1.2.8-repcached-2.2.1 memcached-1.2.8-repcached-2.2.1.tar.gz
[root@mcb-11-8 data]#
[root@mcb-11-4 ~]# systemctl stop firewalld
[root@mcb-11-4 ~]# setenforce 0
[root@mcb-11-4 ~]# cd /data
-bash: cd: /data: 没有那个文件或目录
[root@mcb-11-4 ~]# mkdir /data
[root@mcb-11-4 ~]# cd /data
[root@mcb-11-4 data]#
[root@mcb-11-8 memcached-1.2.8-repcached-2.2.1]#yum -y install gcc libevent libevent-devel
[root@mcb-11-4 data]# 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
--2024-03-14 18:59:49-- 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@mcb-11-8 data]#ls
memcached-1.2.8-repcached-2.2.1.tar.gz
[root@mcb-11-8 data]#tar xf memcached-1.2.8-repcached-2.2.1.tar.gz
[root@mcb-11-8 data]#ls
memcached-1.2.8-repcached-2.2.1 memcached-1.2.8-repcached-2.2.1.tar.gz
[root@mcb-11-8 data]#cd memcached-1.2.8-repcached-2.2.1
[root@mcb-11-8 memcached-1.2.8-repcached-2.2.1]#ls
aclocal.m4 compile daemon.c Makefile.in NEWS stats.c
assoc.c config.guess depcomp memcached.c README stats.h
assoc.h config.h.in doc memcached_dtrace.d replication.c t
AUTHORS config.sub install-sh memcached_dtrace.h replication.h thread.c
AUTHORS.repcached configure items.c memcached.h scripts TODO
ChangeLog configure.ac items.h memcached.spec slabs.c t.rep
ChangeLog.repcached COPYING Makefile.am missing slabs.h
[root@mcb-11-8 memcached-1.2.8-repcached-2.2.1]#./configure --prefix=/apps/repcached --enable-replication
[root@centos7 memcached-1.2.8-repcached-2.2.1]# vim memcached.c
56 #ifndef IOV_MAX
57 #if defined(__FreeBSD__) || defined(__APPLE__)
58 # define IOV_MAX 1024
59 #endif
60 #endif
#改为如下内容,即删除原有的原第57,59行
56 #ifndef IOV_MAX
57 # define IOV_MAX 1024
58 #endif
再次编译安装:
[root@mcb-11-8 memcached-1.2.8-repcached-2.2.1]#vim memcached.c
[root@mcb-11-8 memcached-1.2.8-repcached-2.2.1]#make
[root@mcb-11-8 memcached-1.2.8-repcached-2.2.1]#make install
做软连接
[root@mcb-11-8 ~]#ln -s /apps/repcached/bin/memcached /usr/bin/
7.6 启动 memcached
7.6.1 server1 相关操作
[root@mcb-11-8 ~]#useradd -r -s /sbin/nologin memcached
[root@mcb-11-8 ~]#memcached -d -m 1024 -p 11211 -u memcached -c 2048 -x 192.168.11.4
[root@mcb-11-8 ~]#ss -natl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:11211 *:*
LISTEN 0 128 *:11212 *:*
LISTEN 0 128 *:111 *:*
LISTEN 0 5 192.168.122.1:53 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 127.0.0.1:631 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 127.0.0.1:6010 *:*
LISTEN 0 128 127.0.0.1:6011 *:*
LISTEN 0 128 :::11211 :::*
[root@mcb-11-8 ~]#rsync -a /apps 192.168.11.4:/
The authenticity of host '192.168.11.4 (192.168.11.4)' can't be established.
ECDSA key fingerprint is SHA256:f5CWB5B1Xrf1hEtCK5pFcG+mmkQv+skC9fe3Kaa7B9w.
ECDSA key fingerprint is MD5:d0:e4:b1:5f:db:31:26:bf:ec:b1:45:27:37:06:f6:95.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.11.4' (ECDSA) to the list of known hosts.
root@192.168.11.4's password: #密码123
[root@mcb-11-8 ~]#
[root@mcb-11-4 data]# ln -s /apps/repcached/bin/memcached /usr/bin/
ln: 无法创建符号链接"/usr/bin/memcached": 文件已存在
[root@mcb-11-4 data]# ls
memcached-1.2.8-repcached-2.2.1.tar.gz
[root@mcb-11-4 data]# useradd -r -s /sbin/nologin memcached
useradd:用户“memcached”已存在
[root@mcb-11-4 data]# yum -y install gcc libevent libevent-devel
已加载插件:fastestmirror, langpacks
[root@mcb-11-4 data]# memcached -d -m 1024 -p 11211 -u memcached -c 2048 -x 192.168.11.8
[root@mcb-11-4 data]# ss -natl | grep 11211
LISTEN 0 128 *:11211 *:*
LISTEN 0 128 :::11211 :::*
注:主从备用,一次编译,然后拷回来就行
用客户机测试:就能证明在同步