超簡單的memcached集群搭建
1. magent每次寫數據都會寫到主memcached和從memcached上,並且向主從memcached寫的算法一樣;
2. 當主memcached宕掉,magent會向從memcached中讀取數據。
3. 當主memcached恢復後,magent將重新向主memcached中讀取數據;此時由於主memcached
針對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。
後端memcached1,memcached2,memcached3,memcached4多位4個主memcached
magent3作為從,同時也是從memcached的入口,其後端還有兩個memcached5,memcached6;由magent3, memcached5,memcacched6共同組成從memcached
工作流程:
magent1,magent2接受寫請求,將key分別寫入mecached1-mecached4中,同時也將key寫入從memcached上,也就是magent3上,magent3再分別寫入mecached5,mecached6中;主和從都是用的同一個分配算法
magent1,magent2接受讀請求,將分別向主memcached中進行讀取,而不想從memcached中讀取;
一旦mecached1-mecached4中有一個memcached宕掉,此時magent1和magent2將向從memcached,也就是magent3中讀取數據,達到緩存數據不丟失的效果;
當主中的memcache恢復後,將再次加入主memcached中,此時magent1和magent2將不會向從memcached中讀數據了,但是寫仍正常進行;
1. 安裝libevent
memcached 依賴libevent庫,在安裝memcached之前檢查下系統是否已安裝libevent庫,如果沒有則需要先安裝 libevent。
libevent是一個事件觸發的網絡庫,適用於windows、linux、bsd等多種平臺,內部使用select、epoll、kqueue等系統調用管理事件機制
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上進行數據同步,也就是設置Master的IP
-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
magent1,magent2算法:
1.可以根據magent總入口的個數(此處為2),使用除以2取余的方式,若為0分配到magent1,若為1分配到magent2,這樣會實現將請求平均分配到magent1和magent2上
註:
1.若memcached讀寫的數據多,一定將關掉防火墻或將防火墻設置為不使用跟蹤鏈接表,否則會導致/var/log/message報錯“kernel: nf_conntrack: table full, dropping packet”,
2.使用service iptables stop關掉,並且不能用iptables -L -vnx查看,因此使用此命令會將防火墻開啟,雖然規則是清空的,但仍會記錄連接跟蹤表。
超簡單的memcached集群搭建