1. 程式人生 > >超簡單的memcached集群搭建

超簡單的memcached集群搭建

memcached

Memcached雖然能夠通過分布式緩存,實現其中memcached宕掉不會丟失全部緩存數據,但部分數據還是難逃一劫。 我們可以利用magent代理memcached實現主從備份來保證緩存數據完好無損,而且magent還可以作為從繼續使用,單大體工作原理如下:

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

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

3. 當主memcached恢復後,magent將重新向主memcached中讀取數據;此時由於主memcached

剛剛恢復,其中並無數據,因此導致部分數據無法讀取,這也是magent的一大缺點。


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

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

2. 既然從memcached分配空間較小而隨著存入的數據會越來越多,會導致緩存的數據不斷被過期驅逐內存,因此在主memcached宕掉後,只能暫時起到緩解數據庫壓力的作用。

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

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


memcached集群架構圖

技術分享圖片

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查看,因此使用此命令會將防火墻開啟,雖然規則是清空的,但仍會記錄連接跟蹤表。


超簡單的memcached集群搭建