這節我們來做個關於高可用的小實驗,什么是高可用同學們可以自行去網上搜索相關文章進行學習。
實驗規划:
兩台虛擬機,分別是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
好了 我們的實驗就到此完成了,寫的不對的地方請在下方留言。萬分感激。
參考文檔: