Web架構 - 預防高併發的服務架構

CDN(靜態資源) + Nginx(負載均衡&反向代理)+ Redis(主從配置&Sentinel監聽集羣)+ Mysql(主從配置)

介紹:業務從發展的初期到逐漸成熟,服務器架構也是從相對單一到集羣,再到分佈式,技術迭代的速度很是快,致使咱們不斷的學習。。。
一個能夠支持高併發的服務少不了好的服務器架構,須要有負載均衡,主從集羣的數據庫,主從集羣的緩存,靜態文件上傳cdn,好比 七牛雲 等,這些都是讓業務程序流暢運行的強大後盾。html

閒話很少說,下面簡單介紹搭建Windows服務器架構。mysql

1、配置Nginx

介紹:Nginx是 Igor Sysoev 爲俄羅斯訪問量第二 Rambler.ru 站點開發的一款高性能HTTP和反向代理服務器。nginx

那麼有些人不明白反向代理與正向代理有什麼不一樣?redis

正向代理就像是 由於GWF,國內須要使用代理訪問Google,可是Google不知道真實的客戶端是誰,代理隱藏了真實的客戶端請求,客戶端請求的服務都被代理服務器代替。sql

圖片描述

www.baidu.com 是咱們的反向代理服務器,反向代理服務器會幫咱們把請求轉發到真實的服務器那裏去。
圖片描述數據庫

一、下載 Nginx-Windows & Tomcat7

Nginx命令 1:從新加載配置 2:關閉 3:開啓(或者nginx -c conf/nginx.confsegmentfault

附錄:Nginx工做原理windows

二、修改配置文件

修改\Tomcat\conf\server.xml (三個端口)& \nginx-1.11.6\conf\nginx.conf緩存

#user  nobody;#用戶名
worker_processes  1;#工做進程(與CPU個數一比一)

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;#單個進程最大鏈接數(worker_processes*worker_connections/4小於系統進程打開的文件總數)
}


http {
      upstream tomcat  { #反向代理 
                server localhost:8082 weight=2;#weight權重(機器性能好weight就設大些)
                server localhost:8083 weight=3;  
        } 
    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"';#轉發真實ip

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;#默認80端口
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {#配置靜態文件等
            root   html;
            index  index.html index.htm;
            proxy_pass http://tomcat;#反向代理(上面upstream tomcat)
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

}

三、測試

如何知道集羣服務器配置好了呢?tomcat

咱們修改項目頁面,將body內容改成aaa...和bbb...,打包分別放到上面的Tomcat中,從新啓動Tomcat和Nginx。

圖片描述
圖片描述

根據上圖,Nginx會將請求分發到不一樣的Tomcat中。

介紹:Nginx是採用master-worker多進程的方式,master負責請求轉發,worker的數量爲CPU數,全部worker進程的listenfd會在新鏈接到來時變得可讀,爲保證只有一個進程處理該鏈接,全部worker進程在註冊listenfd讀事件前搶accept_mutex,搶到互斥鎖的那個進程註冊listenfd讀事件,在讀事件裏調用accept接受該鏈接。

四、防預CC攻擊

使用 NGINX 流控和 fail2ban 防止 CC 攻擊

在http模塊中添加

limit_req_zone $binary_remote_addr zone=sym:10m rate=5r/s;   #限制發起的請求頻率,每秒5次
limit_conn_zone $binary_remote_addr zone=conn_sym:10m;       #限制發起的鏈接數

在location中添加

limit_req zone=sym burst=5;
limit_conn conn_sym 10;

配置好後Nginx重啓。模擬多線程併發請求,結果顯示成功和異常:

10線程

查詢Nginx/conf/error.log,顯示以下:

圖片描述

2、配置Redis&Sentinel

一、下載 Redis3.0

解壓redis(主)再複製三份,文件夾名稱分別改成redis-slave(從)、redis-slave2(從)、redis-sentinel(哨兵)這些文件夾都能複製屢次
要用的文件夾應包含文件(*.conf文件的名字可能不一樣!sentinel.conf須要新建!)

二、修改配置文件

修改redis(主)文件夾下的redis.windows.conf:

port 6380                          #端口(不能重複) 
logfile "E:/redis.log"             #日誌(防止宕機後可查)
slave-read-only no                 #默認爲yes,改成no用於主從複製
requirepass "XXX"                  #密碼(主從密碼需相同)

修改redis-slave(從)下的redis.windows.conf:

port 6381
logfile "E:/redis_slave1.log"        
slaveof 127.0.0.1 6380              #master     
slave-read-only no
masterauth "XXX"                    #主密碼
requirepass "XXX"

在redis-sentinel(哨兵)下建立sentinel.conf文件,內容爲:

port 26379
sentinel monitor mymaster 127.0.0.1 6380 1          #主配置,數字1表明有1個Sentinel監聽有問題就進行主從複製並切換
sentinel down-after-milliseconds mymaster 6000
sentinel failover-timeout mymaster 900000
sentinel auth-pass mymaster Alex                    #密碼

下面爲演示:
(1)運行主從Redis:
主
從1
從2

(2)運行Sentinel:

介紹:監聽Redis的哨兵,具體看附錄
附錄:Sentinel

運行Sentinel前的配置
運行Sentinel

運行Sentinel後,.conf中配置內容就會刷新成:

圖片描述
生成的日誌

爲防止Sentinel宕掉。可複製多份sentinel並修改端口,分別啓動。

(3)檢測主從切換

當master宕機後,防止整個資源掛掉,將採用Sentinel實時監控Redis,狀況發生後會當即主從複製並切換,這樣系統崩潰的機率大大下降。
停掉主服務
控制檯輸出
停掉主後Sentinel的配置

監聽的主端口變爲6381,非以前的6380,子監聽的主也自動切換了。

3、配置Mysql集羣

一、配置master主服務器

(1)在Master MySQL上建立用戶,容許其餘Slave服務器能夠經過遠程訪問Master,經過該用戶讀取二進制日誌,實現數據同步。
建立新用戶
圖片描述

建立的用戶必須具備REPLICATION SLAVE權限,除此以外不必添加沒必要要的權限,密碼爲'XXX'。192.168.94.%是指明用戶所在服務器,%是通配符,表示192.168.94.0/255的Server均可以登錄主服務器。

(2)修改my.Ini文件。啓動二進制日誌log-bin。

在[mysqld]下面增長:

server-id=1                       #給數據庫服務的惟一標識,通常爲你們設置服務器Ip的末尾號
log-bin=master-bin
log-bin-index=master-bin.index

(3)重啓Mysql服務,查看日誌

查看日誌

二、配置slaver從服務器

(1)修改my.ini文件,在[mysqld]下面增長

log_bin           = mysql-bin
server_id         = 2
relay_log         = mysql-relay-bin
log_slave_updates = 1
read_only         = 1

重啓Mysql

(2)鏈接Master

change master to master_host='192.168.XXX.XXX', 
master_port=3306,
master_user='alexnevsky',
master_password='XXXX', 
master_log_file='master-bin.000001',
master_log_pos=0;

(3)啓動Slave

start slave;

相關文章
相關標籤/搜索