11. Nginx實(shí)現(xiàn)負(fù)載均衡

6.2 實(shí)現(xiàn)Nginx TCP負(fù)載均衡

Nginx在1.9.0版本開始支持tcp模式的負(fù)載均衡, 在1.9.13版本開始支持udp協(xié)議的負(fù)載均衡, udp主要用于DNS的域名解析, 其配置方式和指令和http代理類似, 其基于ngx_stream_proxy_module模塊實(shí)現(xiàn)tcp負(fù)載, 另外基于模塊ngx_http_upstream_module實(shí)現(xiàn)后端服務(wù)器分組轉(zhuǎn)發(fā), 權(quán)重分配, 狀態(tài)監(jiān)測(cè), 調(diào)度算法等高級(jí)功能

如果是編譯安裝, 需要指定--with-stream選項(xiàng)才能支持ngx_stream_proxy_module模塊

6.2.1 tcp 負(fù)載均衡配置參數(shù)

stream { # 定義stream相關(guān)的服務(wù), 定義在main語(yǔ)句塊和http平級(jí)
    upstream backend { # 定義后端服務(wù)器
        hash $remote_addr consistent; # 定義調(diào)度算法
        server backend1.example.com:12345 weight=5; # 定義具體server
        server 127.0.0.1:12345 max_fails=3 fail_timeout=30s;
        server unix:/tmp/backend3;
    }

    upstream dns { # 定義后端服務(wù)器
        server 10.0.0.1:53535; # 定義具體server
        server dns.example.com:53;
    }

    server { # 定義server, 定義nginx如何接收和轉(zhuǎn)發(fā)遠(yuǎn)程用戶的請(qǐng)求
        listen 12345; # 監(jiān)聽ip:port
        proxy_connect_timeout 1s; # 連接超時(shí)時(shí)間
        proxy_timeout 3s; # 轉(zhuǎn)發(fā)超時(shí)時(shí)間
        proxy_pass backend; # 轉(zhuǎn)發(fā)到具體服務(wù)器組
    }
    
    server {
        listen 127.0.0.1:53 udp reuseport;
        proxy_timeout 20s;
        proxy_pass dns;
    }

    server {
        listen [::1]:12345;
        proxy_pass unix:/tmp/stream.socket;   
    }
} 

6.2.2 負(fù)載均衡案例: Redis

6.2.2.1 準(zhǔn)備環(huán)境

準(zhǔn)備兩臺(tái)后端服務(wù)器, 安裝redis
可以基于每臺(tái)服務(wù)器的run_id測(cè)試調(diào)度結(jié)果
yum -y install redis
vim /etc/redis.conf
bind 0.0.0.0 
systemctl enable --now redis

6.2.2.2 nginx配置負(fù)載均衡

# 先在nginx主配置文件定義tcp負(fù)載均衡的子配置文件路徑
[13:50:26 root@nginx ~]#vim /apps/nginx/conf/nginx.conf
include /apps/nginx/conf/tcp/tcp.conf; # 注意: tcp負(fù)載均衡的子配置文件路徑指令要和http語(yǔ)句塊平級(jí), 一般寫在主配置文件最后即可, 由于stream是一級(jí)語(yǔ)句塊, 整個(gè)nginx只能有一個(gè), 因此, 所有的tcp/udp負(fù)載均衡配置, 都寫在同一個(gè)文件里
[00:30:17 root@nginx /apps/nginx/conf/tcp]#vim redis.conf

stream {                                                                                                                                                                            

    upstream redis-server {
        server 10.0.0.85:6379 weight=2;
        server 10.0.0.84:6379 weight=1;

    }
    server{
        # 配置負(fù)載均衡時(shí), server語(yǔ)句塊不支持server_name, 客戶端直接訪問nginx的ip地址和端口
        listen 6379;
        proxy_pass redis-server;
    }

}

[00:35:51 root@nginx /apps/nginx/conf/tcp]#nginx -s reload
[13:51:16 root@nginx ~]#ss -ntl
State                   Recv-Q                  Send-Q                                    Local Address:Port                                     Peer Address:Port                  
LISTEN                  0                       128                                             0.0.0.0:6379     # 驗(yàn)證監(jiān)聽6379端口                                      0.0.0.0:*                     
LISTEN                  0                       128                                             0.0.0.0:80                                            0.0.0.0:*                     
LISTEN                  0                       128                                             0.0.0.0:22                                            0.0.0.0:*                     
LISTEN                  0                       128                                                [::]:22                                               [::]:*  

6.2.2.3 客戶端連接nginx測(cè)試

# 可以看到1:2調(diào)度
[00:38:02 root@client ~]#redis-cli -h 10.0.0.86 info server | grep run_id
run_id:6c86d33bf1002c7839f43a6ac9055f0406d61b7a
[00:38:25 root@client ~]#redis-cli -h 10.0.0.86 info server | grep run_id
run_id:580343970ae2d5078ff064260e170a8932a48338
[00:38:27 root@client ~]#redis-cli -h 10.0.0.86 info server | grep run_id
run_id:6c86d33bf1002c7839f43a6ac9055f0406d61b7a
[00:38:28 root@client ~]#redis-cli -h 10.0.0.86 info server | grep run_id
run_id:6c86d33bf1002c7839f43a6ac9055f0406d61b7a

6.2.3 負(fù)載均衡案例: MySQL

圖片.png

6.2.3.1 準(zhǔn)備環(huán)境

為了測(cè)試效果, 后端分別使用mariadb和mysql
數(shù)據(jù)庫(kù)上創(chuàng)建用戶, 需要對(duì)nginx的ip地址進(jìn)行授權(quán)
nginx基于四層的調(diào)度是偽四層, 因此nginx會(huì)拆分請(qǐng)求和響應(yīng)報(bào)文, 重新封裝
# 10.0.0.85 - MySQL
[23:34:16 root@mysql ~]#yum -y install mysql-server
[23:35:30 root@mysql ~]#systemctl enable --now mysqld
Created symlink /etc/systemd/system/multi-user.target.wants/mysqld.service → /usr/lib/systemd/system/mysqld.service.
[23:42:31 root@mysql ~]#mysql -e 'create user admin@"10.0.0.%" identified by "000000"'
# 10.0.0.84 - MariaDB
[23:34:41 root@mariadb ~]#yum -y install mariadb-server
[23:35:13 root@mariadb ~]#systemctl enable --now mariadb
Created symlink /etc/systemd/system/mysql.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/mysqld.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service.
[23:44:03 root@mariadb ~]#mysql -e 'create user admin@"10.0.0.%" identified by "000000"'

6.2.3.2 nginx配置負(fù)載均衡

# 單獨(dú)指定存放tcp負(fù)載均衡的配置文件, 關(guān)于tcp的負(fù)載均衡配置, 都可以寫到tcp目錄下某個(gè).conf文件里, 因?yàn)閟tream是一級(jí)語(yǔ)句塊, 一個(gè)服務(wù)器只能有一個(gè), 因此只能存在一個(gè).conf配置文件, 專門來(lái)配置tcp負(fù)載均衡, 如果多個(gè)文件都有stream模塊, 那么重啟nginx會(huì)報(bào)錯(cuò)
include /apps/nginx/conf/tcp/*.conf;                                                                                                                                                                                                                                                                            
[23:47:05 root@nginx /apps/nginx/conf]#mkdir  /apps/nginx/conf/tcp
[23:47:44 root@nginx /apps/nginx/conf]#cd  /apps/nginx/conf/tcp
[23:47:45 root@nginx /apps/nginx/conf/tcp]#
[23:47:46 root@nginx /apps/nginx/conf/tcp]#
[23:47:46 root@nginx /apps/nginx/conf/tcp]#vim mysql.conf
[23:47:46 root@nginx /apps/nginx/conf/tcp]#vim mysql.conf

stream {

     upstream mysql-server { # upstream定義后端服務(wù)器組
        server 10.0.0.85:3306 max_fails=3 fail_timeout=30s;
        server 10.0.0.84:3306; # 后端服務(wù)器監(jiān)聽的端口
     }

     server { # server定義nginx如何接收和處理客戶端請(qǐng)求, 包括監(jiān)聽的端口, 和轉(zhuǎn)發(fā)到的后端群組
        listen 3306; # 面對(duì)客戶端的端口
        proxy_pass mysql-server;
     }
                                                                                                                                                                                    
}

[23:59:02 root@nginx /apps/nginx/conf/tcp]#nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[23:59:05 root@nginx /apps/nginx/conf/tcp]#nginx -s reload
[23:59:10 root@nginx /apps/nginx/conf/tcp]#ss -ntl
State                   Recv-Q                  Send-Q                                    Local Address:Port                                     Peer Address:Port                  
LISTEN                  0                       128                                             0.0.0.0:3306                                          0.0.0.0:*                     
LISTEN                  0                       128                                             0.0.0.0:80                                            0.0.0.0:*                     
LISTEN                  0                       128                                             0.0.0.0:22                                            0.0.0.0:*                     
LISTEN                  0                       128                                                [::]:22                                               [::]:*

6.2.3.3 客戶端連接nginx測(cè)試

# 10.0.0.187安裝mysql客戶端

[00:00:27 root@client ~]#yum -y install mysql
# 連接nginx

[00:00:44 root@client ~]#mysql -h 10.0.0.86 -uadmin -p000000
MySQL [(none)]> 
# 驗(yàn)證版本
圖片.png

此時(shí)后端服務(wù)器會(huì)認(rèn)為是nginx在訪問, 因此數(shù)據(jù)庫(kù)授權(quán)也是針對(duì)nginx進(jìn)行授權(quán)

圖片.png

通過nginx的tcp負(fù)載均衡, 可以實(shí)現(xiàn)對(duì)后端的PXC集群進(jìn)行調(diào)度

圖片.png

補(bǔ)充: lvs和nginx四層負(fù)載均衡的區(qū)別

nginx對(duì)于tcp的負(fù)載均衡實(shí)際是偽四層, 因?yàn)閚ginx會(huì)代替客戶端向后端服務(wù)器發(fā)起請(qǐng)求, 而不是單獨(dú)的轉(zhuǎn)發(fā), 后端服務(wù)器看到的是nginx服務(wù)器的ip地址
lvs對(duì)于tcp的負(fù)載均衡是只轉(zhuǎn)發(fā), 后端服務(wù)器看到的是客戶端的源ip地址
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市妄呕,隨后出現(xiàn)的幾起案子绪励,更是在濱河造成了極大的恐慌论咏,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蠢护,死亡現(xiàn)場(chǎng)離奇詭異葵硕,居然都是意外死亡懈凹,警方通過查閱死者的電腦和手機(jī)悄谐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門们陆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)情屹,“玉大人,你說(shuō)我怎么就攤上這事椅文。” “怎么了皆刺?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵毒坛,是天一觀的道長(zhǎng)林说。 經(jīng)常有香客問我屯伞,道長(zhǎng),這世上最難降的妖魔是什么珠移? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任钧惧,我火速辦了婚禮浓瞪,結(jié)果婚禮上巧婶,老公的妹妹穿的比我還像新娘。我一直安慰自己英岭,他們只是感情好诅妹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布吭狡。 她就那樣靜靜地躺著堰塌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪般此。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天邀桑,我揣著相機(jī)與錄音壁畸,去河邊找鬼。 笑死捏萍,一個(gè)胖子當(dāng)著我的面吹牛空闲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逗噩,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼异雁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼僧须!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起柑蛇,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤驱闷,失蹤者是張志新(化名)和其女友劉穎空另,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摄杂,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡循榆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年秧饮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柑船。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖亏拉,靈堂內(nèi)的尸體忽然破棺而出逆巍,到底是詐尸還是另有隱情,我是刑警寧澤磷蛹,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站庇勃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鸳兽。R本人自食惡果不足惜罕拂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一爆班、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧戚嗅,春花似錦枢舶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至哟冬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锥债,已是汗流浹背痊臭。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工广匙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人潮剪。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓分唾,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親绽乔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子折砸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

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