memcached以前並不能直接通訊,因此memcached自己並不能完整備份全部的數據。這時候我麼可使用magent代理memcached實現主從備份,從而來保證緩存數據的完整性。算法
這中間的工做原理以下:shell
Memcache主從複製指在主Memcached服務器上修改數據都會被同步到從服務器上,可是Memcached API客戶端是沒法判斷鏈接到哪一臺Memcached服務器的,因此須要經過keepalived設置VIP地址,提供給Memcached API客戶端以及magent鏈接訪問。vim
名稱 | IP地址 |
---|---|
memcached主服務器 | 192.168.58.135 |
memcached從服務器 | 192.168.58.132 |
安裝memcached須要libevent的支持,因此須要先安裝libevent。先解壓libevent值指定目錄:緩存
[root@localhost mnt]# tar xf libevent-2.1.8-stable.tar.gz -C /opt/ [root@localhost mnt]# cd /opt/libevent-2.1.8-stable/ [root@localhost libevent-2.1.8-stable]# ./configure --prefix=/usr #進行配置 [root@localhost libevent-2.1.8-stable]# make && make install #進行編譯和安裝
安裝memcached:bash
[root@localhost mnt]# tar xf memcached-1.5.6.tar.gz -C /opt/ #將軟件包解壓到指定目錄中 [root@localhost memcached-1.5.6]# ./configure --with-libevent=/usr #配置,開啓libevent功能,後面加上上面安裝的路徑 [root@localhost memcached-1.5.6]# make && make install #編譯和安裝
將libevent的函數模塊創建軟連接到系統能夠識別的目錄下服務器
[root@localhost lib64]# ln -s /usr/lib/libevent-2.1.so.6 /usr/lib64/libevent-2.1.so.6
以上是主從服務器都須要安裝的軟件,magent只須要在主服務器上安裝,生成一個可執行文件,將這個文件複製到從服務器上便可。ide
[root@localhost mnt]# tar xf magent-0.5.tar.gz -C /opt/ #將magent解壓到指定目錄下 [root@localhost opt]# vim ketama.h #修改這個文件 #ifndef SSIZE_MAX #define SSIZE_MAX 32767 #endif #修改文件最大值,將最後一行的#endif移動到頭兩行下面
[root@localhost opt]# vim Makefile #修改Makefile LIBS = -levent -lm #這句話是鏈接函數庫,Linux的庫命名是一致的,通常爲libxxx.so,或libxxx.a,libxxx.la,那麼你要連接某個庫就用-lxxx,去掉頭lib及"."後面的so,la,a等便可。 #由於數學函數位於libm.so庫文件中(一般在/lib目錄下),-lm選項告訴編譯器,咱們程序中用到的數學函數要到這個庫文件裏找. CFLAGS = -Wall -O2 -g CC = gcc
[root@localhost opt]# make #生成一個可執行文件 [root@localhost opt]# ln -s /opt/magent /usr/bin #把生成的mgent程序讓系統識別,加入到環境變量中,方便系統識別,記得創建軟連接必定要用絕對路徑 [root@localhost opt]# scp magent root@192.168.58.132:/usr/bin/ #使用scp將生成的magent文件複製到從服務器/usr/bin目錄下
[root@localhost opt]# yum install keepalived -y #經過yum倉庫安裝keepalived [root@localhost opt]# vim /etc/keepalived/keepalived.conf #修改keepalived.conf配置文件
其餘多餘的配置直接刪除,從服務器的keepalived配置文件也要修改。memcached
[root@localhost ~]# mkdir -p /opt/shell [root@localhost ~]# vim /opt/shell/magent.sh #!/bin/bash K=`ps -ef | grep keepalived | grep -v grep | wc -l` if [ $K -gt 0 ]; then magent -u root -n 51200 -l 192.168.58.100 -p 12000 -s 192.168.58.135:11211 -b 192.168.58.132:11211 else pkill -9 magent fi -n 51200 #定義用戶最大鏈接數 -l 192.168.58.100 #指定虛擬IP -p 12000 #指定端口號 -s #指定主緩存服務器 -b #指定從緩存服務器 #這個腳本意思就是一旦檢測出系統進程中有keepalived進程,就執行magent這條命令,若是沒有,則將magent進程殺死。總得來講就是,加入主服務器上沒有keepslived進程,magent就會和從服務器鏈接。 [root@localhost ~]# chmod +x /opt/shell/magent.sh #給腳本添加執行權限
[root@localhost ~]# mkdir -p /opt/shell [root@localhost ~]# vim /opt/shell/magent.sh #!/bin/bash K=`ip addr | grep 192.168.58.100 | grep -v grep | wc -l` if [ $K -gt 0 ]; then magent -u root -n 51200 -l 192.168.58.100 -p 12000 -s 192.168.58.135:11211 -b 192.168.58.132:11211 else pkill -9 magent fi #從服務器的腳本意思就是一旦檢測到虛擬ip漂移到本身身上,就會執行magent這條命令,目的就是在主服務器宕掉的時候,從服務器可以正常啓動。 ~
啓動主從服務器的keepalived和memcached服務,查看主服務器狀態。
查看從服務器狀態。函數
這時候你們必定疑惑爲何主服務器的12000端口仍是開啓的呢,我認爲因爲咱們模擬宕機的方法是中止keepalived服務,因此keepalived中的檢測腳本不會再執行,因此裏面的pkill -9 magent這條命令不會再執行了。3d