Nginx主主负载均衡架构

比较常见的Nginx+Keepalived项目方案都采用的是单主Nginx在工作,从Nginx长期处于备份状态,所以我想将两台Nginx负载均衡器都处于工作状态,其实用Keepalived也很容易实现。 Nginx主主架构服务器IP分配表如表如下所示。

Nginx和Keepalived的安装比较简单,这里就不重复了,这里附上两台 Nginx负载均衡器的nginx.conf配置文件,内容如下所示:
user www www;
worker_processes 8;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
}
http{
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi.connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi.buffers 4 64k;
fastcgi _busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
upstream backend {
server 192.168.1.17:80;
server 192.168.1.18:80;
}
server {
listen 80;
server_name hqidi.com;
location / {
root /var/www/html ;
index index.php index.htm index.html;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://backend;
}
location /nginx {
access_log off;
auth_basic "NginxStatus";
#auth_basic_user_file /usr/local/nginx/htpasswd;
}
log_format access '$remote_addr - $remote_user [ $time_local ] "Srequest” '
'Sstatus $body_bytes_sent "$http_referer” '
'"$http_user_agent" $http_x_forwarded_for';
access_log /data/logs/access.log access;
}
}

这里简单解释配置Keepalived文件的原理,其实就是通过Keepalived生成两个实例,两台Nginx互为备份。即第一台是第二台机器的备机,而第二台机器也是第一台的备机,而生成的两个VIP地址分别对应网站//hqidi.com,这样大家在公网上可以通过DNS轮询来访问网站。如果任何一台Nginx机器发生件损坏,Keepalived会自动将它的VIP地址切换到另一台机器,不影响客户端的访问,这个LVS+Keepalived多实例的原理是一样的,相信大家也能明白。
主Nginx机器之一的keepalived.conf配置文件如下:

! Configuration File for keepalived
global_defs {
notification_email {
a@b.cn
}
notification_email_from keepalived0chtopnet.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router.id LVS.DEVEL
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 9527
}
virtual_ipaddress {
192.168.1.8
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 52
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 9527
}
virtual_ipaddress {
192.168.1.9
}
}

另外一台nginx的keepalived.conf的配置文件如下:
! Configuration File for keepalived
global_defs {
notification_email {
a@b.cn
}
notification_email_from keepalived0chtopnet.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router.id LVS.DEVEL
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 9527
}
virtual_ipaddress {
192.168.1.8
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 9527
}
virtual_ipaddress {
192.168.1.9
}
}

启动keepalived后,两台nginx负载均衡器上用tcpdump抓包,正常情况下它们都应该向对方发送VRRP包。
大家都知道keepalived是实现不了程序级别的高可用的,所以我们要通过脚本来实现nginx的高可用,脚本/root/nginxpid.sh内容如下

#!/bin/bash
while :
do
nginxpid=`pgrep nginx | 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

正常启动两台主nginx的nginx和keepalived程序后,两台机器的正常IP显示应该如下所示:
ip为192.168.1.5的机器的ip addr命令显示结果:
1: lo: mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:99:fb:47 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.5/24 brd 192.168.1.255 scope global eth0
  inet 192.168.1.8/32 scope global eth0

IP为192.168.1.6的机器的ip addr命令显示结果:
1: lo: mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:7d:58:32 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.6/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.9/32 scope global eth0
inet6 fe80::20c:29ff:fe7d:585e/64 scope link
valid_lft forever preferred_lft forever

测试过程如下:
1)分别在两台主nginx上killall掉nginx进程,然后在客户端分别访问192.168.1.8和192.168.1.9这两个IP(模拟DNS轮询),看能否正常访问web服务器。
2)尝试重启192.168.1.5的主nginx负载均衡器,测试过程如上。
3)尝试重启192.168.1.6的主nginx负载均衡器,测试过程如上。
尝试分别关闭192.168.1.5和192.168.1.6的机器,测试过程如上,看是否影响网站的正常访问。

目前投入生产要解决的问题:

➤一主一备的环境投入生产环境时,我们的nginx备机完全没有必要闲置浪费,可以作为我们的备份机器,如果是小网站,我们完全可以用NFS文件服务器作为nginx备机。此架构适合中小型网站应用。
➤日志收集系统要重新部署,现在访问日志分布于两台nginx负载均衡器上。
➤要考虑搜索引擎域名收录的问题。
➤要考虑DNS轮询的问题。
➤此网站架构实施时不要影响网站的业务系统,事实上很多业务系统在程序上都做了防作弊措施,所以在实施时考虑问题一定要全面。
➤证书的问题,两台nginx负载均衡器都需要部署证书。
➤nginx主主架构较之nginx主备架构维护起来更为复杂,这点希望大家注意。

原创文章,转载请注明: 转载自笛声

本文链接地址: Nginx主主负载均衡架构

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注