Centos7.4安裝配置haproxy和Keepalived
系統版本是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