大型網站架構之——百萬 PV 大型網站架構部署

名詞解釋:pv是什麼?

PV(Page View,頁面瀏覽量)即點擊量,一般意義上說PV的多少是衡量一個網絡新聞頻道或網站甚至一條網絡新聞的主要指標。pv的解釋是這樣的:一個訪問者在24小時(0點-23點)內到底看了網站的幾個頁面。須要注意的是:同一我的瀏覽網站的同一個頁面,不重複計算pv量,點擊100次頁只算1次。前端

查詢網站的pv量能夠經過訪問——網站 PV 查詢 java


案例概述

  • > 本案例設計採用四層模式來實現,主要分爲前端反向代理、web層、數據庫緩存層、數據庫層。前端反向代理層採用主備模式,Web層採用羣集模式,數據庫緩存層採用主備模式,數據庫層採用主備模式。

架構拓撲:
大型網站架構之——百萬 PV 大型網站架構部署node

  • 說明:實線是正常狀況下的數據走向,虛線表明服務器宕機的狀況下,備用服務器頂上的數據流向!

環境表格說明:mysql

主機名 IP 地址 系統版本 用途
master 192.168.154.128 CenOS 7.4 (64位) 前端Nginx 反向代理主機、redis 緩存主機、MySQL 數據主庫
backup 192.168.154.136 CenOS 7.4 (64位) 前端Nginx法相代理備機、redis緩存備機、MySQL數據備庫
tomcat-node1 192.168.154.130 CenOS 7.4 (64位) Web 服務器
tomcat-node2 192.168.154.131 CenOS 7.4 (64位) Web 服務器

環境文字說明:linux

  • 由於要安裝一些軟件,因此反向代理服務器要求保持在線狀態。這裏前端使用 Keepalived 做爲高可用軟件,虛擬 IP :192.168.154.188 和 223.202.10.188,這裏設置一個虛擬的內網IP是爲了內部各個系統之間的進行通訊。
  • 這裏因爲是搭建的測試環境,因此以上服務器都關閉了防火牆和Selinux。若是是生產環境建議開啓防火牆。全部服務器都是默認配置,沒有進行優化,須要扛起更多的訪問量必須進行優化。
  • 另外,生產環境建議將MySQL的分區設置位 xfs 類型,由於再大多數場景下,總體 IOPS 表現仍是要比ext4來的更高、更穩定,延遲也更小。

文章中所需源碼包:
tomcat 源碼包 密碼:p94u
nginx

實施步驟

全部服務器都關閉防火牆、Selinux。web

[root@master ~]# systemctl stop firewalld.service
[root@master ~]# systemctl disable firewalld.service
[root@master ~]# setenforce 0

2·前端兩臺反向代理服務器安裝帶有nginx的rpm軟件包的源
[root@master ~]# rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpmredis

3·前端兩臺反向代理服務器都安裝 keepalived 和 nginx
[root@master ~]# yum install keepalived nginx -y算法

4·前端兩臺反向代理服務器都須要修改 keepalived 配置文件sql

[root@master ~]# vim /etc/keepalived/keepalived.conf
修改後內容以下:
! Configuration File for keepalived

vrrp_script nginx {                                   //啓用觸發式腳本程序,這裏的腳本須要在
        script "/opt/shell/nginx.sh"               //配置文件外面寫一個shell腳本。它的做用是
        interval 2                                         //當 keepalived 啓動時,自動啓動 Nginx 服務
}

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

vrrp_instance VI_1 {
    state MASTER              //狀態是 master ,從服務器 這裏須要修改成 BACKUP
    interface ens33             //你的網卡名稱
    virtual_router_id 51       // router id 從服務器須要修改成不同的就行
    priority 100                   //優先級,從服務器的優先級須要低於 100
    advert_int 1
    authentication {             //主從之間啓動口令,這裏若是要修改主從服務器必須保持
        auth_type PASS        //一致,不然宕機的時候,不能VIP 不能漂移
        auth_pass 1111
    }

        track_script {          //這裏是調用觸發式腳本,調用的是本身寫的shell腳本!
                nginx
        }

    virtual_ipaddress {
        192.168.154.188      //內網虛擬 IP 
        223.202.10.188        //外網虛擬 IP
    }
}

編寫觸發式腳本,以上配置在 從服務器上須要作相同修改,不一樣的地方在主服務器上已經作了說明,因此從服務器的配置將再也不演示。

[root@master ~]# mkdir /opt/shell      //這裏建立的必須和keepalived配置文件的路徑一致,不然 nginx 不會啓動的!
[root@master ~]# cd /opt/shell/
[root@master shell]# vim nginx.sh
**編寫內容以下:**
#!/bin/bash
k=`ps -ef | grep keepalived | grep -v grep | wc -l`     
if [ $k -gt 0 ];then
        /bin/systemctl start nginx.service
else
        /bin/systemctl stop nginx.service
fi

-----

[root@master shell]# chmod +x nginx.sh      //給與腳本執行權限

6·把 keepalived 配置文件發送給從服務器(BACKUP)。

[root@master shell]# cd /etc/keepalived
[root@master keepalived]# scp keepalived.conf root@192.168.154.136:/etc/keepalived

7·在 從服務器上(BACKUP)上建立 /opt/shell 目錄,並把 觸發式腳本從主服務器拷貝過來!

[root@backup ~]# mkdir /opt/shell
[root@backup ~]# scp root@192.168.154.128:/opt/shell/nginx.sh /opt/shell

8·修改Nginx 配置文件,併發送給從服務器。

[root@master ~]# vim /etc/nginx/nginx.conf
添加內容以下:
http {
            upstream tomcat_pool {
                server 192.168.154.130:8080;      //第一臺 tomcat 服務器 IP地址 
                server 192.168.154.131:8080;     //第二胎 tomcat 服務器 IP 地址
                ip_hash;                                      //hash 算法
        }
        server{
                listen 80;               //監聽端口位80
                server_name 192.168.154.188;             //虛擬IP地址
                location /{
                        proxy_pass http://tomcat_pool;
                        proxy_set_header X-Real-IP $remote_addr;
                }
        }

[root@master ~]# scp /etc/nginx/nginx.conf root@192.168.154.136:/etc/nginx  //發送給從服務器

9·主 、從 服務器都啓動 keepadlived ,並查看nginx是否啓動成功!

[root@master shell]# systemctl start keepalived.service 
[root@master shell]# ps aux | grep keepalived
root       2404  0.0  0.1 118608  1384 ?        Ss   14:04   0:00 /usr/sbin/keepalived -D
root       2405  0.0  0.2 122804  2380 ?        S    14:04   0:00 /usr/sbin/keepalived -D
root       2406  0.0  0.2 124888  2448 ?        S    14:04   0:00 /usr/sbin/keepalived -D
root       2413  0.0  0.0 112676   988 pts/0    R+   14:04   0:00 grep --color=auto keepalived         //啓動 keepalived 成功
[root@master shell]# netstat -antp | grep nginx    //啓動 nginx 成功
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2425/nginx: master

啓動失敗解決思路:

  1. 查看 keepalived 配置文件,仔細檢查是否有語法錯誤,是否有格式錯誤!
  2. 查看 keepalived 配置文件中的觸發式腳本的路徑和名稱是否一致!
  3. 檢查 nginx.sh 的執行權限是否給與!
  4. 檢查 nginx,sh 的腳本是否正確,能夠把裏面的語句單獨拿出來執行,看看是否是shell的語句有語法錯誤。
    若是重啓不成功,大多數問題就是進程佔用,kill 掉進程就好,或者找到 pid 文件位子 刪除 pid 文件。

10·安裝 tomcat web服務器,由於兩臺web 服務器配置都同樣,這裏只演示安裝一臺的過程。

[root@master pv]# tar -zxvf apache-tomcat-8.5.23.tar.gz -C /usr/local   //這裏的安裝包須要下載好再解壓,須要的朋友能夠在文章開頭點擊連接下載。
[root@tomcat-node1r pv]# tar zxvf jdk-8u144-linux-x64.tar.gz -C /usr/local
[root@tomcat-node1r pv]# cd /usr/local
[root@tomcat-node1 local]# mv apache-tomcat-8.5.23 tomcat8
[root@tomcat-node1 local]# mv jdk1.8.0_144 java

11·添加環境變量。

[root@tomcat-node1 ~]# vim /etc/profile
**添加內容以下:**
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

[root@tomcat-node1 ~]# source /etc/profile     //刷新環境變量配置文件,使其當即生效
[root@tomcat-node1 ~]# java -version             //查看 tomcat 版本信息

12·對 tomcat 進行操做優化。

[root@tomcat-node1 local]# ln -s /usr/local/tomcat8/bin/startup.sh /usr/bin/tomcatup
[root@tomcat-node1 local]# ln -s /usr/local/tomcat8/bin/shutdown.sh /usr/bin/tomcatdown

[root@tomcat-node1r ~]# cd /usr/local/tomcat8/webapps/ROOT
[root@tomcat-node1 ROOT]# mv index.jsp index.jsp.bak
[root@tomcat-node1 ROOT]# vim index.jsp               //編輯測試頁面
編寫內容以下:
<h1>Server 130 !!</h1>

13·修改祝福其tomcat配置文件、啓動 tomcat 。

[root@tomcat-node1 ~]# vim /usr/local/tomcat8/conf/server.xml
 在150行左右添加內容以下:
 <Context path="" docBase="SLSaleSystem" reloadable="true" ddebug="0"></Context>               //#添加須要上線服務的位子變量

[root@tomcat-node1 local]# tomcatup
[root@tomcat-node1 local]# netstat -antp | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      46918/java

大型網站架構之——百萬 PV 大型網站架構部署
14·在第二臺 tomcat 服務器上修改配置文件
[root@tomcat-node1 ~]# vim /usr/local/tomcat8/conf/server.xml
在150行左右添加內容以下:
<Context path="" docBase="SLSaleSystem" reloadable="true" ddebug="0"></Context> //#添加須要上線服務的位子變量

15·在主 從服務器上部署 MySQL ,這裏是用mariadb 和MySQL是同樣的。

[root@master ~]# yum install -y mariadb-server mariadb
[root@master ~]# systemctl start mariadb.service
[root@master ~]# systemctl enable mariadb.service
[root@master ~]# netstat -antp | grep 3306
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      64226/mysqld

16·數據的的一些常規設置

[root@master ~]# mysql_secure_installation
這裏常規設置流程:回車--Y---設置MySQL登錄密碼---確認登錄密碼---N--N--N--Y

17·導入須要上線服務的數據文件,這個數據文件再也不單獨提供,由於這裏只用做測試!
[root@master pv]# mysql -u root -p &lt; slsaledb-2014-4-10.sql

18· 給這個導入的這個數據庫受權,讓root有權限管理

MariaDB [(none)]> grant all on slsaledb.* to 'root'@'%' identified by '123123';
MariaDB [(none)]> flush privileges;

19·安裝 redis 而且修改配置文件

[root@master ~]# yum install epel-release redis -y
修改以下內容:
bind 0.0.0.0

在從服務器上多以下一行:
265行下添加:slaveof 192.168.175.128 6379    //主 redis 的IP與端口

[root@master ~]# redis-cli -h 192.168.154.128 -p 6379    //鏈接測試

20·把項目服務在 tomcat 服務器上線。

[root@tomcat-node1 pv]# tar zxvf SLSaleSystem.tar.gz -C /usr/local/tomcat8/webapps
[root@tomcat-node1 pv]# cd /usr/local/tomcat8/webapps/SLSaleSystem/WEB-INF/classes
[root@tomcat-node1 classes]# vim jdbc.properties
修改內容以下:
url=jdbc\:mysql\://192.168.154.188
password=123123

20·在tomcat 服務器中修改項目中鏈接redis 的參數。

[root@tomcat-node1 classes]# vim /usr/local/tomcat8/webapps/SLSaleSystem/WEB-INF/classes/applicationContext-mybatis.xml
修改內容以下:
38行         <!--redis 配置 開始-->
47行                 <constructor-arg value="192.168.154.188"/>         #虛擬IP
48行                 <constructor-arg value="6379"/>

-------------測試緩存效果,在redis 上鍊接VIP
redis-cli -h 192.168.154.188 -p 6379

192.168.154.188:6379> info
keyspace_hits:1 或 keyspace_misses:1 //關注這個值,命中和未命中登錄商城,而後反覆點擊須要數據庫參與的操做界面,再來回檢查

-------------如下配置redis集羣主從切換--只在主服務器操做-----
redis-cli -h 192.168.154.128 info Replication //獲取當前服務器狀態

vim /etc/redis-sentinel.conf
17 protected-mode no
69 sentinel monitor mymaster 192.168.154.128 6379 1 //1表示1臺服務器
98 sentinel down-after-milliseconds mymaster 3000 //故障切換時間

systemctl start redis-sentinel //啓動羣集,從服務器也要開啓羣集
netstat -antp | grep 26379

redis-cli -h 192.168.154.128 -p 26379 info Sentinel //查看羣集信息
------------------驗證主從切換------------------
在主上:
systemctl stop redis //中止redis
redis-cli -h 192.168.154.128 -p 26379 info Sentinel //再次查看

systemctl start redis.service //再次開啓是不會主動回到master ,除非關閉從的redis

--------------驗證redis數據同步狀況------------
redis-cli -h 192.168.154.128 -p 6379
set name2 test2

在從服務器上鍊接,get name2 查看是否有數據

--------------mysql 主服務器配置-----------
vim /etc/my.cnf //[mysqld]下

binlog-ignore-db=mysql,information_schema
character_set_server=utf8
log_bin=mysql_bin
server_id=1 //從服務器的id須要修改
log_slave_updates=true
sync-binlog=1

systemctl restart mariadb.service

netstat -antp | grep 3306

mysql -u root -p

grant replication slave on . to 'rep'@'192.168.154.%' identified by '123123';

flush privileges;

show master status; //記錄日誌文件與偏移量

---------配置mariadb從服務器-------------------
mysql -u root -p

change master to master_host='192.168.154.128',master_user='rep',master_password='123123',master_log_file='mysql_bin.000002',master_log_pos=473;

start slave; //開啓主從複製
show slave status\G; //查看狀態

Slave_IO_Running: Yes   //獲得如下兩個爲Yes的值
    Slave_SQL_Running: Yes
相關文章
相關標籤/搜索