1. 程式人生 > >memcached基於magent 多主多從,主主同步,主從備份,匯入,匯出大於2M資料。

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