溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2020-03-30 19:43:05 來源:網(wǎng)絡(luò) 閱讀:490 作者:wx5b9c94b17c62a 欄目:系統(tǒng)運(yùn)維

在定位問題、測(cè)試等時(shí)候經(jīng)常需要對(duì)memcache的數(shù)據(jù)進(jìn)行一些操作,但是其本身沒有自帶的客戶端,所以只能通過telnet來進(jìn)行操作,下面對(duì)操作memcache指令進(jìn)行詳細(xì)解釋。

指令格式: <命令> <鍵> <標(biāo)記> <有效期> <數(shù)據(jù)長(zhǎng)度>

<命令>-command name**

主要是三個(gè)存儲(chǔ)數(shù)據(jù)的命令:set,add,replace
"set" 命令是保存一個(gè)叫做key的數(shù)據(jù)到服務(wù)器上;
"add" 命令是添加一個(gè)數(shù)據(jù)到服務(wù)器,但是服務(wù)器必須保證這個(gè)key是不存在的,能夠保證數(shù)據(jù)不會(huì)被覆蓋;
"replace" 命令是替換一個(gè)已經(jīng)存在的的數(shù)據(jù),如果數(shù)據(jù)不存在,就是類似于set功能;
//追加命令:
"append":向前追加,對(duì)存在的鍵進(jìn)行追加
"prepend":向后追加,對(duì)存在的鍵進(jìn)行追加

<鍵>-key

保存在服務(wù)器上唯一的一個(gè)表示符,必須是跟其他的key不沖突,否則會(huì)覆蓋掉原來的數(shù)據(jù),這個(gè)key是為了能夠準(zhǔn)確的存取一個(gè)數(shù)據(jù)的項(xiàng)目。

<標(biāo)記>-flag

標(biāo)記是一個(gè)16位的無符號(hào)整型數(shù)據(jù),用來設(shè)置服務(wù)器端跟客戶端一些交互操作。

<有效期>-expiration time

是數(shù)據(jù)在服務(wù)器上的有效期限,如果是0,則數(shù)據(jù)永遠(yuǎn)有效,單位是秒,memcache服務(wù)器端會(huì)把一個(gè)數(shù)據(jù)的有效期設(shè)置為當(dāng)前unix時(shí)間+設(shè)置的有效時(shí)間

數(shù)據(jù)長(zhǎng)度-bytes

數(shù)據(jù)的長(zhǎng)度,block data塊數(shù)據(jù)的長(zhǎng)度,一般在這個(gè)長(zhǎng)度結(jié)束以后下一行跟著block data數(shù)據(jù)內(nèi)容,發(fā)送完數(shù)據(jù)以后,客戶端一般等待服務(wù)器端的返回。
注意:存儲(chǔ)的字節(jié)數(shù)一定要與實(shí)際存儲(chǔ)值得字節(jié)數(shù)對(duì)應(yīng),否則無法存入報(bào)錯(cuò)“CLIENT_ERROR bad data chunk”

memcached的響應(yīng)結(jié)果:
當(dāng)以上數(shù)據(jù)發(fā)送結(jié)束之后,服務(wù)器將返回一個(gè)應(yīng)答??赡苡腥缦碌那闆r:

數(shù)據(jù)保存成功:STORED
數(shù)據(jù)保存失?。篘OT_STORED

數(shù)據(jù)保存失敗,一般是因?yàn)榉?wù)器端這個(gè)數(shù)據(jù)key已經(jīng)存在了,或者是命令的語法錯(cuò)誤。

[指令詳解+實(shí)例]

指令目錄:

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服務(wù)的ip
//PORT:為memcached服務(wù)的端口
實(shí)例:

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

##如果想結(jié)束當(dāng)前連接,使用quit指令:

[root@nginx-server ~]# telnet 172.16.1.130  11211
Trying 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存儲(chǔ)在指定的key中;
如果set的key已經(jīng)存在,該命令可以更新該key所對(duì)應(yīng)的原來的數(shù)據(jù),也就是實(shí)現(xiàn)更新的作用。
set命令是add命令和replace命令的集合體

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

參數(shù)解釋:

  • key:鍵值key-value 結(jié)構(gòu)中的key,用于查找緩存值。
  • flags:可以包括鍵值的整型參數(shù),客戶機(jī)使用它存儲(chǔ)關(guān)于鍵值對(duì)的額外信息。
  • exptime:在緩存中保存鍵值對(duì)的時(shí)間長(zhǎng)度(以秒為單位,0表示永遠(yuǎn))
  • bytes:在緩存中存儲(chǔ)的字節(jié)數(shù)
  • noreply(可選):該參數(shù)告知服務(wù)器不需要返回?cái)?shù)據(jù)。
  • value:存儲(chǔ)的值(始終位于第二行,可直接理解為key-value結(jié)構(gòu)中的value)

實(shí)例:

set test1 0 900 9  #設(shè)置鍵名為test1,flag為0,緩存時(shí)間900秒,存儲(chǔ)字節(jié)數(shù)9
memcached   #存儲(chǔ)的值為memcached
STORED
get test1        #獲取該key的數(shù)據(jù)值
VALUE test1 0 9
memcached    #返回剛剛存儲(chǔ)key的數(shù)據(jù)值
END
set test1 0 9000 13  #對(duì)已存在的key進(jìn)行set
new-memcached   
STORED
get test1    #獲得該key新的數(shù)據(jù)值
VALUE test1 0 13
new-memcached    #可以看到如果set的key已存在,會(huì)實(shí)現(xiàn)更新的作用
END

輸出信息說明:

  • STORED:保存成功后輸出
  • ERROR:在保存失敗后輸出

3,add 命令

add 命令用于將 value存儲(chǔ)在指定的key中。
如果add 的 key已經(jīng)存在,則不會(huì)更新數(shù)據(jù)(過期的key會(huì)更新),之前的值將仍然保持相同,并且您將獲得響應(yīng) NOT_STORED。

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

參數(shù)解釋:

  • key:鍵值key-value結(jié)構(gòu)中的key,用于查找緩存值。
  • flags:可以包括鍵值對(duì)的整型參數(shù),客戶機(jī)使用它存儲(chǔ)關(guān)于鍵值對(duì)的額外信息。
  • exptime:在緩存中保存鍵值對(duì)的時(shí)間長(zhǎng)度(以秒為單位,0表示永遠(yuǎn))
  • bytes:在緩存中存儲(chǔ)的字節(jié)數(shù)
  • noreply(可選):該參數(shù)告知服務(wù)器不需要返回?cái)?shù)據(jù)。
  • value:存儲(chǔ)等的值(始終位于第二行,可直接理解為鍵值結(jié)構(gòu)中的value)

實(shí)例:

add test2 0 900 10 #添加的鍵名為test2,flag為0,緩存時(shí)間900秒,存儲(chǔ)字節(jié)10
date_value   #存儲(chǔ)的值為date_value
STORED
get test2     #獲得該鍵的數(shù)據(jù)值
VALUE test2 0 10
date_value    
END
add test2 0 900 9   #如果添加的key已存在,不會(huì)更新數(shù)據(jù),將獲得響應(yīng)NOT_STORED
new_value
NOT_STORED
get test2     #之前的存儲(chǔ)的值保持不變
VALUE test2 0 10
date_value
END

輸出信息說明:

  • STORED:保存成功后輸出
  • NOT_STORED:在保存失敗后輸出

4,replace 命令

replace命令用于替換已存在的key的value。如果key不存在,則替換失敗,并且將獲得響應(yīng) NOT_STORED。

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

參數(shù)解釋:

  • key:鍵值key-value結(jié)構(gòu)中的key,用于查找緩存值。
  • flags:可以包括鍵值對(duì)的整型參數(shù),客戶機(jī)使用它存儲(chǔ)關(guān)于鍵值對(duì)的額外信息。
  • exptime:在緩存中保存鍵值對(duì)的時(shí)間長(zhǎng)度(以秒為單位,0表示永遠(yuǎn))
  • bytes:在緩存中存儲(chǔ)的字節(jié)數(shù)
  • noreply(可選):該參數(shù)告知服務(wù)器不需要返回?cái)?shù)據(jù)。
  • value:存儲(chǔ)等的值(始終位于第二行,可直接理解為鍵值結(jié)構(gòu)中的value)

實(shí)例:

#添加一個(gè)新的key(test3),并存儲(chǔ)對(duì)應(yīng)的值為date_value
add test3 0 900 10  
date_value      
STORED
get test3
VALUE test3 0 10
date_value
END
#替換已存在的key的值為new_date_value
replace test3 0 900 14
new_date_value
STORED
get test3
VALUE test3 0 14
new_date_value    #key的value替換成功
END

輸出信息說明:

  • STORED: 保存成功后輸出
  • NOT_STORED:執(zhí)行替換失敗后輸出

5, append 命令

append命令用于向已存在key的value后面追加數(shù)據(jù)。

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

參數(shù)解釋:

key:鍵值 key-value 結(jié)構(gòu)中的 key,用于查找緩存值。
flags:可以包括鍵值對(duì)的整型參數(shù),客戶機(jī)使用它存儲(chǔ)關(guān)于鍵值對(duì)的額外信息 。? exptime:在緩存中保存鍵值對(duì)的時(shí)間長(zhǎng)度(以秒為單位, 0 表示永遠(yuǎn))
bytes:在緩存中存儲(chǔ)的字節(jié)數(shù)
noreply(可選): 該參數(shù)告知服務(wù)器不需要返回?cái)?shù)據(jù)
value:存儲(chǔ)的值(始終位于第二行)(可直接理解為 key-value 結(jié)構(gòu)中的 value)

實(shí)例:

#添加一個(gè)新的key(鍵名為test4),并存儲(chǔ)對(duì)應(yīng)的值為abc
add test4 0 900 3
abc
STORED
get test4
VALUE test4 0 3
abc
END
#使用append命令在key為test4的值后面追加“1234”
append test4 0 900 4
1234
STORED
get test4  #使用get命令獲得該值
VALUE test4 0 7
abc1234    #追加value成功
END

輸出信息說明:

  • STORED:保存成功后輸出
  • NOT_STORED:該鍵在memcached上不存在
  • CLIENT_ERROR:執(zhí)行錯(cuò)誤

6,prepend 命令

與append命令相反,prepend命令用于向已存在的key的value前面追加數(shù)據(jù)。

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

參數(shù)解釋:

key:鍵值 key-value 結(jié)構(gòu)中的 key,用于查找緩存值。
flags:可以包括鍵值對(duì)的整型參數(shù),客戶機(jī)使用它存儲(chǔ)關(guān)于鍵值對(duì)的額外信息 。
exptime:在緩存中保存鍵值對(duì)的時(shí)間長(zhǎng)度(以秒為單位, 0 表示永遠(yuǎn))
bytes:在緩存中存儲(chǔ)的字節(jié)數(shù)
noreply(可選): 該參數(shù)告知服務(wù)器不需要返回?cái)?shù)據(jù)
value:存儲(chǔ)的值(始終位于第二行)(可直接理解為 key-value 結(jié)構(gòu)中的 value)

實(shí)例:

get test4   #還是基于上個(gè)實(shí)例存儲(chǔ)的key
VALUE test4 0 7
abc1234
END
#使用prepend命令在key(test4)的值前面追加“new”
prepend test4 0 900 3  
new
STORED
get test4
VALUE test4 0 10
newabc1234
END

輸出信息說明:

  • STORED:保存成功后輸出
  • NOT_STORED:該鍵在memcached上不存在
  • CLIENT_ERROR:執(zhí)行錯(cuò)誤

7,CAS命令

CAS命令用于執(zhí)行一個(gè)“檢查并設(shè)置”的操作,它僅在當(dāng)前客戶端最后一次取值后,該key對(duì)應(yīng)的值沒有被其他客戶端修改的情況下,才能夠?qū)⒅祵懭搿?br/>檢查使用過cas_token參數(shù)進(jìn)行的,這個(gè)參數(shù)是memcache指定給已經(jīng)存在的元素的一個(gè)唯一的64位值。

CAS命令的作用:使用CAS命令的目的就是保證當(dāng)前只有一個(gè)client對(duì)memcache進(jìn)行操作。如果沒有操作成功,那就說明有其他的client對(duì)這個(gè)key-value進(jìn)行了操作。那么需要重新利用gets取到當(dāng)前的cas_token,然后繼續(xù)進(jìn)行cas操作。主要是為了分布式環(huán)境中更新的一致性問題。

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

參數(shù)解釋:

  • key:鍵值 key-value 結(jié)構(gòu)中的 key,用于查找緩存值。
  • flags:可以包括鍵值對(duì)的整型參數(shù),客戶機(jī)使用它存儲(chǔ)關(guān)于鍵值對(duì)的額外信息 。
  • exptime:在緩存中保存鍵值對(duì)的時(shí)間長(zhǎng)度(以秒為單位, 0 表示永遠(yuǎn))
  • bytes:在緩存中存儲(chǔ)的字節(jié)數(shù)
  • unique_cas_token 通過 gets 命令獲取的一個(gè)唯一的 64 位值。
  • noreply(可選): 該參數(shù)告知服務(wù)器不需要返回?cái)?shù)據(jù)
  • value:存儲(chǔ)的值(始終位于第二行)(可直接理解為 key-value 結(jié)構(gòu)中的 value)

實(shí)例:
要在memcached上使用CAS命令,需要從memcached服務(wù)商通過gets命令獲取令牌(token)。

#如果沒有設(shè)置唯一令牌,則cas命令執(zhí)行錯(cuò)誤
cas test5 0 900 9 
ERROR
#如果key不存在,執(zhí)行失敗
cas test5 0 900 9 2   
memcached
NOT_FOUND
#添加一個(gè)key-value
set test5 0 900 9
memcached
STORED
#使用gets命令獲取唯一令牌(12)
gets test5
VALUE test5 0 9 12
memcached
END
#使用cas命令更新數(shù)據(jù)
cas test5 0 900 5 12
abcde
STORED
#查看數(shù)據(jù)更新成功
get test5  
VALUE test5 0 5
abcde
END

輸出信息說明:

  • STORED:保存成功后輸出
  • ERROR: 保存出錯(cuò)或語法錯(cuò)誤
  • EXISTS:在最后一次取值后另外一個(gè)用戶也在更新該數(shù)據(jù)。
  • NOT_FOUND:memcached服務(wù)器手上不存在該鍵值。

8,get 命令

get命令獲取存儲(chǔ)在key中的value,如果key不存在,則返回空。

基本語法格式:
get key
多個(gè)key使用空格隔開:
get key1 key2 key3

參數(shù)說明:

key:鍵值key-value結(jié)構(gòu)中的key,用于查找緩存值

實(shí)例:

set test6 0 900 9
memcached
STORED
get test6
VALUE test6 0 9
memcached
END

9,gets 命令

gets命令獲取帶有CAS令牌存儲(chǔ)的value,如果key不存在,則返回空。

基本語法格式:
gets key
多個(gè)key使用空格隔開:
gets key1 key2 key3

實(shí)例:

gets test6
VALUE test6 0 9 15
memcached
END
#在使用gets命令的輸出結(jié)果中,在最后一列的數(shù)字15 代表了key(test6)的CAS令牌。

擴(kuò):gets命令的功能類似于基本的get命令;兩個(gè)命令之間的差異在于:gets返回的信息稍微多一些:64 位的整型值非常像名稱/值對(duì)的 "版本" 標(biāo)識(shí)符。

10,delete 命令

delete命令用于刪除已存在的key鍵。

語法格式:
delete key [noreply]

參數(shù)解釋:

  • key:鍵值 key-value 結(jié)構(gòu)中的 key,用于查找緩存值。
  • noreply(可選): 該參數(shù)告知服務(wù)器不需要返回?cái)?shù)據(jù)

實(shí)例:

delete test6
DELETED
get test6
END
#以上個(gè)實(shí)例為例,使用delete命令刪除該key(test6)

輸出信息說明:

  • DELETED:刪除成功
  • ERROR:語法錯(cuò)誤或刪除失敗
  • NOT_FOUND:key不存在

11,incr與decr 命令

incr與decr命令用于對(duì)已存在的key(鍵)的數(shù)據(jù)值進(jìn)行自增或自減操作。incr與decr命令操作的數(shù)據(jù)必須是十進(jìn)制的32為無符號(hào)整數(shù)。
如果key不存在返回NOT_FOUND,如果鍵的值不為數(shù)字,則返回CLIENT_ERROR,其他錯(cuò)誤返回ERROR。

incr 命令:

語法格式:
incr key increment_value

參數(shù)解釋:

key:鍵值key-value結(jié)構(gòu)中的key,用于查找緩存值。
increment_value:增加的數(shù)值。

實(shí)例:

#創(chuàng)建一個(gè)鍵(test7),數(shù)據(jù)初始值為10
set test7 0 900 2     
10
STORED
get test7
VALUE test7 0 2
10
END
#使用incr命令進(jìn)行自增的操作(加5)
incr test7 5
15
get test7
VALUE test7 0 2
15      #最后返回的數(shù)據(jù)值為15
END

decr 命令

語法格式:
decr key decrement_value

參數(shù)解釋:

key:鍵值key-value結(jié)構(gòu)中的key,用于查找緩存值。
decrement_value:減少的數(shù)值。

實(shí)例:

get test7
VALUE test7 0 2
15
END
decr test7 10
5
get test7
VALUE test7 0 2
5 
END
#以上個(gè)實(shí)例中的key(test7)初始值為15,使用decr命令進(jìn)行自減操作(減10),最后返回的數(shù)據(jù)值為5

12,stats 命令

stats命令用于返回統(tǒng)計(jì)信息例如PID,版本號(hào),連接數(shù)等。

語法格式:
stats

實(shí)例:
在以下實(shí)例中,使用stats命令來輸出memcached服務(wù)信息。這里顯示了很多狀態(tài)信息,下邊詳細(xì)解釋每個(gè)狀態(tài)項(xiàng):

stats
STAT pid 1332   #memcache 服務(wù)器進(jìn)程 ID
STAT uptime 25950    #服務(wù)器已運(yùn)行秒數(shù)
STAT time 1583711222  #服務(wù)器當(dāng)前unix時(shí)間戳
STAT version 1.4.33    #memcache版本
STAT libevent 2.0.22-stable   #memcahe libevent版本信息
STAT pointer_size 64   #操作系統(tǒng)指針代銷
STAT rusage_user 1.257281    #進(jìn)程累計(jì)用戶時(shí)間
STAT rusage_system 3.981391   #進(jìn)程累計(jì)系統(tǒng)時(shí)間
STAT curr_connections 5   #當(dāng)前連接數(shù)量
STAT total_connections 36   #memcached運(yùn)行以來連接總數(shù)
STAT connection_structures 6    #memcached分配的連接結(jié)構(gòu)數(shù)量
STAT reserved_fds 20    
STAT cmd_get 33    #get命令請(qǐng)求次數(shù)
STAT cmd_set 27   #set命令請(qǐng)求次數(shù)
STAT cmd_flush 0   #fulsuh命令請(qǐng)求次數(shù)
STAT cmd_touch 0 
STAT get_hits 23   #get命令命中次數(shù)
STAT get_misses 10    #get命令未命中次數(shù)
STAT get_expired 4    
STAT get_flushed 0
STAT delete_misses 0     #delete命令未命中次數(shù)
STAT delete_hits 2      #delete命令命中次數(shù)
STAT incr_misses 0   #incr命令未命中次數(shù)
STAT incr_hits 1     #incr命令命中次數(shù)
STAT decr_misses 0   #decr命令未命中次數(shù)
STAT decr_hits 1    #decr命令命中次數(shù)
STAT cas_misses 2   #cas命令為命中次數(shù)
STAT ca*_hits 1   #cas命令命中次數(shù)
STAT cas_badval 0   #使用擦拭次數(shù)
STAT touch_hits 0   
STAT touch_misses 0
STAT auth_cmds 0   #認(rèn)證命令處理的次數(shù)
STAT auth_errors 0   #認(rèn)證失敗數(shù)目
STAT bytes_read 1893   #讀取總字節(jié)數(shù)
STAT bytes_written 1636  #發(fā)送總字節(jié)數(shù)
STAT limit_maxbytes 2147483648   #分配的內(nèi)存總大?。ㄗ止?jié))
STAT accepting_conns 1 #服務(wù)器是否達(dá)到過最大連接(0/1)
STAT listen_disabled_num 0   #失效的監(jiān)聽數(shù)
STAT time_in_listen_disabled_us 0  
STAT threads 4  #當(dāng)前線程數(shù)
STAT conn_yields 0   #連接操作主動(dòng)放棄數(shù)目
STAT hash_power_level 16  
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT malloc_fails 0  
STAT log_worker_dropped 0
STAT log_worker_written 0
STAT log_watcher_skipped 0
STAT log_watcher_sent 0
STAT bytes 241   #當(dāng)前存儲(chǔ)占用的字節(jié)數(shù)
STAT curr_items 3   #當(dāng)前存儲(chǔ)的數(shù)據(jù)總數(shù)
STAT total_items 16   #啟動(dòng)以來存儲(chǔ)的數(shù)據(jù)總數(shù)
STAT expired_unfetched 0   
STAT evicted_unfetched 0
STAT evictions 0   #LRU釋放的對(duì)象數(shù)目
STAT reclaimed 1   #已過期的數(shù)據(jù)條目來存儲(chǔ)新數(shù)據(jù)的數(shù)目
STAT crawler_reclaimed 0
STAT crawler_items_checked 0
STAT lrutail_reflocked 0
END

13,stats items 命令

stats items Ingles用于顯示各個(gè)slab中item 的數(shù)目和存儲(chǔ)時(shí)長(zhǎng)(最后一次訪問距離現(xiàn)在的秒數(shù))。

語法格式:
stats items

例如:

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

14, stats slabs 命令

stats slabs 命令用于顯示各個(gè)slab的信息,包括chunk的大小,數(shù)目,使用情況等。

 語法格式:
 stats slabs

例如:

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

15,stats sizes 命令

stats sizes命令用于顯示所有item的大小和個(gè)數(shù)。
該信息返回兩列:第一列是item的大小,第二列是item的個(gè)數(shù)。

語法:
stats sizes

實(shí)例:

stats sizes
STAT sizes_status disabled    #統(tǒng)計(jì)大小\狀態(tài)已禁用
END

Memcached 1.4.27 及以后的版本自動(dòng)開啟了 stats sizes 功能 這之前的版本需要在 Memcached 啟動(dòng)時(shí)帶上 -o track_sizes 則來開啟 。

16,version 命令

如果只是想單獨(dú)了解當(dāng)前版本信息,可以使用version指令。

語法格式:
version

例子:

version
VERSION 1.4.33   #當(dāng)前memcached的版本號(hào)

16,flush_all 命令

flush_all 命令用于清理緩存中的所有key-value(鍵-值)對(duì)。
該命令提供了一個(gè)可選參數(shù) time:用于在制定的時(shí)間后執(zhí)行清理緩存操作。

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

實(shí)例:

set test 0 900 9
memcached
STORED
get test
VALUE test 0 9
memcached
END
flush_all
OK
get test
END
#在制定的時(shí)間后執(zhí)行清理,操作如下:
flush_all 10  //單位秒,表示在10秒后執(zhí)行清理操作

注:這個(gè)指令一般不要輕易使,除非你確實(shí)想把所有數(shù)據(jù)都干掉,刪除后是無法恢復(fù)的。

memcache分布式集群

telnet下操作memcache(指令詳解)& 高可用分布式集群(magent)
memcached是一個(gè)高性能的分布式內(nèi)存對(duì)象緩存系統(tǒng),用于動(dòng)態(tài)web應(yīng)用以減輕數(shù)據(jù)庫負(fù)載。他通過在內(nèi)存中緩存數(shù)據(jù)和對(duì)象來減少讀取數(shù)據(jù)庫的次數(shù),從而提高動(dòng)態(tài),數(shù)據(jù)庫驅(qū)動(dòng)網(wǎng)站的速度。memcached基于一個(gè)存儲(chǔ)鍵值對(duì)的hashmap。其守護(hù)進(jìn)程(daemon)是用C語言寫的,但是客戶端可以用任何語言來編寫,并通過memcached協(xié)議與守護(hù)進(jìn)程通信。

memcache分布式集群搭建環(huán)境如下:
telnet下操作memcache(指令詳解)& 高可用分布式集群(magent)
telnet下操作memcache(指令詳解)& 高可用分布式集群(magent)

主機(jī) ip地址 操作系統(tǒng)
magent1+keepalived-master 172.16.1.100 CentOS 7.3 VIP地址:172.16.1.200
magent2+keepalived-slave 172.16.1.110 CentOS 7.3
memcached1 172.16.1.120 CentOS 7.3
memcached2 172.16.1.130 CentOS 7.3
client 172.16.1.30 CentOS 7.3

1,首先安裝依賴庫libevent(四臺(tái)服務(wù)器都安裝)
libevent安裝包官網(wǎng)下載: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軟件(后兩臺(tái)memcached服務(wù)器安裝)
memcached官網(wǎng)下載: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

#啟動(dòng)memcached服務(wù)

主緩存:
[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 memcached
tcp        0      0 172.16.1.120:11211      0.0.0.0:*               LISTEN      9678/memcached  
#設(shè)置防火墻:
[root@memcached1 ~]# firewall-cmd  --add-port=11211/tcp --permanent
success
[root@memcached1 ~]# firewall-cmd --reload
success
備緩存:
[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 memcached
tcp        0      0 172.16.1.130:11211      0.0.0.0:*               LISTEN      8551/memcached  
#設(shè)置防火墻:
[root@memcached2 ~]# firewall-cmd --add-port=11211/tcp --permanent
success
[root@memcached2 ~]# firewall-cmd --reload
success

3,安裝magent代理軟件(2臺(tái)Magent服務(wù)器安裝)
Magent 是一款開源的 Memcached 代理服務(wù)器軟件,使用它可以搭建高可用性的集群應(yīng)用的 Memcached 服務(wù) ,備份 Memcached 數(shù)據(jù),盡管 Memcached 服務(wù)掛掉,前端也能獲取到數(shù)據(jù),客戶端先連到 Magent 代理服務(wù)器 ,然后Magent 代理服務(wù)器 在可以連接多臺(tái) Memcached 服務(wù)器,然后可以進(jìn)行數(shù)據(jù)的保存和備份數(shù)據(jù)。這樣數(shù)據(jù)就不會(huì)丟失,保存了數(shù)據(jù)完整性。

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

#例如安裝當(dāng)前最新版本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]# ls
ketama.c  ketama.h  magent.c  Makefile
#解決報(bào)錯(cuò)問題
[root@magent1-master magent]# vim ketama.h 
修改頭部信息(最大值),修改內(nèi)容如下:
#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]# make
gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o magent.o magent.c
gcc -Wall -g -O2 -I/usr/local/include -m64 -c -o ketama.o ketama.c
gcc -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 directory
make: *** [magent] Error 1

#如果還出現(xiàn)以上錯(cuò)誤,修改Makefile文件:

[root@magent1-master magent]# vim Makefile 
找到 LIBS = /usr/lib64/libevent.a /usr/lib64/libm.a
修改為L(zhǎng)IBS = /usr/lib/libevent.a /usr/lib64/libm.a 
#重新編譯:
[root@magent1-master magent]# make
gcc -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]# ls
ketama.c  ketama.h  ketama.o  magent  magent.c  magent.o  Makefile
[root@magent1-master magent]# cp magent /usr/bin/

主緩存和備緩存一樣的啟動(dòng)命令,需要通過“-l” 參數(shù)指定漂移IP,因?yàn)檫€沒有搭建keepalived,所以暫時(shí)不要啟動(dòng)Magent服務(wù)。

4,安裝keepalived高可用軟件(安裝在2臺(tái)Magent服務(wù)器上)
安裝包官網(wǎng)下載: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

#配置主緩存服務(wù)器:

[root@magent1-master ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_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     #指定漂移地址
    }
}
#啟動(dòng)keepalived:
[root@magent1-master ~]# service keepalived start
Unit keepalived.service could not be found.
Reloading systemd:                                         [  OK  ]
Starting keepalived (via systemctl):                       [  OK  ]

配置備緩存服務(wù)器:

[root@magent2-slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL_R2   #路由id保持不同
}

vrrp_instance VI_1 {
    state BACKUP   #狀態(tài)為BACKUP
    interface ens33
    virtual_router_id 51
    priority 99    #優(yōu)先級(jí)保持比master低
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.16.1.200   #漂移地址保持一致
    }
}
#啟動(dòng)服務(wù):
[root@magent2-slave ~]# service keepalived start
Reloading systemd:                                         [  OK  ]
Starting keepalived (via systemctl):                       [  OK  ]

#解決腦裂問題:
由于防火墻會(huì)將vrrp 廣播給過濾掉了,導(dǎo)致backup接受不到master的廣播,然后自己去爭(zhēng)搶了vip,我們稱這種為腦裂現(xiàn)象,為了防止腦裂的發(fā)生,在不關(guān)閉防火墻的情況下,我們需要開啟防火墻vrrp規(guī)則:

#注意:主和備服務(wù)器都需開啟:
[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為設(shè)備網(wǎng)卡,224.0.0.18為vrrp主播地址
[root@magent1-master ~]# firewall-cmd --reload
success
#重啟keepalived服務(wù):
[root@magent1-master ~]# service keepalived restart
Restarting keepalived (via systemctl):                     [  OK  ]

#查看vip地址(確保只漂移在master主機(jī)上)

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

#啟動(dòng)magent服務(wù):(主備啟動(dòng)命令相同)

[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 12000
tcp        0      0 172.16.1.200:12000      0.0.0.0:*               LISTEN      23877/magent  
//注意:備緩存啟動(dòng)后是查看不到12000的監(jiān)聽端口的,因?yàn)楝F(xiàn)在是備用的狀態(tài)。
#開放防火墻的12000端口(主備都需開啟)
[root@magent1-master ~]# firewall-cmd --add-port=12000/tcp --permanent
success
[root@magent1-master ~]# firewall-cmd --reload
success

參數(shù)解釋:

-u:用戶
-n:最大連接數(shù)
-l:magent對(duì)外監(jiān)聽的ip地址
-p:magent對(duì)外監(jiān)聽的端口
-s:magent主緩存ip地址和端口
-b:magent備緩存ip地址和端口

5,客戶端驗(yàn)證高可用集群

#確保能夠ping通vip地址:
[root@sunqiuming-3 ~]# ping 172.16.1.200 -c 5
PING 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 ms
64 bytes from 172.16.1.200: icmp_seq=2 ttl=64 time=0.417 ms
64 bytes from 172.16.1.200: icmp_seq=3 ttl=64 time=0.458 ms
64 bytes from 172.16.1.200: icmp_seq=4 ttl=64 time=0.443 ms
64 bytes from 172.16.1.200: icmp_seq=5 ttl=64 time=0.403 ms

--- 172.16.1.200 ping statistics ---

1)連接上主緩存的12000端口并插入數(shù)據(jù):

#安裝telnet工具
[root@sunqiuming-3 ~]# yum -y install telnet
[root@sunqiuming-3 ~]# telnet 172.16.1.200 12000 #遠(yuǎn)程連接的地址為VIP地址
Trying 172.16.1.200...
Connected to 172.16.1.200.
Escape character is '^]'.
set test 0 0 9        #存儲(chǔ)一個(gè)key(test)- value(memcached)
memcached
STORED
get test
VALUE test 0 9
memcached
END
quit
Connection closed by foreign host.

2)連接主memcacehd節(jié)點(diǎn)的11211端口進(jìn)行查看:

[root@sunqiuming-3 ~]# telnet 172.16.1.120 11211
Trying 172.16.1.120...
Connected to 172.16.1.120.
Escape character is '^]'.
get test   #獲得該key的數(shù)據(jù)值
VALUE test 0 9
memcached
END
quit
Connection closed by foreign host.

3)連接備memcached節(jié)點(diǎn)的11211端口進(jìn)行查看:

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

說明主備memcacehd節(jié)點(diǎn)都有數(shù)據(jù)。

模擬故障,宕掉主memcached緩存節(jié)點(diǎn)

#停止memcacehd進(jìn)程(或者斷開主緩存節(jié)點(diǎn)的網(wǎng)卡)
[root@memcached1 ~]# killall memcached
[root@memcached1 ~]# netstat -anput  | grep memcached
#客戶端查看:
[root@sunqiuming-3 ~]# telnet 172.16.1.200 12000
Trying 172.16.1.200...
Connected to 172.16.1.200.
Escape character is '^]'.
get test     #通過訪問vip地址,能夠正常獲得數(shù)據(jù)
VALUE test 0 9
memcached
END

模擬keepalived故障(master服務(wù)器宕機(jī))

#停止主keepalived的服務(wù):
[root@magent1-master ~]# service keepalived stop
Stopping 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服務(wù)器上:

[root@magent2-slave ~]# ip addr show dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> 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

#啟動(dòng)備緩存服務(wù)器的magent服務(wù)(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 12000
tcp        0      0 172.16.1.200:12000      0.0.0.0:*               LISTEN      23052/magent   
#這是個(gè)缺陷,在生產(chǎn)環(huán)境中,一般會(huì)編寫觸發(fā)式腳本,當(dāng)master宕掉后,自動(dòng)開啟12000端口服務(wù)
#客戶端再次查看:
[root@sunqiuming-3 ~]# telnet 172.16.1.200 12000
Trying 172.16.1.200...
Connected to 172.16.1.200.
Escape character is '^]'.
get test    #通過vip地址,正常訪問緩存中的數(shù)據(jù)
VALUE test 0 9
memcached
END

總結(jié):
memcache的優(yōu)點(diǎn):可以做多主或者多從;
memcache的缺點(diǎn):當(dāng)主緩存節(jié)點(diǎn)宕掉又恢復(fù),之前的緩存數(shù)據(jù)會(huì)丟失,通過magent取到的值就會(huì)為Null。
解決方法:
1、在每次memcache宕機(jī)修復(fù)后可以寫一個(gè)程序把集群中的其他memcache的所有信息全給拷貝到當(dāng)前宕機(jī)修復(fù)后的memcache中。

2、自己寫代理,當(dāng)從一個(gè)memcached服務(wù)上取到的值為null時(shí)再去其他memcached上取值。
注意事項(xiàng):
magent的調(diào)用方式同memcached一樣,客戶端可以不用改代碼即可實(shí)現(xiàn)切換到magent模式下。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI