Linux系統架構----memcache高可用羣集部署

前言:

之前我們部署了memcache單節點,本篇博客介紹memcache羣集

一、memcached羣集分析

1.1 memcached羣集實現高可用組件
  • 由於Mamcached服務器與服務器之間沒有任何通信,並且不進行任何數據複製備份,所以當任何服務器節點出現故障時,會出現單點故障,如果需要實現高可用,就需要通過其他方式。這裏通過Magent緩存代理,防止單點現象,緩存代理也可以做備份功能,通過客戶端連接到緩存代理了服務器,緩存代理服務器連接緩存連接復甦期,緩存代理服務器可以連接多臺Memcached機器可以將每臺Memcached機器進行數據同步,如果其中有一臺緩存服務器down了,系統依然可以繼續工作,如果其中一臺Memcached機器down了,數據不會丟失並且可以保證數據的完整性。

  • magent(memcached代理服務器軟件)工作原理是magent可以備份數據,而且magent可以同時連接多個memcached節點,當memcached重啓或者宕機恢復後可以從magent指定的memcached的備份節點中恢復丟失的緩存數據

  • keepalived 功能:

    ① 故障檢測:

    Keepalived可用檢測memcached服務器的狀態是否正常

    ② 主從切換

    Keepalived如果檢測到memcached服務發生DOWN機或者死機等,能將VIP從主服務器移至從服務器

    ③ keepalived檢測過程

    • keepalived在memcached主服務器產生一個虛擬IP
    • keepalived可以通過不斷的檢測memcached主服務器的11211端口是否正常工作,如果發現memcached Down機,虛擬IP就從主服務器移到從服務器

1.2 高可用架構應用場景

  • 如果memcached分佈式節點比較多,那麼完全不需要做基於複製的高可用架構。
  • 基於複製的高可用架構一般用在memcached單節點存放緩存或者session。

在這裏插入圖片描述

二、memcache集羣實現原理

2.1 一致性Hash算法

在這裏插入圖片描述

  • 算法過程

    ① 先構造一個長度爲2的32次方的整數環(這個環被稱爲一致性Hash環),根據節點名稱的Hash值(其分佈爲[0,2^32 -1])將緩存服務器節點放置在這個Hash環上。

    ② 然後根據需要緩存的數據Key值計算得到其Hash值(其分佈也爲[0,2^32-1])

    ③ 最後在Hash環上順時針查找到距離這個Key值最近的服務器節點,完成Key到服務器的映射查找

  • 如上圖所示

    三個node節點分別位於Hash環上的三個位置,然後Key值根據HashCode,在Hash環上有一個固定位置,位置固定下之後,Key就會順時針去尋找離他最近的一個Node,把數據存儲在這個Node的Memcache服務器中

三、memcache集羣部署

3.1 實驗拓撲

在這裏插入圖片描述

3.2 實驗環境
  • 本次實驗使用三臺虛擬機

  • memcached master節點 IP地址:192.168.226.128

    準備的軟件包

    • ① magent-0.5.tar.gz
    • ② memcached-1.5.6.tar.gz
    • ③ libevent-2.1.8-stable.tar.gz
  • memcached slave節點 IP地址:192.168.226.132

    準備的軟件包

    • ① memcached-1.5.6.tar.gz
    • ② libevent-2.1.8-stable.tar.gz
  • 客戶端 client IP地址:192.168.226.133

3.3 配置memcached master節點
[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# su
   
#安裝環境包及keepalived(高可用軟件)
[root@master ~]# yum install gcc gcc-c++ make keepalived -y

#關閉防火牆、增強性安全功能
[root@master ~]# systemctl stop firewalld
[root@master ~]# setenforce 0

#解壓三個軟件包
[root@master ~]# mount.cifs //192.168.226.1/LAMP-C7 /mnt
Password for root@//192.168.226.1/LAMP-C7:  
[root@master ~]# cd /mnt
[root@master mnt]# tar zxvf memcached-1.5.6.tar.gz -C /opt
[root@master mnt]# tar xzvf libevent-2.1.8-stable.tar.gz -C /opt
[root@master mnt]# mkdir /opt/magent
[root@master mnt]# tar xzvf magent-0.5.tar.gz -C /opt/magent/
ketama.c
magent.c
ketama.h
Makefile
  • 手工編譯安裝事件通知庫
[root@master mnt]# cd /opt
[root@master opt]# cd libevent-2.1.8-stable/
[root@master libevent-2.1.8-stable]# ./configure --prefix=/usr
[root@master libevent-2.1.8-stable]# make && make install
  • 手工編譯安裝memcached服務端
[root@master libevent-2.1.8-stable]# cd /opt/memcached-1.5.6/

#指定存放位置
[root@master memcached-1.5.6]# ./configure --with-libevent=/usr/local
[root@master memcached-1.5.6]# make && make install
  • 修改magent插件
[root@master memcached-1.5.6]# cd /opt/magent/
[root@master magent]# vim ketama.h 
#修改前兩行
#ifndef SSIZE_MAX
#define SSIZE_MAX 32767
------->wq
  • 指定Makefile文件
[root@master magent]# vim Makefile 
#在首行尾部添加-lm
LIBS = -levent -lm
------>wq

#直接make編譯,編譯完成後會生成一個可執行文件
[root@master magent]# make
gcc -Wall -O2 -g  -c -o magent.o magent.c
gcc -Wall -O2 -g  -c -o ketama.o ketama.c
gcc -Wall -O2 -g -o magent magent.o ketama.o -levent -lm
[root@master magent]# ls
ketama.c  ketama.h  ketama.o  magent  magent.c  magent.o  Makefile
#生成了一個magent執行文件

#把magent複製到/usr/bin目錄下
[root@master magent]# cp magent /usr/bin

#在把腳本使用SCP 推送到從節點
[root@master magent]# scp magent [email protected]:/usr/bin
The authenticity of host '192.168.226.132 (192.168.226.132)' can't be established.
ECDSA key fingerprint is SHA256:ZDueYh/RhhG5JxHA1Qj8kwGooD3NotleXDWOUAdAPl4.
ECDSA key fingerprint is MD5:54:54:c7:88:b6:65:73:73:0f:c1:b5:22:00:95:d4:03.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.226.132' (ECDSA) to the list of known hosts.
[email protected]'s password: 
magent                                         100%  112KB  11.5MB/s   00:00    
[root@master magent]# 
  • 修改keepalived配置文件

#31行以下我們這裏暫時不需要,可以直接1000dd刪除

! Configuration File for keepalived

vrrp_script magent{
        script "/opt/shell/magent.sh"	#腳本位置
        interval 2						#間隔時間爲2秒
}
#以上爲添加內容,定義一個函數,函數名爲magent
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 MAGENT_HA
}

vrrp_instance VI_1 {					#實例模塊
    state MASTER
    interface ens33						#網卡名稱爲ens33
    virtual_router_id 51
    priority 100 
    advert_int 1
    authentication {					#驗證模塊,直接使用默認的即可
        auth_type PASS
        auth_pass 1111
    }   
#此處添加調用模塊magent
    track_script {
        magent							#調用的函數名
    }   
    virtual_ipaddress {					#定義漂移地址
        192.168.226.100
    }   
}
#配置文件加載過程,先越過我們添加的函數加載global模塊,然後
  • 該配置文件的加載過程爲
    • ① 先加載global_defs模塊(越過我們添加的函數)
    • ② 加載實例模塊vrrp_instance VI_1
    • ③ 加載到我們添加的調用模塊後,會通過magent名稱,調用我們設置的腳本
    • ④ 最後加載漂移地址模塊virtual_ipaddress
  • 創建keepalived定義的腳本
[root@master magent]# mkdir /opt/shell
[root@master magent]# cd /opt/shell/
[root@master shell]# vim magent.sh
#!/bin/bash
#定義變量名K:檢查keepalived是否開啓
K=`ps -ef | grep keepalived | grep -v grep | wc -l`
#如果keepalived進程爲開啓狀態
if [ $K -gt 0 ]; then
#加載magent插件
#-n(指定連接數量) 
#-p(映射的keepalived端口12000)
#-s (主服務器:mamcache端口號)
#-b(主服務器:memcache端口號)
magent -u root -n 51200 -l 192.168.226.100 -p 12000 -s 192.168.226.128:11211 -b 192.168.226.132:11211
else
#否則就關閉magent插件所有進程
pkill -9 magent
fi
----->wq
[root@master shell]# chmoe +x magent.sh

#建立libevent軟鏈接,否則可能會出錯
[root@master shell]# ln -s /lib/libevent-2.1.so.6* /usr/lib64/
3.4 配置memcache slave節點
[root@localhost ~]# hostnamectl set-hostname slave
[root@localhost ~]# su

#安裝依賴環境和keepalived
[root@slave ~]# yum install gcc gcc-c++ make keepalived -y

#關閉防火牆、增強性安全功能
[root@slave ~]# systemctl stop firewalld.service 
[root@slave ~]# setenforce 0

[root@slave ~]# mount.cifs //192.168.226.1/LAMP-C7 /mnt
Password for root@//192.168.226.1/LAMP-C7:  
[root@slave ~]# cd /mnt
[root@slave mnt]# tar xzvf libevent-2.1.8-stable.tar.gz -C /opt
[root@slave mnt]# tar xzvf memcached-1.5.6.tar.gz -C /opt

#手工編譯libevent
[root@slave mnt]# cd /opt/libevent-2.1.8-stable/
[root@slave libevent-2.1.8-stable]# ./configure --prefix=/usr
[root@slave libevent-2.1.8-stable]# make && make install
......省略部分內容

#手工編譯memcached
[root@slave libevent-2.1.8-stable]# cd /opt/memcached-1.5.6
[root@slave libevent-2.1.8-stable]# ./configure --with-libevent=/usr/local
[root@slave libevent-2.1.8-stable]# make && make install
  • 備份keepalived配置文件,從master節點上覆制keepalived文件
[root@slave memcached-1.5.6]# cd /etc/keepalived/
[root@slave keepalived]# ls
keepalived.conf
[root@slave keepalived]# mv keepalived.conf keepalived.conf.bak
[root@slave keepalived]# scp [email protected]:/etc/keepalived/keepalived.conf ./
[root@slave keepalived]# ls
keepalived.conf  keepalived.conf.bak
[root@slave keepalived]# vim keepalived.conf
#稍微做下修改即可
#17行 router_id 修改
router_id MAGENT_HB

#21行 MASTER修改爲BACKUP
state BACKUP

#23行 修改router_id
virtual_router_id 52

#24行 修改優先級,低於master系欸按
priority 95
----》wq

#創建軟鏈接
[root@slave keepalived]# ln -s /lib/libevent-2.1.so.6* /usr/lib64/
  • 創建magent腳本文件目錄,從master節點下載magent腳本
[root@slave keepalived]# mkdir /opt/shell
[root@slave keepalived]# cd /opt/shell
[root@slave shell]# scp [email protected]:/opt/shell/magent.sh ./
[root@slave shell]# chmod +x magent.sh 
[root@slave shell]# ls
magent.sh
  • 兩臺memcahe服務器均開啓服務
[root@slave shell]# systemctl start keepalived.service 
[root@slave shell]# memcached -m 512k -u root -d -l 192.168.226.132 -p 11211

[root@slave shell]# netstat -natp | grep 12000
tcp        0      0 192.168.226.100:12000     0.0.0.0:*               LISTEN      14737/magent
[root@slave shell]# netstat -natp | grep 11211
tcp        0      0 192.168.226.132:11211   0.0.0.0:*               LISTEN      130493/memcached  
  • ip addr 查看虛擬IP
[root@slave shell]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:fe:08:5b brd ff:ff:ff:ff:ff:ff
    inet 192.168.226.132/24 brd 192.168.226.255 scope global dynamic ens33
       valid_lft 1775sec preferred_lft 1775sec
    inet 192.168.226.100/32 scope global ens33
#inet 192.168.226.100 地址已經生成
3.5 驗證
  • 所有服務器安裝telnet軟件
yum install telnet -y
  • 客戶端以虛擬IP和magent代理端口連接
[root@client ~]# telnet 192.168.226.100 12000
Trying 192.168.226.100...
Connected to 192.168.226.100.
Escape character is '^]'.
#創建數據
add work 0 0 7
1234567
stored
get work
VALUE work 0 7
123456
  • 在主節點和從節點查看

    主從節點均可以查看到數據

[root@slave ~]# telnet 192.168.226.132 11211
Trying 192.168.226.132...
Connected to 192.168.226.132.
Escape character is '^]'.
get work
VALUE work 0 7
1234567
END
  • 如果在slave節點更新數據,master服務器是不會進行同步的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章