• 浅浅探索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

    1. #-f, --slab-growth-factor=<num> chunk size growth factor (default: 1.25)
    2. [root@centos7 ~]#memcached -u memcached -f 2 -vv
    3. slab class   1: chunk size        96 perslab   10922
    4. slab class   2: chunk size       192 perslab    5461
    5. slab class   3: chunk size       384 perslab    2730
    6. slab class   4: chunk size       768 perslab    1365
    7. slab class   5: chunk size      1536 perslab     682
    8. slab class   6: chunk size      3072 perslab     341
    9. slab class   7: chunk size      6144 perslab     170
    10. slab class   8: chunk size     12288 perslab      85
    11. slab class   9: chunk size     24576 perslab      42
    12. slab class  10: chunk size     49152 perslab      21
    13. slab class  11: chunk size     98304 perslab      10
    14. slab class  12: chunk size    196608 perslab       5
    15. slab class  13: chunk size    524288 perslab       2
    16. <27 server listening (auto-negotiate)
    17. <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 安装

    1. [root@zzzcentos2 ~]#systemctl stop firewalld
    2. [root@zzzcentos2 ~]#setenforce 0
    3. setenforce: SELinux is disabled
    4. [root@zzzcentos2 ~]#yum install memcached -y #安装memcached
    5. [root@zzzcentos2 ~]#rpm -ql memcached
    6. /etc/sysconfig/memcached #主配置文件
    7. /usr/bin/memcached
    8. /usr/bin/memcached-tool
    9. /usr/lib/systemd/system/memcached.service
    10. /usr/share/doc/memcached-1.4.15
    11. /usr/share/doc/memcached-1.4.15/AUTHORS
    12. /usr/share/doc/memcached-1.4.15/CONTRIBUTORS
    13. /usr/share/doc/memcached-1.4.15/COPYING
    14. /usr/share/doc/memcached-1.4.15/ChangeLog
    15. /usr/share/doc/memcached-1.4.15/NEWS
    16. /usr/share/doc/memcached-1.4.15/README.md
    17. /usr/share/doc/memcached-1.4.15/protocol.txt
    18. /usr/share/doc/memcached-1.4.15/readme.txt
    19. /usr/share/doc/memcached-1.4.15/threads.txt
    20. /usr/share/man/man1/memcached-tool.1.gz
    21. /usr/share/man/man1/memcached.1.gz
    22. [root@zzzcentos2 ~]#cat /etc/sysconfig/memcached
    23. PORT="11211" #监听端口
    24. USER="memcached" #启动用户
    25. MAXCONN="1024" #最大连接数
    26. CACHESIZE="64" #最大使用内存
    27. OPTIONS="" #设置服务器ip,不写代表所有ip
    28. [root@zzzcentos2 ~]#id memcached #安装memcached之后,会自动创建一个新用户
    29. uid=990(memcached) gid=985(memcached) 组=985(memcached)
    30. [root@zzzcentos2 ~]#systemctl start memcached.service #开启服务
    31. [root@zzzcentos2 ~]#systemctl status memcached.service
    32. ● memcached.service - Memcached
    33. Loaded: loaded (/usr/lib/systemd/system/memcached.service; disabled; vendor preset: disabled)
    34. Active: active (running) since 四 2024-03-14 15:48:17 CST; 9s ago
    35. Main PID: 58390 (memcached)
    36. CGroup: /system.slice/memcached.service
    37. └─58390 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024
    38. 314 15:48:17 zzzcentos2 systemd[1]: Started Memcached.
    39. 314 15:48:17 zzzcentos2 systemd[1]: Starting Memcached...
    40. [root@zzzcentos2 ~]#

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

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

    5.2 编译安装

    1. [root@localhost ~]#yum -y install gcc libevent-devel #安装依赖包
    2. [root@localhost ~]#cd /opt
    3. [root@localhost opt]#ls
    4. [root@localhost opt]#wget http://memcached.org/files/memcached-1.6.6.tar.gz #下载
    5. --2024-03-14 16:40:35-- http://memcached.org/files/memcached-1.6.6.tar.gz
    6. 正在解析主机 memcached.org (memcached.org)... 107.170.231.145
    7. 正在连接 memcached.org (memcached.org)|107.170.231.145|:80... 已连接。
    8. 已发出 HTTP 请求,正在等待回应... 200 OK
    9. 长度:543661 (531K) [application/octet-stream]
    10. 正在保存至: “memcached-1.6.6.tar.gz”
    11. 100%[===============================================================================>] 543,661 790KB/s 用时 0.7s
    12. 2024-03-14 16:40:36 (790 KB/s) - 已保存 “memcached-1.6.6.tar.gz” [543661/543661])
    13. [root@localhost opt]#ls
    14. memcached-1.6.6.tar.gz
    15. [root@localhost opt]#tar xf memcached-1.6.6.tar.gz
    16. [root@localhost opt]#ls
    17. memcached-1.6.6 memcached-1.6.6.tar.gz
    18. [root@localhost opt]#cd memcached-1.6.6/
    19. [root@localhost memcached-1.6.6]#./configure --prefix=/apps/memcached
    20. [root@localhost memcached-1.6.6]#make && make install
    21. [root@localhost memcached-1.6.6]#ls /apps/memcached/
    22. bin include share
    23. [root@localhost memcached-1.6.6]#ln -s /apps/memcached/bin/memcached /usr/bin
    24. [root@localhost memcached-1.6.6]#ls /apps/memcached/bin/
    25. memcached
    26. [root@localhost memcached-1.6.6]#useradd -r -s /sbin/nologin memcached
    27. #Memcache服务必须以普通用户身份运行
    28. [root@localhost memcached-1.6.6]#cat > /etc/sysconfig/memcached << eof
    29. > PORT="11211"
    30. > USER="memcached"
    31. > MAXCONN="1024"
    32. > CACHESIZE="64"
    33. > OPTIONS=""
    34. > eof
    35. [root@localhost memcached-1.6.6]#cat /etc/sysconfig/memcached
    36. PORT="11211"
    37. USER="memcached"
    38. MAXCONN="1024"
    39. CACHESIZE="64"
    40. OPTIONS=""
    41. [root@localhost memcached-1.6.6]#cat > /lib/systemd/system/memcached.service << eof
    42. > [Unit]
    43. > Description=memcached daemon
    44. > Before=httpd.service
    45. > After=network.target
    46. > [Service]
    47. > EnvironmentFile=/etc/sysconfig/memcached
    48. > ExecStart=/apps/memcached/bin/memcached -p \${PORT} -u \${USER} -m \${CACHESIZE} -c \${MAXCONN} \$OPTIONS
    49. > [Install]
    50. > WantedBy=multi-user.target
    51. > eof
    52. [root@localhost memcached-1.6.6]#cat /lib/systemd/system/memcached.service
    53. #将Memcache服务交给systemd管理
    54. [Unit]
    55. Description=memcached daemon
    56. Before=httpd.service
    57. After=network.target
    58. [Service]
    59. EnvironmentFile=/etc/sysconfig/memcached
    60. ExecStart=/apps/memcached/bin/memcached -p ${PORT} -u ${USER} -m ${CACHESIZE} -c ${MAXCONN} $OPTIONS
    61. [Install]
    62. WantedBy=multi-user.target
    63. [root@localhost memcached-1.6.6]#systemctl daemon-reload
    64. [root@localhost memcached-1.6.6]#systemctl enable --now memcached.service
    65. Created symlink from /etc/systemd/system/multi-user.target.wants/memcached.service to /usr/lib/systemd/system/memcached.service.
    66. [root@localhost memcached-1.6.6]#systemctl start memcached
    67. [root@localhost memcached-1.6.6]#systemctl status memcached
    68. ● memcached.service - memcached daemon
    69. Loaded: loaded (/usr/lib/systemd/system/memcached.service; enabled; vendor preset: disabled)
    70. Active: active (running) since 四 2024-03-14 16:55:52 CST; 41s ago
    71. Main PID: 3909 (memcached)
    72. CGroup: /system.slice/memcached.service
    73. └─3909 /apps/memcached/bin/memcached -p 11211 -u memcached -m 64 -c 1024
    74. 314 16:55:52 localhost.localdomain systemd[1]: Started memcached daemon.
    75. 314 16:55:52 localhost.localdomain systemd[1]: Starting memcached daemon...
    76. [root@localhost memcached-1.6.6]#memcached --version #查看版本
    77. memcached 1.6.6
    78. [root@localhost memcached-1.6.6]#

    1. cat > /etc/sysconfig/memcached << eof
    2. PORT="11211"
    3. USER="memcached"
    4. MAXCONN="1024"
    5. CACHESIZE="64"
    6. OPTIONS=""
    7. eof

    注意

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

    1. cat > /lib/systemd/system/memcached.service << eof
    2. [Unit]
    3. Description=memcached daemon
    4. Before=httpd.service
    5. After=network.target
    6. [Service]
    7. EnvironmentFile=/etc/sysconfig/memcached
    8. ExecStart=/apps/memcached/bin/memcached -p \${PORT} -u \${USER} -m \${CACHESIZE} -c \${MAXCONN} \$OPTIONS
    9. [Install]
    10. WantedBy=multi-user.target
    11. eof

    六、memcached选项

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

    memcached -h    查看帮助

    memcached 常见选项

    1. -u username memcached运行的用户身份,必须普通用户
    2. -p 绑定的端口,默认11211
    3. -m num 最大内存,单位MB,默认64MB
    4. -c num 最大连接数,缺省1024
    5. -d 守护进程方式运行
    6. -f 增长因子Growth Factor,默认1.25
    7. -v 详细信息,-vv能看到详细信息
    8. -M 使用内存直到耗尽,不许LRU
    9. -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 检测连接服务器

    1. [root@localhost memcached-1.6.6]#memping --help
    2. memping v1.0
    3. Ping a server to see if it is alive
    4. Current options. A '=' means the option takes a value.
    5. --version
    6. Display the version of the application and then exit.
    7. --help
    8. Display this message and then exit.
    9. --quiet
    10. stderr and stdin will be closed at application startup.
    11. --verbose
    12. Give more details on the progression of the application.
    13. --debug
    14. Provide output only useful for debugging.
    15. --servers=
    16. List which servers you wish to connect to.
    17. --expire=
    18. Set the expire option for the object.
    19. --binary
    20. Switch to binary protocol.
    21. --username=
    22. Username to use for SASL authentication
    23. --password=
    24. Password to use for SASL authentication
    25. [root@localhost memcached-1.6.6]#

    memping --servers 192.168.246.8

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

    memping --servers 192.168.246.8

    7.1.2memstat

    1. [root@localhost memcached-1.6.6]#memstat --servers=192.168.246.8
    2. Server: 192.168.246.8 (11211)
    3. pid: 80971
    4. uptime: 4
    5. time: 1710411899
    6. version: 1.4.15
    7. libevent: 2.0.21-stable
    8. pointer_size: 64
    9. rusage_user: 0.002933
    10. rusage_system: 0.006844
    11. curr_connections: 10
    12. total_connections: 11
    13. connection_structures: 11
    14. reserved_fds: 20
    15. cmd_get: 0
    16. cmd_set: 0
    17. cmd_flush: 0
    18. cmd_touch: 0
    19. get_hits: 0
    20. get_misses: 0
    21. delete_misses: 0
    22. delete_hits: 0
    23. incr_misses: 0
    24. incr_hits: 0
    25. decr_misses: 0
    26. decr_hits: 0
    27. cas_misses: 0
    28. cas_hits: 0
    29. cas_badval: 0
    30. touch_hits: 0
    31. touch_misses: 0
    32. auth_cmds: 0
    33. auth_errors: 0
    34. bytes_read: 17
    35. bytes_written: 16
    36. limit_maxbytes: 67108864
    37. accepting_conns: 1
    38. listen_disabled_num: 0
    39. threads: 4
    40. conn_yields: 0
    41. hash_power_level: 16
    42. hash_bytes: 524288
    43. hash_is_expanding: 0
    44. bytes: 0
    45. curr_items: 0
    46. total_items: 0
    47. expired_unfetched: 0
    48. evicted_unfetched: 0
    49. evictions: 0
    50. reclaimed: 0
    51. [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

    #参数说明如下:
    command set/add/replace
    key     key 用于查找缓存值
    flags     可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
    expiration time     在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
    bytes     在缓存中存储的字节数
    value     存储的值(始终位于第二行)

    #增加key,过期时间为秒,bytes为存储数据的字节数
    add key flags exptime bytes

    显示服务状态:

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

    add 添加数据

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

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

    zzz     具体的值

    set 修改

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

    get 调用数据

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

    delete  删除数据

    1. get name
    2. VALUE name 1 4
    3. niya
    4. END
    5. delete name
    6. DELETED
    7. get name #删除之后再调用数据 显示为空
    8. END

    flush_all清空

    1. add name 1 0 3
    2. bao
    3. STORED
    4. add class 1 0 3
    5. bei
    6. STORED
    7. get name
    8. VALUE name 1 3
    9. bao
    10. END
    11. get class
    12. VALUE class 1 3
    13. bei
    14. END
    15. flush_all
    16. OK
    17. get name
    18. END
    19. get class
    20. 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版本

    1. [root@localhost ~]#systemctl stop firewalld
    2. [root@localhost ~]#setenforce 0
    3. [root@localhost ~]#hostname zzcentos1
    4. [root@localhost ~]#su
    5. [root@zzcentos1 ~]#yum -y install gcc libevent libevent-devel #安装依赖包
    6. [root@zzcentos1 ~]#cd /opt/
    7. [root@zzcentos1 opt]#ls
    8. [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
    9. --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
    10. 正在解析主机 jaist.dl.sourceforge.net (jaist.dl.sourceforge.net)... 150.65.7.130, 2001:df0:2ed:feed::feed
    11. 正在连接 jaist.dl.sourceforge.net (jaist.dl.sourceforge.net)|150.65.7.130|:443... 已连接。
    12. 已发出 HTTP 请求,正在等待回应... 200 OK
    13. 长度:228578 (223K) [application/x-gzip]
    14. 正在保存至: “memcached-1.2.8-repcached-2.2.1.tar.gz”
    15. 100%[===============================================================================>] 228,578 51.2KB/s 用时 4.4s
    16. 2024-03-14 19:34:02 (51.2 KB/s) - 已保存 “memcached-1.2.8-repcached-2.2.1.tar.gz” [228578/228578])
    17. [root@zzcentos1 opt]#ls
    18. memcached-1.2.8-repcached-2.2.1.tar.gz
    19. [root@zzcentos1 opt]#tar xf memcached-1.2.8-repcached-2.2.1.tar.gz #解压
    20. [root@zzcentos1 opt]#ls
    21. memcached-1.2.8-repcached-2.2.1 memcached-1.2.8-repcached-2.2.1.tar.gz
    22. [root@zzcentos1 opt]#cd memcached-1.2.8-repcached-2.2.1/
    23. [root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#
    24. [root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#./configure --prefix=/apps/repcached --enable-replication
    25. [root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#make #报错了
    26. make all-recursive
    27. make[1]: 进入目录“/opt/memcached-1.2.8-repcached-2.2.1
    28. Making all in doc
    29. make[2]: 进入目录“/opt/memcached-1.2.8-repcached-2.2.1/doc”
    30. make[2]: 对“all”无需做任何事。
    31. make[2]: 离开目录“/opt/memcached-1.2.8-repcached-2.2.1/doc”
    32. make[2]: 进入目录“/opt/memcached-1.2.8-repcached-2.2.1
    33. 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
    34. memcached.c: 在函数‘add_iov’中:
    35. memcached.c:697:30: 错误:‘IOV_MAX’未声明(在此函数内第一次使用)
    36. if (m->msg_iovlen == IOV_MAX ||
    37. ^
    38. memcached.c:697:30: 附注:每个未声明的标识符在其出现的函数内只报告一次
    39. make[2]: *** [memcached-memcached.o] 错误 1
    40. make[2]: 离开目录“/opt/memcached-1.2.8-repcached-2.2.1
    41. make[1]: *** [all-recursive] 错误 1
    42. make[1]: 离开目录“/opt/memcached-1.2.8-repcached-2.2.1
    43. make: *** [all] 错误 2
    44. [root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#

    会报错,内核版本过高

    删除后,如下:

    1. [root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#ls
    2. aclocal.m4 compile configure items.c memcached_dtrace.h replication.h t
    3. assoc.c config.guess configure.ac items.h memcached.h scripts thread.c
    4. assoc.h config.h COPYING Makefile memcached.spec slabs.c TODO
    5. AUTHORS config.h.in daemon.c Makefile.am missing slabs.h t.rep
    6. AUTHORS.repcached config.log depcomp Makefile.in NEWS stamp-h1
    7. ChangeLog config.status doc memcached.c README stats.c
    8. ChangeLog.repcached config.sub install-sh memcached_dtrace.d replication.c stats.h
    9. [root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#vim memcached.c
    10. [root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#sed -n '56,58p' memcached.c
    11. #ifndef IOV_MAX
    12. # define IOV_MAX 1024
    13. #endif
    14. [root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#make #再次编译
    15. [root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#make install
    16. [root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#ln -s /apps/repcached/bin/memcached /usr/bin/
    17. [root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#useradd -r -s /sbin/nologin memcached
    18. #创建用户
    19. [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后台启动
    20. [root@zzcentos1 memcached-1.2.8-repcached-2.2.1]#ss -natl |grep 11211
    21. LISTEN 0 128 *:11211 *:*
    22. LISTEN 0 128 :::11211 :::*
    23. [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配置:

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

    查看数据是否同步 

    7-3配置

    1. [root@localhost ~]#systemctl stop firewalld
    2. [root@localhost ~]#setenforce 0
    3. setenforce: SELinux is disabled
    4. [root@localhost ~]#yum install telnet -y
    5. [root@localhost ~]#hostname zzcentos3
    6. [root@localhost ~]#su
    7. [root@zzcentos3 ~]#

    8.5使用HAproxy高可用部署

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

    1. listen mem
    2. bind 192.168.246.9:11211
    3. mode tcp
    4. server m1 192.168.246.7:11211 check
    5. server m2 192.168.246.8:11211 check

    检测:

  • 相关阅读:
    python基础----环境搭建-----01
    外观专利申请流程是怎样的?
    GRU门控循环单元
    JavaScript 继承 - ES6的class继承用ES5如何实现?
    Nginx安装与常见命令
    Java中如何处理XML数据?
    kafka搭建,演示
    qt creator5.15.2用的是什么版本的图形api?
    Spring MVC中@Controller和@RequestMapping注解详解
    TCP/IP协议专栏——静态路由互导 详解——网络入门和工程维护必看
  • 原文地址:https://blog.csdn.net/zzzxxx520369/article/details/136710361