千家信息网

telnet下操作memcache(指令详解)& 高可用分布式集群(magent)

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,在定位问题、测试等时候经常需要对memcache的数据进行一些操作,但是其本身没有自带的客户端,所以只能通过telnet来进行操作,下面对操作memcache指令进行详细解释。指令格式: <命令> <
千家信息网最后更新 2025年02月02日telnet下操作memcache(指令详解)& 高可用分布式集群(magent)

在定位问题、测试等时候经常需要对memcache的数据进行一些操作,但是其本身没有自带的客户端,所以只能通过telnet来进行操作,下面对操作memcache指令进行详细解释。

指令格式: <命令> <键> <标记> <有效期> <数据长度>

<命令>-command name**

主要是三个存储数据的命令:set,add,replace
"set" 命令是保存一个叫做key的数据到服务器上;
"add" 命令是添加一个数据到服务器,但是服务器必须保证这个key是不存在的,能够保证数据不会被覆盖;
"replace" 命令是替换一个已经存在的的数据,如果数据不存在,就是类似于set功能;
//追加命令:
"append":向前追加,对存在的键进行追加
"prepend":向后追加,对存在的键进行追加

<键>-key

保存在服务器上唯一的一个表示符,必须是跟其他的key不冲突,否则会覆盖掉原来的数据,这个key是为了能够准确的存取一个数据的项目。

<标记>-flag

标记是一个16位的无符号整型数据,用来设置服务器端跟客户端一些交互操作。

<有效期>-expiration time

是数据在服务器上的有效期限,如果是0,则数据永远有效,单位是秒,memcache服务器端会把一个数据的有效期设置为当前unix时间+设置的有效时间

数据长度-bytes

数据的长度,block data块数据的长度,一般在这个长度结束以后下一行跟着block data数据内容,发送完数据以后,客户端一般等待服务器端的返回。
注意:存储的字节数一定要与实际存储值得字节数对应,否则无法存入报错"CLIENT_ERROR bad data chunk"

memcached的响应结果:
当以上数据发送结束之后,服务器将返回一个应答。可能有如下的情况:

数据保存成功:STORED数据保存失败:NOT_STORED

数据保存失败,一般是因为服务器端这个数据key已经存在了,或者是命令的语法错误。

[指令详解+实例]

指令目录:

1,memcached 连接
2,set命令
3,add命令
4,replace 命令
5,append 命令
6,prepend 命令
7,CAS命令
8,get 命令
9,gets 命令
10,delete 命令
11,incr与decr 命令
12,stats 命令
13,stats items 命令
14,stats slabs 命令
15,stats sizes 命令
16,flush_all 命令

1,memcached 连接

语法格式:telnet HOST PORT

//HOST: 为memcached服务的ip
//PORT:为memcached服务的端口
实例:

[root@nginx-server ~]# telnet 172.16.1.130  11211Trying 172.16.1.130...Connected to 172.16.1.130.Escape character is '^]'.

##如果想结束当前连接,使用quit指令:

[root@nginx-server ~]# telnet 172.16.1.130  11211Trying 172.16.1.130...Connected to 172.16.1.130.Escape character is '^]'.quit    #退出终端Connection closed by foreign host.[root@nginx-server ~]# 

2, set 命令

set命令用于将 value存储在指定的key中;
如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。
set命令是add命令和replace命令的集合体

语法格式:set key flags exptime bytes [noreply] value

参数解释:

  • key:键值key-value 结构中的key,用于查找缓存值。
  • flags:可以包括键值的整型参数,客户机使用它存储关于键值对的额外信息。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位,0表示永远)
  • bytes:在缓存中存储的字节数
  • noreply(可选):该参数告知服务器不需要返回数据。
  • value:存储的值(始终位于第二行,可直接理解为key-value结构中的value)

实例:

set test1 0 900 9  #设置键名为test1,flag为0,缓存时间900秒,存储字节数9memcached   #存储的值为memcachedSTOREDget test1        #获取该key的数据值VALUE test1 0 9memcached    #返回刚刚存储key的数据值ENDset test1 0 9000 13  #对已存在的key进行setnew-memcached   STOREDget test1    #获得该key新的数据值VALUE test1 0 13new-memcached    #可以看到如果set的key已存在,会实现更新的作用END

输出信息说明:

  • STORED:保存成功后输出
  • ERROR:在保存失败后输出

3,add 命令

add 命令用于将 value存储在指定的key中。
如果add 的 key已经存在,则不会更新数据(过期的key会更新),之前的值将仍然保持相同,并且您将获得响应 NOT_STORED。

语法格式:add key flags exptime bytes [noreply] value

参数解释:

  • key:键值key-value结构中的key,用于查找缓存值。
  • flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位,0表示永远)
  • bytes:在缓存中存储的字节数
  • noreply(可选):该参数告知服务器不需要返回数据。
  • value:存储等的值(始终位于第二行,可直接理解为键值结构中的value)

实例:

add test2 0 900 10 #添加的键名为test2,flag为0,缓存时间900秒,存储字节10date_value   #存储的值为date_valueSTOREDget test2     #获得该键的数据值VALUE test2 0 10date_value    ENDadd test2 0 900 9   #如果添加的key已存在,不会更新数据,将获得响应NOT_STOREDnew_valueNOT_STOREDget test2     #之前的存储的值保持不变VALUE test2 0 10date_valueEND

输出信息说明:

  • STORED:保存成功后输出
  • NOT_STORED:在保存失败后输出

4,replace 命令

replace命令用于替换已存在的key的value。如果key不存在,则替换失败,并且将获得响应 NOT_STORED。

语法格式:replace key flags exptime bytes [noreply] value

参数解释:

  • key:键值key-value结构中的key,用于查找缓存值。
  • flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位,0表示永远)
  • bytes:在缓存中存储的字节数
  • noreply(可选):该参数告知服务器不需要返回数据。
  • value:存储等的值(始终位于第二行,可直接理解为键值结构中的value)

实例:

#添加一个新的key(test3),并存储对应的值为date_valueadd test3 0 900 10  date_value      STOREDget test3VALUE test3 0 10date_valueEND#替换已存在的key的值为new_date_valuereplace test3 0 900 14new_date_valueSTOREDget test3VALUE test3 0 14new_date_value    #key的value替换成功END

输出信息说明:

  • STORED: 保存成功后输出
  • NOT_STORED:执行替换失败后输出

5, append 命令

append命令用于向已存在key的value后面追加数据。

语法格式:append key flags exptime bytes [noreply] value

参数解释:

key:键值 key-value 结构中的 key,用于查找缓存值。
flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。• exptime:在缓存中保存键值对的时间长度(以秒为单位, 0 表示永远)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)(可直接理解为 key-value 结构中的 value)

实例:

#添加一个新的key(键名为test4),并存储对应的值为abcadd test4 0 900 3abcSTOREDget test4VALUE test4 0 3abcEND#使用append命令在key为test4的值后面追加"1234"append test4 0 900 41234STOREDget test4  #使用get命令获得该值VALUE test4 0 7abc1234    #追加value成功END

输出信息说明:

  • STORED:保存成功后输出
  • NOT_STORED:该键在memcached上不存在
  • CLIENT_ERROR:执行错误

6,prepend 命令

与append命令相反,prepend命令用于向已存在的key的value前面追加数据。

语法格式:prepend key flags exptime bytes [noreply] value

参数解释:

key:键值 key-value 结构中的 key,用于查找缓存值。
flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位, 0 表示永远)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)(可直接理解为 key-value 结构中的 value)

实例:

get test4   #还是基于上个实例存储的keyVALUE test4 0 7abc1234END#使用prepend命令在key(test4)的值前面追加"new"prepend test4 0 900 3  newSTOREDget test4VALUE test4 0 10newabc1234END

输出信息说明:

  • STORED:保存成功后输出
  • NOT_STORED:该键在memcached上不存在
  • CLIENT_ERROR:执行错误

7,CAS命令

CAS命令用于执行一个"检查并设置"的操作,它仅在当前客户端最后一次取值后,该key对应的值没有被其他客户端修改的情况下,才能够将值写入。
检查使用过cas_token参数进行的,这个参数是memcache指定给已经存在的元素的一个唯一的64位值。

CAS命令的作用:使用CAS命令的目的就是保证当前只有一个client对memcache进行操作。如果没有操作成功,那就说明有其他的client对这个key-value进行了操作。那么需要重新利用gets取到当前的cas_token,然后继续进行cas操作。主要是为了分布式环境中更新的一致性问题。

语法格式:cas key flags exptime bytes unique_cas_token [noreply] value

参数解释:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位, 0 表示永远)
  • bytes:在缓存中存储的字节数
  • unique_cas_token 通过 gets 命令获取的一个唯一的 64 位值。
  • noreply(可选): 该参数告知服务器不需要返回数据
  • value:存储的值(始终位于第二行)(可直接理解为 key-value 结构中的 value)

实例:
要在memcached上使用CAS命令,需要从memcached服务商通过gets命令获取令牌(token)。

#如果没有设置唯一令牌,则cas命令执行错误cas test5 0 900 9 ERROR#如果key不存在,执行失败cas test5 0 900 9 2   memcachedNOT_FOUND#添加一个key-valueset test5 0 900 9memcachedSTORED#使用gets命令获取唯一令牌(12)gets test5VALUE test5 0 9 12memcachedEND#使用cas命令更新数据cas test5 0 900 5 12abcdeSTORED#查看数据更新成功get test5  VALUE test5 0 5abcdeEND

输出信息说明:

  • STORED:保存成功后输出
  • ERROR: 保存出错或语法错误
  • EXISTS:在最后一次取值后另外一个用户也在更新该数据。
  • NOT_FOUND:memcached服务器手上不存在该键值。

8,get 命令

get命令获取存储在key中的value,如果key不存在,则返回空。

基本语法格式:get key多个key使用空格隔开:get key1 key2 key3

参数说明:

key:键值key-value结构中的key,用于查找缓存值

实例:

set test6 0 900 9memcachedSTOREDget test6VALUE test6 0 9memcachedEND

9,gets 命令

gets命令获取带有CAS令牌存储的value,如果key不存在,则返回空。

基本语法格式:gets key多个key使用空格隔开:gets key1 key2 key3

实例:

gets test6VALUE test6 0 9 15memcachedEND#在使用gets命令的输出结果中,在最后一列的数字15 代表了key(test6)的CAS令牌。

扩:gets命令的功能类似于基本的get命令;两个命令之间的差异在于:gets返回的信息稍微多一些:64 位的整型值非常像名称/值对的 "版本" 标识符。

10,delete 命令

delete命令用于删除已存在的key键。

语法格式:delete key [noreply]

参数解释:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • noreply(可选): 该参数告知服务器不需要返回数据

实例:

delete test6DELETEDget test6END#以上个实例为例,使用delete命令删除该key(test6)

输出信息说明:

  • DELETED:删除成功
  • ERROR:语法错误或删除失败
  • NOT_FOUND:key不存在

11,incr与decr 命令

incr与decr命令用于对已存在的key(键)的数据值进行自增或自减操作。incr与decr命令操作的数据必须是十进制的32为无符号整数。
如果key不存在返回NOT_FOUND,如果键的值不为数字,则返回CLIENT_ERROR,其他错误返回ERROR。

incr 命令:

语法格式:incr key increment_value

参数解释:

key:键值key-value结构中的key,用于查找缓存值。
increment_value:增加的数值。

实例:

#创建一个键(test7),数据初始值为10set test7 0 900 2     10STOREDget test7VALUE test7 0 210END#使用incr命令进行自增的操作(加5)incr test7 515get test7VALUE test7 0 215      #最后返回的数据值为15END

decr 命令

语法格式:decr key decrement_value

参数解释:

key:键值key-value结构中的key,用于查找缓存值。
decrement_value:减少的数值。

实例:

get test7VALUE test7 0 215ENDdecr test7 105get test7VALUE test7 0 25 END#以上个实例中的key(test7)初始值为15,使用decr命令进行自减操作(减10),最后返回的数据值为5

12,stats 命令

stats命令用于返回统计信息例如PID,版本号,连接数等。

语法格式:stats

实例:
在以下实例中,使用stats命令来输出memcached服务信息。这里显示了很多状态信息,下边详细解释每个状态项:

statsSTAT pid 1332   #memcache 服务器进程 IDSTAT uptime 25950    #服务器已运行秒数STAT time 1583711222  #服务器当前unix时间戳STAT version 1.4.33    #memcache版本STAT libevent 2.0.22-stable   #memcahe libevent版本信息STAT pointer_size 64   #操作系统指针代销STAT rusage_user 1.257281    #进程累计用户时间STAT rusage_system 3.981391   #进程累计系统时间STAT curr_connections 5   #当前连接数量STAT total_connections 36   #memcached运行以来连接总数STAT connection_structures 6    #memcached分配的连接结构数量STAT reserved_fds 20    STAT cmd_get 33    #get命令请求次数STAT cmd_set 27   #set命令请求次数STAT cmd_flush 0   #fulsuh命令请求次数STAT cmd_touch 0 STAT get_hits 23   #get命令命中次数STAT get_misses 10    #get命令未命中次数STAT get_expired 4    STAT get_flushed 0STAT delete_misses 0     #delete命令未命中次数STAT delete_hits 2      #delete命令命中次数STAT incr_misses 0   #incr命令未命中次数STAT incr_hits 1     #incr命令命中次数STAT decr_misses 0   #decr命令未命中次数STAT decr_hits 1    #decr命令命中次数STAT cas_misses 2   #cas命令为命中次数STAT ca*_hits 1   #cas命令命中次数STAT cas_badval 0   #使用擦拭次数STAT touch_hits 0   STAT touch_misses 0STAT auth_cmds 0   #认证命令处理的次数STAT auth_errors 0   #认证失败数目STAT bytes_read 1893   #读取总字节数STAT bytes_written 1636  #发送总字节数STAT limit_maxbytes 2147483648   #分配的内存总大小(字节)STAT accepting_conns 1 #服务器是否达到过最大连接(0/1)STAT listen_disabled_num 0   #失效的监听数STAT time_in_listen_disabled_us 0  STAT threads 4  #当前线程数STAT conn_yields 0   #连接操作主动放弃数目STAT hash_power_level 16  STAT hash_bytes 524288STAT hash_is_expanding 0STAT malloc_fails 0  STAT log_worker_dropped 0STAT log_worker_written 0STAT log_watcher_skipped 0STAT log_watcher_sent 0STAT bytes 241   #当前存储占用的字节数STAT curr_items 3   #当前存储的数据总数STAT total_items 16   #启动以来存储的数据总数STAT expired_unfetched 0   STAT evicted_unfetched 0STAT evictions 0   #LRU释放的对象数目STAT reclaimed 1   #已过期的数据条目来存储新数据的数目STAT crawler_reclaimed 0STAT crawler_items_checked 0STAT lrutail_reflocked 0END

13,stats items 命令

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

语法格式:stats items

例如:

stats itemsSTAT items:1:number 3STAT items:1:age 7875STAT items:1:evicted 0STAT items:1:evicted_nonzero 0STAT items:1:evicted_time 0STAT items:1:outofmemory 0STAT items:1:tailrepairs 0STAT items:1:reclaimed 1STAT items:1:expired_unfetched 0STAT items:1:evicted_unfetched 0STAT items:1:crawler_reclaimed 0STAT items:1:crawler_items_checked 0STAT items:1:lrutail_reflocked 0END

14, stats slabs 命令

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

 语法格式: stats slabs

例如:

stats slabsSTAT 1:chunk_size 96STAT 1:chunks_per_page 10922STAT 1:total_pages 1STAT 1:total_chunks 10922STAT 1:used_chunks 3STAT 1:free_chunks 10919STAT 1:free_chunks_end 0STAT 1:mem_requested 241STAT 1:get_hits 23STAT 1:cmd_set 27STAT 1:delete_hits 2STAT 1:incr_hits 1STAT 1:decr_hits 1STAT 1:ca*_hits 1STAT 1:cas_badval 0STAT 1:touch_hits 0STAT active_slabs 1STAT total_malloced 1048512END

15,stats sizes 命令

stats sizes命令用于显示所有item的大小和个数。
该信息返回两列:第一列是item的大小,第二列是item的个数。

语法:stats sizes

实例:

stats sizesSTAT sizes_status disabled    #统计大小\状态已禁用END

Memcached 1.4.27 及以后的版本自动开启了 stats sizes 功能 这之前的版本需要在 Memcached 启动时带上 -o track_sizes 则来开启 。

16,version 命令

如果只是想单独了解当前版本信息,可以使用version指令。

语法格式:version

例子:

versionVERSION 1.4.33   #当前memcached的版本号

16,flush_all 命令

flush_all 命令用于清理缓存中的所有key-value(键-值)对。
该命令提供了一个可选参数 time:用于在制定的时间后执行清理缓存操作。

语法格式:flush_all [time] [noreply]

实例:

set test 0 900 9memcachedSTOREDget testVALUE test 0 9memcachedENDflush_allOKget testEND
#在制定的时间后执行清理,操作如下:flush_all 10  //单位秒,表示在10秒后执行清理操作

注:这个指令一般不要轻易使,除非你确实想把所有数据都干掉,删除后是无法恢复的。

memcache分布式集群


memcached是一个高性能的分布式内存对象缓存系统,用于动态web应用以减轻数据库负载。他通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态,数据库驱动网站的速度。memcached基于一个存储键值对的hashmap。其守护进程(daemon)是用C语言写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

memcache分布式集群搭建环境如下:

主机ip地址操作系统
magent1+keepalived-master172.16.1.100CentOS 7.3VIP地址:172.16.1.200
magent2+keepalived-slave172.16.1.110CentOS 7.3
memcached1172.16.1.120CentOS 7.3
memcached2172.16.1.130CentOS 7.3
client172.16.1.30CentOS 7.3

1,首先安装依赖库libevent(四台服务器都安装)
libevent安装包官网下载:http://libevent.org/

[root@magent1-master ~]# tar zxf libevent-2.0.22-stable.tar.gz  -C /usr/src/[root@magent1-master ~]# cd /usr/src/libevent-2.0.22-stable/[root@magent1-master libevent-2.0.22-stable]# ./configure --prefix=/usr/ && make && make install

2,安装memcached软件(后两台memcached服务器安装)
memcached官网下载:https://memcached.org/downloads

[root@memcached1 ~]# tar zxf memcached-1.4.33.tar.gz -C /usr/src/[root@memcached1 ~]# cd /usr/src/memcached-1.4.33/[root@memcached1 memcached-1.4.33]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/[root@memcached1 memcached-1.4.33]# make && make install

#启动memcached服务

主缓存:[root@memcache1 memcached-1.4.33]#ln -s /usr/local/memcached/bin/memcached  /usr/local/sbin/[root@memcached1 ~]# memcached -d -m 1024 -u root -l 172.16.1.120 -p 11211[root@memcached1 ~]# netstat -anput | grep memcachedtcp        0      0 172.16.1.120:11211      0.0.0.0:*               LISTEN      9678/memcached  #设置防火墙:[root@memcached1 ~]# firewall-cmd  --add-port=11211/tcp --permanentsuccess[root@memcached1 ~]# firewall-cmd --reloadsuccess
备缓存:[root@memcached2 memcached-1.4.33]# ln -s /usr/local/memcached/bin/memcached  /usr/local/sbin/[root@memcached2 memcached-1.4.33]# memcached -d -m 1024 -u root -l 172.16.1.130 -p 11211[root@memcached2 memcached-1.4.33]# netstat -anput | grep memcachedtcp        0      0 172.16.1.130:11211      0.0.0.0:*               LISTEN      8551/memcached  #设置防火墙:[root@memcached2 ~]# firewall-cmd --add-port=11211/tcp --permanentsuccess[root@memcached2 ~]# firewall-cmd --reloadsuccess

3,安装magent代理软件(2台Magent服务器安装)
Magent 是一款开源的 Memcached 代理服务器软件,使用它可以搭建高可用性的集群应用的 Memcached 服务 ,备份 Memcached 数据,尽管 Memcached 服务挂掉,前端也能获取到数据,客户端先连到 Magent 代理服务器 ,然后Magent 代理服务器 在可以连接多台 Memcached 服务器,然后可以进行数据的保存和备份数据。这样数据就不会丢失,保存了数据完整性。

magent安装包下载地址:https://code.google.com/archive/p/memagent/downloads

#例如安装当前最新版本magent-0.6:[root@magent1-master ~]# mkdir /usr/magent[root@magent1-master ~]# tar zxf magent-0.6.tar.gz -C /usr/magent/[root@magent1-master ~]# cd /usr/magent/[root@magent1-master magent]# lsketama.c  ketama.h  magent.c  Makefile#解决报错问题[root@magent1-master magent]# vim ketama.h 修改头部信息(最大值),修改内容如下:#ifndef SSIZE_MAX#define SSIZE_MAX 32767
[root@magent1-master magent]# ln -s /usr/lib64/libm.so /usr/lib64/libm.a[root@magent1-master magent]# ln -s /usr/lib64/libevent-1.4.so.2 /usr/lib64/libevent.a[root@magent1-master magent]# /sbin/ldconfig [root@magent1-master magent]# makegcc -Wall -g -O2 -I/usr/local/include -m64 -c -o magent.o magent.cgcc -Wall -g -O2 -I/usr/local/include -m64 -c -o ketama.o ketama.cgcc -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/lib64/libevent.a /usr/lib64/libm.a gcc: error: /usr/lib64/libevent.a: No such file or directorymake: *** [magent] Error 1

#如果还出现以上错误,修改Makefile文件:

[root@magent1-master magent]# vim Makefile 找到 LIBS = /usr/lib64/libevent.a /usr/lib64/libm.a修改为LIBS = /usr/lib/libevent.a /usr/lib64/libm.a #重新编译:[root@magent1-master magent]# makegcc -Wall -g -O2 -I/usr/local/include -m64 -o magent magent.o ketama.o /usr/lib/libevent.a /usr/lib64/libm.a[root@magent1-master magent]# lsketama.c  ketama.h  ketama.o  magent  magent.c  magent.o  Makefile[root@magent1-master magent]# cp magent /usr/bin/

主缓存和备缓存一样的启动命令,需要通过"-l" 参数指定漂移IP,因为还没有搭建keepalived,所以暂时不要启动Magent服务。

4,安装keepalived高可用软件(安装在2台Magent服务器上)
安装包官网下载:https://www.keepalived.org/download.html

#安装依赖:[root@magent1-master ~]# yum -y install openssl-devel#安装keepalived[root@magent1-master ~]# tar zxf keepalived-1.2.13.tar.gz  -C /usr/src/[root@magent1-master ~]# cd /usr/src/keepalived-1.2.13/[root@magent1-master keepalived-1.2.13]# ./configure --prefix=/ && make && make install

#配置主缓存服务器:

[root@magent1-master ~]# vim /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {   router_id LVS_DEVEL_R1}vrrp_instance VI_1 {    state MASTER    interface ens33    virtual_router_id 51    priority 100    advert_int 1    authentication {        auth_type PASS        auth_pass 1111    }    virtual_ipaddress {        172.16.1.200     #指定漂移地址    }}
#启动keepalived:[root@magent1-master ~]# service keepalived startUnit keepalived.service could not be found.Reloading systemd:                                         [  OK  ]Starting keepalived (via systemctl):                       [  OK  ]

配置备缓存服务器:

[root@magent2-slave ~]# vim /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {   router_id LVS_DEVEL_R2   #路由id保持不同}vrrp_instance VI_1 {    state BACKUP   #状态为BACKUP    interface ens33    virtual_router_id 51    priority 99    #优先级保持比master低    advert_int 1    authentication {        auth_type PASS        auth_pass 1111    }    virtual_ipaddress {        172.16.1.200   #漂移地址保持一致    }}
#启动服务:[root@magent2-slave ~]# service keepalived startReloading systemd:                                         [  OK  ]Starting keepalived (via systemctl):                       [  OK  ]

#解决脑裂问题:
由于防火墙会将vrrp 广播给过滤掉了,导致backup接受不到master的广播,然后自己去争抢了vip,我们称这种为脑裂现象,为了防止脑裂的发生,在不关闭防火墙的情况下,我们需要开启防火墙vrrp规则:

#注意:主和备服务器都需开启:[root@magent1-master ~]# firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT   success       //注释:ens33为设备网卡,224.0.0.18为vrrp主播地址[root@magent1-master ~]# firewall-cmd --reloadsuccess#重启keepalived服务:[root@magent1-master ~]# service keepalived restartRestarting keepalived (via systemctl):                     [  OK  ]

#查看vip地址(确保只漂移在master主机上)

[root@magent1-master ~]# ip add show dev ens33      inet 172.16.1.200/32 scope global ens33

#启动magent服务:(主备启动命令相同)

[root@magent1-master ~]# magent -u root -n 51200 -l 172.16.1.200 -p 12000 -s 172.16.1.120:11211 -b 172.16.1.130:11211[root@magent1-master ~]# netstat -anput | grep 12000tcp        0      0 172.16.1.200:12000      0.0.0.0:*               LISTEN      23877/magent  //注意:备缓存启动后是查看不到12000的监听端口的,因为现在是备用的状态。#开放防火墙的12000端口(主备都需开启)[root@magent1-master ~]# firewall-cmd --add-port=12000/tcp --permanentsuccess[root@magent1-master ~]# firewall-cmd --reloadsuccess

参数解释:

-u:用户
-n:最大连接数
-l:magent对外监听的ip地址
-p:magent对外监听的端口
-s:magent主缓存ip地址和端口
-b:magent备缓存ip地址和端口

5,客户端验证高可用集群

#确保能够ping通vip地址:[root@sunqiuming-3 ~]# ping 172.16.1.200 -c 5PING 172.16.1.200 (172.16.1.200) 56(84) bytes of data.64 bytes from 172.16.1.200: icmp_seq=1 ttl=64 time=0.266 ms64 bytes from 172.16.1.200: icmp_seq=2 ttl=64 time=0.417 ms64 bytes from 172.16.1.200: icmp_seq=3 ttl=64 time=0.458 ms64 bytes from 172.16.1.200: icmp_seq=4 ttl=64 time=0.443 ms64 bytes from 172.16.1.200: icmp_seq=5 ttl=64 time=0.403 ms--- 172.16.1.200 ping statistics ---

1)连接上主缓存的12000端口并插入数据:

#安装telnet工具[root@sunqiuming-3 ~]# yum -y install telnet[root@sunqiuming-3 ~]# telnet 172.16.1.200 12000 #远程连接的地址为VIP地址Trying 172.16.1.200...Connected to 172.16.1.200.Escape character is '^]'.set test 0 0 9        #存储一个key(test)- value(memcached)memcachedSTOREDget testVALUE test 0 9memcachedENDquitConnection closed by foreign host.

2)连接主memcacehd节点的11211端口进行查看:

[root@sunqiuming-3 ~]# telnet 172.16.1.120 11211Trying 172.16.1.120...Connected to 172.16.1.120.Escape character is '^]'.get test   #获得该key的数据值VALUE test 0 9memcachedENDquitConnection closed by foreign host.

3)连接备memcached节点的11211端口进行查看:

[root@sunqiuming-3 ~]# telnet 172.16.1.130 11211Trying 172.16.1.130...Connected to 172.16.1.130.Escape character is '^]'.get testVALUE test 0 9memcachedENDquitConnection closed by foreign host.

说明主备memcacehd节点都有数据。

模拟故障,宕掉主memcached缓存节点

#停止memcacehd进程(或者断开主缓存节点的网卡)[root@memcached1 ~]# killall memcached[root@memcached1 ~]# netstat -anput  | grep memcached
#客户端查看:[root@sunqiuming-3 ~]# telnet 172.16.1.200 12000Trying 172.16.1.200...Connected to 172.16.1.200.Escape character is '^]'.get test     #通过访问vip地址,能够正常获得数据VALUE test 0 9memcachedEND

模拟keepalived故障(master服务器宕机)

#停止主keepalived的服务:[root@magent1-master ~]# service keepalived stopStopping keepalived (via systemctl):                       [  OK  ][root@magent1-master ~]# service keepalived status● keepalived.service - SYSV: Start and stop Keepalived   Loaded: loaded (/etc/rc.d/init.d/keepalived; bad; vendor preset: disabled)   Active: inactive (dead)     Docs: man:systemd-sysv-generator(8)#并且停止12000端口:[root@magent1-master ~]# killall magent[root@magent1-master ~]# netstat -anput | grep magent

#查看vip地址是否漂移到slave服务器上:

[root@magent2-slave ~]# ip addr show dev ens332: ens33:  mtu 1500 qdisc pfifo_fast state UP qlen 1000    link/ether 00:0c:29:a6:d1:22 brd ff:ff:ff:ff:ff:ff    inet 172.16.1.110/24 brd 172.16.1.255 scope global ens33       valid_lft forever preferred_lft forever    inet 172.16.1.200/32 scope global ens33       valid_lft forever preferred_lft forever    inet6 fe80::b0fb:5a7d:7c85:4b98/64 scope link        valid_lft forever preferred_lft forever

#启动备缓存服务器的magent服务(12000端口)

[root@magent2-slave ~]#  magent -u root -n 51200 -l 172.16.1.200 -p 12000 -s 172.16.1.120:11211 -b 172.16.1.130:11211[root@magent2-slave ~]# netstat -anput | grep 12000tcp        0      0 172.16.1.200:12000      0.0.0.0:*               LISTEN      23052/magent   #这是个缺陷,在生产环境中,一般会编写触发式脚本,当master宕掉后,自动开启12000端口服务
#客户端再次查看:[root@sunqiuming-3 ~]# telnet 172.16.1.200 12000Trying 172.16.1.200...Connected to 172.16.1.200.Escape character is '^]'.get test    #通过vip地址,正常访问缓存中的数据VALUE test 0 9memcachedEND

总结:
memcache的优点:可以做多主或者多从;
memcache的缺点:当主缓存节点宕掉又恢复,之前的缓存数据会丢失,通过magent取到的值就会为Null。
解决方法:
1、在每次memcache宕机修复后可以写一个程序把集群中的其他memcache的所有信息全给拷贝到当前宕机修复后的memcache中。

2、自己写代理,当从一个memcached服务上取到的值为null时再去其他memcached上取值。
注意事项:
magent的调用方式同memcached一样,客户端可以不用改代码即可实现切换到magent模式下。

0