keepalived+nginx+tomcat+redis實現(xiàn)負載均衡和session共享

注:以下內(nèi)容均在虛擬機上完成,屬測試環(huán)境村缸。

歡迎大家留言交流祠肥!

架構:

兩臺服務器,兩個實體IP梯皿,一個虛擬IP仇箱。
如下圖所示,服務器正常運行時东羹,keepalived主保證Nginx的HA剂桥,Nginx主負責兩臺Tomcat服務器負載均衡,Redis主負責Tomcat1和2的Session共享属提。
當主節(jié)點的一個或者多個服務無法正常運行渊额,甚至節(jié)點宕機時,備節(jié)點能立即接續(xù)主節(jié)點來執(zhí)行業(yè)務垒拢。從而實現(xiàn)業(yè)務的不中斷或短暫中斷旬迹。
優(yōu)勢:適合硬件有限的小規(guī)模集群,且能保證服務器的穩(wěn)定求类、高可用運行奔垦。可持續(xù)發(fā)展來看尸疆,集群規(guī)拇涣裕可升級——麻雀雖小五臟俱全。
劣勢:對業(yè)務的處理能力有限寿弱,畢竟服務器僅兩臺犯眠。

image.png

環(huán)境:
節(jié)點名 IP 配置 端口開放 VIP
web1 172.16.69.120 6G內(nèi)存、256Gb磁盤 8080症革、8888筐咧、11211 172.16.69.180
web2 172.16.69.121 6G內(nèi)存、256Gb磁盤 8080噪矛、8888量蕊、11211 172.16.69.180
CentOS6.7 64位
JDK 1.7.0_80
Keepalived v1.2.13
Nginx 1.10.2
Tomcat 7.0.75
Redis 4.0.2
所需jar包:
commons-pool2-2.4.1.jar
jedis-2.6.2.jar
tomcat-redis-session-manager1.2.jar

集群:

一、安裝前準備(雙節(jié)點都需要實施)

1艇挨、下載所需的包残炮,網(wǎng)址:鏈接:https://pan.baidu.com/s/1aMMQQx5Pjd7GfHx6Z6kfzA 密碼:ys93
下載好以后,通過winSCP缩滨、Xftp等工具將包上傳到/home/soft目錄下(mkdir /home/soft)
并賦予該目錄下所有文件/文件夾可執(zhí)行權限(chmod -R 755 *)

2势就、測試環(huán)境泉瞻,先關閉防火墻。
CentOS6.7默認用的是iptables防火墻

#service iptables stop  --關閉iptables
#chkconfig iptables off  --禁止iptables開機啟動
二苞冯、配置本地yum源(雙節(jié)點都需要安裝)

1袖牙、先將ios文件上傳到media目錄下
2、掛載:

#mkidr /mnt/rom  --創(chuàng)建掛載的目錄
#mount -o loop -t iso9660 /media/CentOS-6.7-x86_64-bin-DVD1.iso /mnt/rom    ——掛載

3抱完、修改yum配置

#mkdir /home/yum.repos.d_bak  --創(chuàng)建備份目錄
#cd /etc/yum.repos.d
#mv * /home/yum.repos.d_bak --將配置文件移走贼陶,以作備份
#vi myself.repo  --新建配置文件
[myself]
name=CentOS-6.7
baseurl=file:///mnt/rom    --iso掛載目錄
\gpgcheck=0    --不啟用包檢查
enabled=1    --啟用這個倉庫
gpgkey=file:///mnt/rom/RPM-GPG-KEY-CentOS-6

輸入yum list若不報錯即配置成功刃泡。

三巧娱、安裝JDK(雙節(jié)點都需要安裝)

在安裝JDK前,最好檢測下是否安裝了openjdk烘贴,若有禁添,最好卸載。(rpm -qa | grep jdk)
1桨踪、安裝JDK:

#cd /home/soft
#rpm -ivh jdk-7u80-linux-x64.rpm

2老翘、檢測:

#java -version

返回值若如下所示,說明安裝成功


image.png
四锻离、安裝Nginx(雙節(jié)點都需要安裝)

1铺峭、安裝依賴環(huán)境

#yum -y install gcc pcre-devel zlib-devel openssl-devel

2、安裝nginx

#cd /home/soft
#tar -xvf nginx-1.10.2.tar.gz
#cd nginx-1.10.2
#./configure
#make
#make install

檢查nginx是否安裝成功
#cd /usr/local/nginx/sbin
#./nginx -t

若出現(xiàn)以下內(nèi)容則表示安裝成功


image.png

3汽纠、配置nginx以實現(xiàn)負載均衡分發(fā)

#cd /usr/local/nginx/conf
#mv nginx.conf nginx.conf.bak    --備份配置文件
#vi nginx.conf

主從節(jié)點配置文件一樣

#Nginx所用用戶和組
user  root;
#工作的子進程數(shù)量(通常等于CPU數(shù)量或者2倍于CPU)
worker_processes  2;

#錯誤日志存放路徑
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
error_log  logs/error.log  info;

#指定pid存放文件
pid        logs/nginx.pid;

events {
    #使用網(wǎng)絡IO模型Linux建議epoll卫键,F(xiàn)reeBSD建議采用kqueue
    use epoll;
#允許最大連接數(shù),這個與Linux系統(tǒng)進程最大打開文件數(shù)限制有關
     #可用 ulimit -n 1024進行設置
    worker_connections  1024;
}


http {
    # 主模塊指令虱朵,默認采用此即可
    include       mime.types;
    default_type  application/octet-stream;

    #定義日志格式
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #'$status $body_bytes_sent "$http_referer" '
    #'"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log;

    client_header_timeout  3m;
    client_body_timeout    3m;
    send_timeout           3m;

    client_header_buffer_size    1k;
    large_client_header_buffers  4 4k;

    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay    on;

    #keepalive_timeout  0;
    #keepalive_timeout  65;

    # 負載均衡器配置莉炉,名稱為172.16.69.180
# 這個名稱和后面對應即可
     upstream 172.16.69.180{
        # 這里我部署了兩臺tocmat
        # weight均為5,表示兩臺tomcat負載平均分配
        server 172.16.69.120:8080 weight=5;
        server 172.16.69.121:8080 weight=5;
    }

    server {
        #nginx服務端口設置為8888
        listen       8888;
        # 對應上面upstream的名稱
        server_name  172.16.69.180;
        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        
        # 動態(tài)資源處理
        location / {
                proxy_set_header Host $host:8888;
                proxy_connect_timeout   300;
                proxy_send_timeout      300;
                proxy_read_timeout      300;
                proxy_pass http://172.16.69.180;
        }

         # 靜態(tài)資源處理
        location ~ .*\.(js|css|ico|gif|jpg|jpeg|png|bmp|swf)$ {
            root   /usr/local/source/;
        }
    }
}
五、安裝keepalived(雙節(jié)點都需要安裝)

1碴犬、安裝Keepalived(兩種安裝方式)

第一種(推薦):
#yum -y install keepalived

第二種:
#cd /home/soft
#tar -xvf keepalived-1.2.13.tar.gz
#cd keepalived-1.2.13
#./configure
#make
#make install

2絮宁、Keepalived主從節(jié)點配置

聲明:以下兩個配置文件中我標記了interface eth1這個參數(shù),不同的節(jié)點用到的網(wǎng)絡接口名會不同服协,具體請使用ifconfig查看當前IP對應的接口名绍昂。

主節(jié)點配置文件:

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {
    #該腳本檢測ngnix的運行狀態(tài),并在nginx進程不存在時嘗 
    #試重新啟動ngnix偿荷,如果啟動失敗則停止keepalived治专,準備讓其它機器接管。
    script "/home/ha/shell/check_nginx.sh"
    #每1s檢測一次
    interval 1
    # 檢測失斣舛ァ(腳本返回非0則優(yōu)先級2)
    weight 2
}

vrrp_instance VI_1 {
    #指定keepalived的角色张峰,MASTER表示此主機是主服務器,BACKUP表示此主機是備用服務器
    state MASTER
    # 指定HA監(jiān)測的網(wǎng)絡接口
    interface eth1
    # 虛擬路由標識棒旗,要求主從節(jié)點一致
    virtual_router_id 55
    # 優(yōu)先級喘批,在同一vrrp_instance下要求主節(jié)點的優(yōu)先級高于從節(jié)點
    priority 100
    # 設定主從節(jié)點之間同步檢查的時間間隔撩荣,單位是秒
    advert_int 1
    authentication {
        # 設置驗證類型,主要有PASS和AH兩種
        auth_type PASS
        # 設置驗證密碼饶深,在同一個vrrp_instance下餐曹,MASTER與BACKUP必須使用相同的密碼才能正常通信
        auth_pass 1111
    }
    virtual_ipaddress {
        # 設置虛擬IP地址,可以設置多個虛擬IP地址敌厘,每行一個
        172.16.69.180
    }
    track_script {
        # 引用VRRP腳本台猴,即在 vrrp_script 部分指定的名字。
        #定期運行它們來改變優(yōu)先級俱两,并最終引發(fā)主備切換饱狂。
        chk_nginx
    }
}

備節(jié)點配置文件:

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {
    #該腳本檢測ngnix的運行狀態(tài),并在nginx進程不存在時嘗 
    #試重新啟動ngnix宪彩,如果啟動失敗則停止keepalived休讳,準備讓其它機器接管。
    script "/home/ha/shell/check_nginx.sh"
    #每1s檢測一次
    interval 1
    # 檢測失斈蚩住(腳本返回非0則優(yōu)先級2)
    weight 2
}

vrrp_instance VI_1 {
    #指定keepalived的角色俊柔,MASTER表示此主機是主服務器,BACKUP表示此主機是備用服務器
    state BACKUP
    # 指定HA監(jiān)測的網(wǎng)絡接口
    interface eth1
    # 虛擬路由標識活合,要求主從節(jié)點一致
    virtual_router_id 55
    # 優(yōu)先級雏婶,在同一vrrp_instance下要求主節(jié)點的優(yōu)先級高于從節(jié)點
    priority 50
    # 設定主從節(jié)點之間同步檢查的時間間隔,單位是秒
    advert_int 1
    authentication {
        # 設置驗證類型白指,主要有PASS和AH兩種
        auth_type PASS
        # 設置驗證密碼留晚,在同一個vrrp_instance下,MASTER與BACKUP必須使用相同的密碼才能正常通信
        auth_pass 1111
    }
    virtual_ipaddress {
        # 設置虛擬IP地址侵续,可以設置多個虛擬IP地址倔丈,每行一個
        172.16.69.180
    }
    track_script {
        # 引用VRRP腳本,即在 vrrp_script 部分指定的名字状蜗。
        #定期運行它們來改變優(yōu)先級需五,并最終引發(fā)主備切換。
        chk_nginx
    }
}

3轧坎、創(chuàng)建檢測腳本(雙節(jié)點都需要創(chuàng)建宏邮,可使用scp傳輸)

#mkdir -p /home/ha/shell
#touch /home/ha/shell/check_nginx.sh
#
#vi /home/ha/shell/check_nginx.sh
---------------------------------------------------------------------------
#!/bin/sh
echo "1" >> /var/tmp/keepalived.log
Count1=`netstat -antp |grep -v grep |grep nginx |wc -l`
if [ $Count1 -eq 0 ]; then
    #/usr/local/nginx/sbin/nginx
    #sleep 2
        echo "2" >> /var/tmp/keepalived.log
    Count2=`netstat -antp |grep -v grep |grep nginx |wc -l`
    if [ $Count2 -eq 0 ]; then
                echo "nginx pid not found" >> /etc/keepalived/keepalived.log
        killall keepalived
    else
                echo "jinbulai" >> /var/tmp/keepalived.log
        exit 0
    fi
else
        echo "4" >> /var/tmp/keepalived.log
    exit 0
fi

賦予腳本可執(zhí)行權限:

#chmod 755 /usr/sbin/check_nginx.sh
六、部署Tomcat(雙節(jié)點都需要操作)

1缸血、創(chuàng)建用戶tomcat

#useradd -d /home/tomcat -m tomcat
#passwd tomcat

根據(jù)提示設置tomcat用戶密碼即可蜜氨,我這里設置成tomcat@123

2、部署Tomcat

#tar -xvf apache-tomcat-7.0.75.tar.gz -C /home/tomcat  --將soft下的tomcat解壓到tomcat用戶目錄下
#cd /home/tomcat
#chmod -R 755 *  --賦予tomcat用戶目錄下文件/文件夾可執(zhí)行權限
#chown -R tomcat:tomcat *  --將tomcat用戶目錄下文件/文件夾的用戶和組改為tomcat

3捎泻、修改tomcat的內(nèi)存分配

#cd /home/tomcat/apache-tomcat-7.0.75/bin
#vi .catalina.sh  --添加以下內(nèi)容

JAVA_OPTS="-Xms2048m -Xmx4096m -XX:PermSize=1024m -XX:MaxNewSize= 2048m  -XX:MaxPermSize=2048m"

4飒炎、修改tomcat的配置信息

#cd /home/tomcat/apache-tomcat-7.0.75/conf
#vi server.xml

添加jvmRoute信息,且主從節(jié)點不一致(例:主——tomcat1笆豁、從——tomcat2)


image.png

5郎汪、添加測試文件(雙節(jié)點添加)

#cd /home/tomcat/apache-tomcat-7.0.75/webapps/
#mkdir test
#vi index.jsp
主機如下配置赤赊,從機需要將This is Tomcat Server 1改成This is Tomcat Server 2
--------------------------------------------------------------------------
<%--
  Created by IntelliJ IDEA.
  User: ccdk
  Date: 2018/4/27
  Time: 下午7:01
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>測試頁面</title>
  </head>
  <body>
  SessionID:<%=session.getId()%> <BR>
  SessionIP:<%=request.getServerName()%> <BR>
  SessionPort:<%=request.getServerPort()%>
  <%out.println("This is Tomcat Server 1");%> 
  </body>
</html>

添加完以后要修改文件所屬用戶、組

七煞赢、安裝Redis(雙節(jié)點都需要安裝配置)

1抛计、安裝Redis

#tar -xvf redis-4.0.2.tar.gz
#cd redis-4.0.2
#make PREFIX=/usr/local/redis install
#cp /home/soft/redis-4.0.2/redis.conf /usr/local/redis/  --將配置文件拷貝到/usr/local/redis目錄下,方便啟動

2照筑、配置redis

#cd /usr/local/redis/
#vi redis.conf

主節(jié)點配置:
--------------------------------------------------------------------------
# bind 127.0.0.0  --把監(jiān)聽本地注釋掉
port 6000  #設定監(jiān)聽端口
protected-mode no
pidfile "/var/run/redis_6000.pid"

從節(jié)點配置:
--------------------------------------------------------------------------
# bind 127.0.0.0
port 6000
protected-mode no
pidfile "/var/run/redis_6000.pid"
slaveof 172.16.69.120 6000

3烙无、配置Tomcat連接Redis
這里需要先將jar包傳到/home/tomcat/apache-tomcat-7.0.75/lib/

commons-pool2-2.4.1.jar
jedis-2.6.2.jar
tomcat-redis-session-manager1.2.jar

接下來修改context.xml(主備機一樣):

#vi /home/tomcat/apache-tomcat-7.0.75/conf/context.xml

    <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"/>
    <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
    host="172.16.69.120"
    port="6000"
    maxInactiveInterval="180"/>

4弛秋、啟動Redis秩命,檢測是否正常

#cd /usr/local/redis
#./bin/redis-server ./redis.conf &  --啟動

主機啟動成功示例:


image.png

從機啟動成功示例:


image.png

5阔涉、配置Sentinel

#cd /usr/local/redis/
#vi sentinel.conf

主從節(jié)點一致:
--------------------------------------------------------------------------
#守護進程
daemonize yes
protected-mode no
#端口
port 23456
#運行日志
logfile "/usr/local/redis/redis/sentinel.log"
pidfile "/var/run/sentinel.pid"
#配置監(jiān)控主服務器,mymaster:定義主服務器名,172.16.69.120:主服務ip 6000:主服務端口 2:設置當有1個sentinel判斷master故障后才真正認為master無法繼續(xù)提供服務,即開始容災措施
sentinel monitor mymaster 172.16.69.120 6000 1
#指定sentinel認定一個服務器斷線的毫秒數(shù),即一個sentinel認定服務SDOWN媒抠,在這個配置時間內(nèi)需要獲得指定個數(shù)的Sentinel判定ODWON,才開始failover
sentinel down-after-milliseconds mymaster 2000
#從節(jié)點數(shù)量為幾后面就寫幾弟断,我這里只有一個從節(jié)點咏花,所以寫1
sentinel parallel-syncs mymaster 1

6趴生、啟動Sentinel

#cd /usr/local/redis
#./bin/redis-sentinel ./sentinel.conf &  --啟動

7、檢驗

#./bin/redis-cli -h 172.16.69.120 -p 6000   # -h:ip地址,-p:訪問端口

主節(jié)點:

image.png

從節(jié)點:


image.png

sentinel使用./bin/redis-cli -h 172.16.69.120 -p 23456訪問

八昏翰、基礎指令

1苍匆、啟動順序
Nginx -> Tomcat -> Keepalived -> Redis

2、指令

#cd /usr/local/nginx/sbin
#./nginx  --啟動nginx
#./nginx -s stop  --關閉nginx
#./nginx -s reload  --重啟nginx

#su tomcat  --切換成tomcat用戶
#cd /home/tomcat/apache-tomcat-7.0.75/bin
#./startup.sh  --啟動tomcat
#./shutdown.sh  --關閉tomcat

#service keepalived start  --啟動keepalived
#service keepalived stop  --關閉keepalived
#service keepalived restart  --重啟keepalived

#cd /usr/local/redis
#./bin/redis-server ./redis.conf &  --啟動redis
#./bin/redis-cli -p 6000 shutdown  --關閉redis
#./bin/redis-sentinel ./sentinel.conf &  --啟動sentinel
#./bin/redis-cli -p 23456 shutdown --關閉sentinel

注:redis有兩種啟動方式棚菊。
前臺啟動:./bin/redis-server ./redis.conf
后臺啟動:./bin/redis-server ./redis.conf &
還有種后臺啟動的方式是改redis.conf配置文件浸踩,將daemonize改為yes,這樣直接使用./bin/redis-server ./redis.conf也是后臺啟動统求。

九检碗、結果檢測

當所有服務都啟動好以后,進行負載均衡和session共享的檢測
若出現(xiàn)如下效果码邻,說明已經(jīng)實現(xiàn)了負載均衡和session共享折剃。


2018-05-21 at 下午7.59.gif

純手動碼字...謝謝瀏覽。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末像屋,一起剝皮案震驚了整個濱河市怕犁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌己莺,老刑警劉巖奏甫,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凌受,居然都是意外死亡阵子,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門胜蛉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挠进,“玉大人智蝠,你說我怎么就攤上這事∧问幔” “怎么了杈湾?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長攘须。 經(jīng)常有香客問我漆撞,道長,這世上最難降的妖魔是什么于宙? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任浮驳,我火速辦了婚禮,結果婚禮上捞魁,老公的妹妹穿的比我還像新娘至会。我一直安慰自己,他們只是感情好谱俭,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布奉件。 她就那樣靜靜地躺著,像睡著了一般昆著。 火紅的嫁衣襯著肌膚如雪县貌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天凑懂,我揣著相機與錄音煤痕,去河邊找鬼。 笑死接谨,一個胖子當著我的面吹牛摆碉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播脓豪,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼巷帝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了跑揉?” 一聲冷哼從身側響起锅睛,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎历谍,沒想到半個月后现拒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡望侈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年印蔬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脱衙。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡侥猬,死狀恐怖例驹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情退唠,我是刑警寧澤鹃锈,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站瞧预,受9級特大地震影響屎债,放射性物質發(fā)生泄漏。R本人自食惡果不足惜垢油,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一盆驹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滩愁,春花似錦躯喇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至檀咙,卻和暖如春雅倒,著一層夾襖步出監(jiān)牢的瞬間璃诀,已是汗流浹背弧可。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留劣欢,地道東北人棕诵。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像凿将,于是被迫代替她去往敵國和親校套。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容