實驗目的
-
掌握基于?
repcached
?的 Memcached 主主復制配置 -
實現通過 Keepalived 的 VIP 高可用機制
-
驗證數據雙向同步及故障自動切換能力
實驗環境
角色 | IP 地址 | 主機名 | 虛擬 IP (VIP) |
---|---|---|---|
主節點 | 10.1.1.78 | server-a | 10.1.1.80 |
備節點 | 10.1.1.79 | server-b | 10.1.1.80 |
-
操作系統: CentOS 7
-
軟件版本: memcached-1.2.8-repcached-2.2
一、搭建memcached 主主復制
Memcached 的復制功能支持多個 Memcached 之間相互復制(雙向復制,主備都是可讀可寫的),可以解決 Memcached 的容災問題。
memcached 本身不支持相互復制,若已安裝,需要卸載rpm 安裝的memcached ,換帶有支持復制功能的memcached;
yum -y remove memcached
(1)環境準備
假設有兩臺服務器用于 Memcached 主主復制,分別為 Server A(10.1.1.78)和 Server B(10.1.1.79)。確保兩臺服務器都運行 CentOS 7 系統,并且網絡可以正常通信。
注意實驗時需要設置防火墻規則,學習時期可直接關閉防火墻,因此兩臺虛擬機都需關閉防火墻
?
sudo firewall-cmd --add-port=11211/tcp --permanent
sudo firewall-cmd --reload#注意也可以執行以下命令關閉防火墻(centos7中若要關閉防火墻兩個都要關,具體使用規則可查看本人其他博客)
systemctl stop firewalld
systemctl stop iptables
(2)安裝依賴
在兩臺服務器上都執行以下命令安裝編譯所需的依賴:
yum install -y gcc make libevent-devel
(3)下載并安裝支持復制的 Memcached(repcached)
repcached 是實現 Memcached 復制功能的擴展,以下是安裝步驟:
下載下面的壓縮包并上傳兩臺虛擬機,并執行wgte命令下載 repcached
Docs
wget http://downloads.sourceforge.net/repcached/memcached-1.2.8-repcached-2.2.tar.gz
如果上述鏈接不可用,你可以在 SourceForge 等網站上查找合適的版本。
(4)解壓文件
tar zxvf memcached-1.2.8-repcached-2.2.tar.gz
ls ?
cd memcached-1.2.8-repcached-2.2
(5)置編譯選項
./configure --prefix=/usr/local/memcached --enable-replication --with-libevent=/usr/lib64/
(6) 編譯并安裝
make clean
make &&make install
編譯過程中若報錯,處理后再編譯:
修改memcached.c,刪除兩行如下圖所示,大概在五十多行左右,可輸入命令行:set nu顯示行數
修改 replication.c文件,增加紅色框住的一行
(7)配置主主復制
1. 啟動 Server A 的 Memcached
#創建對應的用戶
useradd memcached
?
#進到對應目錄啟動服務
cd /usr/local/memcached/bin
./memcached -d -u memcached -m 64 -l 10.1.1.78 -p 11211 -x 10.1.1.79
?
注:若配合調度器上面的指令改成
./memcached -d -u memcached -m 64 -l 0.0.0.0 -p 11211 -x 10.1.1.79
?
?
#啟動服務后一定要查看進程,看到底服務啟動沒
netstat -naptl |grep memcached
?
注:netstat 這個網絡指令來源于net-tools 這個軟件包,沒有就自己安裝!
sudo yum install net-tools?
#停掉服務的方法
pkill -9 memcached
參數說明:
-d
:以守護進程模式運行。-u root
:以 root 用戶身份運行。-m 64
:分配 64MB 內存給 Memcached。-l 10.1.1.78
:監聽的 IP 地址。-p 11211
:監聽的端口。-x 10.1.1.79
:指定要同步數據的對端服務器 IP。
2. 啟動 Server B 的 Memcached
#創建對應的用戶
useradd memcached
?
#進到對應目錄啟動服務
cd /usr/local/memcached/bin
./memcached -d -u memcached -m 64 -l 10.1.1.79 -p 11211 -x 10.1.1.78
?
注:若配合調度器上面的指令改成
./memcached -d -u memcached -m 64 -l 0.0.0.0 -p 11211 -x 10.1.1.78
?
?
#啟動服務后一定要查看進程,看到底服務啟動沒
netstat -naptl |grep memcached
?
注:netstat 這個網絡指令來源于net-tools 這個軟件包,沒有就自己安裝!
sudo yum install net-tools?
#停掉服務的方法
pkill -9 memcached
(8)驗證主主復制
注意若沒有telnet命令可自行下載
sudo yum install telnet -y
1. 在 Server A 插入數據
telnet 10.1.1.78 11211
set test 0 0 5
hello
quit
2. 在 Server B 驗證數據
telnet 10.1.1.79 11211
get test
如果能獲取到在 Server A 上插入的數據,說明主主復制配置成功。同理,在 Server B 上插入數據,也應該能在 Server A 上獲取到。
注意:同步的前提,使用相同用戶啟動服務;
二、搭建memcached 主主復制+keepalived 高可用
(1)在兩個節點上都安裝keepalived
yum -y install keepalived ipvsadm
(2)在10.1.1.78?上的配置
cd /etc/keepalived/
vi keepalived.conf
# 清空原文件并寫入以下內容(示例為10.1.1.78主節點配置)
cat > /etc/keepalived/keepalived.conf <<'EOF'
! Configuration File for keepalivedglobal_defs {router_id LVS_DEVEL
}vrrp_script chk_memcached {script "/usr/bin/pgrep memcached" # 檢測Memcached進程interval 2weight -20
}vrrp_instance VI_1 {state MASTER # 主節點設為MASTER,備節點設為BACKUPinterface ens33 # 網卡名(通過ip addr查看實際名稱)virtual_router_id 51priority 100 # 備節點改為90advert_int 1authentication {auth_type PASSauth_pass 1111 # 密碼需主備一致}virtual_ipaddress {10.1.1.80/24 # 虛擬IP(VIP)}track_script {chk_memcached}
}
EOF
在10.1.1.79上,僅修改state和priority
cat > /etc/keepalived/keepalived.conf <<'EOF'
! Configuration File for keepalivedglobal_defs {router_id LVS_DEVEL_79 # 唯一標識,建議改為節點相關名稱
}vrrp_script chk_memcached {script "/usr/bin/pgrep memcached" # 檢測Memcached進程interval 2weight -20
}vrrp_instance VI_1 {state BACKUP # 明確指定為備節點interface ens33 # 網卡名(需與ip addr顯示一致)virtual_router_id 51 # 必須與主節點相同priority 90 # 優先級低于主節點(100)advert_int 1authentication {auth_type PASSauth_pass 1111 # 密碼與主節點一致}virtual_ipaddress {10.1.1.80/24 # 相同的虛擬IP}track_script {chk_memcached}
}
EOF
(3)啟動keepalived
systemctl start keepalived
systemctl enable keepalived
systemctl status keepalived
(4) 測試故障切換
ip addr show ens33
pkill -9 memcached
最開始:
查看10.1.1.78,此時有10.1.1.80的VIP,
查看10.1.1.79,沒有10.1.1.80的VIP
手動停止memcached后:
?在 主10.1.1.78上
pkill -9 memcached
觀察vip 飄逸
78上沒有80,79上有80
?
實驗結論
-
主主復制有效性
-
數據在 10.1.1.78 和 10.1.1.79 之間實現雙向同步,寫入任一節點的數據均能實時同步至對端。
-
通過?
stats replication
?確認復制狀態為?connected
,同步字節數 (replication_bytes
) 持續增長。
-
-
高可用性驗證
-
當主節點 Memcached 服務終止時,Keepalived 在?2秒內?將 VIP (10.1.1.80) 漂移至備節點。
-
客戶端通過 VIP 訪問服務無感知中斷,實現無縫故障轉移。
-
-
關鍵問題與解決
-
編譯錯誤: 通過修改?
memcached.c
?定義?IOV_MAX
?解決。 -
同步失敗: 因防火墻未放行 11212 復制端口,關閉防火墻后恢復正常。
-
實驗總結
本次實驗成功構建了 Memcached 主主復制集群,并結合 Keepalived 實現高可用。關鍵成果包括:
-
數據冗余:雙向復制確保單節點故障時數據不丟失。
-
服務連續性:VIP 機制保障客戶端訪問零中斷。
-
可擴展性:架構支持后續添加更多節點。