memcached基於magent 多主多從,主主同步,主從備份,匯入,匯出大於2M資料。
安裝部署memcached 基於magent的 主從同步 主主同步
需下載的包
wget http://www.memcached.org/files/memcached-1.5.10.tar.gz wget https://raw.githubusercontent.com/memcached/memcached/master/scripts/memcached-tool (匯出工具是一個指令碼) wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz magent https://code.google.com/archive/p/memagent/downloads (包含magent所有版本不能訪問google無法下載) wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/memagent/magent-0.5.tar.gz
關於架構介紹:
紅色線代表主 ,綠色線代表從。多臺主會輪詢寫入主。每個從都會寫入資料(從上的資料是所有主上的資料集合),
客戶端現在是直接訪問magent 代理,所有操作都會有magent 轉發後端的memcached(部分命令不支援),
1、首先安裝libevent,指定安裝路徑即可,第二臺上相同操作
cd/home/system/libevent-2.1.8-stable ./configure --prefix=/home/system/libevent 路徑建議安裝到 /usr/local/libevent 下
2、安裝memcached,第二臺上相同操作
cd /home/system/memcached-1.5.6 ./configure \ --prefix=/home/system/memcached --with-libevent=/home/system/libevent/ #指定上面庫模組安裝路勁
make && make install
##################################################################
領導有要求備份 memached 需改原始碼, vi /home/system/memcached-1.5.6/items.c
596 unsigned int memlimit = 2 * 1024 * 1024; /* 2MB max response size */ 直接改這個值編譯安裝會報錯,修改下面判斷值。 629 if (bufcurr + len + 6 > memlimit) /* 6 is END\r\n\0 */ 630 break; 改為想要的值100G 629 if (bufcurr + len + 6 > 107374182400) /* 6 is END\r\n\0 */ 630 break;
儲存 編譯安裝即可 ##################################################
4、將編譯安裝的libevent-2.1.so.6模組複製到/usr/lib64,否則memcached服務啟動時會報錯。 第二臺上相同操作。
ln -s /home/system/libevent/lib/libevent-2.1.so.6 /usr/lib64/libevent-2.1.so.6
5、安裝magent,第二臺可以安裝也可以 scp magent 到第二臺,啟動都指定絕對路徑啟動方便其餘運維維護。
tar magent-0.5.tar.gz -C /opt/ cd /opt
4.1修改檔案
magent-0.5]# vi ketama.h
#ifndef SSIZE_MAX #define SSIZE_MAX 32767 //前兩行帶#的改成這樣 #endif //位置上調 到第三行
如下:
1 #ifndef SSIZE_MAX 2 #define SSIZE_MAX 32767 3 #endif
4.2修改 Makefile檔案 magent-0.5]# vi Makefile
LIBS = -levent -lm -L/home/system/libevent/lib/ //注意libevent的安裝路徑,否則make會報錯 INCLUDE = -I /home/system/libevent/include
6、生成magent程式 此處需要注意,在magent生成可執行程式之前需要關閉防火牆,不然無法make,只需要make即可。
make ########################################## magent-0.6安裝 : 在測試過程中magent-0.6有問題,併發會無法提供服務,Time Out。上生產也是如此。
後來改用magent-0.5 可以用。也許是我配置的問題(如果可以用請留言,並告知如何用)。 1, ln -s /home/system/libevent/* /usr/lib64/ ln -s /usr/lib64/libm.so /usr/lib64/libm.a (或者直接修改 Makefile 檔案中的 /usr/lib64/libm.a) 2, vi Makefile ifeq ($(ARCH), $(X64)) M64 = -m64 LIBS = /usr/lib64/libevent-2.1.so.6 /usr/lib64/libm.a else LIBS = -levent -lm -L/usr/lib64/lib endif
CFLAGS = -Wall -g -O2 -I/usr/lib64/include $(M64) 3, vi ketama.h
#ifndef SSIZE_MAX #define SSIZE_MAX 32767 //前兩行帶#的改成這樣 #endif //位置上調
#ifndef SSIZE_MAX #define SSIZE_MAX 32767 #endif ############################################################## 7, 啟動 memcached
/home/system/memcached-100G/bin/memcached -d -m 40960 -c 40960 -l 192.168.88.23 -p 11210 -u root -P /tmp/memcached-100G.pid
記憶體10G 最大訪問量40960 埠 11210
8,啟動 magent 代理: -s 兩主 -b 兩從
/home/system/123/magent -u root -n 51200 -l 192.168.88.23 -p 1111 -s 192.168.88.23:11210 -s 192.168.88.23:11213 -b 192.168.88.21:11211 -b 192.168.88.21:11212
9,生成set資料 複製貼上到 telnet命令列 。
[[email protected] bin]# for i in {0..9}; do echo -e "set ZZZ$i 0 0 5\r\naXXX$i\r"; done set ZZZ0 0 0 5 aXXX0 ,,,, set ZZZ9 0 0 5 aXXX9 [[email protected] bin]# for i in {0..9}; do echo -e "get ZZZ$i\r"; done get ZZZ0 ,,,,, get ZZZ10
[[email protected] ~]# telnet 192.168.88.23 1111 Trying 192.168.88.23... Connected to 192.168.88.23. Escape character is '^]'. set ZZZ0 0 0 5 aXXX0 STORED set ZZZ1 0 0 5 aXXX1 STORED set ZZZ2 0 0 5 aXXX2 set ZZZ3 0 0 5 STORED aXXX3 set ZZZ4 0 0 5 STORED aXXX4 set ZZZ5 0 0 5 STORED aXXX5 STORED set ZZZ6 0 0 5 aXXX6 STORED set ZZZ7 0 0 5 aXXX7 STORED set ZZZ8 0 0 5 aXXX8 set ZZZ9 0 0 5 aXXX9 set ZZZ10 0 0 5 aXXX10STORED
STORED
get 獲取值
get ZZZ0 VALUE ZZZ0 0 5 aXXX0 END get ZZZ1 VALUE ZZZ1 0 5 aXXX1 END get ZZZ2 VALUE ZZZ2 0 5 aXXX2 END get ZZZ3 VALUE ZZZ3 0 5 aXXX3 END get ZZZ4 VALUE ZZZ4 0 5 aXXX4 END get ZZZ5 VALUE ZZZ5 0 5 aXXX5 END get ZZZ6 get ZZZ7 get ZZZ8 get ZZZ9 get ZZZ10VALUE ZZZ6 0 5 aXXX6 END VALUE ZZZ7 0 5 aXXX7 END
VALUE ZZZ8 0 5 aXXX8 END
VALUE ZZZ9 0 5 aXXX9 END
END
ctrl + ] 然後 輸入q 回車推退出
通過 stats cachedump 1 0 查詢所有資料 。可以看出多主 多從會分擔負載,資料分片分佈在主從上面。
[[email protected] ~]# telnet 192.168.88.23 11210 Trying 192.168.88.23... Connected to 192.168.88.23. Escape character is '^]'. stats cachedump 1 0 ITEM ZZZ9 [5 b; 0 s] ITEM ZZZ7 [5 b; 0 s] ITEM ZZZ5 [5 b; 0 s] ITEM ZZZ3 [5 b; 0 s] ITEM ZZZ1 [5 b; 0 s] END ^] telnet> q Connection closed. [[email protected] ~]# telnet 192.168.88.23 11213 Trying 192.168.88.23... Connected to 192.168.88.23. Escape character is '^]'. stats cachedump 1 0 ITEM ZZZ8 [5 b; 1537157432 s] ITEM ZZZ6 [5 b; 1537157432 s] ITEM ZZZ4 [5 b; 1537157432 s] ITEM ZZZ2 [5 b; 1537157432 s] ITEM ZZZ0 [5 b; 1537157432 s] ITEM ZZZ5 [5 b; 1537157432 s] END ^] telnet> q Connection closed. [[email protected] ~]# telnet 192.168.88.21 11211 Trying 192.168.88.21... Connected to 192.168.88.21. Escape character is '^]'. stats cachedump 1 0 ITEM ZZZ9 [5 b; 0 s] ITEM ZZZ7 [5 b; 0 s] ITEM ZZZ5 [5 b; 0 s] ITEM ZZZ3 [5 b; 0 s] ITEM ZZZ1 [5 b; 0 s] END ^] telnet> q Connection closed. [[email protected] ~]# telnet 192.168.88.21 11212 Trying 192.168.88.21... Connected to 192.168.88.21. Escape character is '^]'. stats cachedump 1 0 ITEM ZZZ8 [5 b; 0 s] ITEM ZZZ6 [5 b; 0 s] ITEM ZZZ4 [5 b; 0 s] ITEM ZZZ2 [5 b; 0 s] ITEM ZZZ0 [5 b; 0 s] END
我測試過
twemproxy-master 這個代理 代理的是redis 也是分片儲存到代理池,問題是取值 get時,是輪詢取值,因為是分片儲存,所以有時取不到的概率是 (n-1)/n N為池redis數。也許是我配置的問題。
10,匯出資料
/home/system/memcached/bin/memcached-tool 192.168.88.23:11210 dump >100G-dump.txt
11, 匯入資料
nc 192.168.88.23 11211 < 20180906.txt
12, 生成資料測試。匯入匯出。
for i in {0..10000000}; do echo -e "set $i 0 0 200\r\n01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\r" >>2G.txt; done
會生成2G資料
13 , memcached 與 magent介紹:
1、Telnet操作Memcached
1. 連線
開啟CMD。輸入如下格式 telnet [IP 埠] 如:telnet 192.168.11.183 1200
2. Memcached操作命令
2.1 新增資料
add key值 0
時間(秒)
長度(存放多長時間由你指定,
鍵名不能重複,但是值可以重複
)例:add name 0 5 5不可以在add name 0 77 44
2.2、獲取資料
get key值
【key-val key不能重複,但是val可以重複】
2.3、修改資料
replace key值 0 60 5
【如果key值不存在,則失敗】
set key值 0 60 5
【如果key值不存在,相當於新增,如果存在,則相當於修改.】
2.4、刪除資料
delete 鍵值
2.5、刪除全部
flush_all
2, 檢視全部 資料, stats items ,stats cachedump 7 0 (7是根據stats items檢視得到的)
主主同步magent 用法
Usage:
-h this message
-u uid
-g gid
-p port, default is 11211. (0 to disable tcp support)
-s ip:port, set memcached server ip and port
-b ip:port, set backup memcached server ip and port
-l ip, local bind ip address, default is 0.0.0.0
-n number, set max connections, default is 4096
-D don't go to background
-k use ketama key allocation algorithm
-f file, unix socket path to listen on. default is off
-i number, set max keep alive connections for one memcached server, default is 20
-v verbose
用途:
-這個訊息
U-UID
G-GID
p埠,預設值為11211。(0禁用TCP支援)
-s IP:埠,設定MycCaseServer IP和埠
-b IP:埠,設定備份MycCurp伺服器IP和埠
-l IP,本地繫結IP地址,預設值為0.0.0.0
-n個數,設定最大連線,預設為4096
-d 不要去後臺
-K使用KEATMA金鑰分配演算法
-F檔案,Unix套接字路徑偵聽。預設關閉
-i個數,設定一個記憶體快取伺服器的最大保持連線,預設為20
-v字形
14,主主同步 就是 A 機器上 用magent -s A -b B
B機器上 magent -s B -b A