1. 程式人生 > >幹貨,memcached+keepalived實現主主復制和高可用,詳解!

幹貨,memcached+keepalived實現主主復制和高可用,詳解!

sdf 功能 部署方式 live sys ref mtu pad gin

keepalived+memcached主主復制高可用介紹:

客戶端連接兩臺服務器之間的VIP地址,如果後端服務器故障自動切換。

技術分享圖片

Keepalive原理:

1.故障檢測:

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

2.主從切換:

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

3.Keepalived如何發現memcached異常:

1) keepalived在memcached主服務器產生一個虛擬IP

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

高可用架構應用場景:

如果memcached分布式節點比較多,那麽完全不需要做基於復制的高可用架構。

基於復制的高可用架構一般用在memcached單節點存放緩存或者session。

部署環境介紹:
操作系統:Centos 7 64位

Node1:192.168.100.12  主節點

Node2:192.168.100.13  備節點
1、環境部署:

兩臺服務器部署方式一樣,按照如下方式部署好即可

(1)安裝memcached依賴libevent

[root@node1 ~]# yum -y install libevent libevent-devel

(2)安裝c語言編譯環境

[root@node1 ~]# yum -y install c++ gcc

(3)安裝具有復制功能的memcached版本

wget http://downloads.sourceforge.net/repcached/memcached-1.2.8-repcached-2.2.tar.gz
tar zxvf memcached-1.2.8-repcached-2.2.tar.gz
cd memcached-1.2.8-repcached-2.2
./configure  --prefix=/usr/local/memcached_replication  --enable-replication

make
make install

註:編譯報錯解決
技術分享圖片

修改memcached.c文件即可:

修改前

[root@node1 memcached-1.2.8-repcached-2.2]# 

vim memcached.c
  56 #ifndef IOV_MAX
  57 #if defined(__FreeBSD__) || defined(__APPLE__)
  58 # define IOV_MAX 1024
  59 #endif
  60 #endif

修改後

56 #ifndef IOV_MAX
57 # define IOV_MAX 1024
58 #endif

安裝完成目錄結構如下:

[root@node1 ~]# tree /usr/local/memcached_replication/
/usr/local/memcached_replication/
├── bin
│   ├── memcached
│   └── memcached-debug
└── share
    └── man
        └── man1
            └── memcached.1

查詢memcached復制版本的的命令幫助只是比普通的memcached多了一個-x選項,就是指定復制的memcached服務器主機名或IP地址

[root@node1 ~]# /usr/local/memcached_replication/bin/memcached -h
-x <ip_addr>  hostname or IP address of peer repcached
2、以主從復制架構啟動memcached

1)創建memcached用戶

[root@node1 ~]# useradd -r -s /sbin/nologin memcached

2)啟動memcached,帶復制功能

Node1節點啟動:

[root@node1 ~]# cd /usr/local/memcached_replication/bin/
[root@node1 bin]# ./memcached -d -u memcached -m 512 -x 192.168.100.13
[root@node1 bin]# ps aux | grep mem
memcach+  20208  0.0  0.0  11704   872 ?        Ss   23:14   0:00 ./memcached -d -u memcached -m 512 -x 192.168.100.13

node2節點啟動:

[root@node2 ~]# cd /usr/local/memcached_replication/bin/
[root@node2 bin]# ./memcached -d -u memcached -m 512 -x 192.168.100.12
[root@node2 bin]# ps aux | grep memcached
memcach+  12162  0.0  0.0  11648   872 ?        Ss   18:22   0:00 ./memcached -d -u memcached -m 512 -x 192.168.100.12
驗證復制架構:

在node1節點插入數據

[root@node1 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is ‘^]‘.
set username 0 0 9
node1xmfb
STORED
get username
VALUE username 0 9
node1xmfb
END

Node2節點驗證數據是否存在

[root@node2 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is ‘^]‘.
get username
VALUE username 0 9
node1xmfb
END

如果在節點1寫入數據節點2可以看到那麽就說明memcached的主從復制架構是沒有問題的,就可以在memcached主從復制的基礎上使用keepalived產生VIP了。

3.Keepalived+memcached高可用架構部署與配置
1)keepalived包安裝
yum install keepalived* -y
2)配置keepalived

Keepalived主節點配置文件設置如下所示:

[root@node1 bin]# cat /etc/keepalived/keepalived.conf
global_defs {
   router_id memcached_replication  #路由標識,主從保持一致
}

vrrp_instance mem_1 {         #定義VRRP熱備實例
    state MASTER              #MASTER表示主節點
    interface eth0            #承載VIP地址的物理接口
    virtual_router_id 51      #虛擬路由器的ID號,主備相同
    priority 100              #優先級,數值越高優先級越大
    advert_int 1              #通知間隔秒數(心跳頻率)
    nopreempt                #不主動搶占資源,只在master或者高優先級服務器設置
    authentication {          #認證信息配置,主從服務器保持一致
            auth_type PASS       #設置認證類型為密碼
            auth_pass asdfgh     #設置認證的密碼
    }
# 定義VIP是什麽
    virtual_ipaddress {
        192.168.100.100
    }
}

# VIP故障檢測
virtual_server 192.168.100.100 11211 {
    deploy_loop 6
    protocol TCP
    # 配置主服務器地址端口
    real_server 192.168.100.10 11211 {
        weight 3
        notify_down /shell/memcached.sh # 當memcached當機時,執行keepalived服務停止
        }
    TCP_CHECK {
        connect_timeout 3      #連接超時
        nb_get_retry 3         #重試次數
        delay_before_retry 3   #重試時間間隔
        connect_port 11211     #連接端口
    }
}

keepalived備節點配置文件設置如下所示:

[root@node2 bin]# cat /etc/keepalived/keepalived.conf
global_defs {
   router_id memcached_replication  #路由標識,主從保持一致
}

vrrp_instance mem_1 {            #定義VRRP熱備實例
    state BACKUP             #MASTER表示主節點
    interface eth0            #承載VIP地址的物理接口
    virtual_router_id 51     #虛擬路由器的ID號,主備相同
    priority 50              #優先級,數值越高優先級越大
    advert_int 1             #通知間隔秒數(心跳頻率)
    nopreempt                #不主動搶占資源,只在master或者高優先級服務器設置
    authentication {         #認證信息配置,主從服務器保持一致
            auth_type PASS       #設置認證類型為密碼
            auth_pass asdfgh     #設置認證的密碼
    }
# 定義VIP是什麽
    virtual_ipaddress {
        192.168.100.100
    }
}

virtual_server 192.168.100.100 11211 {
    deploy_loop 6
    protocol TCP
    # 配置主服務器地址端口
    real_server 192.168.100.11 11211 {
        weight 3
        notify_down /shell/memcached.sh
        }
    TCP_CHECK {
        connect_timeout 3      #連接超時
        nb_get_retry 3         #重試次數
        delay_before_retry 3   #重試時間間隔
        connect_port 11211     #連接端口
    }
}

兩個節點都添加腳本:如果監聽的memcached故障,那麽就本地keepalived,實現VIP漂移

[root@node1 ~]# cat /shell/memcached.sh
systemctl stop keepalived
[root@node1 ~]# chmod +x /shell/memcached.sh
3)兩個節點啟動keepalived服務
[root@node1 ~]# systemctl start keepalived.service
4、高可用驗證

驗證vip已經啟動

[root@node1 ~]# ip address show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:85:36:db brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.12/24 brd 192.168.100.255 scope global dynamic eth0
       valid_lft 20059sec preferred_lft 20059sec
    inet 192.168.100.100/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe85:36db/64 scope link
       valid_lft forever preferred_lft forever
You have new mail in /var/spool/mail/root

強制關閉主節點memcached進程,可以看到vip地址已經不見了

[root@node1 ~]# ps aux | grep keepliaved
root      45424  0.0  0.0 112648   980 pts/0    S+   11:24   0:00 grep --color=auto keepliaved
[root@node1 ~]# ps aux | grep mem
memcach+  45419  0.0  0.1  12672  1924 ?        Ss   11:22   0:00 ./memcached -d -u memcached -m 512 -x 192.168.100.13
root      45427  0.0  0.0 112648   976 pts/0    S+   11:24   0:00 grep --color=auto mem
[root@node1 ~]# kill -9 45419
[root@node1 ~]# ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:85:36:db brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.12/24 brd 192.168.100.255 scope global dynamic eth0
       valid_lft 16561sec preferred_lft 16561sec
    inet6 fe80::20c:29ff:fe85:36db/64 scope link
       valid_lft forever preferred_lft forever

在從節點查看,memcached地址又出現了。

[root@node2 ~]# ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:9e:47:61 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.13/24 brd 192.168.100.255 scope global dynamic eth0
       valid_lft 14759sec preferred_lft 14759sec
    inet 192.168.100.100/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe9e:4761/64 scope link
       valid_lft forever preferred_lft forever

操作成功,謝謝觀看!

幹貨,memcached+keepalived實現主主復制和高可用,詳解!