項目:Lvs+Keepalived+Nginx+Tomcat高可用集羣
項目拓撲:
實驗思路:php
實驗重點:
1.概述:此架構中keepalived所起到的做用就是對lvs架構中的調度器進行熱備份。至少包含兩臺熱備的負載調度器,兩臺臺web的節點服務器;
2.重點:LVS架構中須要經過ipvsadm工具來對ip_vs這個模塊進行編寫規則,使用keepalived+lvs時,不須要用到ipvsadm管理工具,不須要ipvsadm手動編寫規則,用在keepalived的配置文件中指定配置項來將其取代;
3.keepalived的節點健康檢查:keepalived能夠經過對real server的某個端口進行節點健康檢查,來執行相應的操做,由notify_down配置項來完成;
實驗步驟:
安裝並配置後端兩臺tomcat(兩臺tomcat服務器配置相同,在此只列出其中一臺配置);
安裝並配置兩臺nginx服務器(兩臺nginx服務器配置相同,在此只列出其中一臺配置);
安裝前端兩臺負載調度器的keepalived服務與lvs服務(兩臺調度器配置相同,在此只列出一臺配置);
配置master主調度器的keepalived服務並啓動;
配置backup從調度器的keepalived服務並啓動;
配置兩臺nginx在Lvs_DR模式中的網絡參數(兩臺nginx服務器配置相同,在此只列出一臺配置);
客戶端測試訪問集羣;
安裝配置後端存儲主機上的mysql服務;
安裝配置後端存儲主機上的nfs服務,而且將動態項目和靜態項目上傳並設置nfs共享;
兩臺nginx服務器掛載並讀取nfs共享的靜態網頁資源(兩臺nginx服務器配置相同,在此只列出一臺配置);
兩臺tomcat服務器掛載並讀取nfs共享的動態網站項目(由java編寫的超市管理項目),(兩臺tomcat服務器配置相同,在此只列出其中一臺配置);
配置後端mysql數據庫;
客戶端訪問測試靜態網頁資源;
客戶端測試訪問動態網站資源;
將nginx1模擬故障,客戶端測試訪問以及查看郵件狀況;
將master主調度器模擬故障,測試客戶端訪問狀況;css
安裝並配置後端兩臺tomcat(兩臺tomcat服務器配置相同,在此只列出其中一臺配置);html
[root@tm1 ~]# ls apache-tomcat-9.0.10.tar.gz jdk-8u171-linux-x64.tar.gz [root@tm1~]# rpm -qa |grep java [root@tm1 ~]# tar zxvf jdk-8u171-linux-x64.tar.gz [root@tm1 ~]# mv jdk1.8.0_171/ /usr/local/java [root@tm1 ~]# ls /usr/local/java bin db javafx-src.zip lib man release THIRDPARTYLICENSEREADME-JAVAFX.txt COPYRIGHT include jre LICENSE README.html src.zip THIRDPARTYLICENSEREADME.txt [root@tm1 ~]# cat <<END >>/etc/profile export JAVA_HOME=/usr/local/java export PATH=$PATH:/usr/local/java/bin END [root@tm1~]# source /etc/profile [root@tm1 ~]# java -version java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1.8.0_171-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode) [root@tm1 ~]# tar zxvf apache-tomcat-9.0.10.tar.gz [root@tm1 ~]# mv apache-tomcat-9.0.10 /usr/local/tomcat [root@tm1 ~]# ls /usr/local/tomcat bin conf lib LICENSE logs NOTICE RELEASE-NOTES RUNNING.txt temp webapps work [root@tm1 ~]# /usr/local/tomcat/bin/startup.sh ##啓動apache-tomcat [root@tm1 ~]# netstat -utpln |grep 8080 tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 14758/java 安裝並配置兩臺nginx服務器(兩臺nginx服務器配置相同,在此只列出其中一臺配置); [root@ng1 ~]# yum -y install pcre-devel zlib-devel [root@ng1 ~]# useradd -M -s /sbin/nologin nginx [root@ng1 ~]# tar zxvf nginx-1.12.2.tar.gz -C /usr/src/ [root@ng1 ~]# cd /usr/src/nginx-1.12.2/ [root@ng1 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module [root@ng1 nginx-1.12.2]# make && make install [root@ng1 nginx-1.12.2]# cd [root@ng1 ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ [root@ng1 ~]# vi /usr/lib/systemd/system/nginx.service [Unit] Description=nginxapi After=network.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStart=/usr/local/nginx/sbin/nginx ExecReload=kill -s HUP $(cat /usr/local/nginx/logs/nginx.pid) ExecStop=kill -s QUIT $(cat /usr/local/nginx/logs/nginx.pid) PrivateTmp=Flase [Install] WantedBy=multi-user.target [root@ng1 ~]# vi /usr/local/nginx/conf/nginx.conf 34 upstream tomserver { 35 server 192.168.100.105:8080 weight=1; 36 server 192.168.100.106:8080 weight=1; 37 } 50 location ~ \.(asp|aspx|php|jsp|do|js|css|png|jpg)$ { 51 proxy_pass http://tomserver; 52 } [root@ng1 ~]# systemctl start nginx [root@ng1 ~]# systemctl enable nginx [root@ng1 ~]# netstat -utpln |grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3538/nginx: master 安裝前端兩臺負載調度器的keepalived服務與lvs服務(兩臺調度器配置相同,在此只列出一臺配置); [root@ld1 ~]# yum -y install kernel-devel openssl-devel popt-devel [root@ld1 ~]# ls keepalived-1.2.13.tar.gz keepalived-1.2.13.tar.gz [root@ld1 ~]# tar zxvf keepalived-1.2.13.tar.gz -C /usr/src/ [root@ld1 ~]# cd /usr/src/keepalived-1.2.13/ [root@ld1 keepalived-1.2.13]# ./configure --prefix=/usr/local/keepalived [root@ld1 keepalived-1.2.13]# make && make install [root@ld1 keepalived-1.2.13]# cd [root@ld1 ~]# mkdir -p /etc/keepalived [root@ld1 ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ [root@ld1 ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ [root@ld1 ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ [root@ld1 ~]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ [root@ld1 ~]# chmod 755 /etc/init.d/keepalived 配置master主調度器的keepalived服務並啓動; [root@ld1 ~]# vi /etc/keepalived/keepalived.conf global_defs { router_id HA_TEST_R1 ##本服務器的名稱 } vrrp_instance VI_1 { ##定義VRRP熱備實例 state MASTER ##MASTER表示主服務器 interface eth0 ##承載VIP地址的物理接口 virtual_router_id 1 ##虛擬路由器的ID號 priority 100 ##優先級,數值越大優先級越高 advert_int 1 ##通告間隔秒數(心跳頻率) authentication { ##認證信息 auth_type PASS ##認證類型 auth_pass 123456 ##密碼字串 } virtual_ipaddress { 192.168.100.95 ##指定漂移地址(VIP) } virtual_server 192.168.100.95 80 { ##指定vip地址 delay_loop 5 ##每隔5秒檢測一次real server lb_algo rr lb_kind DR protocol TCP real_server 192.168.100.103 80 { ##指定web集羣節點1,在此爲nginx1 weight 1 notify_down /etc/keepalived/check.sh ##real server檢測失敗後執行的腳本 TCP_CHECK { connect_port 80 connect_timeout 3 ##鏈接超時 nb_get_retry 3 ##重試鏈接次數 delay_before_retry 4 ##重試間隔 } } real_server 192.168.100.104 80 { ##指定web集羣節點2,在此爲nginx2 weight 1 notify_down /etc/keepalived/check.sh ##real server檢測失敗後執行的腳本 TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 4 } } } [root@ld1 ~]# vi /etc/keepalived/check.sh #!/bin/bash echo -e " nginx1(192.168.100.103) or nginx2(192.168.100.104) is down on $(date +%F-%T)" >/root/check_httpd.log cat /root/check_httpd.log |/usr/local/bin/sendEmail -o message-charset=utf8 -f li__wenhu@163.com -t li__wenhu@163.com -s smtp.163.com -u "It's up to it" -xu li__wenhu@163.com -xp 854365897huhu :<<END 解釋: -f 表示發送者的郵箱 -t 表示接收者的郵箱 -s 表示SMTP服務器的域名或者ip -u 表示郵件的主題 -xu 表示SMTP驗證的用戶名 -xp 表示SMTP驗證的密碼(注意,這個密碼貌似有限制,例如我用d!5neyland就不能被正確識別) -m 表示郵件的內容 END :wq [root@ld1 ~]# chmod +x /etc/keepalived/check.sh [root@ld1 ~]# wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz [root@ld1 ~]# tar zxf sendEmail-v1.56.tar.gz ##安裝發送郵件工具 [root@ld1 ~]# cd sendEmail-v1.56 [root@ld1 sendEmail-v1.56]# mv sendEmail /usr/local/bin/ [root@ld1 sendEmail-v1.56]# cd [root@ld1 ~]# cat /etc/fstab |/usr/local/bin/sendEmail -o message-charset=utf8 -f li__wenhu@163.com -t li__wenhu@163.com -s smtp.163.com -u "It's up to it" -xu li__wenhu@163.com -xp ########## ##發送測試郵件,也可用-m指定郵件內容 [root@ld1 ~]# modprobe ip_vs ##啓動ip_vs模塊 [root@ld1 ~]# lsmod |grep ip_vs [root@ld1 ~]# echo "modprobe ip_vs" >>/etc/rc.local [root@ld1 ~]# chmod +x /etc/rc.local [root@ld1 ~]# /etc/init.d/keepalived start Reloading systemd: [ 肯定 ] Starting keepalived (via systemctl): [ 肯定 ] [root@ld1 ~]# ip a |grep 192.168.100.95 inet 192.168.100.95/32 scope global eth0 配置backup從調度器的keepalived服務並啓動; [root@ld2 ~]# vi /etc/keepalived/keepalived.conf global_defs { router_id HA_TEST_R2 ##本服務器的名稱 } vrrp_instance VI_1 { ##定義VRRP熱備實例 state BACKUP ##MASTER表示主服務器 interface eth0 ##承載VIP地址的物理接口 virtual_router_id 1 ##虛擬路由器的ID號 priority 99 ##優先級,數值越大優先級越高 advert_int 1 ##通告間隔秒數(心跳頻率) authentication { ##認證信息 auth_type PASS ##認證類型 auth_pass 123456 ##密碼字串 } virtual_ipaddress { 192.168.100.95 ##指定漂移地址(VIP) } virtual_server 192.168.100.95 80 { ##指定vip地址 delay_loop 5 ##每隔5秒檢測一次real server lb_algo rr lb_kind DR protocol TCP real_server 192.168.100.103 80 { ##指定web集羣節點1,在此爲nginx1 weight 1 notify_down /etc/keepalived/check.sh ##real server檢測失敗後執行的腳本 TCP_CHECK { connect_port 80 connect_timeout 3 ##鏈接超時 nb_get_retry 3 ##重試鏈接次數 delay_before_retry 4 ##重試間隔 } } real_server 192.168.100.104 80 { ##指定web集羣節點2,在此爲nginx2 weight 1 notify_down /etc/keepalived/check.sh ##real server檢測失敗後執行的腳本 TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 4 } } } [root@ld2 ~]# vi /etc/keepalived/check.sh #!/bin/bash echo -e " nginx1(192.168.100.103) or nginx2(192.168.100.104) is down on $(date +%F-%T)" >/root/check_httpd.log cat /root/check_httpd.log |/usr/local/bin/sendEmail -o message-charset=utf8 -f li__wenhu@163.com -t li__wenhu@163.com -s smtp.163.com -u "It's up to it" -xu li__wenhu@163.com -xp ############ :<<END 解釋: -f 表示發送者的郵箱 -t 表示接收者的郵箱 -s 表示SMTP服務器的域名或者ip -u 表示郵件的主題 -xu 表示SMTP驗證的用戶名 -xp 表示SMTP驗證的密碼(注意,這個密碼貌似有限制,例如我用d!5neyland就不能被正確識別) -m 表示郵件的內容 END :wq [root@ld2 ~]# chmod +x /etc/keepalived/check.sh [root@ld2 ~]# wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz [root@ld2 ~]# tar zxf sendEmail-v1.56.tar.gz ##安裝發送郵件工具 [root@ld2 ~]# cd sendEmail-v1.56 [root@ld2 sendEmail-v1.56]# mv sendEmail /usr/local/bin/ [root@ld2 sendEmail-v1.56]# cd [root@ld1 ~]# cat /etc/fstab |/usr/local/bin/sendEmail -o message-charset=utf8 -f li__wenhu@163.com -t li__wenhu@163.com -s smtp.163.com -u "It's up to it" -xu li__wenhu@163.com -xp ########## ##發送測試郵件,也可用-m指定郵件內容
[root@ld2 ~]# modprobe ip_vs ##啓動ip_vs模塊 [root@ld2 ~]# lsmod |grep ip_vs [root@ld2 ~]# echo "modprobe ip_vs" >>/etc/rc.local [root@ld2 ~]# chmod +x /etc/rc.local [root@ld2 ~]# /etc/init.d/keepalived start Reloading systemd: [ 肯定 ] Starting keepalived (via systemctl): [ 肯定 ] [root@ld2 ~]# ip a |grep 192.168.100.95 配置兩臺nginx在Lvs_DR模式中的網絡參數(兩臺nginx服務器配置相同,在此只列出一臺配置); [root@ng1 ~]# cat <<END >/etc/sysconfig/network-scripts/ifcfg-lo:0 DEVICE=lo:0 IPADDR=192.168.100.95 NETMASK=255.255.255.255 ONBOOT=yes NAME=lo:0 END [root@ng1 ~]# systemctl restart network [root@ng1 ~]# ip a |grep 95 inet 192.168.100.95/32 brd 192.168.100.88 scope global lo:0
客戶端測試訪問集羣;
訪問靜態網頁資源並查看服務器日誌:前端
訪問動態網站資源並查看服務器日誌:java
安裝配置後端存儲主機上的mysql服務; [root@st ~]# yum -y install mariadb-server mysql [root@st ~]# systemctl start mariadb [root@st ~]# systemctl enable mariadb Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service. [root@st ~]# mysqladmin -uroot password ##設置密碼爲123123 [root@st ~]# mysql -uroot -p123123 MariaDB [(none)]> exit 安裝配置後端存儲主機上的nfs服務,而且將動態項目和靜態項目上傳並設置nfs共享; [root@st ~]# for i in rpcbind nfs;do systemctl enable $i; done [root@st ~]# for i in rpcbind nfs;do systemctl enable $i; done [root@st ~]# mkdir /opt/nginx [root@st ~]# chmod 777 /opt/nginx/ [root@st ~]# echo "this is a beautiful page!!!" >>/opt/nginx/index.html ##準備nginx的靜態網頁資源 [root@st ~]# mkdir /opt/tom [root@st ~]# chmod 777 /opt/tom/ [root@st ~]# ls /opt/tom/ ##上傳超市管理項目的源碼 WebRoot [root@st ~]# vi /opt/tom/WebRoot/WEB-INF/classes/database.properties url=jdbc:mysql://192.168.100.107:3306/smbms?useUnicode=true&characterEncoding=utf-8 user=linuxfan password=123123 :wq [root@st ~]# vi /etc/exports /opt/nginx 192.168.100.0/24(rw,sync,no_root_squash) /opt/tom 192.168.100.0/24(rw,sync,no_root_squash) [root@st ~]# systemctl start rpcbind [root@st ~]# systemctl start nfs Job for nfs-server.service failed because the control process exited with error code. See "systemctl status nfs-server.service" and "journalctl -xe" for details. [root@st ~]# kill -HUP `cat /run/gssproxy.pid` [root@st ~]# systemctl start nfs [root@st ~]# systemctl enable rpcbind nfs [root@st ~]# showmount -e 192.168.100.107 Export list for 192.168.100.107: /opt/tom 192.168.100.0/24 /opt/nginx 192.168.100.0/24 兩臺nginx服務器掛載並讀取nfs共享的靜態網頁資源(兩臺nginx服務器配置相同,在此只列出一臺配置); [root@ng1 ~]# yum -y install nfs-utils rpcbind [root@ng1 ~]# systemctl start rpcbind [root@ng1 ~]# systemctl start nfs Job for nfs-server.service failed because the control process exited with error code. See "systemctl status nfs-server.service" and "journalctl -xe" for details. [root@ng1 ~]# kill -HUP `cat /run/gssproxy.pid` [root@ng1 ~]# systemctl start nfs [root@ng1 ~]# systemctl enable rpcbind nfs [root@ng1 ~]# showmount -e 192.168.100.107 Export list for 192.168.100.107: /opt/tom 192.168.100.0/24 /opt/nginx 192.168.100.0/24 [root@ng1 ~]# echo "192.168.100.107:/opt/nginx /usr/local/nginx/html/ nfs defaults,_netdev 0 0" >>/etc/fstab [root@ng1 ~]# mount -a [root@ng1 ~]# ls /usr/local/nginx/html/ index.html [root@ng1 ~]# mount |tail -1 192.168.100.107:/opt/nginx on /usr/local/nginx/html type nfs4 (rw,relatime,vers=4.1,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.100.103,local_lock=none,addr=192.168.100.107,_netdev) 兩臺tomcat服務器掛載並讀取nfs共享的動態網站項目(由java編寫的超市管理項目),(兩臺tomcat服務器配置相同,在此只列出其中一臺配置); [root@tm1 ~]# yum -y install nfs-utils rpcbind [root@tm1 ~]# systemctl start rpcbind [root@tm1 ~]# systemctl start nfs Job for nfs-server.service failed because the control process exited with error code. See "systemctl status nfs-server.service" and "journalctl -xe" for details. [root@tm1 ~]# kill -HUP `cat /run/gssproxy.pid` [root@tm1 ~]# systemctl start nfs [root@tm1 ~]# systemctl enable rpcbind nfs [root@tm1 ~]# showmount -e 192.168.100.107 Export list for 192.168.100.107: /opt/tom 192.168.100.0/24 /opt/nginx 192.168.100.0/24 [root@tm1 ~]# echo "192.168.100.107:/opt/tom /usr/local/tomcat/webapps/ nfs defaults,_netdev 0 0" >>/etc/fstab [root@tm1 ~]# mount -a [root@tm1 ~]# ls /usr/local/tomcat/webapps/ WebRoot [root@tm1 ~]# mount |tail -1 192.168.100.107:/opt/tom on /usr/local/tomcat/webapps type nfs4 (rw,relatime,vers=4.1,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.100.105,local_lock=none,addr=192.168.100.107,_netdev) 配置後端mysql數據庫; [root@st ~]# ls smbms_db.sql smbms_db.sql [root@st ~]# mysql -uroot -p123123<smbms_db.sql [root@st ~]# mysql -uroot -p123123 MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | smbms | | test | +--------------------+ 5 rows in set (0.00 sec) MariaDB [(none)]> grant all on smbms.* to 'linuxfan'@'192.168.100.%' identified by "123123"; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> flush privileges; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> exit Bye
客戶端訪問測試靜態網頁資源;
客戶端測試訪問動態網站資源;
登陸後如若訪問不了,能夠嘗試重啓tomcat;mysql
將nginx1模擬故障,客戶端測試訪問以及查看郵件狀況;linux
將master主調度器模擬故障,測試客戶端訪問狀況;nginx