1. 程式人生 > 其它 >位元組面試題整理

位元組面試題整理

技術標籤:nginxHaproxynginxhaproxy

文章目錄

一、常見的Web叢集排程器

  • 目前常見的web叢集排程器分為軟體和硬體
  • 軟體通常使用開源的LVS、Haproxy、Nginx
  • 硬體一般使用比較多的是F5,也有很多人使用國內的一些產品,如梭子魚,綠盟等

二、Haproxy應用分析

  • LVS在企業應用中抗負載能力很強,但存在不足
    • LVS不支援正則處理,不能實現動靜分離
    • 對於大型網站,LVS的實施配置複雜,維護成本相對較高
  • Haproxy是一款可以提供高可用性、負載均衡、及基於TCP和HTTP應用的代理的軟體

三、Haproxy排程演算法原理

Haproxy支援多種排程演算法,最常用的有三種RR(輪詢)、LC(最小連線數演算法)、SH(基於來源訪問排程演算法)

3.1 RR

RR演算法是最簡單最常用的一種演算法,即輪詢排程
理解舉例:

  • 有三個節點a,b,c
  • 第一個使用者訪問會被指派到節點a
  • 第二個使用者訪問會被指派到節點b
  • 第三個使用者訪問會被指派到節點c
  • 第四個使用者訪問繼續指派到節點a,輪詢分配訪問請求實現負載均衡效果

3.2 LC

LC最小連線數演算法,根據後端的節點連線數大小動態分配請求
理解舉例:

  • 有三個節點a,b,c,各節點的連線數分別為a:4,b:5,c:6
  • 第一個使用者連線請求,會被指派到a上,連線數變為a:5,b:5,c:6
  • 第二個使用者請求會繼續分配到a上,連線數變為a:6,b:5,c:6;再有新的請求會分配給b,每次將新的請求指派給連線數最少的客戶端
  • 優於實際情況下a,b,c的連線數會動態釋放,很難會出現一樣連線數的情況
  • 此演算法相比較RR演算法有很大改進,是目前用到比較多的一種演算法

3.3 SH

SH基於來源訪問排程演算法,用於一些Session會話記錄在伺服器端的場景,可以基於來源的IP,cookie等做叢集排程
理解舉例:

  • 有三個節點a,b,c,第一個使用者第一次訪問被指派到了a,第二個使用者第一次訪問被指派到了b
  • 當第一個使用者第二次訪問時會被繼續指派到a,第二個使用者第二次訪問時依舊會被指派到b,只要負載均衡排程器不重啟,第一個使用者訪問都會被指派到a,第二個yoghurt訪問都會被指派到b,實現叢集的排程
  • 此排程演算法的好處是實現會話保持,但某些IP訪問量非常大時會引起負載不均衡,部分節點訪問量超大,影響業務使用

四、Haproxy配置檔案

4.1、global配置引數

  • log127.0.0.1 lcal0:配置日誌記錄,local0為日誌裝置,預設存放到系統日誌
  • log127.0.0.1 loca1 notice:notice為日誌級別,通常有24個級別
  • maxconn4096:最大連線數
  • uid 99:使用者uid
  • gid 99:使用者gid

4.2、defaults配置引數

  • log global:定義日誌為global配置中的日誌定義
  • mode http:模式為http
  • option httplog:採用http日誌格式記錄日誌
  • retries 3:檢查節點伺服器失敗連續達到三次則認為節點不可用
  • maxconn2000:最大連線數
  • contimeout5000:連線超時時間
  • clitimeout50000:客戶端超時時間
  • srvtimeout50000:伺服器超時時間

4.3、listen配置引數

  • listen appli4- backup 0.0.0.0:10004:定義一個appli4- backup的應用
  • option httpchk /index.html檢查伺服器的index.html檔案
  • option persist:強制將請求傳送到已經down掉的伺服器(註釋掉,否則起服務會報錯)
  • balance roundrobin:負載均衡排程演算法使用輪詢演算法
  • server inst1 192.168.40.10:80 check inter 2000 fall 3:定義線上節點
  • server inst2 192.168 40.10:81 check inter 2000 fall 3 backup:定義備份節點

五、案例部署實踐

5.1 環境

Haproxy:192.168.40.10
Nginx1:192.168.40.20
Nginx2:192.168.40.30
NFS:192.168.40.40
client:192.168.40.50

5.2 NFS配置

yum -y install nfs-utils rpcbind
mkdir /web1
mkdir /web2
echo "<h1>nginx web1</h1>" > /web1/index.html
echo "<h1>nginx web2</h1>" > /web2/inedx.html
vi /etc/exports
/web1 192.168.40.20(ro)
/web2 192.168.40.30(ro)
systemctl start nfs rpcbind
showmount -e ## 檢視釋出情況

5.3 Nginx1配置

yum -y install gcc gcc-c++ make pcre-devel zlib-devel
useradd -M -s /sbin/nologin nginx
tar zxvf nginx-1.12.2.tar.gz 
cd nginx-1.12.2/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install
cd
ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/
mount 192.168.40.40:/web1 /usr/local/nginx/html/
nginx
[root@nginx1 ~]# curl http://localhost
<h1>nginx web1</h1>

5.4 Nginx2配置

yum -y install gcc gcc-c++ make pcre-devel zlib-devel
useradd -M -s /sbin/nologin nginx
tar zxvf nginx-1.12.2.tar.gz 
cd nginx-1.12.2/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install
cd
ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/
mount 192.168.40.40:/web2 /usr/local/nginx/html/
nginx
[root@nginx2 ~]# curl http://localhost
<h1>nginx web2</h1>

5.5 Haproxy配置

yum -y install gcc gcc-c++ make pcre-devel bzip2-devel ## 安裝依賴環境
## 編譯安裝Haproxy
tar zxvf haproxy-1.4.24.tar.gz 
cd haproxy-1.4.24/
make TARGET=lunux26
make install

## 建立haproxy目錄,將軟體包中的配置檔案模板複製到haproxy目錄中
mkdir /etc/haproxy
cp examples/haproxy.cfg /etc/haproxy/

## 修改haproxy.cfg配置引數
cd /etc/haproxy/
vim haproxy.cfg
#chroot /usr/share/haproxy  ## 加上註釋,固有目錄註釋掉
#redispatch  ##添加註釋
## 刪除所有listen配置,新增以下配置
vim /etc/haproxy/haproxy.cfg 
listen webcluster 0.0.0.0:80
        option httpchk GET /index.html
        balance roundrobin
        server web1 192.168.40.20:80 check inter 2000 fall 3
        server web2 192.168.40.30:80 check inter 2000 fall 3

## 優化服務啟動
cd haproxy-1.4.24/
cp examples/haproxy.init /etc/init.d/haproxy
vi /etc/init.d/haproxy
# chkconfig: 35 80 90
chmod 755 /etc/init.d/haproxy
chkconfig --add /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
systemctl start haproxy

5.6 client驗證

第一次訪問Haproxy伺服器
在這裡插入圖片描述
第二次訪問
在這裡插入圖片描述

六、Haproxy日誌管理

##修改Haproxy配置中關於日誌的選項,註釋掉global裡的log 127.0.0.1   local0和log 127.0.0.1   local1 notice,新增
global
	log /dev/log local0 info	
	log /dev/log local0 notice
## 修改rsyslog配置,將Haproxy相關的配置獨立定義到haproxy.conf,並放到/etc/rsyslog.d下
touch /etc/rsyslog.d/haproxy.conf
vi /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~
systemctl restart rsyslog haproxy ## 重啟rsyslog,Haproxy服務完成配置
cd /var/log/haproxy ## 檢視日誌資訊

haproxy-info.log  --haproxy排程資訊
haproxy-notice.log --haproxy啟動資訊
可在/var/log/haproxy下看到收集的日誌資訊


七、Haproxy優化

1、maxconn:最大連線數,根據應用實際情況進行調整,推薦使用10240
2、daemon:守護程序模式, Haproxy可以使用非守護程序模式啟動,建議使用守護程序模式啟動
3、nbproc:負載均衡的併發程序數,建議與當前伺服器CPU核數相等或為其2倍
retries:重試次數,主要用於對叢集節點的檢查,如果節點多,且併發量大,設定為2次或3次
4、option http-server-close:主動關閉http請求選項,建議在生產環境中使用此選項
5、timeout http-keep-alive:長連線超時時間,設定長連線超時時間,可以設定為10s
6、timeout http-request:http請求超時時間,建議將此時間設定為5~10s,增加http連線釋放速度
7、timeout client:客戶端超時時間,如果訪問量過大,節點響應慢,可以將此時間設定短一些,建議設定為1min左右就可以了