1. 程式人生 > >Memcached 主主復制 + Keepalived 高可用架構【附上原理】

Memcached 主主復制 + Keepalived 高可用架構【附上原理】

ima pki nag ali event 主服務器 figure tel outer

目錄:

1·Memcached 主主復制概念
2·Memcached 高可用的實現
3·案例部署
4·總結


Memcached 主主復制概念

(1)主主復制概念:

Memcached 主主復制是指在任意一臺 Memcached 服務器修改數據都會被同步到另外一臺,但是 Memcached API 客戶端無法判斷連接到那一臺 Memcached 服務器,所有需要設置 VIP 地址,提供給 Memcached API 客戶端進行連接。


(2)文章推薦:

知道了主主復制,那麽需要了解 Memcached 是什麽,還有一些最基本的情況,比如:
1) Memcached 功能
2)Memcached 特征

3)Memcached 儲存方式
可以看看上篇文章Memcached 高性能緩存對象


Memcached 高可用的實現

(1)怎麽實現 Memcached 的高可用

1)這裏就需要牽扯到主主復制的概念了,因為Memcached 主主復制這種架構,在程序連接的時候不會知道應該連接哪一個主服務器,所以需要在前端加上 VIP 地址,實現高可用架構。這裏可以用 Keepalived 實現,所以說,Keepalived 的作用就是來檢測 Memcached 服務器的狀態是否正常。


2)Keepalived 會不斷的檢測 Memcached 主服務器的 11211端口,如果檢測到 Memcached 服務發生故障或宕機等情況,就會將 VIP 從主服務器上轉移到從服務器,從而實現 Memcached 的高可用性。


3)Memcached 高可用架構圖
技術分享圖片


案例部署說明

(1)部署環境文字說明:

1)因為這篇文章是演示 Memcached 的主主復制+ Keepalived 的高可用架構,所以這裏不需要安裝 Memcached API 。請提前安裝編譯環境:gcc 、gcc-c++ 、 make ,文章中不會提示安裝!


2)整個環境部署所需要的源碼包將會無償提供,需要的請點擊:Memcached 高可用源碼包,密碼:sxsr


(2)部署環境表格說明:

名稱 IP 地址 操作系統 主要軟件包
Memcached 主1 192.168.154.128 CenOS 7.4 libevent-2.1.8-stable.tar.gz 、memcached-1.5.6.tar.gz 、 magent-0.5.tar.gz
Memcached 主2 192.168.154.129 CenOS 7.4 libevent-2.1.8-stable.tar.gz 、memcached-1.5.6.tar.gz
Linux 系統 192.168.154.130 CenOS 7.4 telnet 用於測試

開始部署

(1)在 Memcached 主1解壓、安裝 所需要的源碼包
1)關閉防火墻

[root@localhost memcached]# systemctl stop firewalld.service
[root@localhost memcached]# setenforce 0

2)解壓、安裝源碼包 libevent-2.1.8-stable.tar.gz

[root@localhost memcached]# tar zxvf libevent-2.1.8-stable.tar.gz -C /opt/
[root@localhost memcached]# 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
[root@localhost libevent-2.1.8-stable]# ln -s /usr/lib/libevent-2.1.so.6  /usr/lib64/libevent-2.1.so.6 --(這裏必須將模塊做一個軟連接,因為啟動 Memcached 時需要在/usr/lib64下尋找libevent-2.1.so.6模塊)

3)解壓、安裝源碼包 memcached-1.5.6.tar.gz

[root@localhost memcached]# tar zxvf memcached-1.5.6.tar.gz -C /opt
[root@localhost memcached]# cd /opt/memcached-1.5.6
[root@localhost memcached-1.5.6]# ./configure --with-libevent=/usr ---(這裏安裝需要指定 libevent 的安裝路徑)
[root@localhost memcached-1.5.6]# make && make install

4)安裝、解壓軟件包 magent-0.5.tar.gz

[root@localhost ~]# mkdir /opt/magent
[root@localhost memcached]# tar xvf magent-0.5.tar.gz -C /opt/magent
將會得出以下文件:
ketama.c
magent.c
ketama.h
Makefile
[root@localhost memcached]# cd /opt/magent
[root@localhost magent]# vim ketama.h  ---(現在沒有 make 文件,需要修改才能得出 make 執行文件)
修改如下:
#ifndef SSIZE_MAX 
#define SSIZE_MAX 32767

技術分享圖片

[root@localhost magent]# vim Makefile ---(繼續修改文件)
修改內容:
LIBS = -levent -lm

技術分享圖片

[root@localhost magent]# make ----(文件修改完成後就可以 make)
[root@localhost magent]# cp magent /usr/bin

(2)在 Memcached 主2 解壓、安裝 所需要的源碼包
1)關閉防火墻

[root@localhost memcached]# systemctl stop firewalld.service
[root@localhost memcached]# setenforce 0

2)解壓、安裝源碼包 libevent-2.1.8-stable.tar.gz

[root@localhost memcached]# tar zxvf libevent-2.1.8-stable.tar.gz -C /opt/
[root@localhost memcached]# 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
[root@localhost libevent-2.1.8-stable]# ln -s /usr/lib/libevent-2.1.so.6  /usr/lib64/libevent-2.1.so.6 --(這裏必須將模塊做一個軟連接,因為啟動 Memcached 時需要在/usr/lib64下尋找libevent-2.1.so.6模塊)

3)解壓、安裝源碼包 memcached-1.5.6.tar.gz

[root@localhost memcached]# tar zxvf memcached-1.5.6.tar.gz -C /opt
[root@localhost memcached]# cd /opt/memcached-1.5.6
[root@localhost memcached-1.5.6]# ./configure --with-libevent=/usr ---(這裏安裝需要指定 libevent 的安裝路徑)
[root@localhost memcached-1.5.6]# make && make install

4)把 主1 的 magent 文件,遠程拷貝一份到 主 2 ,這裏需要在 主1 上操作

[root@localhost magent]# yum install telnet -y ----(安裝遠程連接工具)
[root@localhost magent]# scp magent [email protected]:/usr/bin ---(發送給主 2 一份 )

(3)在 主 1 、主 2 上同時安裝 Keepalived 軟件
1)安裝 Keepalived 、修改 Keepalived 配置文件

[root@localhost ~]# yum install keepalived -y
[root@localhost ~]# vim /etc/keepalived/keepalived.conf  ---(修改Keepalived主配置文件)
! Configuration File for keepalived

vrrp_script magent {                              #定義函數
        script "/opt/shell/magent.sh"           #臨時定義的路徑,所以還需要手動創建
        interval 2                                        #每隔兩秒檢測
}
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id Master_A         #定義id名稱,主 2  可以任意修改
     以下幾行需要刪除
}   

vrrp_instance VI_1 {
        state MASTER                                 #定義狀態,主 2  定義為 BANKUP
        interface ens33                                #WANG
    virtual_router_id 51
    priority 100                                      #優先級,主 2 要低於 主 1
    advert_int 1
    authentication {
        auth_type PASS                          #身份驗證,這裏需要和 主2 一致
        auth_pass 1111
    }

track_script {                                          #開始調用函數
        magent
}

    virtual_ipaddress {                            #定義VIP 漂移地址
        192.168.154.188
    }
}
以下所有配置刪除

2)編寫觸發式腳本

[root@localhost ~]# mkdir /opt/shell   ----(這裏路徑需要和 Keepalived 主配置文件裏路徑一致)

[root@localhost ~]# vim /opt/shell/magent.sh
內容如下:
K=$(ps -ef | grep keepalived | grep -v grep | wc -l)
if [ $K -gt 0 ];then
magent -u root -n 51200 -l 192.168.154.188 -p 12000 -s  192.168.154.128:11211 -b 192.168.154.129:11211
else
pkill -9 magent
fi

對以上參數說明:
-n 51200 //定義用戶最大連接數
-l 192.168.154.188 //指定虛擬ip
-p 12000 //指定端口號
-s //指定主緩存服務器
-b //指定從緩存服務器

[root@localhost shell]# scp magent.sh [email protected]:/opt/shell ----(發送給 主 2 一份,就不用在 主2 上寫了)


3)給與腳本執行權限、並啟動 Keepalived 服務

[root@localhost ~]# chmod +x /opt/shell/magent.sh
[root@localhost keepalived]# scp keepalived.conf [email protected]:/etc/keepalived  ----(發送配置文件給 主 2)
[root@localhost keepalived]# systemctl start keepalived.service  ---(啟動 keepalived 服務)
[root@localhost keepalived]# netstat -antp | grep 12000 ----(查看啟動端口)
tcp        0      0 192.168.154.188:12000   0.0.0.0:*               LISTEN      51911/magent 

4)啟動 memcached 服務

[root@localhost ~]# memcached -m 512k -u root -d -l 192.168.154.128 -p 11211
[root@localhost ~]# netstat -antp | grep 11211 -----(查看端口)
tcp        0      0 192.168.154.128:11211   0.0.0.0:*               LISTEN      53856/memcached

5)在 主 2 上啟動 Keepalived 與 Memcached 服務、創建目錄

[root@localhost ~]# mkdir /opt/shell
[root@localhost shell]# systemctl start keepalived.service 
[root@localhost shell]# netstat -antp | grep 12000
tcp        0      0 192.168.154.188:12000   0.0.0.0:*               LISTEN      50521/magent 
[root@localhost ~]# memcached -m 512k -u root -d -l 192.168.154.129 -p 11211
[root@localhost ~]# netstat -antp | grep 11211

(4)服務搭建完成,開始在客戶端測試主主復制:
1)客戶端連接漂移地址寫入數據

[root@localhost ~]# yum install telnet -y
[root@localhost ~]# telnet 192.168.154.188 12000 -----(遠程連接VIP 地址 端口號 為 12000)
開始寫入數據:
add username 0 0 6
123456
STORED

2)客戶端連接 主1 的 真實 IP 地址 端口 11211 ,查看數據

[root@localhost ~]# telnet 192.168.154.128 12000
get username  -----(查看數據)
VALUE username 0 6   ----(寫入的數據存在)
123456
END

如下圖:
技術分享圖片


3)客戶端連接 主 2 的真實 IP 地址 端口 11211, 查看數據

[root@localhost ~]# telnet 192.168.154.129 11211
get username
VALUE username 0 6
123456
END

如下圖:
技術分享圖片


(5)開始驗證,Keepalived 的高可用:
[root@localhost shell]# systemctl stop keepalived.service ------(停止主1 keepalived 服務)
[root@localhost ~]# telnet 192.168.154.188 12000 ----(客戶端再次連接漂移地址,如果能連接成功,高可用成功)
[root@localhost ~]# ip addr ----(在 主 2 上查看漂移地址)
如下圖:
技術分享圖片

結論:

1·Memcached 是分布式內存對象緩存系統,因為所有數據都存儲在內存中,從而常用於網站加速
2·Memcached 分布式實現不是在服務端實現而是在客戶端實現的
3·Memcached 可以通過 Keepalived 實現 Memcached 服務的高可用性。

Memcached 主主復制 + Keepalived 高可用架構【附上原理】