1. 程式人生 > >領會Memcached高可用群集(Memcached主主複製+Keepalived)

領會Memcached高可用群集(Memcached主主複製+Keepalived)

10月3號我寫了高效能記憶體快取物件快取Memcached原理 (Memcached核心概念,部署),本片將Memcached高可用群集(Memcached主主複製+Keepalived)掌握一下。

memcached高可用叢集原理及介紹:

  1. memcached在實現分散式群集部署時,memcached服務之間是不能進行通訊的,分散式也是通過客戶端的演算法吧資料儲存在不同的memcached中,所以當我們做完群集客戶端往一個memcached節點寫入資料後,另外兩個節點是查詢不到的。
  2. 那麼如何結局額這個問題,就是接下來要做的了。
    memcached這種群集之間不能相互通訊導致了這種情況,這在訪問量很大的web網站中是不允許的。所以我們就要使用到一個magent開源軟體來解決這個問題。
    magent是一款開源的代理服務軟體,我們可以通過他來實現快取資料的同步,當然這裡說的同步不是說memcached之間就能互相通訊了,而是magent可以備份資料,而magent可以同時連線多個memcached節點,當memcached重啟或者宕機恢復後可以從magent指定的memcached的備份節點中恢復丟失的快取資料。

領會Memcached高可用群集(Memcached主主複製+Keepalived)

通過上圖來說明一下原理:
1、magent在啟動時會指定主的memcached節點與備份的memcached節點,假設我們指定了兩個主的快取節點,一個備份節點,當客戶端寫入時會通過演算法寫在其中一個指定的主快取節點中,並把資料備份到memcached備份節點中,當主節點重啟後或者宕機恢復後會從備份節點中恢復丟失的快取資料。
2、同時magent還可以使用keepalived來實現高可用。具體案例配置步驟如下所示:


案例說明:

* 為解決memcached單點故障,需要實現memcached快取的高可用。
* 首先,需要實現Memcached的主主複製,指任意一臺memcached伺服器修改資料都會被同步到另外一臺,但是memcached API無法判斷連線哪一臺伺服器,因此需要VIP。
* 其次,通過Keepalived產生的VIP連線memcached伺服器,提供高可用架構。

案例拓撲圖如下所示:
領會Memcached高可用群集(Memcached主主複製+Keepalived)
案例環境準備:

主機 作業系統 IP地址 主要軟體
Memcached 1 Centos7 192.168.72.128 libevent;memcached;keepalived;magent;telnet
Memcached 2 Centos7 192.168.72.129 libevent;memcached;keepalived;telnet
客戶端 Centos7 192.168.72.130 telnet

百度網盤免密提供軟體包:
https://pan.baidu.com/s/1aEM27okhC2DK00EhFC9LBw

案例實施過程:

1.首先給兩個伺服器安裝Memcached

* 安裝環境包(兩臺伺服器同裝):
* systemctl stop firewalld.service      #關閉防火牆
* setenforce 0                                  #關閉增強性安全功能
* yum install gcc gcc-c++ make -y    #安裝鎖需要的環境包

領會Memcached高可用群集(Memcached主主複製+Keepalived)

* 解壓下載好的libevent、memecached包到/opt下:
* tar zxvf libevent-2.1.8-stable.tar.gz -C /opt 
* tar zxvf memcached-1.5.6.tar.gz -C /opt

領會Memcached高可用群集(Memcached主主複製+Keepalived)

* 接下來手工編譯安裝(注意:libevent在先 memcached在後)
* cd /opt/libevent-2.1.8-stable/      #手工編譯安裝libevent
     ./configure --prefix=/usr
* make && make install
* cd /opt/memcached-1.5.6/              #手工編譯安裝memcached
    ./configure --with-libevent=/usr   
* make && make install

領會Memcached高可用群集(Memcached主主複製+Keepalived)
領會Memcached高可用群集(Memcached主主複製+Keepalived)

2.在主伺服器上安裝magent

* 解壓下載好的magent包到/opt/magent/下
* tar zxvf magent-0.5.tar.gz -C /opt/magent/    

領會Memcached高可用群集(Memcached主主複製+Keepalived)

* 編輯配置檔案:
* cd /opt/magent
* vim ketama.h                 #檔案開頭修改
   #ifndef SSIZE_MAX
   #define SSIZE_MAX 32767
   #endif                          #刪除最後那個endif

* vim Makefile 
   LIBS = -levent -lm         #注意空格 

* make                             #安裝magent
* ls                                    #檢視magent可執行程式

領會Memcached高可用群集(Memcached主主複製+Keepalived)
領會Memcached高可用群集(Memcached主主複製+Keepalived)
領會Memcached高可用群集(Memcached主主複製+Keepalived)

* 將magent程式複製到memcached從伺服器上:
* scp magent 192.168.72.129:/usr/bin

領會Memcached高可用群集(Memcached主主複製+Keepalived)
3.接下來主伺服器上安裝keepalived

* yum install keepalived -y     #yum安裝
* 安裝完成修改配置檔案:
* vim /etc/keepalived/keepalived.conf 
//12行
router_id MAGENT_HA
刪除13-16 (vrrp)
//在global_defs下新增
vrrp_script magent {
     script "/opt/shell/magent.sh"
     interval 2                   #時間間隔2s
}
vrrp_instance VI_1 {    
......
interface ens33             #修改
......
track_script {                 #呼叫-新增 ;注意括號
       magent
}
virtual_ipaddress          #修改
           192.168.72.100
     }                                #定義虛擬地址
}                                     #剩餘全刪除   

領會Memcached高可用群集(Memcached主主複製+Keepalived)
領會Memcached高可用群集(Memcached主主複製+Keepalived)
4.接下來從伺服器上安裝keepalived

* yum install keepalived -y                       #yum安裝keepalived
* cd /etc/keepalived/
* mv keepalived.conf keepalived.conf.bk           #修改配置檔名
* scp keepalived.conf [email protected]:/etc/keepalived/    #主伺服器上推送keepalived已經修改好的配置檔案
* vi keepalived.conf
  router_id MAGENT_HB
  state BACKUP
  virtual_router_id 52
  priority 90

領會Memcached高可用群集(Memcached主主複製+Keepalived)
領會Memcached高可用群集(Memcached主主複製+Keepalived)
領會Memcached高可用群集(Memcached主主複製+Keepalived)
5.到此主從兩臺伺服器上keepalived已經安裝配置完成,接下來在主和從伺服器寫入keepalived配置檔案載入的指令碼

* 建一個指令碼存放目錄:
* mkdir /opt/shell
* 編寫指令碼:
* cd /opt/shell
* vim 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.72.100 -p 12000 -s 192.168.37.128:11211 -b 192.168.37.130:11211
else
pkill -9 magent
fi 

-n 51200                      #定義使用者最大連線數
-l 192.168.37.188        #指定虛擬IP
-p 12000                     #指定埠號
-s                                #指定主快取伺服器
-b                                  #指定從快取伺服器
chmod +x magent.sh                #新增執行許可權

領會Memcached高可用群集(Memcached主主複製+Keepalived)

* 主從伺服器開啟keepalived服務:
* systemctl start keepalived.service
* netstat -ntap | grep 12000               #開啟較慢,確認magent執行

領會Memcached高可用群集(Memcached主主複製+Keepalived)

  • 確認主從伺服器漂移地址生效
  • 主伺服器:
    領會Memcached高可用群集(Memcached主主複製+Keepalived)
  • 從伺服器:
    領會Memcached高可用群集(Memcached主主複製+Keepalived)
    6.主從伺服器開啟memecached
  • 主伺服器:
  • memcached -m 512k -u root -d -l 192.168.72.128 -p 11211
  • netstat -ntap | grep 11211
  • yum install telnet -y #安裝遠端登入工具
  • telnet 192.168.72.128 11211 #本地登入
    
    ![](http://i2.51cto.com/images/blog/201810/19/adf324951eef2e8963624f10ada3cf40.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
* 從伺服器:
* memcached -m 512k -u root -d -l 192.168.72.129 -p 11211
* netstat -ntap | grep 11211
* yum install telnet -y
* telnet 192.168.72.129 11211

領會Memcached高可用群集(Memcached主主複製+Keepalived)

7.客戶端測試

* 安裝telnet工具,連線VIP,寫入資料:
* yum install telnet -y
* telnet 192.168.72.100 12000
   add username 0 0 4
   1234

領會Memcached高可用群集(Memcached主主複製+Keepalived)

  • 主伺服器可以看到寫入的內容:
    領會Memcached高可用群集(Memcached主主複製+Keepalived)
  • 從伺服器可以看到寫入的內容:
    領會Memcached高可用群集(Memcached主主複製+Keepalived)
  • 如果斷掉一臺memcached,再次訪問,客戶端仍然可以連線:
    領會Memcached高可用群集(Memcached主主複製+Keepalived)
    領會Memcached高可用群集(Memcached主主複製+Keepalived)
    仍然可以看到!

    本篇總結:

  • Memcached是分散式記憶體物件快取系統,因為所有資料都儲存在記憶體中,從而常用於網站加速;
  • Memcached分散式實現不是在服務端實現的而是在客戶端實現;
  • Memcached可以通過keepalived實現Memcached服務的高可用行;