Memcached 主主複製這種架構,在程序鏈接時不知道應該鏈接哪一個主服務器,因此須要在前端增長 VIP 地址,實現高可用架構。這裏用 Keepalived 實現,於是 Keepalived 的做用就是用來檢測 Memcached 服務器的狀態是否正常。
Keepalived 不斷檢測 Memcached 主服務器的11211端口,若是檢測到 Memcached 服務發生宕機或者死機等狀況,就會將 VIP 從主服務器移至從服務器,從而實現 Memcached 的高可用性。
前端
主機名 | 操做系統 | IP地址 | 軟件包 | VIP地址 |
---|---|---|---|---|
Memcached1服務器 | CentOS 7.4 x86_64 | 192.168.100.201 | libevent-2.1.8-stable.tar.gz、memcached-1.5.9.tar.gz、magent-0.5.tar.gz、keepalived | 192.168.100.200 |
Memcached2服務器 | CentOS 7.4 x86_64 | 192.168.100.202 | libevent-2.1.8-stable.tar.gz、memcached-1.5.9.tar.gz、keepalived | 192.168.100.200 |
Client客戶端 | CentOS 7.4 x86_64 | 192.168.100.203 | Telnet |
# tar zxvf memcached-1.5.6.tar.gz -C /opt/ # tar zxvf libevent-2.1.8-stable.tar.gz -C /opt/ # yum install gcc gcc-c++ make -y # cd /opt/libevent-2.1.8-stable # ./configure --prefix=/usr/local/libevent # make && make install # cd /opt/memcached-1.5.6 # ./configure \ --prefix=/usr/local/memcached \ --with-libevent=/usr/local/libevent/ # make && make install # ln -s /usr/local/memcached/bin/* /usr/local/bin/
將安裝的libevent-2.1.so.6模塊創建軟連接到/usr/lib64目錄下,不然在啓動Magent時會出錯c++
# ln -s /usr/local/libevent/lib/libevent-2.1.so.6 /usr/lib64/libevent-2.1.so.6
Magent 是一款開源的 Memcached 代理軟件,使用它能夠搭建高可用性的集羣應用的 Memcached 服務 ,備份 Memcached 數據,儘管 Memcached 服務掛掉,前端也能獲取到數據,客戶端先連到 Magent 代理服務器 ,而後Magent 代理服務器 在能夠鏈接多臺 Memcached 服務器,而後能夠進行數據的保存和備份數據。這樣數據就不會丟失,保存了數據完整性。
shell
# wget http://memagent.googlecode.com/files/magent-0.5.tar.gz # mkdir /opt/magent # tar zxvf magent-0.5.tar.gz -C /opt/magent # cd /opt/magent
# vim ketama.h //修改下面的行 #ifndef SSIZE_MAX #define SSIZE_MAX 32767 #endif # vim Makefile //添加路徑 LIBS = -levent -lm -L/usr/local/libevent/lib INCLUDE=-I/usr/local/libevent/include # make
# cp magent /usr/bin/ //把生成的magent命令讓系統識別 # scp /opt/magent/magent root@192.168.100.202:/usr/bin //把生成的magent命令複製到memcached2服務器
# yum install keepalived -y # vim /etc/keepalived/keepalived.conf router_id MAGENT_HA //主從不一樣 自定義 下面刪除4行 } //調用這個腳本每2秒檢查一次magent狀態 vrrp_script magent { script "/opt/shell/magent.sh" interval 2 } vrrp_instance VI_1 { state MASTER // 另外一臺服務器這裏是BACKUP interface ens33 virtual_router_id 51 //虛擬路由ID ,兩臺相同 priority 100 //優先級 從要小於主 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { //調用上面定義的腳本 magent } virtual_ipaddress { //定義VIP地址 192.168.100.200 } }
# mkdir -p /opt/shell/ # cd /opt/shell/ # vi 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.100.200 -p 12000 -s 192.168.100.201:11211 -b 192.168.100.202:11211 else pkill -9 magent fi
腳本添加執行權限,並開啓keepalived服務vim
# chmod +x magent.sh # systemctl start keepalived.service # ip addr //查看VIP的IP地址
-n 51200 //定義用戶最大鏈接數 -l //指定虛擬IP -p 12000 //指定端口號 -s //指定主緩存服務器 -b //指定從緩存服務器
# mkdir -p /opt/shell/ # cd /opt/shell/ # vi magent.sh #!/bin/bash K=`ip addr | grep 192.168.100.200 | grep -v grep | wc -l` if [ $K -gt 0 ]; then magent -u root -n 51200 -l 192.168.100.200 -p 12000 -s 192.168.100.201:11211 -b 192.168.100.202:11211 else pkill -9 magent fi
# chmod +x magent.sh # systemctl start keepalived.service
咱們在客戶端上使用Telnet登陸VIP地址並寫入數據,在兩臺memcached緩存服務器上能夠看到數據都已經同步緩存
將memcached1服務器宕機,登陸memcached2服務器,查看IP地址,此時VIP已經漂移到memcached2服務器上bash