1. 程式人生 > >Centos7.4安裝配置haproxy和Keepalived

Centos7.4安裝配置haproxy和Keepalived

global sysconf 無法 用戶組 outer cfg unicast app note

系統版本是centos7.4的

[root@data-1-1 ~]# cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 
[root@data-1-1 ~]# uname -r
3.10.0-693.el7.x86_64
[root@data-1-1 ~]# ip ad|grep eth0 |grep -v mtu
    inet 10.0.1.61/24 brd 10.0.1.255 scope global eth0
[root@data-1-1 ~]# 

  

這次試用的haproxy版本是穩定版中的1.6.14

之所以選擇這個haproxy版本
現在時間是2018年4月8日
1.6.14的穩定版版本到現在有3個月時間沒更新新版本了。說明沒太多bug

技術分享圖片

系統優化部分


1、修改文件描述符

默認文件描述符大小是1024

[root@data-1-1 ~]# ulimit -n
1024
[root@data-1-1 ~]# 

這表示當前用戶的每個進程最多允許同時打開1024個文件,這1024個文件中還得除去每個進程必然打開的標準輸入,標準輸出,標準錯誤,服務器監聽socket,進程間通訊的unix域socket等文件,那麼剩下的可用於客戶端socket連接的文件數就只有大概1024-10=1014個左右。也就是說缺省情況下,基於Linux的通訊程序最多允許同時1014個TCP並發連接,顯然不符合我們的要求,改成2到3萬左右,超過65535其實對於haproxy也沒太多作用了,因為一個端口至少占一個文件描述符,系統總的端口是65535.

臨時性一起修改硬件文件描述符和軟件描述符命令如下,直接在命令行執行,立馬生效

-H表示硬件資源限制

-S表示軟件資源限制,它的個數不能超過硬件資源限制

-n表示個數

ulimit -SHn 32768

  

另外網上看到一些人一起修改了進程數限制。下面的nproc參數就是。

cat >> /etc/security/limits.conf <<EOF
# End of file
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
EOF  

這裏我沒修改進程數限制,因為使用ulimit命令可以看到系統默認也1萬多了,比較大了

其中max user processes就是表示用戶的最大進程數,我的這個值很大,進程數也沒有超過它。如果超過的話,可以修改最大進程數的配置

[root@data-1-1 ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15728
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 102400
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 15728
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@data-1-1 ~]# 

  

nproc是操作系統級別對每個用戶創建的進程數的限制,在Linux下運行多線程時,每個線程的實現其實是一個輕量級的進程,對應的術語是:light weight process(LWP)。怎麽知道一個用戶創建了多少個進程呢,默認的ps是不顯示全部進程的,需要‘-L‘ 才能看到所有的進程。

查看所有用戶創建的進程數,使用命令:
ps h -Led -o user | sort | uniq -c | sort -n
[root@data-1-1 ~]# ps h -Led -o user | sort | uniq -c | sort -n
      1 dbus
      1 haproxy
      6 polkitd
    140 root
[root@data-1-1 ~]# 

  

永久性修改系統文件描述符大小

cat >> /etc/security/limits.conf << EOF
*           soft   nofile       32768
*           hard   nofile       65535
EOF  

2、修改系統內核參數

修改系統內核參數,下面參數追加到文件末尾,會覆蓋前面相同的參數。

cat >> /etc/sysctl.conf << EOF
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv4.ip_local_port_range = 10240 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_nonlocal_bind=1
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_forward=1
net.ipv4.icmp_echo_ignore_broadcasts = 1
EOF
/sbin/sysctl -p

  

  

上面參數的含義

##關閉ipv6,完全用不到ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

##避免放大攻擊
net.ipv4.icmp_echo_ignore_broadcasts = 1

##開啟SYN洪水攻擊保護
net.ipv4.tcp_syncookies = 1

##允許系統打開的端口範圍,因為haproxy要連後端web服務器,每次都是1個隨機端口,每個用戶請求都占用一個端口
net.ipv4.ip_local_port_range = 10240    65535

##改tcp的tw端口的復用,啟用reuse,新的請求可以使用haproxy連接後端的未釋放的空閑鏈接。避免每次回收和開啟新端口開銷
##註意不要啟用tcp_tw_recycle,它是端口的快速回收。和這個沖突
net.ipv4.tcp_tw_reuse = 1

##打開ip_forward內核的轉發功能(我測試沒開啟也能成功訪問後端web服務器,這裏開啟吧,沒影響)
net.ipv4.ip_forward=1

##配置linux進程可以綁定非本地IP,後面配置Keepalived雙機高可用方案的時候會用到,技術部配置高可用也不影響系統
net.ipv4.ip_nonlocal_bind=1

  

下面是臨時修改一些參數方式。臨時生效,重啟後參數會失效

[root@data-1-1 ~]# echo "10240 65534" >/proc/sys/net/ipv4/ip_local_port_range
[root@data-1-1 ~]# cat /proc/sys/net/ipv4/ip_local_port_range
10240	65534
[root@data-1-1 ~]# 


[root@data-1-1 ~]# cat /proc/sys/net/ipv4/tcp_tw_reuse
0
[root@data-1-1 ~]# echo "1">/proc/sys/net/ipv4/tcp_tw_reuse
[root@data-1-1 ~]# cat /proc/sys/net/ipv4/tcp_tw_reuse
1
[root@data-1-1 ~]# 

##打開ip_forward功能打開內核的轉發功能
[root@data-1-1 ~]# cat /proc/sys/net/ipv4/ip_forward
0
[root@data-1-1 ~]# echo "1">/proc/sys/net/ipv4/ip_forward
[root@data-1-1 ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@data-1-1 ~]# 

  

安裝haproxy部分


安裝過程如下

mkdir /tools -p
mkdir /application -p
cd /tools/
wget http://10.0.2.15:8298/soft/haproxy-1.6.14.tar.gz
tar xfz haproxy-1.6.14.tar.gz 
cd haproxy-1.6.14
make TARGET=linux2628 PREFIX=/application/haproxy-1.6.14
##安裝時一定要指定路徑,application下面的haproxy目錄不用提前創建,安裝時自動創建
make install  PREFIX=/application/haproxy-1.6.14

##查看並創建軟鏈接
cd /application/
ln -s /application/haproxy-1.6.14 /application/haproxy


##安裝成功後,查看版本
/application/haproxy/sbin/haproxy -v

##復制haproxy文件到/usr/sbin下
##因為下面的haproxy.init啟動腳本默認會去/usr/sbin下找,當然你也可以修改,不過比較麻煩
cp /application/haproxy/sbin/haproxy /usr/sbin/

##復制haproxy腳本,到/etc/init.d下
cp /tools/haproxy-1.6.14/examples/haproxy.init /etc/init.d/haproxy
chmod 755 /etc/init.d/haproxy 

##創建系統賬號,不創建家目錄,禁止ssh登錄
useradd haproxy -s /sbin/nologin -M

##創建配置文件目錄
mkdir /etc/haproxy -p

##創建chroot目錄
mkdir /var/lib/haproxy -p

  

創建配置文件,路徑和內容如下

[root@data-1-1 ~]# cat /etc/haproxy/haproxy.cfg
global
    #設置日誌
    log 127.0.0.1 local3 info
    chroot /var/lib/haproxy
    #用戶與用戶組
    user haproxy
    group haproxy
    #守護進程啟動
    daemon
    #最大連接數
    maxconn 4096
 
#默認配置
defaults
    log global
    mode http
    retries 3  #連接後端服務器的失敗重試次數
    option httplog
    option dontlognull   #日誌中不記錄空連接,比如不記錄健康檢查的連接
    option forwardfor   #這裏設置之後,下面的frontend和backend默認會繼承它
    timeout connect 10s
    timeout client 20s
    timeout server 30s
    timeout check  5s    #對後端服務器的檢測超時時間
 
#前端配置,http_front名稱可自定義
frontend http_front_8181
    bind *:8181
    mode http
    option httpclose
    default_backend http_back_8181
 
#後端配置,http_back名稱可自定義
backend http_back_8181
    mode http
    balance source  
    option httpchk GET /index.html  #設置健康檢查頁面
    server node1 10.0.2.16:8080 check inter 2000 rise 3 fall 3 weight 6
    server node2 10.0.2.17:8080 check inter 2000 rise 3 fall 3 weight 6

#設置管理頁面
listen admin_stats
    bind *:9188
    mode http
    log 127.0.0.1 local3 err
    stats refresh 30s
    stats uri /my_haproxy_status
    stats realm welcome login\ Haproxy
    stats auth ha_admin:ha_admin!23
    stats hide-version
    stats admin if TRUE
[root@data-1-1 ~]# 

 

關於配置文件

Haproxy配置中分成五部分內容,當然這些組件不是必選的,可以根據需要選擇作為配置。
•global:參數是進程級的,通常和操作系統(OS)相關。這些參數一般只設置一次,如果配置無誤,就不需要再次配置進行修改;
•default:配置默認參數的,這些參數可以被利用配置到frontend,backend,listen組件;
•frontend:接收請求的前端虛擬節點,Frontend可以根據規則直接指定具體使用後端的backend(可動態選擇);
•backend:後端服務集群的配置,是真實的服務器,一個Backend對應一個或者多個實體服務器;
•listen:Frontend和Backend的組合體。

 

配置使用系統的rsyslog服務記錄haproxy日誌

##配置rsyslog記錄haproxy訪問日誌
vim  /etc/rsyslog.conf

##去掉下面兩行前面的#號
$ModLoad imudp
$UDPServerRun 514

##並添加下面一行
local3.*        /var/log/haproxy.log


##重啟rsyslog
systemctl restart rsyslog

###查看監聽,udp的514端口啟動         
[root@data-1-1 ~]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      837/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      917/master          
tcp6       0      0 :::22                   :::*                    LISTEN      837/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      917/master          
udp        0      0 0.0.0.0:514             0.0.0.0:*                           1543/rsyslogd       
udp6       0      0 :::514                  :::*                                1543/rsyslogd       
[root@data-1-1 ~]# 

  

可以啟動haproxy了

haproxy啟動和停止命令
/etc/init.d/haproxy start
/etc/init.d/haproxy stop

  

補充部分


haproxy自帶的啟動腳本有個語法小bug

後面不跟stop或者start的時候,提示第26行有語法錯誤
[root@data-1-2 ~]# /etc/init.d/haproxy 
/etc/init.d/haproxy: line 26: [: =: unary operator expected
Usage: haproxy {start|stop|restart|reload|condrestart|status|check}
[root@data-1-2 ~]# /etc/init.d/haproxy start
Starting haproxy (via systemctl):                          [  OK  ]

26行這裏語法報錯

技術分享圖片

百度解決
https://blog.csdn.net/goodlixueyong/article/details/6564591
shell腳本報錯:"[: =: unary operator expected"
在匹配字符串相等時,我用了類似這樣的語句:
if [ $STATUS == "OK" ]; then     
echo "OK"
fi
在運行時出現了 [: =: unary operator expected 的錯誤,就一直找不到原因,嘗試了刪除等號兩側的空格和括號裏的空格都不管用,
最後baidu了一下,才找到原因。把語句改成這樣就不會出錯了.
if [[ $STATUS = "OK" ]]; 
then     
echo "OK"
fi
究其原因,是因為如果變量STATUS值為空,那麽就成了 [ = "OK"] ,顯然 [ 和 "OK" 不相等並且缺少了 [ 符號,所以報了這樣的錯誤。
當然不總是出錯,如果變量STATUS值不為空,程序就正常了,所以這樣的錯誤還是很隱蔽的。
最後是再加一層中括號

  

技術分享圖片

再次測試沒問題

技術分享圖片

多個frontend配置的部分,這裏是多個端口

[root@data-1-1 ~]# cat /etc/haproxy/haproxy.cfg
global
    #設置日誌
    log 127.0.0.1 local3 info
    chroot /var/lib/haproxy
    #用戶與用戶組
    user haproxy
    group haproxy
    #守護進程啟動
    daemon
    #最大連接數
    maxconn 4096
 
#默認配置
defaults
    log global
    mode http
    retries 3  #連接後端服務器的失敗重試次數
    option httplog
    option dontlognull   #日誌中不記錄空連接,比如不記錄健康檢查的連接
    option forwardfor
    timeout connect 10s
    timeout client 20s
    timeout server 30s
    timeout check  5s    #對後端服務器的檢測超時時間
 
#前端配置,http_front名稱可自定義
frontend http_front_8181
    bind *:8181
    option httpclose
    default_backend http_back_8181
 
#前端配置,http_front名稱可自定義
frontend http_front_18181
    bind *:18181
    option httpclose
    default_backend http_back_18181

#後端配置,http_back名稱可自定義
backend http_back_8181
    balance source  
    option httpchk GET /index.html  #設置健康檢查頁面
    server node1 10.0.2.16:8080 check inter 2000 rise 3 fall 3 weight 6
#   server node2 10.0.2.17:8080 check inter 2000 rise 3 fall 3 weight 6

#後端配置,http_back名稱可自定義
backend http_back_18181
    balance source  
    option httpchk GET /index.html  #設置健康檢查頁面
#   server node1 10.0.2.16:8080 check inter 2000 rise 3 fall 3 weight 6
    server node2 10.0.2.17:8080 check inter 2000 rise 3 fall 3 weight 6

listen admin_stats
    bind *:9188
    mode http
    log 127.0.0.1 local3 err
    stats refresh 30s
    stats uri /my_haproxy_status
    stats realm welcome login\ Haproxy
    stats auth ha_admin:ha_admin!23
    stats hide-version
    stats admin if TRUE
[root@data-1-1 ~]# 

  

至此haproxy安裝完畢

開始Keepalived部分


選擇Keepalived版本

http://www.keepalived.org/download.html
可以看到1.3.5版本過去半年左右才出現的1.3.6版本
那說明1.3.5版本沒太多或者大的bug

技術分享圖片

安裝tcpdump,它是個抓包工具,有時候會用到
安裝psmisc包,安裝之後多了 fuser, killall,pstree等命令

yum install tcpdump -y
yum install psmisc -y

安裝和配置過程

下載,編譯,其中fwmark模塊貌似和防火墻相關的,禁用掉即可

安裝完畢,創建個軟鏈接

cd /tools/
wget http://10.0.2.15:8298/soft/keepalived-1.3.5.tar.gz
tar xfz keepalived-1.3.5.tar.gz 
cd keepalived-1.3.5
./configure --prefix=/application/keepalived-1.3.5 --disable-fwmark
make && make install
ls /application/keepalived-1.3.5/
ln -s /application/keepalived-1.3.5 /application/keepalived

  

創建Keepalived的默認配置文件目錄

拷貝配置文件

拷貝Keepalived工具到系統可執行路徑中

修改記錄日誌的配置文件,並拷貝到sysconfig目錄下

查看Keepalived服務是否已經加入到了systemd管理路徑下

mkdir   /etc/keepalived   -p
/bin/cp  /application/keepalived/etc/keepalived/keepalived.conf   /etc/keepalived/
/bin/cp  /application/keepalived/sbin/keepalived  /usr/sbin/
sed -i s#‘KEEPALIVED_OPTIONS="-D"‘#‘KEEPALIVED_OPTIONS="-D -d -S 0"‘#g  /application/keepalived/etc/sysconfig/keepalived
/bin/cp  /application/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ls -l /usr/lib/systemd/system/keepalived.service

補充說明下,其中修改sysconfig下面的Keepalived配置文件的作用

配置指定文件接收Keepalived日誌
keepalived默認輸出的日誌在/var/log/messages
最下面添加一行
-S指定一個syslog設備接收,0表示local0設備 
-D是詳細日誌
-d是dump配置文件內容到日誌中  

另外

因為啟動腳本默認讀取的是/application/keepalived-1.3.5/etc/sysconfig/keepalived這個文件 

這裏可以不用把這個文件拷貝到/etc/sysconfig目錄下,這裏拷貝了雖然沒用到,也沒關系

 

修改Keepalived服務配置文件

執行下面命令即可,這裏是master節點,覆蓋原來的配置了

采用的單播方式,而不是默認的組播(可能一些機房或者公有雲禁止了組播報文)

同一集群的keepalived的主、備機的virtual_router_id 必須相同,取值0-255,這裏取值80,隨便取得
但是同一內網中不應有相同virtual_router_id的集群

vrrp_instance中必須有track_script部分,裏面的chk_haproxy名字和是vrrp_script右邊的一致,這樣在haproxy服務停止之後,vip能迅速切換到備機。

少了它的話,只有Keepalived服務停止,vip才能切換過去,haproxy停止並沒有遷移vip。

###keepalived config file
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived

global_defs {
   notification_email {
   [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 3
   router_id Haproxy_1
}

vrrp_script chk_haproxy {
    script "killall -0 haproxy" 
    interval 3
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 80
    priority 150
    advert_int 5
    authentication {
        auth_type PASS
        auth_pass ha_keep
    }
    track_script {
        chk_haproxy
    }
    virtual_ipaddress {
        10.0.1.63/24 dev eth0
    }
    unicast_src_ip  10.0.1.61
    unicast_peer { 
        10.0.1.62
    } 
}
EOF

  

下面是backup機器的配置執行方式

###keepalived config file
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived

global_defs {
   notification_email {
   [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 3
   router_id Haproxy_2
}

vrrp_script chk_haproxy {
    script "killall -0 haproxy" 
    interval 3
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 80
    priority 100
    advert_int 5
    authentication {
        auth_type PASS
        auth_pass ha_keep
    }
    track_script {
        chk_haproxy
    }
    virtual_ipaddress {
        10.0.1.63/24 dev eth0
    }
    unicast_src_ip  10.0.1.62
    unicast_peer { 
        10.0.1.61
    } 
}
EOF

  

修改rsyslog,讓Keepalived的日誌采用local設備記錄,這樣可以自定義記錄路徑,而不是采用默認的/var/log/message

配置完畢後需要在syslog.conf文件裏添加一行,如下
上面配置文件表示syslog讓local0接收,local0接收後往後面的/var/log/keepalived.log裏面接收
.* 表示所有狀態都接受,檢查沒問題重啟rsyslog服務

###config rsyslog for keepalived
cat >> /etc/rsyslog.conf << EOF
#keepalived
local0.*         /var/log/keepalived.log
EOF
tail -2 /etc/rsyslog.conf 
systemctl restart rsyslog

  

修改Keepalived服務啟動腳本,註意cat追加的時候有變量,需要用斜線轉義下

這裏只把pidfile路徑改成系統通用路徑下

最後需要reload系統服務

###modify keepalived.service
cat > /usr/lib/systemd/system/keepalived.service << EOF
[Unit]
Description=LVS and VRRP High Availability Monitor
After=syslog.target network-online.target

[Service]
Type=forking
PIDFile=/var/run/keepalived.pid
KillMode=process
EnvironmentFile=-/application/keepalived-1.3.5/etc/sysconfig/keepalived
ExecStart=/application/keepalived-1.3.5/sbin/keepalived \$KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP \$MAINPID

[Install]
WantedBy=multi-user.target
EOF

##reload service config
systemctl daemon-reload

  

補充說明下

一些人安裝後,是復制下面路徑下的啟動腳本到/etc/init.d下
我的是centos7.4環境,沒找到它
/bin/cp  /application/keepalived/etc/rc.d/init.d/keepalived  /etc/init.d/
但是locate命令查找keepalived的時候發現下面出現了它
/usr/lib/systemd/system/keepalived.service
可能centos7已經默認編譯安裝後自動加入到了systemd
ll -al /usr/lib/systemd/system/keepalived.service

  

最後啟動Keepalived服務即可,可以看到3個進程

[root@data-1-2 ~]# systemctl stop keepalived
[root@data-1-2 ~]# systemctl start keepalived
[root@data-1-2 ~]# ps -ef |grep keepalived
root      6456  6300  0 15:16 pts/1    00:00:00 tail -F /var/log/keepalived.log
root     13307     1  0 19:10 ?        00:00:00 /application/keepalived-1.3.5/sbin/keepalived -D -d -S 0
root     13308 13307  0 19:10 ?        00:00:00 /application/keepalived-1.3.5/sbin/keepalived -D -d -S 0
root     13309 13307  0 19:10 ?        00:00:00 /application/keepalived-1.3.5/sbin/keepalived -D -d -S 0
root     13319  2275  0 19:10 pts/0    00:00:00 grep --colour=auto keepalived
[root@data-1-2 ~]# 

  

至此,Keepalived主備節點都安裝完畢。接下來就是測試服務能否正常切換

把Keepalived服務加入啟動項

[root@data-1-1 ~]# systemctl enable keepalived
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
[root@data-1-1 ~]# 

  

haproxy暫時無法用systemd管理,使用chkconfig工具管理,加入啟動項

[root@data-1-1 ~]# chkconfig haproxy on
[root@data-1-1 ~]# chkconfig --list |grep haproxy

Note: This output shows SysV services only and does not include native
      systemd services. SysV configuration data might be overridden by native
      systemd configuration.

      If you want to list systemd services use ‘systemctl list-unit-files‘.
      To see services enabled on particular target use
      ‘systemctl list-dependencies [target]‘.

haproxy        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
[root@data-1-1 ~]# 

  

Centos7.4安裝配置haproxy和Keepalived