1. 程式人生 > >群集架構篇——nginx反向代理+keepalived雙機熱備+tomcat服務器池+後端數據庫

群集架構篇——nginx反向代理+keepalived雙機熱備+tomcat服務器池+後端數據庫

virtual def set defs efault ddd .tar.gz web-inf 執行權限

一、系統環境

1、2臺CentOS 7作為nginx服務器綁定同一塊虛擬網卡:vnet1
對應的IP分別為:192.168.80.100
192.168.80.110
2、2臺CentOS 7作為tomcat服務器同樣綁定同一款網卡:vnet1
對應的IP設置為:192.168.80.120
192.168.80.130
3、1臺CentOS 7 作為後端數據庫綁定網卡:vnet1對應的IP為192.168.80.140

二、項目簡介

1、拓撲圖
技術分享圖片
2、項目說明
(1)兩臺nginx服務器作反代理
(2)兩臺nginx服務器實現雙機熱備
(3)Nginx+tomcat實現負載均衡
(4)在tomcat上部署商城項目實現tomcat服務器與數據庫的對接

3、項目需求
實現niginx服務器互為熱備份,一臺服務器停止,另外一臺繼續運行。tomcat負載均衡,同樣一臺停止工作另外一臺能繼續工作,整個項目是為了讓商城項目成功運行,並且在後臺服務器down機過程中,用戶無感知。

三、項目部署

部署nginx服務器

1、安裝nginx服務器(另外一臺相同操作)

yum install -y \        //搭建安裝工具和編輯環境
gcc gcc-c++ make openssl-devel zlib-devel pcre-devel

useradd -s /sbin/nologin -M nginx      //添加帳號

tar vxf nginx-1.13.9.tar.gz //解壓nginx源碼包

cd nginx-1.13.9 
./configure \       //檢查環境
--prefix=/usr/local/nginx \     //指定安裝路徑
--user=nginx --group=nginx 
make && make install //編譯並且安裝

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/      //nginx命令做軟連接方便使用

vi /etc/init.d/nginx        //制作nginx啟動腳本
#!/bin/bash
# chkconfig: 35 99 20
# description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
  start)
    $PROG
    ;;
  stop)
    kill -s QUIT $(cat $PIDF)
    ;;
  restart)
    $0 stop
    $0 start
    ;;
  reload)
    kill -s HUP $(cat $PIDF)
    ;;
  *)
        echo "Usage: $0 {start|stop|restart|reload}"
        exit 1
esac
exit 0
chmod +x /etc/init.d/nginx   //更改啟動腳本的權限
chkconfig --add nginx       //將腳本添加到systemctl環境中
systemctl start nginx   //啟動nginx服務器

2、驗證兩臺nginx服務器搭建成功
驗證第一臺:192.168.80.100
技術分享圖片
驗證第二臺:192.168.80.110
技術分享圖片

部署keepalived雙機熱備

1、nginx主服務器中安裝keepalived

yum -y install \        //安裝所需環境
popt-devel kernel-devel openssl-devel
tar xvf keepalived-1.4.2.tar.gz     //解壓源碼安裝包

cd keepalived-1.4.2         //進目錄
./configure --prefix=/      //檢查編譯環境
make && make install    //編譯並安裝

cp keepalived/etc/init.d/keepalived /etc/init.d/        //將keepalived添加開機進程中
systemctl enable keepalived         //設置開機自啟

2、修改keepalived配置文件

vi /etc/keepalived/keepalived.conf
刪除所有內容添加下面內容:
! Configuration File for keepalived
global_defs {
        route_id NGINX-01       //服務器名稱
   }
vrrp_script nginx {
        script "/opt/nginx.sh"  //keepalived狀態檢查配置文件的路徑
        interval 2
        weight -10  //檢查失敗對應優先級減少的值
}
vrrp_instance VI_1 {
    state MASTER        //狀態為主服務器
    interface ens33
    virtual_router_id 51
    priority 150        //優先級設為150
    advert_int 1
    authentication {
        auth_type PASS  //認證方式  
        auth_pass 1111  //認證密碼
    }
    track_script {
        nginx
        }
    virtual_ipaddress {
        192.168.80.90       //兩臺nginx服務器共同的虛擬IP也稱漂移地址
    }
}

3、添加檢查keepalived狀態的配置文件

vi /opt/nginx.sh    //該腳本方便同時將nginx和keepalived服務器同時啟動
添加以下內容
#!/bin/bash 
#Filename:nginx.sh
A=$(ps -ef | grep keepalived | grep -v grep | wc -l)
if [ $A -gt 0 ]; then
        /etc/init.d/nginx start
else
        /etc/init.d/nginx stop
fi

chmod +x /opt/nginx.sh      //添加執行權限
systemctl start keepalived  //開啟服務

4、驗證漂移地址vip是否生成
ip addr show dev ens33
技術分享圖片
5、nginx從服務器所有部署如上區別如下:
(1)keepalived.conf配置文件中route_id更改為NGINX-02,狀態state更改為從服務器BACKUP,優先級priority更改為100。
vi /etc/keepalived/keepalived
刪除所有內容添加下面內容:

! Configuration File for keepalived
global_defs {
        route_id NGINX-02       //服務器名稱為02
   }
vrrp_script nginx {
        script "/opt/nginx.sh"  //keepalived狀態檢查配置文件的路徑
        interval 2
        weight -10  //檢查失敗對應優先級減少的值
}
vrrp_instance VI_1 {
    state BACKUP        //狀態為從服務器
    interface ens33
    virtual_router_id 51
    priority 100        //優先級設為100與主相差50
    advert_int 1
    authentication {
        auth_type PASS  //認證方式  
        auth_pass 1111  //認證密碼
    }
    track_script {
        nginx
        }
    virtual_ipaddress {
        192.168.80.90       //兩臺nginx服務器共同的虛擬IP也稱漂移地址
    }
}

(2)nginx.sh腳本中nginx服務的啟動不是根據keepalived的啟動而啟動,而是根據
判斷漂移地址是否存在而啟動nginx服務。

vi /opt/nginx.sh
#!/bin/bash
#Filename:nginx.sh
A=$(ip addr | grep 192.168.80.90/32 | grep -v grep | wc -l)
if [ $A -gt 0 ]; then
        /etc/init.d/nginx start
else
        /etc/init.d/nginx stop
fi

6、驗證nginx從服務器配置是否生效
停止主服務器查看漂移地址
技術分享圖片
漂移地址出現在從服務器上
技術分享圖片
重啟主服務器再次查看漂移地址
技術分享圖片
漂移地址重新回到主服務器從服務器處於熱備狀態
技術分享圖片
7、驗證漂移地址是否能訪問nginx
技術分享圖片
主服務器down機驗證訪問
技術分享圖片
技術分享圖片

部署tomcat

說明:
由於tomat服務器是運行在jdk環境中,因此首先要搭建jdk環境。
1、搭建jdk環境

tar xvf jdk-8u144-linux-x64.tar.gz      //解壓jdk
cp -r jdk1.8.0_144/ /usr/local/java     //將解壓好的jdk下的文件復制到java目錄下
vi /etc/profile     //添加jdk系統變量
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export PATH=$PATH:/usr/local/java/bin
export CLASSPATH=./:/usr/local/java/lib:/usr/local/java/jre/lib
source /etc/profile     //刷新下文件
java -version       //查看版本成功說明環境搭建成功

技術分享圖片
2、安裝tomcat

tar xvf apache-tomcat-8.5.23.tar.gz     //解壓軟件包
cp -r apache-tomcat-8.5.23 /usr/local/tomcat8   //將解壓好包復制到tomcat8目錄下

//將tomcat啟動命令軟鏈接到系統命令的目錄下重命名為tomcatup方便使用
ln -s /usr/local/tomcat8/bin/startup.sh /usr/bin/tomcatup       
ln -s /usr/local/tomcat8/bin/shutdown.sh /usr/bin/tomcatdown

tomcatup        //啟動tomcat

3、驗證兩臺tomcat服務器是否成功訪問(另一臺tomcat部署操作上同)
驗證訪問第一臺192.168.80.120:8080
技術分享圖片
驗證訪問第二臺192.168.80.130:8080
技術分享圖片

部署nginx反代理

1、配置nginx服務器
vi /usr/local/nginx/conf/nginx.conf
刪除location塊中的內容添加反向代理
proxy_pass http://tomcat_pool;
技術分享圖片
2、定義上遊請求實現負載均衡
在server模塊上面添加名為tomcat_pool地址池

upstream tomcat_pool {
        servername 192.168.80.120:8080 weight=1;
Servername 192.168.80.130:8080 weight=1;
}

技術分享圖片
3、檢查配置文件重啟nginx

nginx -t
systemctl restart nginx

技術分享圖片
4、驗證通過nginx服務器vip地址:192.168.80.90訪問tomcat服務器
技術分享圖片

部署後端數據庫

1、搭建安裝環境

yum -y install gcc gcc-c++ make ncurses ncurses-devel bison Cmake

2、添加數據庫用戶
useradd -s /sbin/nologin mysql //添加數據庫用戶
3、安裝mysql數據庫

tar xf mysql-boost-5.7.20.tar.gz –C /opt/       //解壓源碼包

cmake \     //檢查安裝配置環境
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock -DSYSCONFDIR=/etc -DSYSTEMD_PID_DIR=/usr/local/mysql -DDEFAULT_CHARSET=utf8  -DDEFAULT_COLLATION=utf8_general_ci -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 -DMYSQL_DATADIR=/usr/local/mysql/data -DWITH_BOOST=boost -DWITH_SYSTEMD=1

make && make install        //編譯安裝

chown -R mysql.mysql /usr/local/mysql/  //將數據庫安裝目錄的使用權限給用戶mysql

vi /etc/my.cnf  //將主配置文件清空添加以下內容
[client]
port = 3306 
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock

[mysql]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock

[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES

chown mysql:mysql /etc/my.cnf       //更改主配置文件的權限

echo ‘PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH‘ >> /etc/profile
echo ‘export PATH‘ >> /etc/profile      //添加系統環境變量
source /etc/profile //刷新立即生效

cd /usr/local/mysql/        //進入安裝目錄初始化數據庫
bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

cp usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/       //制作數據庫系統啟動命令
systemctl daemon-reload           //刷新識別啟動腳本
systemctl start mysqld      //啟動數據庫
netstat -anpt | grep 3306       //查看端口是否在監聽狀態

技術分享圖片

systemctl enable mysqld     //開機自啟
mysqladmin -u root -p password "abc123"     //添加數據庫用戶
mysql -u root -p        //進入數據庫

技術分享圖片

部署商城項目

1、將商城項目上傳到兩臺tomcat服務器中(兩臺配置一樣以其中一臺為例)
tar xf SLSaleSystem.tar.gz //解壓寫好的商城項目
2、修改tomcat主配置文件
vi /usr/local/tomcat8/conf/server.xml
在webapps站點下指定項目的路徑
<Context docBase="" path="/root/SLSaleSystem" reloadable="flase">
技術分享圖片
3、tomcat與後端數據庫對接實現用戶登陸

mysql -u root –p    //進入數據庫
create database slsaledb;   //為商城項目創建數據庫
GRANT all ON slsaledb.* TO ‘testuser‘@‘%‘ IDENTIFIED BY ‘admin123‘;      //授權testuser   用戶連接slsaledb數據庫
flush privileges;
mysql -u root -p  < slsaledb-2014-4-10.sql      //商城項目對應的數據庫文件上傳到slsaledb數據庫中

4、更改商城項目中的數據庫對接配置文件
vi SLSaleSystem/WEB-INF/classes/jdbc.properties
技術分享圖片
5、重啟tomcat服務器並用本地服務器地址訪問登陸

tomcatdown
tomcatup

訪問192.168.80.120:8080
技術分享圖片
技術分享圖片
6、驗證nginx代理服務器vip訪問
由於商城項目有登陸會話界面因此要想登陸成功需要在nginx服務器的代理地址池中添加會話保持功能,ip_hash;
技術分享圖片
技術分享圖片
技術分享圖片
7、測試用戶down機用戶無感知訪問
先down掉主nginx服務器驗證訪問

systemctl stop keepalived
killall -9 nginx
netstat -anput | grep nginx

技術分享圖片
技術分享圖片
技術分享圖片
同時down掉一臺tomcat服務器驗證訪問(down掉192.168.80.120服務器)
tomcatdown
並用tomcat本地IP驗證down機成功
技術分享圖片
訪問vip:192.168.80.90
技術分享圖片
技術分享圖片

四、總結

本文只做了簡單的架構,現實中還需在nginx服務器和tomcat服務器中做各種優化,以便讓客戶感受最佳的訪問效果。

群集架構篇——nginx反向代理+keepalived雙機熱備+tomcat服務器池+後端數據庫