keepalived 安裝及配置及完成nginx高可用


這節我們來做個關於高可用的小實驗,什么是高可用同學們可以自行去網上搜索相關文章進行學習。

實驗規划:

兩台虛擬機,分別是192.168.26.127(centos7 master),192.168.56.128(centos7 backup)

我們分別用簡稱來代替上面的兩台機器

c7m-->centos7 master

c7b-->centos7 backup

 

c7m 應用規划:

nginx(端口號8601),spingboot web application x 2(端口號分別是8701,8702)

其中nginx 負責負載均衡

其配置文件內容如下:

#user  nobody;
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;


    upstream upstream_name{
        server 192.168.56.127:8701;
        server 192.168.56.127:8702;
    }

    server {
        listen       8601;
        server_name  localhost;
        location / {
            proxy_pass http://upstream_name;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

c7b 應用規划:

nginx(端口號8601),spingboot web application x 2(端口號分別是8801,8802)

其中nginx 負責負載均衡

其配置文件內容如下:

#user  nobody;
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    upstream upstream_name{
        server 192.168.56.128:8801;
        server 192.168.56.128:8802;
    }

    server {
        listen       8601;
        server_name  localhost;

        location / {
            proxy_pass http://upstream_name;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
   
    }

}

spingboot web application 的內容如下:

package com.nginxtest.it.nginxtest;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class NginxtestApplication {

    @Value("${server.port:}")
    private String port;

    public static void main(String[] args) {
        SpringApplication.run(NginxtestApplication.class, args);
    }

    @GetMapping("")
    public String hello() {
        System.out.println("call me " + port);
        return "i am " + port;
    }

}

啟動nginx 和兩個springboot web application 命令如下:

1 nginx
2 nohup java -jar nginxtest-0.0.1-SNAPSHOT.jar --server.port=8701
3 nohup java -jar nginxtest-0.0.1-SNAPSHOT.jar --server.port=8702

 

完成上面的准備工作我們可以打開瀏覽器驗證一下:

輸入地址:http://192.168.56.128/127:8601

 

 

 出現上面的情況說明成功配置了負載均衡,我們來做高可用

 

keepalived 安裝與配置

 

1,keepalived 工作原理

首先Keepalived可以在主機上產生一個虛擬的ip, 這里叫做vip(v是virtual的意思):192.168.56.150, keepalived會將這個vip綁定到交換機上.
當用戶訪問主機:192.168.56.127時, 交換機會通過這個ip和vip的對應找到192.168.56.127上的Nginx進行處理.
如果當有一天192.168.56.127上的Nginx掛掉的時候, Keepalived會立即在備機上生成一個相同的vip: 192.168.56.150, 當用戶繼續訪問192.168.56.127時, 交換機上已經綁定了vip, 這時發現這個vip是存在於192.168.56.128上面的, 所以直接將請求轉發到了備機上.
如果主機被修復好能夠繼續對外提供服務時, 這時keepalived會將主機上繼續生成這個vip, 同時回收在備機上生成的vip. 這個是通過心跳檢查來判斷主機已恢復使用.

 

keepalived 下載地址:

https://www.keepalived.org/download.html

里面有很多版本可以根據項目需要進行選擇

這里我們選擇最新的版本

下載源碼包:

wget https://www.keepalived.org/software/keepalived-2.1.5.tar.gz

解壓縮壓縮包:

tar -xvf keepalived-2.1.5.tar.gz

 

進入keepalived-2.1.5目錄

執行下面的命令,提前可以安裝好 gcc, openssl,openssl-devel等依賴包

./configure --prefix=/usr/local/keepalived
make && make install

執行完成后就會出現上圖的安裝好的keepalived,被安裝在了/usr/local/keepalived下

執行以下命令讓keepalived 成為systemd的應用程序,受systemctl管理,並將其二進制程序加入環境變量

#使keepalived成為systemd的程序,並受systemctl管理,
cp /usr/local/keepalived-2.1.5/keepalived/etc/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived-2.1.5/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ #加入環境變量中 cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
#將配置文件放入/etc/keepalived/下,因為在啟動keepalived時默認找的是這里的配置文件,不放的化會報此配置文件找不到 install -d /etc/keepalived cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

 

修改c7m keepalived 配置文件,內容如下:

! Configuration File for keepalived

global_defs {
   router_id 127master
}
vrrp_script chk_nginx {
        script "/usr/local/nginx_check.sh"
        interval 2
        weight -20
}

vrrp_instance VI_1 {
    state MASTER
    interface enp0s8
    virtual_router_id 51
    priority 200
    advert_int 1
    unicast_src_ip 192.168.56.127
    unicast_peer {
        192.168.56.128
    }
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.56.150/24
    }
}

nginx_check.sh內容如下:

#! /bin/bash
pidof nginx
if [ $? -ne 0 ];then
/etc/init.d/keepalived stop
fi

修改c7b keepalived配置文件,內容如下:

! Configuration File for keepalived

global_defs {
   router_id 128salve
}
vrrp_script chk_nginx {
        script "/usr/local/nginx_check.sh"
        interval 2
        weight -20
}
vrrp_instance VI_1 {
    state BACKUP
    interface enp0s8
    virtual_router_id 51
    priority 100
    advert_int 1
    unicast_src_ip 192.168.56.128
    unicast_peer {
        192.168.56.127
    }
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.56.150/24
    }
}

nginx_check.sh文件和上面的一樣。

下面分別啟動c7m,和c7b下面的nginx,springboot web application,keepalived,命令如下:

c7m

1 nginx
2 nohup java -jar nginxtest-0.0.1-SNAPSHOT.jar --server.port=8701
3 nohup java -jar nginxtest-0.0.1-SNAPSHOT.jar --server.port=8702
4 systemctl start keepalived

c7b

1 nginx
2 nohup java -jar nginxtest-0.0.1-SNAPSHOT.jar --server.port=8801
3 nohup java -jar nginxtest-0.0.1-SNAPSHOT.jar --server.port=8802
4 systemctl start keepalived

上述配置解釋:

首先當主節點啟動時,會在網卡enp0s8上產生一個vip 192.168.56.150 的虛擬地址,這是我們可以測試一下,打開瀏覽器輸入http://192.168.56.158:8601,這是我們能訪問到的通過nginx(192.168.56.127:8601)負載均衡的后端web應用8701,8702,這里有個監測腳本nginx_check.sh 如果此時將192.168.56.127上的nginx停掉,此腳本就會將c7m上的keepalived進程殺死停掉,這時c7m,enp0s8網卡上的vip就會消失(被刪除掉),這時c7b上的keepalived通過心跳監測發現c7m上的keepalived已經停掉了,這時c7b自己就會啟動一個跟c7m上的keepalived一樣的vip(192.168.56.150),這時c7b enp0s8網卡上就會出現一個vip(192.168.56.150),這時 我們在瀏覽器繼續訪問剛才的地址(http://192.168.56.150:8601)此時會發現我們會訪問到通過nginx(192.168.56.128:8601)負載均衡的web應用8801,8802,此時我們就完成了通過keepalived 實現的nginx的高可用,此時如果恢復c7m上的nginx和keepalived,這時c7m通過心跳監測重新獲取主控權,並且c7b的vip 會被刪除,c7m會重新生成vip(192.168.56.150). 此時繼續訪問的話,訪問的又會恢復成8701,8702

下面我們來試試看是不是我們預期的效果:

c7m,c7b都啟動的時候:

 

 停掉c7m的nginx

 

 恢復c7m的nginx和keepalived

 

 好了 我們的實驗就到此完成了,寫的不對的地方請在下方留言。萬分感激。

 

 

參考文檔:

https://www.cnblogs.com/xxoome/p/8621677.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM