nginx(四) nginx+keepalived 實現主備+雙主熱備模型的高可用負載均衡代理服務
nginx(四) nginx+keepalived 實現主備+雙主熱備模型的高可用負載均衡代理服務
在前面《nginx配置:反向代理 負載均衡 後端健康檢查 快取》等幾篇文章中,我們配置了nginx的反向代理負載均衡WEB叢集,而在《keepalived 及 keepalived配置LVS高可用叢集》進行keepalived配置LVS高可用叢集。下面將在前文的一些基礎上,用keepalived分別實現主備模型和雙主模型的nginx反向代理伺服器的高可用。
1、配置環境準備
1-1、模擬環境
1、各伺服器主機系統:CentOS 6.4 x86_64
2、反向代理伺服器:
node1: IP:192.168.18.241 (host name:node1.tjiyu.com);
node2: IP:192.168.18.242 (host name:node2.tjiyu.com);
VIP1:192.168.18.240;(主備模型只使用VIP1)
VIP2:192.168.18.250;
service:nginx 1.10.2 提供反向代理、負載均衡服務;
keepalived 為nginx(VIP)提供高可用服務;
3、後端兩臺realserver:
realserver1: IP:192.168.18.251 (host name:realserver1.tjiyu,com);
realserver2: IP:192.168.18.252 (host name:realserver2.tjiyu.com);
service:nginx 1.10.2 提供WEB服務
1-2、配置前所需要的準備
各主機需要做以下準備:
1、配置IP、關閉防火牆/SELINUX;
2、時間同步;
3、配置節點名稱(不是必須的,最好配置上,方便操作)
2、nginx和keepalived相關準備說明
nginx可以參考《nginx配置:反向代理 負載均衡 後端健康檢查 快取》文章,先在配置好兩臺代理伺服器,使得它們都可以實現反向代理和負載均衡(注意。不用配置快取,影響測試),分別訪問它們的IP測試正常,如下:
Nginx根據前文配置好後,下面就不會去配置nginx了,主要是對keepalived進行配置,以及相關測試。
Keepalived相關的原理、配置說明,可以參考《keepalived 及 keepalived配置LVS高可用叢集》;首先需要在兩臺代理伺服器分別下載安裝,yum install -y keepalived就可以了。下面我們用到它裡面的一些配置,不過會重新給出並作出說明。
3、配置nginx+keepalived主備模型
我們先來說明配置的一些細節,後面再給出完整的配置檔案。一個是對nignx狀態進行監測,一個是對nginx進行管理。
3-1、配置keepalived對nignx進行監測
配置/etc/keepalived/keepalived.conf檔案使得keepalived可以對nignx進行監測,如下:
[[email protected] ~]# cd /etc/keepalived/ [[email protected] keepalived]# cp keepalived.conf keepalived.conf.bak [[email protected] keepalived]# vim keepalived.conf
在配置文中增加vrrp_script chk_nginx_health { script "killall -0 nginx"… }塊,定義nginx服務狀態跟蹤指令碼,指令碼中可以檢查nginx的狀態,如下:
這裡我們直接用"killall -0 nginx"命令,它不會殺死nginx,只會在nginx啟動正常時返回0,停止時返回1,如下:
然後在vrrp_instance VI_1 {track_script {… }}中呼叫上面定義的服務狀態跟蹤指令碼,如下:
3-2、配置keepalived狀態轉換通知,以及轉換時對nignx進行管理
自定義keepalived狀態轉換狀態變化指令碼notify.sh,放到/etc/keepalived目錄下,如下:
該指令碼可以在keepalived狀態轉換時,發出郵件通知;還可以對nginx服務進行管理,如keepalived成功主節點時,啟動nginx,成為備節點時停止nginx(主備時)或重啟nginx(雙主時),配置到vrrp_instance VI_1 {}塊中,如下:
注意,配置的發件人使用者得是系統使用者,不存在使用者發不出郵件,得先在兩節點上新增使用者,過程如下:
[[email protected] keepalived]# useradd root_keepalived
3-3、node1上的keepalived配置
配置node1成主節點,優先順序較高(搶佔式),配置如下:
! Configuration File for keepalived global_defs { #全域性配置,這裡額外的靜態路由並未新增因為它是非必要的,除非我們在當前或特定的主機上生成特殊的靜態路由等 notification_email { #realserver故障時通知郵件的收件人地址,可以多個 [email protected] } notification_email_from root_keepalived #發件人資訊(可以隨意偽裝,因為郵件系統不會驗證處理髮件人資訊) smtp_server 127.0.0.1 #發郵件的伺服器(一定不可為外部地址) smtp_connect_timeout 30 #連線超時時間 router_id LVS_DEVEL #路由器的標識(可以隨便改動) } vrrp_script chk_nginx_health { # 定義服務狀態跟蹤指令碼,指令碼中可以檢查高可用服務的狀態,返回狀態碼0表示服務正常;配置呼叫則在vrrp_instance中的track_script段;這裡chk_nginx是定義指令碼的名稱,可隨意取 script "killall -0 nginx" #判斷命令/自己定義好的指令碼路徑;#這裡killall -0 nginx不會殺死nginx,只會在nginx啟動正常時返回0,停止時返回1,返回1就會在vrrp例項定義的優先順序減去下面的weight值,就表示期望這個節點為備用狀態。 interval 1 #每隔1秒鐘執行一次 weight -2 #上面的命令指令碼執行失敗,優先順序降低2;這個值的絕對值必須大於MASTER減BACKUP定義的優先順序 fall 2 #命令/指令碼執行失敗多少次才算真的失敗 rise 1 #命令/指令碼執行成功多少次才算真的成功 } vrrp_instance VI_1 { #配置虛擬路由器的例項,VI_1是自定義的例項名稱 state MASTER #初始狀態,MASTER|BACKUP,當state指定的instance的初始化狀態,在兩臺伺服器都啟動以後,馬上發生競選,優先順序高的成為MASTER,所以這裡的MASTER並不是表示此臺伺服器一直是MASTER interface eth0 #通告選舉所用埠 virtual_router_id 51 #虛擬路由的ID號(一般不可大於255) priority 101 #優先順序資訊 #備必須更低 advert_int 1 #VRRP通告間隔,秒 authentication { auth_type PASS #認證機制 auth_pass 5344 #密碼(儘量使用隨機) } virtual_ipaddress { #虛擬地址(VIP地址) 192.168.18.240 } track_script { #呼叫上面定義的服務狀態跟蹤指令碼 chk_nginx_health } #nopreempt #設定不搶佔,這裡只能設定在state為BACKUP的節點上,而且這個節點的優先順序必須別另外的高 #preempt delay 300 #搶佔延遲,和nopreempt一樣只能用在BACKUP上,但不能和nopreempt同時使用 notify_master "/etc/keepalived/notify.sh -m mb -n master -s nginx -a 192.168.18.240" #轉換為master狀態時使用此指令碼通知 notify_backup "/etc/keepalived/notify.sh -m mb -n backup -s nginx -a 192.168.18.240" #轉換為backup狀態時使用此指令碼通知 notify_fault "/etc/keepalived/notify.sh -m mb -n fault -s nginx -a 192.168.18.240" #轉換為fault狀態時使用此指令碼通知,如果指令碼帶有引數也就是有空格必須使用引號 }
3-4、node2上的keepalived配置
配置node2成為備節點,和node1h配置主要差別有兩處,一是state BACKUP,二是priority 100優先順序更低,這是在搶佔模式下的配置,後面我們再說非搶佔式配置,差別不大,本配置如下:
! Configuration File for keepalived global_defs { #全域性配置,這裡額外的靜態路由並未新增因為它是非必要的,除非我們在當前或特定的主機上生成特殊的靜態路由等 notification_email { #realserver故障時通知郵件的收件人地址,可以多個 [email protected] } notification_email_from root_keepalived #發件人資訊(可以隨意偽裝,因為郵件系統不會驗證處理髮件人資訊) smtp_server 127.0.0.1 #發郵件的伺服器(一定不可為外部地址) smtp_connect_timeout 30 #連線超時時間 router_id LVS_DEVEL #路由器的標識(可以隨便改動) } vrrp_script chk_nginx_health { # 定義服務狀態跟蹤指令碼,指令碼中可以檢查高可用服務的狀態,返回狀態碼0表示服務正常;配置呼叫則在vrrp_instance中的track_script段;這裡chk_nginx是定義指令碼的名稱,可隨意取 script "killall -0 nginx" #判斷命令/自己定義好的指令碼路徑;#這裡killall -0 nginx不會殺死nginx,只會在nginx啟動正常時返回0,停止時返回1,返回1就會在vrrp例項定義的優先順序減去下面的weight值,就表示期望這個節點為備用狀態。 interval 1 #每隔1秒鐘執行一次 weight -2 #上面的命令指令碼執行失敗,優先順序降低2;這個值的絕對值必須大於MASTER減BACKUP定義的優先順序 fall 2 #命令/指令碼執行失敗多少次才算真的失敗 rise 1 #命令/指令碼執行成功多少次才算真的成功 } vrrp_instance VI_1 { #配置虛擬路由器的例項,VI_1是自定義的例項名稱 state BACKUP #初始狀態,MASTER|BACKUP,當state指定的instance的初始化狀態,在兩臺伺服器都啟動以後,馬上發生競選,優先順序高的成為MASTER,所以這裡的MASTER並不是表示此臺伺服器一直是MASTER interface eth0 #通告選舉所用埠 virtual_router_id 51 #虛擬路由的ID號(一般不可大於255) priority 100 #優先順序資訊 #備必須更低 advert_int 1 #VRRP通告間隔,秒 authentication { auth_type PASS #認證機制 auth_pass 5344 #密碼(儘量使用隨機) } virtual_ipaddress { #虛擬地址(VIP地址) 192.168.18.240 } track_script { #呼叫上面定義的服務狀態跟蹤指令碼 chk_nginx_health } #nopreempt #設定不搶佔,這裡只能設定在state為BACKUP的節點上,而且這個節點的優先順序必須別另外的高 #preempt delay 300 #搶佔延遲,和nopreempt一樣只能用在BACKUP上,但不能和nopreempt同時使用 notify_master "/etc/keepalived/notify.sh -m mb -n master -s nginx -a 192.168.18.240" #轉換為master狀態時使用此指令碼通知 notify_backup "/etc/keepalived/notify.sh -m mb -n backup -s nginx -a 192.168.18.240" #轉換為backup狀態時使用此指令碼通知 notify_fault "/etc/keepalived/notify.sh -m mb -n fault -s nginx -a 192.168.18.240" #轉換為fault狀態時使用此指令碼通知,如果指令碼帶有引數也就是有空格必須使用引號 }
3-5、狀態轉換通知指令碼notify.sh
前面我們說過,自定義keepalived狀態轉換狀態變化指令碼notify.sh,放到/etc/keepalived目錄下,如下:
#!/bin/bash # description: An example of notify script # Usage: notify.sh -m|--mode {mm|mb} -s|--service SERVICE1,... -a|--address VIP -n|--notify {master|backup|falut} -h|--help contact='[email protected]' helpflag=0 serviceflag=0 modeflag=0 addressflag=0 notifyflag=0 Usage() { echo "Usage: notify.sh [-m|--mode {mm|mb}] [-s|--service SERVICE1,...] <-a|--address VIP> <-n|--notify {master|backup|falut}>" echo "Usage: notify.sh -h|--help" } ParseOptions() { local I=1; if [ $# -gt 0 ]; then while [ $I -le $# ]; do case $1 in -s|--service) [ $# -lt 2 ] && return 3 serviceflag=1 services=(`echo $2|awk -F"," '{for(i=1;i<=NF;i++) print $i}'`) shift 2 ;; -h|--help) helpflag=1 return 0 shift ;; -a|--address) [ $# -lt 2 ] && return 3 addressflag=1 vip=$2 shift 2 ;; -m|--mode) [ $# -lt 2 ] && return 3 mode=$2 shift 2 ;; -n|--notify) [ $# -lt 2 ] && return 3 notifyflag=1 notify=$2 shift 2 ;; *) echo "Wrong options..." Usage return 7 ;; esac done return 0 fi } #workspace=$(dirname $0) RestartService() { if [ ${#@} -gt 0 ]; then for I in [email protected]; do if [ -x /etc/rc.d/init.d/$I ]; then /etc/rc.d/init.d/$I restart else echo "$I is not a valid service..." fi done fi } StopService() { if [ ${#@} -gt 0 ]; then for I in [email protected]; do if [ -x /etc/rc.d/init.d/$I ]; then /etc/rc.d/init.d/$I stop else echo "$I is not a valid service..." fi done fi } Notify() { mailsubject="`hostname` to be $1: $vip floating" mailbody="`date '+%F %H:%M:%S'`, vrrp transition, `hostname` changed to be $1." echo $mailbody | mail -s "$mailsubject" $contact } # Main Function ParseOptions [email protected] [ $? -ne 0 ] && Usage && exit 5 [ $helpflag -eq 1 ] && Usage && exit 0 if [ $addressflag -ne 1 -o $notifyflag -ne 1 ]; then Usage exit 2 fi mode=${mode:-mb} case $notify in 'master') if [ $serviceflag -eq 1 ]; then RestartService ${services[*]} fi Notify master ;; 'backup') if [ $serviceflag -eq 1 ]; then if [ "$mode" == 'mb' ]; then StopService ${services[*]} else RestartService ${services[*]} fi fi Notify backup ;; 'fault') Notify fault ;; *) Usage exit 4 ;; esac exit 0
4、測試主備模型
1、在node1和node2上分別啟動keepalived,可以看到VIP配置到了node1上,成為了主節點,而訪問測試也正常,如下:
2、當我們killall nginx停止node1上的nginx時,可以看到VIP流轉到node2上,即node2成為主節點,而訪問正常,如下:
3、而接著當我們killall nginx停止node2的nginx時,可以看到VIP流轉回了node1,也即node1重新成為主節點,而訪問也正常;注意,我們並沒有手動啟動node1上前面kil掉的nginx,這是由notify.sh在node1成功主節點時完成的,如下:
4、當我們killall keepalived停止node1上的keepalived時,可以VIP再次流轉到node2,也即node2再次成為主節點,而訪問也正常;注意,我們檢視node1上的日誌可以看到node1上的VIP被移除了,如下:
5、接著,我們重啟node1上的keepalived,發現VIP流轉回node1,即node1成為了主節點,而之前node2作為主節點在正常執行的,這就是搶佔式了,node1配置優先順序高,恢復正常後搶佔了node2的主節點資源,如下:
6、配置非搶佔式:在配置BACKUP的node2上配置,nopreempt並且優先順序比MASTER的node1高,而後我們重啟node2上的keepalived,然後停止node1上的keepalived,再次使node2成為主節點,如下:
7、接著,如上面第5步,重啟node1上的keepalived,VIP依然在node2,即node2還作為主節點在正常執行,這就是非搶佔式,如下:
8、接著,我們停止node2上的keepalived,可以看到node1成為主節點,但VIP在node1、node2上都有,即node2沒有撤除VIP,keepalived就停止了,不過這也沒關,因為node1配置VIP時會自己自動發出ARP,這樣報文就能轉到node1了,如下:
9、接著,我們重啟node2上的keepalived,可以看到node2成為備節點,node1依然還是主節點,也沒有被搶佔,如下:
5、配置nginx+keepalived雙主模型
我們在《keepalived 及 keepalived配置LVS高可用叢集》中說過,Keepalived工作模型總是一主多備的,而這個雙主是指兩個VIP分別對應兩個VRRP例項(也就是兩個主備同時執行),如果兩個VIP對應同一個服務,可以在前面再加DNS輪循,對就兩條DNS的A記錄,這樣可以做到scale out 橫向擴充套件,並且充分利用資源。
注意,雙主最好不要配置非搶佔模式,因為一臺故障時另一臺執行兩個VIP,當恢復時需要把一個VIP搶佔流轉回來,這樣就才能平分流量。
5-1、修改主備配置
我們就在上面主備模型的基礎上,增加一個VRRP例項對就VIP2(192.168.18.250),但需要稍微修改前面配置,如記錄得改回node2上的搶佔模式,還有狀態轉換通知的指令碼配置改"-m mm",如下:
5-2、node1上增加的配置
直接在配置檔案後面加上加一個VRRP例項配置,這個例項node1為備節點,如下:
vrrp_instance VI_2 { #配置虛擬路由器的例項,VI_1是自定義的例項名稱 state BACKUP #初始狀態,MASTER|BACKUP,當state指定的instance的初始化狀態,在兩臺伺服器都啟動以後>,馬上發生競選,優先順序高的成為MASTER,所以這裡的MASTER並不是表示此臺伺服器一直是MASTER interface eth0 #通告選舉所用埠 virtual_router_id 55 #虛擬路由的ID號(一般不可大於255) priority 100 #優先順序資訊 #備必須更低 advert_int 1 #VRRP通告間隔,秒 authentication { auth_type PASS #認證機制 auth_pass 6675 #密碼(儘量使用隨機) } virtual_ipaddress { #虛擬地址(VIP地址) 192.168.18.250 } track_script { #呼叫上面定義的服務狀態跟蹤指令碼 chk_nginx_health } #nopreempt #設定不搶佔,這裡只能設定在state為BACKUP的節點上,而且這個節點的優先順序必須別另外的高 #preempt delay 300 #搶佔延遲,和nopreempt一樣只能用在BACKUP上,但不能和nopreempt同時使用 notify_master "/etc/keepalived/notify.sh -m mm -n master -s nginx -a 192.168.18.250" #轉換為master狀態時使用 此指令碼通知 notify_backup "/etc/keepalived/notify.sh -m mm -n backup -s nginx -a 192.168.18.250" #轉換為backup狀態時使用 此指令碼通知 notify_fault "/etc/keepalived/notify.sh -m mm -n fault -s nginx -a 192.168.18.250" #轉換為fault狀態時使用>此指令碼通知,如果指令碼帶有引數也就是有空格必須使用引號 }
5-3、node2上增加的配置
直接在配置檔案後面加上加一個VRRP例項配置,這個例項node2為主節點,如下:
vrrp_instance VI_2 { #配置虛擬路由器的例項,VI_1是自定義的例項名稱 state MASTER #初始狀態,MASTER|BACKUP,當state指定的instance的初始化狀態,在兩臺伺服器都啟動以後,>馬上發生競選,優先順序高的成為MASTER,所以這裡的MASTER並不是表示此臺伺服器一直是MASTER interface eth0 #通告選舉所用埠 virtual_router_id 55 #虛擬路由的ID號(一般不可大於255) priority 101 #優先順序資訊 #備必須更低 advert_int 1 #VRRP通告間隔,秒 authentication { auth_type PASS #認證機制 auth_pass 6675 #密碼(儘量使用隨機) } virtual_ipaddress { #虛擬地址(VIP地址) 192.168.18.250 } track_script { #呼叫上面定義的服務狀態跟蹤指令碼 chk_nginx_health } #nopreempt #設定不搶佔,這裡只能設定在state為BACKUP的節點上,而且這個節點的優先順序必須別另外的高 #preempt delay 300 #搶佔延遲,和nopreempt一樣只能用在BACKUP上,但不能和nopreempt同時使用 notify_master "/etc/keepalived/notify.sh -m mm -n master -s nginx -a 192.168.18.240" #轉換為master狀態時使用此 指令碼通知 notify_backup "/etc/keepalived/notify.sh -m mm -n backup -s nginx -a 192.168.18.240" #轉換為backup狀態時使用此 指令碼通知 notify_fault "/etc/keepalived/notify.sh -m mm -n fault -s nginx -a 192.168.18.240" #轉換為fault狀態時使用此>指令碼通知,如果指令碼帶有引數也就是有空格必須使用引號 }
6、測試nginx+keepalived雙主模型
我們分別重啟兩個節點上keepalived,可以看到VIP1(192.168.18.240)配置到node1上,而VIP2(192.168.18.250)配置到node2上,說明node1成為VRRP例項1的主節點,node2成為VRRP例項2的主節點;而訪問VIP1和VIP2都能正常,如下
到這裡,我們完成了用keepalived分別實現主備模型和雙主模型的nginx反向代理負載均衡伺服器的高可用,後面有時間將會在本檔案的基礎上進行nginx+tomcat的動靜分離配置……
【參考資料】
相關推薦
nginx(四) nginx+keepalived 實現主備+雙主熱備模型的高可用負載均衡代理服務
nginx(四) nginx+keepalived 實現主備+雙主熱備模型的高可用負載均衡代理服務 在前面《nginx配置:反向代理 負載均衡 後端健康檢查 快取》等幾篇文章中,我們配置了nginx的反向代理負載均衡WEB叢集,而在《keepalived
MySQL集群(四)之keepalived實現mysql雙主高可用
健康檢查 重連 lose 搶占 pro 資源 交換機 state nec 前面大家介紹了主從、主主復制以及他們的中間件mysql-proxy的使用,這一篇給大家介紹的是keepalived的搭建與使用! 一、keepalived簡介 1.1、keepalived介紹
Nginx(四)------nginx 負載均衡
在上一篇部落格我們介紹了 Nginx 一個很重要的功能——代理,包括正向代理和反向代理。這兩個代理的核心區別是:正向代理代理的是客戶端,而反向代理代理的是伺服器。其中我們又重點介紹了反向代理,以及如何通過 Nginx 來實現反向代理。那麼瞭解了Nginx的反向代理之後,我們要通過Nginx的反向代理實現另
基於HAProxy+Keepalived高可用負載均衡web服務的搭建
1.2 epo cnblogs oba backup 保持 ica mysql redis 一 原理簡介 1.HAProxyHAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。HAProxy特別適用於那
Nginx學習之路(四)NginX的子程序主迴圈
//呼叫傳入的回撥函式,子程序的正式主迴圈開始,回撥函式的實體是ngx_worker_process_cycle proc(cycle, data); 今天就來介紹一下這個proc的具體過程:首先,proc函式是一個隨ngx_spawn_process(
lnmp(四)——nginx防盜鏈、訪問控制、解析php、代理服務
12.13 Nginx防盜鏈 12.14 Nginx訪問控制 12.15 Nginx解析php相關配置 12.16 Nginx代理 12.13 Nginx防盜鏈 配置如下,可以和靜態檔案不記錄日誌的配置結合起來: location ~* ^.+\.(gif|jpg|png|s
Keepalived+Nginx實現高可用負載均衡集群
連接 靜態 adf -1 rip mail fff hostname dex 一 環境介紹 1.操作系統CentOS Linux release 7.2.1511 (Core) 2.服務keepalived+lvs雙主高可用負載均衡集群及LAMP應用keepalived-1
Nginx(九)-- Nginx實際使用配置
cal ddr conn access 增加 依然 worker ref tom 1.由於在nginx中需要配置很多東西,就會使得nginx.conf配置文件過於臃腫,所以我們會將配置文件合理的切分。大體的配置依然在nginx.conf中,其他的配置會放在etc下面的目錄中
nginx+keepalived實現高可用負載均衡
其中 centos7.3 9.png IT 配置文件 bsp 是我 add nginx 環境: centos7.3虛擬機A 10.0.3.46 centos7.3虛擬機B 10.0.3.110 虛擬機A和B都需要安裝nginx和keepalived(過程省略,其中keepa
Nginx(二)------nginx.conf 配置文件
影響 name 模型 logs deny app params 路徑 localhost 上一篇博客我們將 nginx 安裝在 /usr/local/nginx 目錄下,其默認的配置文件都放在這個目錄的 conf 目錄下,而主配置文件 nginx.conf 也在其中,後
百曉生詳解nginx(下)nginx在實際生產環境中的應用(該帖連載更新)
2.0 編譯環境 + - apache 80端口 ali oss keep fff 案例一:Nginx+Tomcat負載均衡集群的部署案例概述:京北點指科技有限公司發布V3版移聯建站管理系統,該項目為JAVA語言開發web站點。實驗環境:站點服務器(tomcat1)cent
Android 開發:(四)Button圓角實現
本節學習button的圓角實現: 利用上節登入button示例: 1.效果對比: <Button android:layout_width="match_parent" android:layout_height="45dp
深入理解多執行緒(四)—— Moniter的實現原理
在深入理解多執行緒(一)——Synchronized的實現原理中介紹過關於Synchronize的實現原理,無論是同步方法還是同步程式碼塊,無論是ACC_SYNCHRONIZED還是monitorenter、monitorexit都是基於Monitor實現的,那麼這篇來介紹下什麼是Monitor。
Java程式設計師從笨鳥到菜鳥之(七十二)細談Spring(四)利用註解實現spring基本配置詳解
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
機器學習筆記(四)Logistic迴歸實現及正則化
一、Logistic迴歸實現 (一)特徵值較少的情況 1. 實驗資料 吳恩達《機器學習》第二課時作業提供資料1。判斷一個學生能否被一個大學錄取,給出的資料集為學生兩門課的成績和是否被錄取,通過這些資料來預測一個學生能否被錄取。 2. 分類結果評估 橫縱軸(特徵)為學生兩門課成績,可以在圖
【第17天】Java集合(四)---Sorted介面實現的TreeSet集合及單值型別集合總結
1 TreeSet簡介 2 基本用法與特點 3 制定單值比較規則 3.1 自然排序(compareTo(Object obj)) 3.2 定製排序(定義比較器類) 3.2.1 普通類內定義
機器學習---支援向量機實戰(四)核函式實現
這節和上一節很像,不同的是,上一篇的是通過支援向量和待分類資料內積進行分類的,只是這裡不同的是,在計算內積時使用核函式進行代替,這裡參考的是機器學習實戰中的核函式,如果前面理解的比較深入,讀程式碼還是很簡單的,這裡的程式碼建議不要剛開始就去讀核函式定義,建議先從測試核函式的程
簡單的通訊(四)----使用DatagramSocket實現UDP協議
功能 UDP的簡單實用 程式碼 package com.demo; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddre
從零實現Vue的元件庫(四)- File-Reader實現
實現一個File-Reader元件用來讀取本地資源。 概述: 在使用者手動上傳一些資源的時候,需要分為兩步,第一步是將其從本地讀取出來,得到一個file物件,然後再上傳至伺服器。該元件用於第一步,然後可通過後續進一步封裝程Upload元件。 該元件的痛點在於: 新增拖拽上傳的功能;
自學nginx(三): nginx + gunicorn的反向代理
前言 正好一個專案是python的flask框架開發的,部署的時候就考慮用gunicorn作為應用伺服器,然後再用nginx的反向代理套在應用伺服器的外層。 架構圖 每一臺server內部,都安裝nginx,以及部署gunicorn的python