引用網址:http://www.gegugu.com/2016/08/23/14097.html
一、集群基礎
1、系統的擴展方式
- scale up向上擴展:提高單臺伺服器的姓能
- scale out向外擴展:多臺伺服器聯合起來滿足同一個需要
2、集群類型
-
LB :load balancing,負載均衡集群,通過橫向擴展提高系統姓能
引用網址:http://www.gegugu.com/2016/08/23/14097.html
LB :load balancing,負載均衡集群,通過橫向擴展提高系統姓能
引用網址:http://www.server110.com/nginx/201309/1311.html
首先理解上图:一个高访问量的站点(每天100万PV),可以使用以上的服务器组成配置。该站点总共由7台服务器组成,图片文件服务器负责整个站点的图片存储(当然高访问量的站点当然需要cnd图片加速了),两台数据库服务器形成主从备份保证了数据运算的速度,同时保证了当其中一台服务器宕机后,还有一台数据库服务器保证系统的运行,两台web服务器保证了系统的快速响应请求,同时其中一台web服务器宕机后还有一个web服务器提供服务。两台nginx代理服务负责转发用户的请求,问题是,两台nginx有两个ip,怎么才能保证一台nginx服务器宕机后,另一台服务器自动接手服务呢?keepalived提供的VRRP虚拟路由服务就可以解决这个问题。
一、安装必要的软件包,以保证nginx和keepalived能安装:
yum -y install gcc gcc-c++ make
yum -y install wget #安装下载工具
yum -y install pcre-devel #安装nginx的依赖软件包
yum -y install openssl-devel #安装keepalived依赖软件包
yum -y install popt-devel #安装keepalived依赖软件包
二、安装nginx
wget http://nginx.org/download/nginx-1.2.8.tar.gz #下载nginx
tar -zxf nginx-1.2.8.tar.gz #解压nginx
cd nginx-1.2.8
groupadd www #添加www用户组
useradd -g www www #新添加www用户,且用户组隶属于www用户组
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install #编译,--with-http_stub_status_module --with-http_ssl_module这两个模块必须开启
编写nginx启动脚本
cat /etc/init.d/nginx
#!/bin/bash
#
# chkconfig: - 85 15
# description: Nginx is a World Wide Web server.
# processname: nginx
nginx=/usr/local/nginx/sbin/nginx #nginx执行路径
conf=/usr/local/nginx/conf/nginx.conf #nginx配置文件路径
case \$1 in
start)
echo -n "Starting Nginx"
\$nginx -c \$conf
echo " done"
;;
stop)
echo -n "Stopping Nginx"
killall -9 nginx
echo " done"
;;
test)
\$nginx -t -c \$conf
;;
reload)
echo -n "Reloading Nginx"
ps auxww | grep nginx | grep master | awk '{print \$2}' | xargs kill -HUP
echo " done"
;;
restart)
killall -9 nginx
echo -n "Stopping Nginx"
\$nginx -c \$conf
echo -n "Starting Nginx"
echo " done"
;;
show)
ps -aux|grep nginx
;;
*)
echo -n "Usage: \$0 {start|restart|reload|stop|test|show}"
;;
esac
EOF
chmod +x /etc/init.d/nginx
service nginx start
chkconfig nginx on
service nginx start
在浏览器浏览你的nginx看看是否启动。
三、安装keepalived-1.2.0
wget http://keepalived.org/software/keepalived-1.2.0.tar.gz
tar -zxf keepalived-1.2.0.tar.gz
cd keepalived-1.2.0
./configure --prefix=/usr/local/keepalived
make && make install
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
mkdir /etc/keepalived
编写keepalived的配置
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
vrrp_script chk_http_port {
script "/etc/keepalived/nginx_pid.sh" #nginx监控脚本路径,改脚本可以把死掉的nginx进程重新启动。
interval 2
weight 2
}
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER #状态,位主,从机使用BACKUP
interface eth0 #把那块网卡映射寻ip
virtual_router_id 51 #虚拟路由id号,这个和从keepalived机子一样。
priority 100 #权重,那个权重高,那个就是主的,所以MASTER的权重必须高于BACKUP
advert_int 1
authentication {
auth_type PASS #主从机子通信的加密方式,两台必须一样
auth_pass 123456 #主从机子通信的加密密码,两台必须一样
}
track_script {
chk_http_port #监控脚本,chk_http_port对应的是第3行的vrrp_script chk_http_port,
}
virtual_ipaddress {
192.168.1.250 #虚拟IP
}
EOF
service keepalived start
ip addr 看看是否有以下内容:如果内看到以下内容就表明你keepalived配置正确了,然后你用192.168.137.120这个虚拟ip是否和192.168.137.110这个ip看到的是一样的,如果是一样就表明可以了
编写nginx的监控脚本:
cat /etc/keepalived/nginx_pid.sh
#!/bin/bash
while :
do
nginxpid=`ps -C nginx --no-header | wc -l`
if [ $nginxpid -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 5
if [ $nginxpid -eq 0 ];then
/etc/init.d/keepalived stop
fi
fi
sleep 5
done
EOF
四、经过以上的配置,虚拟路由是可以启动了,当主虚拟路由机宕机后,从虚拟路由机后接手。下面来配置nginx的转发代理。
nginx的配置如下:
user www www;
worker_processes 2;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
use epoll;
worker_connections 65535;
}
http {
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
client_max_body_size 300m;
sendfile on;
tcp_nopush on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_temp_file_write_size 128k;
keepalive_timeout 90;
tcp_nodelay on;
server_tokens off;
gzip on;
gzip_min_length 1k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
include vhost/*.conf;
}
引用網址:http://baike.baidu.com/view/876125.htm
引用網址: http://tavi.debian.org.tw/index.php?page=VRRP
VRRP的全名為Virtual Router Redundancy Protocol,中文名稱可以翻為"虛擬路由器備援協定"。
VRRP
全名為 Virtual Router Redundancy Protocol (虛擬路由器備援協定)
定義在 RFC 2338 和 3768 中 (3768 為 2338 的更新修正版)
而在瞭解 VRRP 的原理之前,先來看看 VRRP 的封包
(一)VRRP封包格式
以下是 RFC 3768 中所定義出來 VRRP 封包的格式
然後再來看看 VRRP 的封包有哪些特色
首先先看 L2 的 Frame
VRRP 的封包第二層的資料只包含了 Source MAC address 和 Destination MAC address
VRRP 中來源 MAC 位址格式必須為 00-00-5E-00-01-XX
其中 XX 為虛擬路由器的編號(Virtual Router Identifier,簡寫為VRID)
其次是 L3 的 Packet
目的 IP 位址必須是群播位址 240.0.0.18
TTL 則必須設定為 255 ,否則會被丟棄
IP 的上一層是 VRRP ,故 Protocol 欄位數值是 112 (0x70 in 16進位)
最後來到最上層
在 RFC 3768 中有詳細說明各欄位的意義,在此不贅述
其中要特別注意到的是 Priority 欄位
這個欄位說明了 sending VRRP router 的優先權,值愈大優先權愈大
但是當此欄位為 0 時有特別意義
代表 the current Master has stopped participating in VRRP
也就是說現在要有 Backup router 必須被選為下一個 Master
而不用等現在的 Master timeout 才去選
(二)VRRP基本原理
我們網路上有許多路由器(Router)
跑著不同的路由協定(Routing Protocol)
其中跑著 VRRP 的 router 我們稱為 VRRP router
而一個虛擬路由器(Virtual Router)可以說是一群 VRRP router 的組合
因為實際運作的路由器是這些路由器中的 master,所以才說這一群是「一個」虛擬路由器
此外, virtual router 有一個辨識號碼(VRID)和一組相關聯的 IP 位址
因此可以說同一個 virtual router 底下的 VRRP router 都具有相同的 VRID,稱它們為同一 group
那 VRRP 是幹什麼的呢?
剛說 virtual router 底下有很多 VRRP router
VRRP 就是在選其中一個 router 作為 master
剩餘的則成為 backup
若是 master 掛掉了,則從 backup 中依優先權再選出一個 master
其實可以再進一步看
VRRP 封包格式中有一欄位叫做 Adver Int(Advertisement Interval)
預設為一秒,此欄是用來判斷是否該有 backup 起來作為 master 的判斷因素之一
最後做個小結
VRRP 是用在 static default routed environment(靜態預設路由環境)
其功用在於避免 single point of failure(單點故障)
最大優點是可以不用在每個 end-host 作 dynamic routing 或 router discovery protocol 的組態設定
而有高可得性的預設路徑(high availability default path)
以上為個人「簡單」心得,有誤不吝指教
參考資料:
http://www.faqs.org/rfcs/rfc3768.html
http://tavi.debian.org.tw/index.php?page=VRRP
http://www.networksorcery.com/enp/protocol/vrrp.htm
http://en.wikipedia.org/wiki/Virtual_Router_Redundancy_Protocol