超簡單的memcached集羣搭建

    Memcached雖然可以經過分佈式緩存,實現其中memcached宕掉不會丟失所有緩存數據,但部分數據仍是難逃一劫。    咱們能夠利用magent代理memcached實現主從備份來保證緩存數據無缺無損,並且magent還能夠做爲從繼續使用,單大致工做原理以下:linux

   1. magent每次寫數據都會寫到主memcached和從memcached上,而且向主從memcached寫的算法同樣; 算法

   2. 當主memcached宕掉,magent會向從memcached中讀取數據。數據庫

   3. 當主memcached恢復後,magent將從新向主memcached中讀取數據;此時因爲主memcached剛剛恢復,其中並沒有數據,所以致使部分數據沒法讀取,這也是magent的一大缺點。vim


   針對magent的缺點有幾種想法:windows

     1. 在生產環境中主memcached宕掉的可能性很是小,大部分時間都是工做的;而從memcached只是在主memcached宕掉後才使用,所以從memcached分配的空間不可能和主memcached同樣,這樣無疑是在浪費寶貴的內存空間。後端

     2. 既然從memcached分配空間較小而隨着存入的數據會愈來愈多,會致使緩存的數據不斷被過時驅逐內存,所以在主memcached宕掉後,只能暫時起到緩解數據庫壓力的做用。緩存

     3. memcached宕掉後,不宜直接將其啓動,仍是在數據庫壓力比較小的時候再啓動吧,就當預熱緩存,bash

       總結:我引入magent除了主從方面,還考慮到magent--magent實現memcached入口的負載均衡,也就是說讀寫請求按照必定的算法分配到magent入口上,既能達到高可用,還能起到負載均衡。網絡


memcached集羣架構圖架構

圖片2.png

magent1,magent2做爲memcached的總入口,咱們使用算法來實現負載均衡,分配讀寫請求,不管使用哪一個入口分配到後端的memcached是同樣的,由於他們分配memcached使用的都是同一個算法consistent-hash

後端memcached1memcached2,memcached3,memcached4多位4個主memcached

magent3做爲從,同時也是從memcached的入口,其後端還有兩個memcached5,memcached6;magent3, memcached5,memcacched6共同組成從memcached


工做流程:

magent1magent2接受寫請求,將key分別寫入mecached1-mecached4中,同時也將key寫入從memcached上,也就是magent3上,magent3再分別寫入mecached5mecached6中;主和從都是用的同一個分配算法

magent1,magent2接受讀請求,將分別向主memcached中進行讀取,而不想從memcached中讀取;

一旦mecached1-mecached4中有一個memcached宕掉,此時magent1magent2將向從memcached,也就是magent3中讀取數據,達到緩存數據不丟失的效果;

當主中的memcache恢復後,將再次加入主memcached中,此時magent1magent2將不會向從memcached中讀數據了,可是寫仍正常進行;

 


1. 安裝libevent

 

     memcached 依賴libevent庫,在安裝memcached以前檢查下系統是否已安裝libevent庫,若是沒有則須要先安裝 libevent

     libevent是一個事件觸發的網絡庫,適用於windowslinuxbsd等多種平臺,內部使用selectepollkqueue等系統調用管理事件機制

tar zxvf libevent-1.4.9-stable.tar.gz  
cd libevent-1.4.9-stable  
./configure --prefix=/usr/local/libevent
make
make install
cd ..


2. 安裝memcached

tar zxvf memcached-1.2.8.tar.gz
cd memcached-1.2.8
./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
make && make install
cd ..
memcached -u root -d -m 200 -l 127.0.0.1 -p 11211 -P /var/run/memcached.pid

若是啓動的時候報錯:

 /usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

須要修改:

ln -s /usr/local/libevent/lib/libevent-2.0.so.5 /lib64/libevent-2.0.so.5

3. 安裝magent

mkdir magent  
cp magent-0.5.tar.gz magent  
cd magent  
tar zxvf magent-0.5.tar.gz
#vim ketama.h   
在開頭加入  
ifndef SSIZE_MAX  
define SSIZE_MAX      32767  
endif
#vim Makefile  
CFLAGS = -Wall -O2 -g 改成 CFLAGS = -lrt -Wall -O2 -g
mkdir /usr/lib64  
cp /usr/local/lib/libevent.a /usr/lib64
ln -s /usr/lib64/libm.so /usr/lib64/libm.a  
/sbin/ldconfig  
sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile  
make  
cp magent /usr/bin/magent  
cd ..

#執行magent出現如下則表示成功

#magent
please provide -s "ip:port" argument
 
memcached agent v0.4 Build-Date: Oct 24 2016 11:08:20
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

啓動memcached各節點:

memcached1-memcached6

 

以前已經啓動一個節點,須要把以前的節點先kill掉。

 

#memcached -u root -d -p 11211 -m 1024 -c 102400 -x 127.0.0.1 -X 11111
#memcached -u root -d -p 11212 -m 1024 -c 102400 -x 127.0.0.1 -X 11111
#memcached -u root -d -p 11213 -m 1024 -c 102400 -x 127.0.0.1 -X 11111
#memcached -u root -d -p 11214 -m 1024 -c 102400 -x 127.0.0.1 -X 11111
#memcached -u root -d -p 11215 -m 1024 -c 102400 -x 127.0.0.1 -X 11111
#memcached -u root -d -p 11216 -m 1024 -c 102400 -x 127.0.0.1 -X 11111
 
# ps -ef | grep memcached                                        
root      21929      1  0 15:41 ?        00:00:00 memcached -u root -d -l 127.0.0.1 -p 11211 -x 127.0.0.1 -X 11111
root      21931      1  0 15:41 ?        00:00:00 memcached -u root -d -l 127.0.0.1 -p 11212 -x 127.0.0.1 -X 11111
root      21957      1  0 15:48 ?        00:00:00 memcached -u root -d -l 127.0.0.1 -p 11213 -x 127.0.0.1 -X 11111
root      21959      1  0 15:48 ?        00:00:00 memcached -u root -d -l 127.0.0.1 -p 11214 -x 127.0.0.1 -X 11111
root      21961      1  0 15:48 ?        00:00:00 memcached -u root -d -l 127.0.0.1 -p 11215 -x 127.0.0.1 -X 11111
root      21963      1  0 15:48 ?        00:00:00 memcached -u root -d -l 127.0.0.1 -p 11216 -x 127.0.0.1 -X 11111


 

-p:指定tcp 監聽端口

-d:後臺運行memcached

-m:指定最大運行內存,默認64M

-c:是最大的併發鏈接數

-x        #設置從哪一個IP上進行數據同步,也就是設置MasterIP

-X        #設置數據同步的端口號,默認11212.11212已經被使用的話,

          #須要經過這個參數來設置,不然memcached沒法啓動

 

 

記得啓動memcached各個節點的時候,必定要加-x -X設置數據同步IP和端口,不能會報錯:replication: failed to initialize replication server socket

faild to replication init

 

 

magent3:
#magent -u root -n 102400 -l 192.168.16.20 -p 12002 -s 192.168.16.20:11215 -s 192.168.16.20:11216
 
magent1: 
#magent -u root -n 102400 -l 192.168.16.20 -p 12000 -s 192.168.16.20:11211 -s 192.168.16.20:11212 -s 192.168.16.20:11213 -s 192.168.16.20:11214 -b 192.168.16.20:12002
 
magent2:
#magent -u root -n 102400 -l 192.168.16.20 -p 12001 -s 192.168.16.20:11211 -s 192.168.16.20:11212 -s 192.168.16.20:11213 -s 192.168.16.20:11214 -b 192.168.16.20:12002
 
# ps -ef | grep magent
root      20302      1  0 15:28 ?        00:00:00 magent -u root -n 102400 -l 192.168.16.20 -p 12002 -s 192.168.16.20:11215 -s 192.168.16.20:11216
root      21886      1  0 15:39 ?        00:00:00 magent -u root -n 102400 -l 192.168.16.20 -p 12000 -s 192.168.16.20:11211 -s 192.168.16.20:11212 -s 192.168.16.20:11213 -s 192.168.16.20:11214 -b 192.168.16.20:12002
root      21890      1  0 15:39 ?        00:00:00 magent -u root -n 102400 -l 192.168.16.20 -p 12001 -s 192.168.16.20:11211 -s 192.168.16.20:11212 -s 192.168.16.20:11213 -s 192.168.16.20:11214 -b 192.168.16.20:12002


 

 

magent1magent2算法:

1.能夠根據magent總入口的個數(此處爲2),使用除以2取餘的方式,若爲0分配到magent1,若爲1分配到magent2,這樣會實現將請求平均分配到magent1magent2

 

注:

1.memcached讀寫的數據多,必定將關掉防火牆或將防火牆設置爲不使用跟蹤連接表,不然會致使/var/log/message報錯「kernel: nf_conntrack: table full, dropping packet」,

2.使用service iptables stop關掉,而且不能用iptables -L -vnx查看,所以使用此命令會將防火牆開啓,雖然規則是清空的,但仍會記錄鏈接跟蹤表。

相關文章
相關標籤/搜索