#### 一,lvs+keepalived 與HAproxy+keepalived[#](https://www.cnblogs.com/g2thend/p/10996614.html###%E4%B8%80%EF%BC%8Clvs+keepalived-%E4%B8%8Ehaproxy+keepalived)
[](https://img2018.cnblogs.com/blog/1673483/201906/1673483-20190610082121481-1346528555.png)
[](https://img2018.cnblogs.com/blog/1673483/201906/1673483-20190610082136102-2011786552.png)
#### ##二,實驗操做:[#](https://www.cnblogs.com/g2thend/p/10996614.html###%E4%BA%8C%EF%BC%8C%E5%AE%9E%E9%AA%8C%E6%93%8D%E5%81%9A%EF%BC%9A)
nfs掛載:
nfs掛載,在后端創建用戶,用戶名及id與服務器nginx一致,并對導出的目錄為該用戶放開權限
/home/nfstestdir? ? ? ?192.168.222.0/24(rw,sync,all\_squash,anonuid=1000,anongid=1000)
~~~
NFS權限參數配置
ro 只讀訪問
rw 讀寫訪問
sync 所有數據在請求時寫入共享
async NFS在寫入數據前可以相應請求
secure NFS通過1024以下的安全TCP/IP端口發送
insecure NFS通過1024以上的端口發送
wdelay 如果多個用戶要寫入NFS目錄,則歸組寫入(默認)
no_wdelay 如果多個用戶要寫入NFS目錄,則立即寫入,當使用async時,無需此設置。
hide 在NFS共享目錄中不共享其子目錄
no_hide 共享NFS目錄的子目錄
subtree_check 如果共享/usr/bin之類的子目錄時,強制NFS檢查父目錄的權限(默認)
no_subtree_check 和上面相對,不檢查父目錄權限
all_squash 共享文件的UID和GID映射匿名用戶anonymous,適合公用目錄。
no_all_squash 保留共享文件的UID和GID(默認)
root_squash root用戶的所有請求映射成如anonymous用戶一樣的權限(默認)
no_root_squas root用戶具有根目錄的完全管理訪問權限
anonuid=xxx 指定NFS服務器/etc/passwd文件中匿名用戶的UID
anongid=xxx 指定NFS服務器/etc/passwd文件中匿名用戶的GID
~~~
### nginx +fpm
配置重點,php-fpm? 配置啟動用戶為nginx? ,這樣php可以以相同的用戶處理nfs上的文件
配置參考其他博文:[https://www.cnblogs.com/g2thend/p/10884579.html](https://www.cnblogs.com/g2thend/p/10884579.html)
lvs+keepalived??
keepalived? 配置2個vip,一個走網站服務,一個走數據庫。和圖示不同,只是ip 有改動,注意所有ip 為同一局域網下
```
`cat`?`/etc/keepalived/keepalived``.conf`
`! Configuration File``for``keepalived`
`global_defs {`
`notification_email {`
`2222@qq.com???`
`}`
`notification_email_from? admin@loaclhost`
`smtp_server? 127.0.0.1`
`smtp_connect_timeout 30`
`router_id? test73`
`vrrp_skip_check_adv_addr`
`# vrrp_strict`
`vrrp_garp_interval 0`
`vrrp_gna_interval 0`
`}`
`vrrp_instance VI_1 {`
`state MASTER`
`interface eth1`
`virtual_router_id 51`
`priority?? 50`
`advert_int 1`
`authentication {`
`auth_type PASS`
`auth_pass 1q2w3e4r`
`}`
`virtual_ipaddress {`
`#??? 192.168.36.179`
`192.168.36.179?? dev eth1? label eth1:0`
`192.168.36.180?? dev eth1? label eth1:1`
`}`
`}`
`virtual_server 192.168.36.180 3306? {????`
`delay_loop?? 5??????????????????????`
`lb_algo rr?????????????????????????``#調度算法`
`lb_kind? DR????????????????????????``#集群類型NAT|DR|TUN`
`nat_mask 255.255.255.0?????????????``#子網掩碼,可選項。`
`#persistence_timeout 50???????????????`
`protocol TCP???????????????????????``#|UDP|SCTP`
`#sorry_server <IPADDR> <PORT>????????`
`real_server? 192.168.36.76? 3306? {??``#RS地址和端口`
`weight? 1???????????????????????`
`TCP_CHECK {`
`connect_port? 3306`
`connect_timeout? 3`
`nb_get_retry 2`
`delay_before_retry 1`
`}?`
`}????????????`
`}`
`virtual_server?? 192.168.36.179? 80? {????`
`delay_loop?? 5??????????????????????`
`lb_algo rr?????????????????????????``#調度算法`
`lb_kind? DR????????????????????????``#集群類型NAT|DR|TUN`
`nat_mask 255.255.255.0?????????????``#子網掩碼,可選項。`
`#persistence_timeout 50???????????????`
`protocol TCP???????????????????????``#|UDP|SCTP`
`#sorry_server <IPADDR> <PORT>????????`
`real_server? 192.168.36.74 80? {??``#RS地址和端口`
`weight? 1???????????????????????`
`HTTP_GET {??????????????`
`url {`
`path?``/index``.html????????????????????`
`status_code 200?????????`
`}?????????????????????????`
`connect_timeout 3???????????`
`nb_get_retry 3?????????????`
`delay_before_retry 3???????`
`#? connect_ip <IP ADDRESS>?????`
`#? connect_port <PORT>?????????`
`#? bindto <IP ADDRESS>????????`
`#? bind_port <PORT>???????????`
`}`
`}`
`real_server? 192.168.36.75 80? {??``#RS地址和端口`
`weight? 1???????????????????????`
`HTTP_GET {`
`url {`
`path?``/index``.html`
`status_code 200?`
`}???????????????`
`connect_timeout 3?`
`nb_get_retry 3????`
`delay_before_retry 3`
`#? connect_ip <IP ADDRESS>`
`#? connect_port <PORT>???`
`#? bindto <IP ADDRESS>???`
`#? bind_port <PORT>??????`
`}`
`}`
`}`
```
###2,haproxy +keepalived
此時keepalived只是作為單點故障恢復,不做lvs負載均衡,所以不用配置vrrp\_instance.
haproxy配置
~~~
cat /etc/haproxy/haproxy.cfg
global
maxconn 100000
chroot /usr/local/haproxy
stats socket /var/lib/haproxy/haproxy.sock1 mode 600 level admin process 1
stats socket /var/lib/haproxy/haproxy.sock2 mode 600 level admin process 2
#僅限本機,根據傳送的信號關閉進程等
uid 1990 #nobody /sbin/nologin
gid 1990 #useradd -s /sbin/nologin haproxy 更換uid pid
daemon
nbproc 2 #啟動進程數,與cpu保持一致
#nbthread 2 #指定每個haproxy進程開啟的線程數,默認為每個進程一個線程 使用版本>v1.8
#看線程 pstree
#ulimit-n 65535 #設置每進程所能夠打開的最大文件描述符數目
#cpu-map 1 0 #第一個進程綁定到0核心上
#cpu-map 2 1
#cpu-map 3 2
#cpu-map 4 3
pidfile /run/haproxy.pid
spread-checks 2 #后端server狀態check,隨機提前或延遲百分比時間,建議2-5(20%-50%)之間,默認0不延遲
log 127.0.0.1 local3 info
#沒有專門日志 vim /etc/rsyslog.conf
#imudp 模塊打開 接收端口打開
#local3.* /var/log/haproxy_xxxx.log systemctl restart rsyslog
defaults
option http-keep-alive #會話保持
option forwardfor #頭部添加客戶端源地址 ip透傳
#后端服務器需要記錄客戶端真實ip, 需要在HTTP請求中添加”X-Forwarded-For”字段;
#haproxy自身的健康檢測機制訪問后端服務器時, 不應將記錄訪問日志,可用except來排除127.0.0.0,即haproxy本身
#option httpclose
#啟http協議中服務器端關閉功能, 每個請求完畢后主動關閉http通道, 使得支持長連接,使得會話可以被重用,使得每一個日志記錄都會被記錄
#option dontlognull #如果產生了一個空連接,那這個空連接的日志將不會記錄.
maxconn 100000 #最大并發
mode http #全局默認轉發模式,listen 區域可重寫該變量
timeout connect 60s #TCP之前 (請求到后端,不能建立連接
timeout client 600s #空連接時間
timeout server 600s #tcp之后(請求已轉發) 后端處理較長,建議設置久時間
timeout check 10s #心跳檢測時間
#timeout http-request 10s #默認http請求超時時間
#timeout queue 1m #默認隊列超時時間, 后端服務器在高負載時, 會將haproxy發來的請求放進一個隊列中
#當與后端服務器的會話失敗(服務器故障或其他原因)時, 把會話重新分發到其他健康的服務器上; 當故障服務器恢復時, 會話又被定向到已恢復的服務器上;
#還可以用”retries”關鍵字來設定在判定會話失敗時的嘗試連接的次數
#option redispatch
#retries 3
#當haproxy負載很高時, 自動結束掉當前隊列處理比較久的鏈接.
#option abortonclose
#設置默認的負載均衡方式
#balance source
#balnace leastconn
listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
#option httplog #日志格式
#maxconn 10 #統計頁面默認最大連接
#stats hide-version #隱藏統計頁面上的haproxy版本信息
#stats refresh 30s #監控頁面自動刷新時間
#stats realm LTC\ Haproxy #統計頁面密碼框提示文本
stats uri /haproxy-status
stats auth haadmin:1q2w3e4r
#手工啟動/禁用后端服務器, 可通過web管理節點
stats admin if TRUE
#設置haproxy錯誤頁面
errorfile 400 /usr/local/haproxy/errorfiles/400.http
errorfile 403 /usr/local/haproxy/errorfiles/403.http
errorfile 408 /usr/local/haproxy/errorfiles/408.http
errorfile 500 /usr/local/haproxy/errorfiles/500.http
errorfile 502 /usr/local/haproxy/errorfiles/502.http
errorfile 503 /usr/local/haproxy/errorfiles/503.http
errorfile 504 /usr/local/haproxy/errorfiles/504.http
listen web_port
bind *:80 #填寫具體的地址端口(可綁定多網卡分流
mode tcp
log global
#option forwardfor
server web1 192.168.36.74:80 weight 2 check port 9000 inter 3000 fall 2 rise 5 #健康檢查后端php:9000
server web2 192.168.36.75:80 weight 3 check port 9000 inter 3000 fall 2 rise 5 #健康檢查后端php:9000
~~~
keepalived
主備配置文件需改變??state MASTER? 狀態,優先級頁需要改變,默認為搶占模式,即主故障后備生效,主恢復后備因為優先級再次失效
~~~
global_defs {
notification_email {
2222@qq.com
}
notification_email_from admin@loaclhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id test73
vrrp_skip_check_adv_addr
# vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1q2w3e4r
}
virtual_ipaddress {
# 192.168.36.179
192.168.36.179 dev eth1 label eth1:0
192.168.36.180 dev eth1 label eth1:1
}
}
~~~
#### keepalived? 監控腳本
~~~
#keepalived 再改變狀態即 MASTER 或 BACKUP 時執行腳本
cat /etc/keepalived/notify.sh
#!/bin/bash
contact='2012@qq.com'
notify() {
mailsubject="$(hostname) to be $1, vip 轉移"
mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac
調用方法 vrrp_instance 中調用
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
#判斷本機是否可用,對vs權重進行調整,進而改變VIP的位置
(根據第三方文件判斷本機服務是否正常)
#主配置文件中聲明
vrrp_script chk_down {
script "/bin/bash -c '[[ -f /etc/keepalived/down ]]' && exit 7 || exit 0"
#script "/usr/bin/killall -0 nginx"
#根據文件是否存在測試進程是否活躍
interval 1
weight -20
fall 3
rise 5
timeout 2
}
#vrrp_instance 中調用
track_script {
#chk_down
chk_nginx
}
~~~
- 前言
- 服務器開發設計
- Reactor模式
- 一種心跳,兩種設計
- 聊聊 TCP 長連接和心跳那些事
- 學習TCP三次握手和四次揮手
- Linux基礎
- Linux的inode的理解
- 異步IO模型介紹
- 20個最常用的GCC編譯器參數
- epoll
- epoll精髓
- epoll原理詳解及epoll反應堆模型
- epoll的坑
- epoll的本質
- socket的SO_REUSEADDR參數全面分析
- 服務器網絡
- Protobuf
- Protobuf2 語法指南
- 一種自動反射消息類型的 Protobuf 網絡傳輸方案
- 微服務
- RPC框架
- 什么是RPC
- 如何科學的解釋RPC
- RPC 消息協議
- 實現一個極簡版的RPC
- 一個基于protobuf的極簡RPC
- 如何基于protobuf實現一個極簡版的RPC
- 開源RPC框架
- thrift
- grpc
- brpc
- Dubbo
- 服務注冊,發現,治理
- Redis
- Redis發布訂閱
- Redis分布式鎖
- 一致性哈希算法
- Redis常見問題
- Redis數據類型
- 緩存一致性
- LevelDB
- 高可用
- keepalived基本理解
- keepalived操做
- LVS 學習
- 性能優化
- Linux服務器程序性能優化方法
- SRS性能(CPU)、內存優化工具用法
- centos6的性能分析工具集合
- CentOS系統性能工具 sar 示例!
- Linux性能監控工具集sysstat
- gdb相關
- Linux 下如何產生core文件(core dump設置)