浅浅探索Memcached

一、NoSQL介绍

NoSQL是对 Not Only SQL、非传统关系型数据库的统称。

NoSQL一词诞生于1998年,2009年这个词汇被再次提出指非关系型、分布式、不提供ACID的数据库设计模式。

随着互联网时代的到来,数据爆发式增长,数据库技术发展日新月异,要适应新的业务需求。

而随着移动互联网、物联网的到来,大数据的技术中NoSQL也同样重要。

数据库排名:DB-Engines Ranking - popularity ranking of database management systems

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

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 官网:memcached - a distributed memory object caching system

Memcached:是一个免费开源的、高性能的、具有分布式内存对象的缓存系统,它通过减轻数据库负载加速动态Web应用;

这个实在没什么好说的了,毕竟大家学过redis,数据库的数据是放到磁盘的,而不管是redis还是memcached都可以把它当做一个大大的内存条,从内存条里面读取数据肯定比从硬盘里面读取数据库要快得多。

再来看下它的特性:

①本质上就是一个内存key-value缓存;

②协议简单,使用的是基于文本行的协议;

③不支持数据的持久化,服务器关闭之后数据全部丢失;

④Memcached简洁而强大,便于快速开发,上手较为容易;

⑤互不通信的Memcached之间具有分布特征 ;

⑥没有安全机制

三、Memcached Redis 比较

类别RedisMemcached
支持的数据结构哈希、列表、集合、有序集合纯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,数据量非常大,并发量非常大的业务

四、Memcached 工作机制

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。

查看Slab Class

#-f, --slab-growth-factor=<num> chunk size growth factor (default: 1.25)
[root@centos7 ~]#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)

4.2 懒过期 Lazy Expiration

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

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

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

4.4 集群

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

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

五、memcached安装

5.1 yum 安装

[root@zzzcentos2 ~]#systemctl stop firewalld
[root@zzzcentos2 ~]#setenforce 0
setenforce: SELinux is disabled
[root@zzzcentos2 ~]#yum install memcached -y   #安装memcached
[root@zzzcentos2 ~]#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@zzzcentos2 ~]#cat /etc/sysconfig/memcached 
PORT="11211"       #监听端口
USER="memcached"   #启动用户
MAXCONN="1024"     #最大连接数
CACHESIZE="64"     #最大使用内存
OPTIONS=""         #设置服务器ip,不写代表所有ip
[root@zzzcentos2 ~]#id memcached       #安装memcached之后,会自动创建一个新用户
uid=990(memcached) gid=985(memcached) 组=985(memcached)
[root@zzzcentos2 ~]#systemctl start memcached.service   #开启服务
[root@zzzcentos2 ~]#systemctl status memcached.service 
● memcached.service - MemcachedLoaded: loaded (/usr/lib/systemd/system/memcached.service; disabled; vendor preset: disabled)Active: active (running) since 四 2024-03-14 15:48:17 CST; 9s agoMain PID: 58390 (memcached)CGroup: /system.slice/memcached.service└─58390 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 10243月 14 15:48:17 zzzcentos2 systemd[1]: Started Memcached.
3月 14 15:48:17 zzzcentos2 systemd[1]: Starting Memcached...
[root@zzzcentos2 ~]#

memcached没有客户端工具,客户端需要安装telent来登录

[root@localhost ~]#yum install telnet -y

5.2 编译安装

[root@localhost ~]#yum -y install gcc libevent-devel  #安装依赖包
[root@localhost ~]#cd /opt
[root@localhost opt]#ls
[root@localhost opt]#wget http://memcached.org/files/memcached-1.6.6.tar.gz #下载
--2024-03-14 16:40:35--  http://memcached.org/files/memcached-1.6.6.tar.gz
正在解析主机 memcached.org (memcached.org)... 107.170.231.145
正在连接 memcached.org (memcached.org)|107.170.231.145|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:543661 (531K) [application/octet-stream]
正在保存至: “memcached-1.6.6.tar.gz”100%[===============================================================================>] 543,661      790KB/s 用时 0.7s   2024-03-14 16:40:36 (790 KB/s) - 已保存 “memcached-1.6.6.tar.gz” [543661/543661])[root@localhost opt]#ls
memcached-1.6.6.tar.gz
[root@localhost opt]#tar xf memcached-1.6.6.tar.gz 
[root@localhost opt]#ls
memcached-1.6.6  memcached-1.6.6.tar.gz
[root@localhost opt]#cd memcached-1.6.6/
[root@localhost memcached-1.6.6]#./configure --prefix=/apps/memcached
[root@localhost memcached-1.6.6]#make && make install
[root@localhost memcached-1.6.6]#ls /apps/memcached/
bin  include  share
[root@localhost memcached-1.6.6]#ln -s /apps/memcached/bin/memcached /usr/bin
[root@localhost memcached-1.6.6]#ls /apps/memcached/bin/
memcached
[root@localhost memcached-1.6.6]#useradd -r -s /sbin/nologin memcached 
#Memcache服务必须以普通用户身份运行
[root@localhost memcached-1.6.6]#cat >    /etc/sysconfig/memcached    << eof
> PORT="11211"
> USER="memcached"
> MAXCONN="1024"
> CACHESIZE="64"
> OPTIONS=""
> eof
[root@localhost memcached-1.6.6]#cat  /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
[root@localhost 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@localhost 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
[root@localhost memcached-1.6.6]#systemctl daemon-reload
[root@localhost 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@localhost memcached-1.6.6]#systemctl start memcached
[root@localhost memcached-1.6.6]#systemctl status memcached
● memcached.service - memcached daemonLoaded: loaded (/usr/lib/systemd/system/memcached.service; enabled; vendor preset: disabled)Active: active (running) since 四 2024-03-14 16:55:52 CST; 41s agoMain PID: 3909 (memcached)CGroup: /system.slice/memcached.service└─3909 /apps/memcached/bin/memcached -p 11211 -u memcached -m 64 -c 10243月 14 16:55:52 localhost.localdomain systemd[1]: Started memcached daemon.
3月 14 16:55:52 localhost.localdomain systemd[1]: Starting memcached daemon...
[root@localhost memcached-1.6.6]#memcached --version   #查看版本
memcached 1.6.6
[root@localhost memcached-1.6.6]#

cat >    /etc/sysconfig/memcached    << eof
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
eof

注意

-p \${PORT} -u \${USER} -m \${CACHESIZE} -c \${MAXCONN} \$OPTIONS必须要加\转义 不然输入的内容为空 这里的变量与/etc/sysconfig/memcached的配置文件相对应

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

六、memcached选项

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

memcached -h    查看帮助

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

#默认前台执行
[root@centos7 ~]#memcached -u memcached -m 1024 -c 65536 -f 2 -vv 

#以台方式执行
[root@centos7 ~]#memcached -u memcached -m 1024 -c 65536 -d

七、 使用 memcached

7.1 memcached 开发库和工具

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

[root@localhost memcached-1.6.6]#yum install  libmemcached -y   #安装工具包

7.1.1memping 检测连接服务器

[root@localhost memcached-1.6.6]#memping --help
memping v1.0Ping a server to see if it is aliveCurrent 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 memcached-1.6.6]#

memping --servers 192.168.246.8

[root@localhost memcached-1.6.6]#memping --servers 192.168.246.8   #另一台主机ip
[root@localhost memcached-1.6.6]#echo $?
0

memping --servers 192.168.246.8

7.1.2memstat

[root@localhost memcached-1.6.6]#memstat --servers=192.168.246.8
Server: 192.168.246.8 (11211)pid: 80971uptime: 4time: 1710411899version: 1.4.15libevent: 2.0.21-stablepointer_size: 64rusage_user: 0.002933rusage_system: 0.006844curr_connections: 10total_connections: 11connection_structures: 11reserved_fds: 20cmd_get: 0cmd_set: 0cmd_flush: 0cmd_touch: 0get_hits: 0get_misses: 0delete_misses: 0delete_hits: 0incr_misses: 0incr_hits: 0decr_misses: 0decr_hits: 0cas_misses: 0cas_hits: 0cas_badval: 0touch_hits: 0touch_misses: 0auth_cmds: 0auth_errors: 0bytes_read: 17bytes_written: 16limit_maxbytes: 67108864accepting_conns: 1listen_disabled_num: 0threads: 4conn_yields: 0hash_power_level: 16hash_bytes: 524288hash_is_expanding: 0bytes: 0curr_items: 0total_items: 0expired_unfetched: 0evicted_unfetched: 0evictions: 0reclaimed: 0
[root@localhost memcached-1.6.6]#

7.2 memcached 操作命令

cat /usr/share/doc/memcached-1.4.15/protocol.txt  #查看帮助

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

  • set
  • add
  • flush
  • get
  • delete

前三个命令是用于操作存储在 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

显示服务状态:

[root@localhost memcached-1.6.6]#telnet 192.168.246.8 11211
Trying 192.168.246.8...
Connected to 192.168.246.8.
Escape character is '^]'.stats   #显示服务状态stats items #显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)。stats slabs #用于显示各个slab的信息,包括chunk的大小、数目、使用情况等quit   #退出

add 添加数据

[root@localhost memcached-1.6.6]#telnet 192.168.246.8 11211
Trying 192.168.246.8...
Connected to 192.168.246.8.
Escape character is '^]'.
add name 1 10 3   #添加 name flages标志位1 永不超时 3字节的内容
zzz      #具体数据内容
STORED

add      添加
name      键的名字
1        flages标志  描述信息
30       超时时间   默认秒  0 代表永久有效
4        字节数  数据的大小

zzz     具体的值

set 修改

set name 1 0 4
#修改键名为name的键  flages标志位1 永不超时 3字节长度
niya
#修改的内容为cxk
STORED

get 调用数据

get name
#调用 键名为name的数据
VALUE name 1 4
#name数据的信息
niya
#具体数据内容  (此处由于set修改之后  所以显示的为set修改后的数据内容)
END

delete  删除数据

get name
VALUE name 1 4
niya
END
delete name
DELETED
get name   #删除之后再调用数据 显示为空
END

flush_all清空

add name 1 0 3
bao
STORED
add class 1 0 3
bei
STORED
get name
VALUE name 1 3
bao
END
get class
VALUE class 1 3
bei
END
flush_all
OK
get name
END
get class
END

八、memcached集群部署架构

8.1 基于 magent 的部署架构

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

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

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

8.2 Repcached 实现原理

项目站点:repcached - add data replication feature to memcached

在 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方案

8.3 简化后的部署架构

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

8.4 部署repcached

只支持memcached-1.2.8版本

[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
[root@localhost ~]#hostname zzcentos1
[root@localhost ~]#su
[root@zzcentos1 ~]#yum -y install gcc libevent libevent-devel  #安装依赖包
[root@zzcentos1 ~]#cd /opt/
[root@zzcentos1 opt]#ls
[root@zzcentos1 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
--2024-03-14 19:33:57--  https://jaist.dl.sourceforge.net/project/repcached/repcached/2.2.1-1.2.8/memcached-1.2.8-repcached-2.2.1.tar.gz
正在解析主机 jaist.dl.sourceforge.net (jaist.dl.sourceforge.net)... 150.65.7.130, 2001:df0:2ed:feed::feed
正在连接 jaist.dl.sourceforge.net (jaist.dl.sourceforge.net)|150.65.7.130|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:228578 (223K) [application/x-gzip]
正在保存至: “memcached-1.2.8-repcached-2.2.1.tar.gz”100%[===============================================================================>] 228,578     51.2KB/s 用时 4.4s   2024-03-14 19:34:02 (51.2 KB/s) - 已保存 “memcached-1.2.8-repcached-2.2.1.tar.gz” [228578/228578])[root@zzcentos1 opt]#ls
memcached-1.2.8-repcached-2.2.1.tar.gz
[root@zzcentos1 opt]#tar xf memcached-1.2.8-repcached-2.2.1.tar.gz     #解压
[root@zzcentos1 opt]#ls
memcached-1.2.8-repcached-2.2.1  memcached-1.2.8-repcached-2.2.1.tar.gz
[root@zzcentos1 opt]#cd memcached-1.2.8-repcached-2.2.1/
[root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#
[root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#./configure --prefix=/apps/repcached --enable-replication
[root@zzcentos1 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@zzcentos1 memcached-1.2.8-repcached-2.2.1]#

会报错,内核版本过高

删除后,如下:

[root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#ls
aclocal.m4           compile        configure     items.c             memcached_dtrace.h  replication.h  t
assoc.c              config.guess   configure.ac  items.h             memcached.h         scripts        thread.c
assoc.h              config.h       COPYING       Makefile            memcached.spec      slabs.c        TODO
AUTHORS              config.h.in    daemon.c      Makefile.am         missing             slabs.h        t.rep
AUTHORS.repcached    config.log     depcomp       Makefile.in         NEWS                stamp-h1
ChangeLog            config.status  doc           memcached.c         README              stats.c
ChangeLog.repcached  config.sub     install-sh    memcached_dtrace.d  replication.c       stats.h
[root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#vim memcached.c
[root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#sed -n '56,58p' memcached.c
#ifndef IOV_MAX
# define IOV_MAX 1024
#endif
[root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#make         #再次编译
[root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#make install
[root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#ln -s /apps/repcached/bin/memcached  /usr/bin/        
[root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#useradd -r -s /sbin/nologin memcached
#创建用户
[root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#memcached -d -m 1024 -p 11211 -u memcached -c 2048 -x 192.168.246.8     #为远端主机192.168.246.8后台启动
[root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#ss -natl |grep 11211
LISTEN     0      128          *:11211                    *:*                  
LISTEN     0      128         :::11211                   :::*                  
[root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#

ss -ntl  # 查看是否启动

可以使用rsync远程拷贝命令将配置同步到远端

rsync:同步命令;底层原理是ssh
[root@zzcentos1 ~]#rsync -a /apps 192.168.246.8:/

apps注意后面不要加/ 

另一台主机 7-2配置:

[root@zzcentos2 ~]#cd /opt
[root@zzcentos2 opt]#ls /
apps  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@zzcentos2 opt]#ln -s /apps/repcached/bin/memcached  /usr/bin/   # 做软连接
[root@zzcentos2 opt]#useradd -r -s /sbin/nologin memcached            #创建用户
[root@zzcentos2 opt]#
[root@zzcentos2 opt]#yum -y install gcc libevent libevent-devel  #安装依赖库 否则起不来
[root@zzcentos2 opt]#memcached -d -m 1024 -p 11211 -u memcached -c 2048 -x 192.168.246.7
[root@zzcentos2 opt]#ss -natl |grep 11211    #查看是否启动
LISTEN     0      128          *:11211                    *:*                  
LISTEN     0      128         :::11211                   :::*                  
[root@zzcentos2 opt]#

查看数据是否同步 

7-3配置

[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
setenforce: SELinux is disabled
[root@localhost ~]#yum install telnet -y
[root@localhost ~]#hostname zzcentos3
[root@localhost ~]#su
[root@zzcentos3 ~]#

8.5使用HAproxy高可用部署

[root@zzcentos3 ~]#yum install haproxy.x86_64 -y
[root@zzcentos3 ~]#systemctl start haproxy.service 
[root@zzcentos3 ~]#systemctl status haproxy.service

listen membind 192.168.246.9:11211mode tcpserver m1 192.168.246.7:11211 checkserver m2 192.168.246.8:11211 check

检测:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/745979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

N沟道功率MOSFET--FDA59N30 助力提高电源效率 为设备节能做出贡献

FDA59N30 UniFETTM MOSFET 是高压 MOSFET产品&#xff0c;基于平面条形和 DMOS 技术。 该 MOSFET 产品专用于降低通态电阻&#xff0c;并提供更好的开关性能和更高的雪崩能量强度。适用于开关电源转换器应用&#xff0c;如功率因数校正&#xff08;PFC&#xff09;、平板显示器…

服务器集群 -- nginx配置tcp负载均衡

当面临高流量、高可用性、水平扩展、会话保持或跨地域流量分发等需求时&#xff0c;单台服务器受限于硬件资源、性能有限不能满足应用场景的并发需求量时&#xff0c;引入负载均衡器部署多个服务器共同处理客户端的并发请求&#xff0c;可以帮助优化系统架构&#xff0c;提高系…

Ubuntu——以桌面应用为主的Linux发行版操作系统

目录 一、Ubuntu简介 二、Ubuntu下载及安装 1.Swap分区的作用 2.语言环境 3.软件管理——apt 3.1配置文件 3.2软件源配置文件格式 3.3DPKG常用命令 三、常用命令总结 1. date——显示或设定系统的日期和与时间 2.cal——显示日历 3.设置时区 4.修改密码——passwd…

【DL】Dataload实操

Dataload介绍 DataLoad是一个针对Oracle开发的数据录入工具(也适用其他程序),其工作原理是模仿键盘的操作,将数据和键盘的按键以表格的形式存储起来。当你需要在目标程序界面中输入数据的时候,dataload根据所定义的数据和键盘按键顺序,将数据录入。 Dataload常用命令 Da…

FTP文件的上传与下载

利用FTP实现文件的上传与下载&#xff08;Java): import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.…

录屏在哪开?很简单,我来告诉你!

随着数码产品的普及和网络技术的发展&#xff0c;录屏已经成为人们日常生活中经常需要使用的功能。无论是录制游戏精彩瞬间、制作教学视频还是保存线上会议内容&#xff0c;录屏都扮演着重要的角色。然而&#xff0c;很多用户却不知道录屏在哪开&#xff0c;以及如何使用它们。…

『scrapy爬虫』04. 使用管道将数据写入excel(详细注释步骤)

目录 1. excel文件的初始化与保存2. 配置管道使用运行测试总结 欢迎关注 『scrapy爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『scrapy爬虫』 专栏&#xff0c;持续更新中 1. excel文件的初始化与保存 安装操作excel文件的库 pip install openpyxl钩子函数&#xff08;Hook…

✅技术社区—MySQL和ES的数据同步策略

使用Canal框架实现MySQL与Elasticsearch&#xff08;ES&#xff09;的数据同步确实可以提高实时搜索的准确性和效率。Canal通过模拟MySQL的binlog日志订阅和解析&#xff0c;实现了数据的实时同步。在这样的同步机制下&#xff0c;ES中的数据可以非常接近于MySQL数据库中的实时…

非阻塞 IO多路复用

非阻塞 & IO多路复用 一、非阻塞 socket都是会阻塞的 在等待连接以及等待接收数据的时候进入一个阻塞状态 # 服务端 import socketphone socket.socket(socket.AF_INET , socket.SOCK_STREAM) phone.bind((127.0.0.1 , 8080)) phone.listen(5)# 设置非阻塞状态 phone.…

【MySQL性能优化】- 一文了解MVCC机制

MySQL理解MVCC &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xff…

【Qt】QListView 显示富文本,设置文本内容颜色

【Qt】QListView 显示富文本&#xff0c;设置文本内容颜色 文章目录 I - 控件使用II - 显示富文本III - 注意事项 I - 控件使用 Qt 的 MVC 架构为 MV &#xff0c;Controller 部分继承到了 View 里&#xff0c;View(视图) 设置 Model(模型)&#xff0c;Model 设置数据 这里使用…

NTP网络时间服务器的妙用?让网络更精准

NTP网络时间服务器的妙用&#xff1f;让网络更精准 NTP网络时间服务器的妙用&#xff1f;让网络更精准 随着计算机网络的迅猛发展&#xff0c;网络应用已经非常普遍&#xff0c;众多领域的网络系统如电力、石化、金融业&#xff08;证券、银行&#xff09;、广电业&#xff08…

工作中Git如何切换远程仓库地址

工作中Git如何切换远程仓库地址 部门之前的仓库不用了&#xff0c;重新建了一个仓库&#xff0c;但是上传代码还是上传到了之前的仓库里面了&#xff0c;所以得进行修改&#xff0c;下面将修改地址的方法进行操作。 方法一、直接修改远程仓库地址 查看当前远程仓库地址 git …

ideaSSM校医院管理网页模式开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea ssm 校医院管理系统是一套完善的完整信息管理系统&#xff0c;结合SSM框架完成本系统SpringMVC spring mybatis &#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c; 系统具有完整的源代码和数据…

C# tcp通信连接正常判断

在 C# 中&#xff0c;你可以使用 TcpClient 类来进行 TCP 连接的管理。你可以编写一个循环来尝试连接&#xff0c;以及检测连接是否正常。以下是一个简单的示例代码&#xff0c;演示如何实现这一功能&#xff1a; using System; using System.Net.Sockets; using System.Threa…

前端跨页面通信的几种方式---同源

参考链接 1、LocalStorage:当 LocalStorage 变化时&#xff0c;会触发storage事件。利用这个特性&#xff0c;我们可以在发送消息时&#xff0c;把消息写入到某个 LocalStorage 中&#xff1b;然后在各个页面内&#xff0c;通过监听storage事件即可收到通知。 2、BroadCast C…

Java实现知乎热点小时榜爬虫

1.效果演示 1.1 热点问题列表 启动程序后&#xff0c;自动展示热点问题&#xff0c;并等待终端输入 1.2 根据序号选择想看的热点问题 输入问题序号&#xff0c;展示回答内容 1.3 退出 输入q即可退出程序 2.源码 2.1 pom.xml <?xml version"1.0" enco…

Spring Boot 获取maven打包时间

引入maven打包插件 <build><plugins><!-- 打包时生成打包时间 --><plugin><groupId>org.codehaus.mojo</groupId><artifactId>buildnumber-maven-plugin</artifactId><version>3.2.0</version><configuration&…