文章目錄
前言:
之前我們部署了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服務器是不會進行同步的