1. 程式人生 > 其它 >Linux之負載均衡

Linux之負載均衡

負載均衡的實現

  通過代理將流量按照一定的比例,轉發到後端

負載均衡的實現

  1、實現

將後端服務打包成一個IP連線池。

1、反向代理
server {
       listen 80;
       server_name _;
       location / {
        proxy_pass http://[連線池];
       }
}

2、IP連線池
upstream [連線池名稱] {
    server [ip]:[port];
    server [ip]:[port];
    server [ip]:[port];
}

[root@lb01 conf.d]# 
cat game.conf upstream supermarie { server 172.16.1.7:80; server 172.16.1.8:80; server 172.16.1.9:80; } server { listen 80; server_name _; location / { proxy_pass http://supermarie; include /etc/nginx/proxy_params; } }

  2、負載均衡的比例

    1、輪詢

# 預設情況下,Nginx負載均衡的輪詢狀態。
upstream supermarie {
    server 
172.16.1.7:80; server 172.16.1.8:80; server 172.16.1.9:80; }

    2、權重

# Nginx中的權重0-100,數字越大,權重越高。
upstream supermarie {
    server 172.16.1.7:80 weight=9;
    server 172.16.1.8:80 weight=5;
    server 172.16.1.9:80 weight=1;
}

    3、ip_hash

# 每一個IP固定訪問某一個後端。
upstream supermarie {
    server 172.16
.1.7:80; server 172.16.1.8:80; server 172.16.1.9:80; ip_hash; }

負載均衡後端狀態

  1、down

# 暫時不分配流量
upstream supermarie {
    server 172.16.1.7:80 down;
    server 172.16.1.8:80;
    server 172.16.1.9:80;
}

server {
    listen 80;
    server_name _;
    location / {
        proxy_pass http://supermarie;
        include /etc/nginx/proxy_params;
    }
}

  2、backup

# 只有當所有的機器全部宕機,才能啟動。
upstream supermarie {
    server 172.16.1.7:80 backup;
    server 172.16.1.8:80;
    server 172.16.1.9:80;
}

server {
    listen 80;
    server_name _;
    location / {
        proxy_pass http://supermarie;
        include /etc/nginx/proxy_params;
    }
}

  3、max_fails、fail_timeout

# max_fails

# proxy_next_upstream 後端錯誤標識

[root@lb01 ~]# cat /etc/nginx/conf.d/game.conf 
upstream supermarie {
    server 172.16.1.7:80 max_fails=3 fail_timeout=3s;
    server 172.16.1.8:80 max_fails=3 fail_timeout=3s;
    server 172.16.1.9:80 max_fails=3 fail_timeout=3s;
}

server {
    listen 80;
    server_name _;
    location / {
        proxy_pass http://supermarie;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_404; 
        include /etc/nginx/proxy_params;
    }
}
注意:proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; 

error             # 與伺服器建立連線,向其傳遞請求或讀取響應頭時發生錯誤;
timeout           # 在與伺服器建立連線,向其傳遞請求或讀取響應頭時發生超時;
invalid_header    # 伺服器返回空的或無效的響應;
http_500          # 伺服器返回程式碼為500的響應;
http_502          # 伺服器返回程式碼為502的響應;
http_503          # 伺服器返回程式碼為503的響應;
http_504          # 伺服器返回程式碼504的響應;
http_403          # 伺服器返回程式碼為403的響應;
http_404          # 伺服器返回程式碼為404的響應;
http_429          # 伺服器返回程式碼為429的響應(1.11.13);
non_idempotent    # 通常,請求與 非冪等 方法(POST,LOCK,PATCH)不傳遞到請求是否已被髮送到上游伺服器(1.9.13)的下一個伺服器; 啟用此選項顯式允許重試此類請求;
off               # 禁用將請求傳遞給下一個伺服器。

負載均衡部署BBS

  1、部署後端服務

    部署python

建立使用者
[root@web01 opt]# groupadd django -g 888
[root@web01 opt]# useradd django -u 888 -g 888 -r -M -s /bin/sh

安裝依賴軟體
[root@web01 opt]# yum install python3 libxml* python-devel gcc* pcre-devel openssl-devel python3-devel -y

    部署Django和uwsgi

安裝Django和uwsgi
[root@web01 opt]# pip3 install django==1.11
[root@web01 opt]# pip3 install uwsgi
[root@web01 opt]# pip3 install pymysql

建立專案
[root@web01 opt]# unzip bbs.zip 
[root@web03 bbs]# pwd
/opt/bbs
[root@web03 bbs]# vim bbs/settings.py 
ALLOWED_HOSTS = ['*']
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'bbs',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '172.16.1.61',
        'PORT': 3306,
        'CHARSET': 'utf8'
    }
}

# 啟動測試
[root@web01 bbs]# python3 manage.py runserver 0.0.0.0:8000

    配置並啟動

編輯專案配置檔案
[root@localhost ~]# cat /opt/linux/myweb_uwsgi.ini 
[uwsgi]
# 埠號
socket            = :8000
# 指定專案的目錄
chdir           = /opt/bbs
# wsgi檔案路徑
wsgi-file       = bbs/wsgi.py
# 模組wsgi路徑
module          = bbs.wsgi
# 是否開啟master程序
master          = true
# 工作程序的最大數目
processes       = 4
# 結束後是否清理檔案
vacuum          = true

啟動uwsgi
[root@web01 linux]# uwsgi -d --ini myweb_uwsgi.ini --uid 666

-d       : 以守護程序方式執行
--ini : 指定配置檔案路徑
--uid : 指定uid

TCP 服務

編輯Nginx配置檔案
[root@localhost ~]# cat /etc/nginx/conf.d/python.conf 
server {
    listen 80;
    server_name py.test.com;
    location / { 
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8000;
        uwsgi_read_timeout 2;
        uwsgi_param UWSGI_SCRIPT bbs.wsgi;
        uwsgi_param UWSGI_CHDIR /opt/bbs;
        index  index.html index.htm;
        client_max_body_size 35m;
    }
}

重啟Nginx配置
systemctl restart nginx

    部署負載均衡

[root@lb01 conf.d]# cat python.conf 
upstream bbs {
    server 172.16.1.7:80 max_fails=3 fail_timeout=3s;
    server 172.16.1.8:80 max_fails=3 fail_timeout=3s;
    server 172.16.1.9:80 max_fails=3 fail_timeout=3s;
}

server {
    listen 80;
    server_name py.test.com;
    location / {
        proxy_pass http://bbs;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_404; 
        include /etc/nginx/proxy_params;
    }
}