HA集群及varnish緩存基礎

HA集群及varnish緩存基礎

一、簡述HA cluster原理


HA cluster高可用集群:高可用集群就是當某一個節點或服務器發生故障時,另一個節點能夠自動且立即向外提供服務,即將有故障節點上的資源轉移到另一個節點上去,這樣另一個節點有了資源既可以向外提供服務。高可用集群是用于單個節點發生故障時,能夠自動將資源、服務進行切換,這樣可以保證服務一直在線。在這個過程中,對于客戶端來說是透明的。

1.高可用集群的衡量標準:高可用集群一般是通過系統的可靠性(reliability)和系統的可維護性(maintainability)來衡量的。通常用平均無故障時間(MTTF)來衡量系統的可靠性,用平均維護 時間(MTTR)來衡量系統的可維護性。因此,一個高可用集群服務可以這樣來定義:HA=MTTF/(MTTF+MTTR)*100%

2.高可用集群的相關特性:

1.提供冗余系統:HA Cluster:為提升系統調用性,組合多臺主機構建成為的集群    
2.vote system投票系統:HA中的各節點無法探測彼此的心跳信息時,必須無法協調工作;此種狀態即為partitioned cluster    
3.failover: 失效轉移,故障轉移,failback:失效轉回,故障轉回,通過配置ha.cf文件中的 auto_failback on啟用    
4.心跳信息傳遞機制。

二、keepalived實現主從、主主架構


keepalived:vrrp(virtual redundant routing protocol)協議的軟件實現,原生設計的目的是為了高可用ipvs服務。

1.基于vrrp協議完成地址流動;    
2.為vip地址所在的節點生成ipvs規則(在配置文件中預先定義);    
3.為ipvs集群的各RS做健康狀態監測;    
4.基于腳本調用接口通過執行腳本完成腳本中定義的功能,進而影響集群事務;

Keepalived的配置前提:

1.各節點時間必須同步;    
2.確保iptables及selinux不會成為阻礙;    
3.各節點之間可通過主機名互相通信;    
4.確保各節點的用于集群服務的接口支持MULTICAST通信;

keepalived的主從架構:使用node1,node2中部署keepalived做主從和主主的架構,在后端服務器node3,node4部署nginx搭建web站點。

1.搭建后端nginx服務:

[root@node1 ~]# yum install -y nginx    #安裝nginx服務    

2.配置nginx顯示頁面配置:

[root@node1 ~]# vim /usr/share/nginx/html/index.html    
<h1>Server 1 10.3.223.11</h1>    #修改配置    
[root@node2 ~]# systemctl start nginx    #啟動nginx服務    

3.在node1上配置lvs-dr的配置,創建lvsdr腳本:

[root@node1 ~]# vim lvsdr.sh
#!bin/bash
#
vip=10.3.88.188
mask='255.255.255.255'

case $1 in
start)
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

    ifconfig lo:0 $vip netmask $mask broadcast $vip up
    route add -host $vip dev lo:0
    ;;
stop)
    ifconfig lo:0 down
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    ;;

*)
    echo "Usage $(basename $0) start|stop"  
    exit 1
    ;;
esac    

執行RS腳本:

[root@node1 ~]# bash lvsdr.sh start    #啟動腳本
[root@node1 ~]# ifconfig lo:0
    lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
    inet 10.3.88.188  netmask 255.255.255.255
    loop  txqueuelen 0  (Local Loopback)

4.node2采取同樣的配置。

搭建node3服務:安裝keepalived和ipvsadm程序包:

[root@node3 ~]# yum install -y keepalived ipvsadm    #安裝ipvsadm和keepalived服務    

編輯keepalived配置文件:

! Configuration File for keepalived

global_defs {
    notification_email {
root@localhost 
}
   notification_email_from keepalived@localhost 
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   route_id node3
   vrrp_mcast_group4 224.0.88.188
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

    vrrp_instance VI_1 {
    state MASTER
    interface eno16777736
    virtual_router_id 1
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
}
virtual_ipaddress {
    10.3.88.188/16 dev eno16777736 label eno16777736:0
}
}

virtual_server 10.3.88.188 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP

real_server 10.3.223.11 80 {
    weight 1
    HTTP_GET {
        url {
            path /index.html
            status_code 200
        }
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
    }
}
real_server 10.3.223.12 80 {
    weight 1
    HTTP_GET {
        url {
            path /index.html
            status_code 200
        }
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
    }
}
}

查看ipvsadm的端口狀態:

[root@node3 keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.3.88.188:80 rr
 -> 10.3.223.11:80               Route   1      0          0         
 -> 10.3.223.12:80               Route   1      0          0 

配置node4服務器的keepalived,配置node3,修改相對應的參數即可,使用ipvsadm查看狀態:

[root@node4 keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.3.88.188:80 rr
 -> 10.3.223.11:80               Route   1      0          0         
  -> 10.3.223.12:80               Route   1      0          0 

測試,訪問vip地址,獲得的服務如下:

[root@node1 ~]# for i in {1..10};do curl http://10.3.88.188;done
<h1>Server 1 10.3.223.11</h1>
<h1>Server 2 10.3.223.12</h1>
<h1>Server 1 10.3.223.11</h1>
<h1>Server 2 10.3.223.12</h1>
<h1>Server 1 10.3.223.11</h1>
<h1>Server 2 10.3.223.12</h1>
<h1>Server 1 10.3.223.11</h1>
<h1>Server 2 10.3.223.12</h1>
<h1>Server 1 10.3.223.11</h1>
h1>Server 2 10.3.223.12</h1>

此時node3為master,node4為backup,將node3服務關閉,此時node4將成為master,同樣測試vip的服務:

[root@node1 ~]# for i in {1..10};do curl http://10.3.88.188;done
<h1>Server 2 10.3.223.12</h1>
<h1>Server 1 10.3.223.11</h1>
<h1>Server 2 10.3.223.12</h1>
<h1>Server 1 10.3.223.11</h1>
<h1>Server 2 10.3.223.12</h1>
<h1>Server 1 10.3.223.11</h1>
<h1>Server 2 10.3.223.12</h1>
<h1>Server 1 10.3.223.11</h1>
<h1>Server 2 10.3.223.12</h1>
<h1>Server 1 10.3.223.11</h1>

此時服務仍正常,說明keepalived的主從配置正確。

keepalived主主配置:

修改node3的keepalived配置文件:

[root@node3 keepalived]# cat keepalived.conf
! Configuration File for keepalived

global_defs {
 notification_email {
root@localhost 
  }
 notification_email_from keepalived@localhost 
 smtp_server 127.0.0.1
smtp_connect_timeout 30
  route_id node3
   vrrp_mcast_group4 224.0.88.188
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 1
priority 100
advert_int 1
authentication {
    auth_type PASS
    auth_pass 1111
}
virtual_ipaddress {
    10.3.88.188/16 dev eno16777736 label eno16777736:0
}
}

vrrp_instance VI_2 {
state BACKUP
interface eno16777736
virtual_router_id 2
priority 96
advert_int 1
authentication {
    auth_type PASS
    auth_pass 2222
}
virtual_ipaddress {
    10.3.88.187/16 dev eno16777736 label eno16777736:1
}
}

virtual_server_group backend {
    10.3.88.188 80
            10.3.88.187 80
}

virtual_server group backend 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP

real_server 10.3.223.11 80 {
    weight 1
    HTTP_GET {
        url {
            path /index.html
            status_code 200
        }
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
    }
}
real_server 10.3.223.12 80 {
    weight 1
    HTTP_GET {
        url {
            path /index.html
            status_code 200
        }
        connect_timeout 3
        nb_get_retry 3
        delay_before_retry 3
    }
}
}

查看ipvsadm的狀態為:

[root@node3 keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
 -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.3.88.187:80 rr
  -> 10.3.223.11:80               Route   1      0          0         
 -> 10.3.223.12:80               Route   1      0          0         
TCP  10.3.88.188:80 rr
  -> 10.3.223.11:80               Route   1      0          0         
 -> 10.3.223.12:80               Route   1      0          0 

node4如node3一樣配置,修改相應的參數即可。

在node1和node2上添加lo:1的地址,如下:

lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
    inet 10.3.88.188  netmask 255.255.255.255
    loop  txqueuelen 0  (Local Loopback)

lo:1: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
    inet 10.3.88.187  netmask 255.255.255.255
    loop  txqueuelen 0  (Local Loopback)

在客戶端上訪問10.3.88.188,及10.3.88.187均能訪問到服務:

[root@node1 keepalived]# for i in {1..10};do curl http://10.3.88.188;done
<h1>Server 2 10.3.223.12</h1>
<h1>Server 1 10.3.223.11</h1>
<h1>Server 2 10.3.223.12</h1>
<h1>Server 1 10.3.223.11</h1>
<h1>Server 2 10.3.223.12</h1>
<h1>Server 1 10.3.223.11</h1>
h1>Server 2 10.3.223.12</h1>
<h1>Server 1 10.3.223.11</h1>
<h1>Server 2 10.3.223.12</h1>
<h1>Server 1 10.3.223.11</h1>
[root@node1 keepalived]# for i in {1..10};do curl http://10.3.88.187;done
<h1>Server 2 10.3.223.12</h1>
<h1>Server 1 10.3.223.11</h1>
<h1>Server 2 10.3.223.12</h1>
<h1>Server 1 10.3.223.11</h1>
<h1>Server 2 10.3.223.12</h1>
<h1>Server 1 10.3.223.11</h1>
<h1>Server 2 10.3.223.12</h1>
<h1>Server 1 10.3.223.11</h1>
<h1>Server 2 10.3.223.12</h1>
<h1>Server 1 10.3.223.11</h1>     #測試完成,keepalived的主主配置正確。

三、簡述http協議緩存原理及常用首部講解


http協議緩存的原理: 程序的運行具有局部性特征:
1.時間局部性:一個數據被訪問過之后,可能很快會被再次訪問到;
2.空間局限性:一個數據被訪問時,其周邊的數據也有可能被訪問到。

http緩存處理的步驟:
接受請求–>解析請求(提取請求的URL及各種首部)–>查詢緩存–>判斷緩存的有效性–>構建響應報文–>發送響應–>記錄日志

與緩存相關的首部:

1.expire:緩存的有效期限,是一個絕對時間    
2.if-modified-since:表示基于last-modified機制,緩存服務器到后端真實服務器上判斷緩存有效時,判斷自從某個絕對時間后,緩存內容是否發生過更改    
3.if-none-match:基于Etag機制,用于緩存服務器向后端服務器驗證緩存有效性    
4.public:可被所有公共緩存緩存,僅可以在響應報文中    
5.private:僅可被私有緩存緩存    
6.no-store:在響應報文中表示該內容不可花怒才能,在請求報文中表示不能從緩存中進行響應    
7.no-cache    
    在響應報文中表示可以緩存,但是客戶端請求的內容緩存命中后,不能直接用緩存直接響應,而是要先到原始服務器上進行校驗緩存有效性;    
    在請求報文中表示要先到原始服務器上進行校驗有效性后才能用緩存的內容進行響應    
8.max-age:以秒為單位指定的相對時長,表示緩存的最大有效期,是一個相對時長,與expire類似,    
9.s-maxage:與max-age類似,但是僅僅用作于公共緩存。

四、varnish實現緩存對象及反代后端主機


varnish簡介

1.varnish的程序結構:
varnish主要運行兩個進程:Management進程和Child進程(cache進程)。
Management進程主要實現新的配置,編譯VLC,監控varnish,初始化varnish以及提供一個命令接口等。management進程會每隔幾秒鐘探測一下child進程以判斷其是否正常運行,如果在指定的時長內未得到child進程的回應,management將會重啟此child進程。

varnish基礎架構如下: HA集群及varnish緩存基礎

2.varnish的緩存存儲機制:

varnish支持多種不同類型的后端存儲,這可以再varnishd啟動時使用-s選項指定。后端存儲的類型包括:

1.file:自管理的文件系統,使用特定的一個文件存儲全部的緩存數據,并通過操作系統的mmap()系統調用將整個緩存文件映射至內存區域(如果內存大小條件允許);varnish重啟時,所有緩存對象都將被清除;    
2.malloc:使用malloc()庫調用在varnish啟動時間操作系統申請指定大小的內容空間以緩存對象,varnish重啟后,所有緩存對象都將被清除。    
3.persistent:與file的功能相同,但可以持久存儲數據(即重啟varnish數據時不會被清除),處于測試期。

3.varnish日志:

varnish通過可以基于文件系統接口進行訪問的共享內存區域來記錄日志,為了與系統的其它部分進行交互,Child進程使用了可以通過文件系統接口進行訪問的共享內存日志(shared memory log),因此,如果某線程需要記錄信息,其僅需要持有一個鎖,而后向共享內存中的某內存區域寫入數據,再釋放持有的鎖即可。而為了減少競爭,每個worker線程都使用了日志數據緩存。

varnish的程序環境: /etc/varnish/varnish.params: 配置varnish服務進程的工作特性,例如監聽的地址和端口,緩存機制; /etc/varnish/default.vcl:配置各Child/Cache線程的緩存策略; 主程序: /usr/sbin/varnishd CLI interface: /usr/bin/varnishadm Shared Memory Log交互工具: /usr/bin/varnishhist /usr/bin/varnishlog /usr/bin/varnishncsa /usr/bin/varnishstat /usr/bin/varnishtop 測試工具程序: /usr/bin/varnishtest VCL配置文件重載程序: /usr/sbin/varnishreloadvcl Systemd Unit File: /usr/lib/systemd/system/varnish.service varnish服務 /usr/lib/systemd/system/varnishlog.service /usr/lib/systemd/system/varnishncsa.service 日志持久的服務;

varnish的緩存存儲機制( Storage Types): -s [name=]type[,options]

· malloc[,size]
    內存存儲,[,size]用于定義空間大?。恢貑⒑笏芯彺骓検?;
· file[,path[,size[,granularity]]]
    磁盤文件存儲,黑盒;重啟后所有緩存項失效;
· persistent,path,size
    文件存儲,黑盒;重啟后所有緩存項有效;實驗;

varnish程序的選項: 程序選項:/etc/varnish/varnish.params文件 -a address[:port][,address[:port][…],默認為6081端口; -T address[:port],默認為6082端口; -s [name=]type[,options],定義緩存存儲機制; -u user -g group -f config:VCL配置文件; -F:運行于前臺; … 運行時參數:/etc/varnish/varnish.params文件, DEAMONOPTS DAEMONOPTS=”-p threadpoolmin=5 -p threadpoolmax=500 -p threadpooltimeout=300″

    -p param=value:設定運行參數及其值; 可重復使用多次;
    -r param[,param...]: 設定指定的參數為只讀狀態; 

 

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/100814

(0)
gw章gw章
上一篇 2018-06-10
下一篇 2018-06-10

相關推薦

欧美性久久久久