亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-03-30 19:43:05 來源:網絡 閱讀:500 作者:wx5b9c94b17c62a 欄目:系統運維

在定位問題、測試等時候經常需要對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  11211
Trying 172.16.1.130...
Connected to 172.16.1.130.
Escape character is '^]'.

##如果想結束當前連接,使用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存儲在指定的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秒,存儲字節數9
memcached   #存儲的值為memcached
STORED
get test1        #獲取該key的數據值
VALUE test1 0 9
memcached    #返回剛剛存儲key的數據值
END
set test1 0 9000 13  #對已存在的key進行set
new-memcached   
STORED
get test1    #獲得該key新的數據值
VALUE test1 0 13
new-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秒,存儲字節10
date_value   #存儲的值為date_value
STORED
get test2     #獲得該鍵的數據值
VALUE test2 0 10
date_value    
END
add test2 0 900 9   #如果添加的key已存在,不會更新數據,將獲得響應NOT_STORED
new_value
NOT_STORED
get test2     #之前的存儲的值保持不變
VALUE test2 0 10
date_value
END

輸出信息說明:

  • 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_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:執行替換失敗后輸出

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),并存儲對應的值為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:執行錯誤

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   #還是基于上個實例存儲的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:執行錯誤

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   
memcached
NOT_FOUND
#添加一個key-value
set test5 0 900 9
memcached
STORED
#使用gets命令獲取唯一令牌(12)
gets test5
VALUE test5 0 9 12
memcached
END
#使用cas命令更新數據
cas test5 0 900 5 12
abcde
STORED
#查看數據更新成功
get test5  
VALUE test5 0 5
abcde
END

輸出信息說明:

  • 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 9
memcached
STORED
get test6
VALUE test6 0 9
memcached
END

9,gets 命令

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

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

實例:

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

擴:gets命令的功能類似于基本的get命令;兩個命令之間的差異在于:gets返回的信息稍微多一些:64 位的整型值非常像名稱/值對的 "版本" 標識符。

10,delete 命令

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

語法格式:
delete key [noreply]

參數解釋:

  • key:鍵值 key-value 結構中的 key,用于查找緩存值。
  • noreply(可選): 該參數告知服務器不需要返回數據

實例:

delete test6
DELETED
get test6
END
#以上個實例為例,使用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),數據初始值為10
set test7 0 900 2     
10
STORED
get test7
VALUE test7 0 2
10
END
#使用incr命令進行自增的操作(加5)
incr test7 5
15
get test7
VALUE test7 0 2
15      #最后返回的數據值為15
END

decr 命令

語法格式:
decr key decrement_value

參數解釋:

key:鍵值key-value結構中的key,用于查找緩存值。
decrement_value:減少的數值。

實例:

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

12,stats 命令

stats命令用于返回統計信息例如PID,版本號,連接數等。

語法格式:
stats

實例:
在以下實例中,使用stats命令來輸出memcached服務信息。這里顯示了很多狀態信息,下邊詳細解釋每個狀態項:

stats
STAT pid 1332   #memcache 服務器進程 ID
STAT 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 0
STAT 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 0
STAT 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 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   #當前存儲占用的字節數
STAT curr_items 3   #當前存儲的數據總數
STAT total_items 16   #啟動以來存儲的數據總數
STAT expired_unfetched 0   
STAT evicted_unfetched 0
STAT evictions 0   #LRU釋放的對象數目
STAT reclaimed 1   #已過期的數據條目來存儲新數據的數目
STAT crawler_reclaimed 0
STAT crawler_items_checked 0
STAT lrutail_reflocked 0
END

13,stats items 命令

stats items Ingles用于顯示各個slab中item 的數目和存儲時長(最后一次訪問距離現在的秒數)。

語法格式:
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 命令用于顯示各個slab的信息,包括chunk的大小,數目,使用情況等。

 語法格式:
 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的大小和個數。
該信息返回兩列:第一列是item的大小,第二列是item的個數。

語法:
stats sizes

實例:

stats sizes
STAT sizes_status disabled    #統計大小\狀態已禁用
END

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

16,version 命令

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

語法格式:
version

例子:

version
VERSION 1.4.33   #當前memcached的版本號

16,flush_all 命令

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

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

實例:

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

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

memcache分布式集群

telnet下操作memcache(指令詳解)& 高可用分布式集群(magent)
memcached是一個高性能的分布式內存對象緩存系統,用于動態web應用以減輕數據庫負載。他通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高動態,數據庫驅動網站的速度。memcached基于一個存儲鍵值對的hashmap。其守護進程(daemon)是用C語言寫的,但是客戶端可以用任何語言來編寫,并通過memcached協議與守護進程通信。

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

主機 ip地址 操作系統
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(四臺服務器都安裝)
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 memcached
tcp        0      0 172.16.1.120:11211      0.0.0.0:*               LISTEN      9678/memcached  
#設置防火墻:
[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  
#設置防火墻:
[root@memcached2 ~]# firewall-cmd --add-port=11211/tcp --permanent
success
[root@memcached2 ~]# firewall-cmd --reload
success

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]# ls
ketama.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]# 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

#如果還出現以上錯誤,修改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]# 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/

主緩存和備緩存一樣的啟動命令,需要通過“-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 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     #指定漂移地址
    }
}
#啟動keepalived:
[root@magent1-master ~]# service keepalived start
Unit 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 keepalived

global_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 start
Reloading 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 --reload
success
#重啟keepalived服務:
[root@magent1-master ~]# service keepalived restart
Restarting 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 12000
tcp        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 --permanent
success
[root@magent1-master ~]# firewall-cmd --reload
success

參數解釋:

-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 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端口并插入數據:

#安裝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)
memcached
STORED
get test
VALUE test 0 9
memcached
END
quit
Connection closed by foreign host.

2)連接主memcacehd節點的11211端口進行查看:

[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的數據值
VALUE test 0 9
memcached
END
quit
Connection closed by foreign host.

3)連接備memcached節點的11211端口進行查看:

[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節點都有數據。

模擬故障,宕掉主memcached緩存節點

#停止memcacehd進程(或者斷開主緩存節點的網卡)
[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地址,能夠正常獲得數據
VALUE test 0 9
memcached
END

模擬keepalived故障(master服務器宕機)

#停止主keepalived的服務:
[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服務器上:

[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

#啟動備緩存服務器的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 12000
tcp        0      0 172.16.1.200:12000      0.0.0.0:*               LISTEN      23052/magent   
#這是個缺陷,在生產環境中,一般會編寫觸發式腳本,當master宕掉后,自動開啟12000端口服務
#客戶端再次查看:
[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地址,正常訪問緩存中的數據
VALUE test 0 9
memcached
END

總結:
memcache的優點:可以做多主或者多從;
memcache的缺點:當主緩存節點宕掉又恢復,之前的緩存數據會丟失,通過magent取到的值就會為Null。
解決方法:
1、在每次memcache宕機修復后可以寫一個程序把集群中的其他memcache的所有信息全給拷貝到當前宕機修復后的memcache中。

2、自己寫代理,當從一個memcached服務上取到的值為null時再去其他memcached上取值。
注意事項:
magent的調用方式同memcached一樣,客戶端可以不用改代碼即可實現切換到magent模式下。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

班玛县| 通山县| 喀喇| 蒲江县| 永济市| 本溪市| 梅河口市| 沽源县| 大竹县| 禹城市| 鄂托克旗| 江油市| 杭锦旗| 定安县| 涡阳县| 镇雄县| 城固县| 扶余县| 商水县| 鹤山市| 东兰县| 永顺县| 永善县| 乐至县| 纳雍县| 嘉义县| 岳普湖县| 浪卡子县| 囊谦县| 湘阴县| 含山县| 东城区| 元阳县| 新郑市| 德令哈市| 西乡县| 古田县| 阿坝| 株洲县| 申扎县| 长宁区|