1. 程式人生 > >Keepalived+Tengine實現高可用叢集

Keepalived+Tengine實現高可用叢集

概述

近年來隨著Nginx在國內的發展潮流,越來越多的網際網路公司使用Nginx;憑Nginx的高效能、穩定性等成為了眾多IT者青睞的WEB反向代理伺服器;但是Nginx雖然有很強大的代理功能,只有一臺Nginx伺服器難免不會出現問題,這就形成了單點故障的問題,而恰好可以使用Keepalived來解決單點的故障問題,Keepalived故障轉移時間比較短,而且配置簡單易用,這也是選擇Keepalived做高可用的一個主要原因所在,如果日PV值不是很大的中小型企業可以考慮使用這種方案

Tengine

Tengine是由淘寶網發起的Web伺服器專案。它在Nginx的基礎上,針對大訪問量網站的需求,添加了很多高階功能和特性。Tengine的效能和穩定性已經在大型的網站如淘寶、天貓商城等得到了很好的檢驗。它的最終目標是打造一個高效、穩定、安全、易用的Web平臺

Tengine特性:

1、繼承Nginx-1.2.9的所有特性,100%相容Nginx的配置

2、動態模組載入(DSO)支援。加入一個模組不再需要重新編譯整個Tengine

3、更加強大的負載均衡能力,包括一致性hash模組、會話保持模組,還可以對後端的伺服器進行主動健康4、檢查,根據伺服器狀態自動上線下線

5、輸入過濾器機制支援。通過使用這種機制Web應用防火牆的編寫更為方便

6、組合多個CSS、JavaScript檔案的訪問請求變成一個請求

7、自動根據CPU數目設定程序個數和繫結CPU親緣性

8、監控系統的負載和資源佔用從而對系統進行保護

9、更強大的防攻擊(訪問速度限制)模組

10、動態指令碼語言Lua支援。擴充套件功能非常高效簡單

......

一、Nginx+Keepalived有兩種配置高可用方法

1Nginx+Keepalived主備模式

使用一個虛擬IP地址即可,前端有兩臺Nginx伺服器做排程,其中一臺為主節點而另一臺有備用節點,兩臺伺服器只有一臺提供服務,而另一臺處於閒置的狀態,只有主節點伺服器出現故障時備用節點伺服器才會接管主節點伺服器上的所有服務及虛擬IP並繼續提供服務,而這一切對客戶端來說是透明的

2Nginx+Keepalived主主模式

這種模式需要使用兩個虛擬IP地址,前端有兩臺Nginx伺服器做排程,兩臺伺服器互為主備並同時工作,如果其中一臺伺服器出現故障時,將會把所有請求都轉發到另一臺伺服器上面,這種做是不是很經濟實惠,兩臺伺服器同時提供服務,相比主備模式不僅分擔了一臺伺服器的壓力還提高了併發量

二、下面以一個案例來配置說明Keepalived+Nginx是如何實現高可用

133941568.gif

環境介紹:

系統版本:CentOS 6_x86_64

Tengine版本: Tengine-1.5.1

Keepalived版本:keepalived-1.2.7-3.el6

1、在Nginx1與Nginx2伺服器上安裝Tengine

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ######在Nginx1安裝 [root@nginx1 ~]# useradd -r nginx [root@nginx1 ~]# tar xf tengine-1.5.1.tar.gz [root@nginx1 ~]# cd tengine-1.5.1 ######安裝Tengine的依賴環境包 [root@nginx1 ~]# yum -y install pcre-devel openssl-devel libxml2-devel libxslt-devel gd-devel lua-devel GeoIP-devel gcc gcc-c++ [root@nginx1 ~]# ./configure \ --prefix=/usr/local/nginx\ --sbin-path=/usr/local/nginx/sbin/nginx\ --conf-path=/etc/nginx/nginx.conf \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --pid-path=/var/run/nginx/nginx.pid  \ --lock-path=/var/lock/nginx.lock \ --user=nginx \ --group=nginx \ --enable-mods-shared=all [root@nginx1 tengine-1.5.1]# make && make install ######在Nginx2安裝 [root@nginx2 ~]# scp 172.16.14.1:/root/tengine-1.5.1.tar.gz ./ [root@nginx2 tengine-1.5.1]# yum -y install pcre-devel openssl-devel libxml2-devel libxslt-devel gd-devel lua-devel GeoIP-devel gcc gcc-c++ [root@nginx2 tengine-1.5.1]# ./configure \ --prefix=/usr/local/nginx\ --sbin-path=/usr/local/nginx/sbin/nginx\ --conf-path=/etc/nginx/nginx.conf \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --pid-path=/var/run/nginx/nginx.pid  \ --lock-path=/var/lock/nginx.lock \ --user=nginx \ --group=nginx \ --enable-mods-shared=all [root@nginx2 tengine-1.5.1]# make && make install

2、在Nginx1與Nginx2伺服器上為Tengine準備Sysv服務指令碼

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 ######Nginx1提供指令碼 [root@nginx1 ~]# vim /etc/init.d/nginx #!/bin/sh # nginx - this script starts and stops the nginx daemon # chkconfig:   - 85 15 # description:  Nginx is an HTTP(S) server, HTTP(S) reverse \ # processname: nginx # config:      /etc/nginx/nginx.conf # config:      /etc/sysconfig/nginx # pidfile:     /var/run/nginx.pid # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING"= "no" ] && exit 0 nginx="/usr/local/nginx/sbin/nginx" prog=$(basename$nginx) NGINX_CONF_FILE="/etc/nginx/nginx.conf" [ -f /etc/sysconfig/nginx] && . /etc/sysconfig/nginx lockfile=/var/lock/subsys/nginx make_dirs() { # make required directories user=`nginx -V 2>&1 |grep "configure arguments:"| sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` options=`$nginx -V 2>&1 |grep 'configure arguments:'` foropt in $options; do if[ `echo $opt | grep '.*-temp-path'` ]; then value=`echo $opt | cut -d"=" -f 2` if [ ! -d "$value"]; then # echo "creating" $value mkdir -p $value && chown -R $user $value fi fi done } start() { [ -x $nginx ] ||exit 5 [ -f $NGINX_CONF_FILE ] ||exit 6 make_dirs echo-n $"Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq0 ] && touch $lockfile return$retval } stop() { echo-n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq0 ] && rm -f $lockfile return$retval } restart() { configtest ||return $? stop sleep1 start } reload() { configtest ||return $? echo-n $"Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo } force_reload() { restart } configtest() { $nginx -t -c $NGINX_CONF_FILE } rh_status() { status $prog } rh_status_q() { rh_status >/dev/null2>&1 } case "$1" in start) rh_status_q && exit0 $1 ;; stop) rh_status_q || exit0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit0 ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart| try-restart|reload|force-reload|configtest}" exit 2 esac ######將Nginx加入到系統服務並啟動 [root@nginx1 ~]# chmod +x /etc/init.d/nginx [root@nginx1 ~]# chkconfig --add nginx [root@nginx1 ~]# service nginx start ######將Nginx1指令碼拷貝到Nignx2伺服器上並加入系統服務 [root@nginx2 ~]# scp 172.16.14.1:/etc/init.d/nginx /etc/init.d/ [root@nginx2 ~]# chmod +x /etc/init.d/nginx [root@nginx2 ~]# chkconfig --add nginx [root@nginx2 ~]# service nginx start

3、訪問測試Nginx服務是否正常

3.1、在Nginx1伺服器上測試

1 2 [root@nginx1 ~]# netstat -anpt|grep nginx tcp        0      0 0.0.0.0:80      0.0.0.0:*       LISTEN      15088/nginx

140613745.gif

3.2、在Nginx2伺服器上測試

1 2 [root@nginx2 ~]# netstat -anpt|grep nginx tcp      0      0 0.0.0.0:80   0.0.0.0:*     LISTEN 7281/nginx

141055703.gif

三、在Httpd1與Httpd2伺服器上安裝Apache

1、在Httpd1伺服器配置好YUM源,使用YUM安裝HTTPD服務

1 2 3 4 5 [root@httpd1 ~]# yum -y install httpd [root@httpd1 ~]# chkconfig httpd on [root@httpd1 ~]# service httpd start ######為Httpd1提供測試頁 [root@httpd1 ~]# echo '<h1>172.16.14.3 httpd1</h1>' > /var/www/html/index.html

142436623.gif

2、在Httpd2伺服器配置好YUM源,使用YUM安裝HTTPD服務

1 2 3 4 [root@httpd2 ~]# yum -y install httpd [root@httpd2 ~]# chkconfig httpd on [root@httpd2 ~]# service httpd start [root@httpd2 ~]# echo '<h1>172.16.14.4 httpd2</h1>' > /var/www/html/index.html

143323322.gif

四、配置Tengine

1、將主配置檔案備份一份然後修改主配置檔案

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 [root@nginx1 ~]# cd /etc/nginx/ [root@nginx1 nginx]# cp nginx.conf nginx.conf.bak [root@nginx1 nginx]# vim nginx.conf user  nginx nginx; worker_processes  2; worker_rlimit_nofile 51200; #error_log  logs/error.log; #pid        logs/nginx.pid; events { use epoll; worker_connections  51200; } # load modules compiled as Dynamic Shared Object (DSO) dso {        #實現動態載入模組 load ngx_http_upstream_session_sticky_module.so;  #載入session模組 } http { include       mime.types; default_type  application/octet-stream; log_format  main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log  logs/access.log main; client_max_body_size 20m; client_header_buffer_size 16k; large_client_header_buffers 4 16k; sendfile        on; tcp_nopush     on; keepalive_timeout  65; gzip  on;             #開啟壓縮 gzip_min_length 1k; gzip_buffers 4 16k; gzip_proxied   any; gzip_http_version 1.1; gzip_comp_level 3; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; proxy_temp_path   /tmp/proxy_temp; proxy_cache_path  /tmp/proxy_cache levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=3g; proxy_connect_timeout    50; proxy_read_timeout       600; proxy_send_timeout       600; proxy_buffer_size        128k; proxy_buffers           16 256k; proxy_busy_buffers_size 512k; proxy_temp_file_write_size 1024m; proxy_next_upstream error timeout invalid_header http_500 http_503 http_404 http_502 http_504; upstream allen { server 172.16.14.3; server 172.16.14.4; check interval=3000 rise=2 fall=5 timeout=1000 type=http; #後端Server健康狀態檢查 check_http_send"GET / HTTP/1.0\r\n\r\n"; check_http_expect_alive http_2xx http_3xx; session_sticky;    #保持會話連線 } server { listen       80; server_name  localhost; #charset koi8-r; #access_log  logs/host.access.log  main; location / { proxy_pass http://allen; } location /status {        #實現狀態監控 check_status; } #error_page  404              /404.html; # redirect server error pages to the static page /50x.html # error_page   500 502 503 504  /50x.html; location = /50x.html { root   html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { #    root           html; #    fastcgi_pass   127.0.0.1:9000; #    fastcgi_index  index.php; #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name; #    include        fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { #    deny  all; #} } # HTTPS server # #server { #    listen       443; #    server_name  localhost; #    ssl                  on; #    ssl_certificate      cert.pem; #    ssl_certificate_key  cert.key; #    ssl_session_timeout  5m; #    ssl_protocols  SSLv2 SSLv3 TLSv1; #    ssl_ciphers  HIGH:!aNULL:!MD5; #    ssl_prefer_server_ciphers   on; #    location / { #        root   html; #        index  index.html index.htm; #    } #} } 註釋:Nginx的更多引數介紹請檢視前面的部落格

2、重啟Tengine服務訪問測試負載均衡

1 [root@nginx1 ~]# service nginx restart

151308170.gif

151311873.gif

由上圖可見可以成功訪問到後端的Httpd服務,接下來訪問測試狀態監控模組

152212277.gif

3、在Nginx2伺服器配置Tengine主配置檔案

1 2 3 4 ######複製Nginx1伺服器上的配置檔案到Nginx2伺服器 [root@nginx2 ~]# scp 172.16.14.1:/etc/nginx/nginx.conf /etc/nginx/ [root@nginx2 ~]# service nginx restart 註釋:重啟Tengine服務並測試;測試方法同Nginx1伺服器,這裡就不再做測試了

五、安裝Keepalived並配置

1、在Nginx1與Nginx2伺服器上安裝Keepalived

1 2 3 4

相關推薦

Keepalived+Tengine實現可用叢集

概述 近年來隨著Nginx在國內的發展潮流,越來越多的網際網路公司使用Nginx;憑Nginx的高效能、穩定性等成為了眾多IT者青睞的WEB反向代理伺服器;但是Nginx雖然有很強大的代理功能,只有一臺Nginx伺服器難免不會出現問題,這就形成了單點故障的問題,而恰好可

LVS健康檢查及keepalived實現可用叢集

LVS健康檢查 我們前面做的那些LVS的各種模式部署,都沒有健康檢查這一功能,就是說在我們搭建的負載均衡叢集中,如果後端伺服器RS全部宕掉了,客戶端就無法訪問到服務端的資料,這時我們應該給客戶端一些提示,說明伺服器暫時無法訪問。 配置(搭建好LVS-DR模式負載均衡的前提下) 在

docker下用keepalived+Haproxy實現可用負載均衡叢集

先記錄下遇到的坑,避免之後忘了; 花時間最多去解決的一個題是:在docker下啟動haproxy服務後在這個docker服務內安裝keepalived無法ping通的問題,雖然最後也是莫名其妙就好了,但是加強了不少對docker的理解和還需深入學習的地方。 為什麼要用

CentOS7 haproxy+keepalived實現可用叢集搭建

一、搭建環境   CentOS7 64位         Keepalived  1.3.5         Haproxy 1.5.18   後端負載主機:192.168.166.21   192.168.166.22   兩臺節點上安裝rabbitmq服務      

rabbitmq+haproxy+keepalived實現可用叢集搭建

  專案需要搭建rabbitmq的高可用叢集,最近在學習搭建過程,在這裡記錄下可以跟大家一起互相交流(這裡只是記錄了學習之後自己的搭建過程,許多原理的東西沒有細說)。 搭建環境   CentOS7 64位   RabbitMQ 3.6.2   Keepalived 1.2.21   主機:192.1

Keepalived+Nginx實現可用負載均衡集群

連接 靜態 adf -1 rip mail fff hostname dex 一 環境介紹 1.操作系統CentOS Linux release 7.2.1511 (Core) 2.服務keepalived+lvs雙主高可用負載均衡集群及LAMP應用keepalived-1

Keepalived+Nginx實現可用(HA)

nginx+keepalived ha高可用高可用有2中方式。1、Nginx+keepalived 主從配置這種方案,使用一個vip地址,前端使用2臺機器,一臺做主,一臺做備,但同時只有一臺機器工作,另一臺備份機器在主機器不出現故障的時候,永遠處於浪費狀態,對於服務器不多的網站,該方案不經濟實惠。2、Ngin

keepalived+nginx實現可用

決定 toc state ipv4 一次 根據 並且 ive lob 方案規劃 vip ip hostname nginx端口 系統 192.168.88.100 182.168.88.1 nginx-01 80 CentOS7.3.1611 192.168.

keepalived+Nginx實現可用集群

auth timeout cati -c stat -h track ast 顯示 keepalived安裝Nginx安裝 配置keepalived#修改配置vim /etc/keepalived/keepalived.conf #配置文件 ! Config

keepalived+lvs實現可用負載均衡集群

keepalived+lvs實現高可用LVS實戰篇第1章 環境準備1.1 系統環境1.1.1 系統版本[root@lb01 ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@lb01 ~]# uname -r 2.6.32-696.el6

keepalived+mysql實現可用

algo prior 優先級 mysqld www. cte enc 方案 .cn 為了響應公司需求,打造出更安全的mysql集群,能夠實現mysql故障後切換,研究了幾天終於有了成果,一起分享一下。首先介紹一下這套集群方案實現的功能1、mysql服務器故障後自動轉移,修好

RabbitMq 基於 keepalived+haproxy實現可用

for eal arch ant pen 概述 否則 一個 round 1 概述rabbitmq作為消息隊列,廣泛用於生產環境,但是,如果單節點,將導致故障後,生產環境不可用,因此,需要部署高可用環境本文將介紹基於keepalived+haproxy實現rabbitmq的

redis主從復制及keepalived方式實現可用測試

kcon .gz 接口 replica 健康檢查 密碼 write weight 高可用 前言:redis高可用有Sentinel、Cluster等多種方式,本文主要介紹keepalived方式。架構:配置:hostnameiposredis版本keepalived版本備註

keepalived + glusterfs實現可用

此處暫時不介紹原理亂七八糟,邊做別記錄下操作。 1.伺服器修改網絡卡的名字為eth0 1 1.將device和name都改成eth0 2 vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 3 2.網絡卡名字改了 4 mv ifcfg-eno1

lvs + keepalived + nginx 實現可用

1.目的 lvs是四層的負載均衡,keepalived為lvs提供高可用服務,同時檢查後端nginx的健康狀態,nginx主要用來做七層的負載均衡 2.拓撲圖 伺服器 IP地址 說明 Director主節點 192.168.3.105 lvs keepalived Director備節點

keepalived+nginx實現可用+tomcat

pro location add protoc ins ade 要求 網卡 fire 1、keepalived的yum安裝 安裝依賴包[root@localhost ~]# yum install -y curl gcc openssl-devel libnl3-devel

keepalived + nginx 實現可用之遠端面籤專案

面籤系統部署文件 1. 準備工作 1.1 前提 運維應確保各個系統網路策略已經開通並驗證通過 運維需提供安裝系統的DVD光碟或映象 雲屋視訊模組由雲屋工程師負責部署安裝 客服系統由客服系統工程師負責部署安裝 面籤系統由面籤系統工程師負責部署安裝 1.2 開始準備工作 //建立使用者

keepalived + nginx 實現可用之遠程面簽項目

使用說明 pat 使用 部署 mount use top service ngx 面簽系統部署文檔 1. 準備工作 1.1 前提 運維應確保各個系統網絡策略已經開通並驗證通過 運維需提供安裝系統的DVD光盤或鏡像 雲屋視頻模塊由雲屋工程師負責部署安裝 客服系統由客服系統工

003.Keepalived搭建LVS可用叢集

一 基礎環境 1.1 IP規劃 OS:CentOS 6.8 64位 節點型別 IP規劃

使用Haproxy,Keepalived,Tproxy實現可用透明反向代理

宣告 本文為Gleasy原創文章,轉載請指明引自Gleasy團隊部落格 一。需求場景 具體需求如下: 4臺Server,2臺為Proxy Server,2臺為Web Server,均為雙網絡卡; 1個公網IP(183.129.228.91); 要求如下: 1. 2臺Proxy Server反向代理2臺W