欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

ngnix+keepalived 实现N主高可用负载均衡web群集

发布时间:2025/7/14 编程问答 56 豆豆
生活随笔 收集整理的这篇文章主要介绍了 ngnix+keepalived 实现N主高可用负载均衡web群集 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

ngnix+keepalived 实现N主高可用负载均衡web群集

 

思路:
总结一下最近学习的nginx+keepalived 的负载均衡架构,发现linux的群集系统都是负载均衡层加服务器群组层,实现负载均衡高可用的话就需要一主一备,备的那台机就空闲了,为了合理使用资源,想通过keepalived把备用的也当做web服务器,当主的挂掉后,备的接管负载均衡任务。(想实现类似 于windowns的NLB群集)


原理:

各台nginx用80端口做负载均衡,81端口提供web服务,通过keepalived将全部服务器做高可用。
当master挂掉后,backup服务器通过优先级选举新的master接管vip,新的master使用80端口做负载,继续访问其他服务器群的81端口,把自己的web服务(81端口)备用。
修复好的服务器,要上线成为master就把keepalived的优先级设高点,只加入提供web服务就把优先级设置得比现有master低即可。

缺点:
每台服务器都要公网ip,如果只使用一个公网ip(做VIP),就要在路由器上指定到这个ip的静态路由
中心交换机负荷重,数据流:client->master:80->web1:81->master->client

注意:真实环境还是大多会用前端负载均衡的架构,两台负载均衡器做高可用。

 

实验步骤:
Server 1
Eth0: 192.168.1.1/24
Server 2
Eth0:192.168.1.2/24
Server 3
Eth0: 192.168.1.10/24
Server 4
Eth0: 192.168.1.11/24

软件:
Nginx 1.22
Keepalived v1.1.19

安装过程:
网上大把。


需要配置的文件:
/etc/keepalived/keepalived.conf
/usr/local/nginx/conf/nginx.conf

 

设置好一台服务器的配置文件,可以使用scp 命令复制到其他服务器里:

  • scp /usr/local/nginx/conf/nginx.conf 192.168.1.2:/usr/local/nginx/conf/ 
  • scp /etc/keepalived/keepalived.conf 192.168.1.2:/etc/keepalived/ 
  • .....
  • 开始配置nginx Server 1 的/usr/local/nginx/conf/nginx.conf文件如下:
  • #运行用户 
  •     user  www www; 
  • #启动进程,通常设置成和cpu的数量相等 
  •     worker_processes  1;   
  • #最好与ulimit -n的值保持一致 
  •     worker_rlimit_nofile 65535; 
  •  
  • #全局错误日志及PID文件 
  •     #error_log  logs/error.log; 
  •     #error_log  logs/error.log  notice; 
  •     #error_log  logs/error.log  info; 
  •     #pid        logs/nginx.pid; 
  •  
  • #google加速 
  • google_perftools_profiles /tmp/tcmalloc; 
  •  
  • #工作模式及连接数上限 
  •   events { 
  •     worker_connections  65535; 
  • #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能 
  •     use epoll; 
  •    } 
  •  
  • #设定http服务器,利用它的方向代理功能提供负载均衡 
  •   http { 
  • #设定mime类型,类型由mime.type文件定义 
  •     include       mime.types; 
  •     default_type  application/octet-stream; 
  • #隐藏nginx版本 
  • server_tokens off; 
  •  
  • # 设定日志格式 
  •     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 10m; 
  • ##缓冲区代理缓冲用户端请求的最大字节数, 
  •         client_body_buffer_size 128k; 
  •  
  • #防止网络阻塞 
  •     #tcp_nopush     on; 
  • #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用, 
  • #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime. 
  •     sendfile on; 
  • #连接超时时间 
  •     keepalive_timeout  65; 
  • #允许客户端请求的最大单文件字节数 
  • ##缓冲区代理缓冲用户端请求的最大字节数, 
  • #开启gzip压缩  
  •     gzip  on; 
  • #设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是0,不管页面多大都压缩。>建议设置大于1k的字节数,小于1k可能会越压越大。 
  •     gzip_min_length 1k; 
  • #设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位,安装原始数据大小以16k为单位的4倍申请内存。 
  •     gzip_buffers 16 64k; 
  • #识别http的协议版本(1.0/1.1) 
  •     gzip_http_version 1.1; 
  • #gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu) 
  •     gzip_comp_level 6; 
  • #匹配mime类型进行压缩,无论是否指定,”text/html”类型总是会被压缩的。 
  •     gzip_types text/plain application/x-javascript text/css application/xml; 
  • #和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩 
  •     gzip_vary on; 
  •  
  • #指定连接到后端FastCGI的超时时间。 
  • fastcgi_connect_timeout 300; 
  • #向FastCGI传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间。 
  • fastcgi_send_timeout 300; 
  • #接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间。 
  • fastcgi_read_timeout 300; 
  • #定读取FastCGI应答第一部分需要用多大的缓冲区,一般第一部分应答不会超过1k,由于页面大小为4k,所以这里设置为4k。 
  • fastcgi_buffer_size 64k; 
  • #指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答。 
  • fastcgi_buffers 4 64k; 
  • #只知道默认值是fastcgi_buffers的两倍。 
  • fastcgi_busy_buffers_size 128k; 
  • #在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍。 
  • fastcgi_temp_file_write_size 128k; 
  • #这个指令为Nginx配置FastCGI缓存指定一个路径,目录结构等级,关键字区域存储时间和非活动删除时间。 
  • fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m
  • #指定读取FastCGI应答第一部分需要用多大的缓冲区,一般第一部分应答不会超过1k,由于页面大小为4k,所以这里设置为4k。 
  • fastcgi_cache TEST; 
  • #为指定的应答代码指定缓存时间,如上例中将200,302应答缓存一小时,301应答缓存1天,其他为1分钟。 
  • #fastcgi_cache_valid 200 302 1h; 
  • #fastcgi_cache_valid 301 1d; 
  • #fastcgi_cache_valid any 1m; 
  •  
  •  
  • #添加一组真实的服务器地址池mysrv 端口为81 
  •   upstream mysrv { 
  • #后台如果有动态应用的时候,ip_hash指令可以通过hash算法将客户端请求定位到同一台后端服务器上,解决session共享, 
  • # 但建议用动态应用做session共享 
  •     #ip_hash;  
  • #server用于指定一个后端服务器的名称和参数 
  • #weight代表权,重默认为1,权重越高被分配的客户端越多 
  • #max_fails 指定时间内对后端请求失败的次数 
  • #fail_timeout 达到max_fails指定的失败次数后暂停的时间 
  • #down参数用来标记为离线,不参与负载均衡.在ip_hash下使用 
  • #backup仅仅在非backup服务器宕机或繁忙的时候使用 
  •     server  192.168.1.10:81 ; 
  •     server  192.168.1.11:81 ; 
  •     server  192.168.1.2:81 ; 
  • #自己为备用服务器,当其他服务器都故障了才使用本机的web服务 
  •     server  192.168.1.1:81 backup; 
  •     }  
  •  
  • server { 
  • #设置80端口负责负载均衡 
  •         listen       80; 
  •         server_name  www.xzr.com; 
  • location / { 
  •     root /var/www/html; 
  • #将根负载调度到后端web服务器的81端口 
  •     proxy_pass http://mysrv;  
  •     proxy_redirect off; 
  • #如果后端的服务器返回502,504,执行超时错误等信息,自动将请求转发到upstream负载均衡池中 
  •     proxy_next_upstream http_404 http_502 http_504 error timeout invalid_header; 
  • # #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP 
  •         proxy_set_header Host $host; 
  •         proxy_set_header X-Real-IP $remote_addr; 
  •         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
  • #nginx跟后端服务器连接超时时间(代理连接超时) 
  •         proxy_connect_timeout 90; 
  • #后端服务器数据回传时间(代理发送超时) 
  •         proxy_send_timeout 90; 
  • #连接成功后,后端服务器响应时间(代理接收超时) 
  •         proxy_read_timeout 90; 
  • #设置代理服务器(nginx)保存用户头信息的缓冲区大小 
  •         proxy_buffer_size 4k; 
  • #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 
  •         proxy_buffers 4 32k; 
  • ##高负荷下缓冲大小(proxy_buffers*2) 
  •         proxy_busy_buffers_size 64k; 
  • #设定缓存文件夹大小,大于这个值,将从upstream服务器传 
  •         proxy_temp_file_write_size 64k; 
  •  
  • }  
  •     error_page   500 502 503 504  /50x.html; 
  •         location = /50x.html { 
  •     root   html; 
  •         } 
  • #定义本机81端口提供web服务 
  • server { 
  •         listen       81; 
  •         server_name  www.xzr.com; 
  •         root /var/www/html; 
  •         index  index.php index.html index.htm index.jsp; 
  • ##设定查看Nginx状态的地址 
  •     location /status { 
  •     stub_status on; 
  •     access_log off; 
  •     auth_basic  "NginxStatus"; 
  • #认证登录使用htpasswd命令 -c 指定文件 用户 
  • #0.6.7版本以后这里指定的文件是nginx.conf所在目录的相对路径,而不是--prefix指定的路径。 
  •     auth_basic_user_file htpasswd; 
  •     } 
  • #静态文件直接读取 
  •     location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {  
  •     expires 1d;  
  •     }  
  • #所有php后缀的,都通过fastcgi发送到9000端口上 
  •   location ~ \.php$ { 
  •     fastcgi_pass   127.0.0.1:9000; 
  •     fastcgi_index  index.php; 
  •     include        fastcgi.conf; 
  •     } 
  • }
  • Server 2的/usr/local/nginx/conf/nginx.conf需要修改的地方
  • #去掉服务器1的backup,设置自己为backup   
  • server  192.168.1.2:81 backup; 
  • Server 3的/usr/local/nginx/conf/nginx.conf需要修改的地方
  • #去掉服务器1的backup,设置自己为backup   
  • server  192.168.1.10:81 backup; 
  • Server 4的/usr/local/nginx/conf/nginx.conf需要修改的地方
  • #去掉服务器1的backup,设置自己为backup    
  • server  192.168.1.11:81 backup; 
  • 开始配置:keepalived Server 1的/etc/keepalived/keepalived.conf文件如下:
  • ! Configuration File for keepalived 
  • global_defs { 
  •      notification_email { #发生事件切换的时候,发送的邮箱,可以有多个,每行一个 
  •      xzrgg@21cn.com 
  •      } 
  •      notification_email_from xzrgg@21cn.com  #指定发件人 
  •      smtp_server 127.0.0.1  #指定smtp服务器地址 
  •      smtp_connect_timeout 30    #指定smtp连接超时时间 
  •      router_id nginx_1  #运行keepalived机器的一个标识主备不能相同 
  •      } 
  •  
  • #vrrp_script区域定义脚本名字和脚本执行的间隔和脚本执行的优先级变更 
  • vrrp_script check_nginx { 
  • #定义监控nginx的命令,命令的$?返回1就改变优先级。 
  •         script "ps -C nginx --no-header" 
  •         interval 5     #脚本执行间隔 
  •         weight -10   #脚本结果1导致的优先级变更:10表示优先级+10;-10则表示优先级-10 
  •     fall   2     # 检测几次返回1为失败 
  •     rise   1     # 检测几次返回0成功为ok 
  •         } 
  •  
  • #VIP 
  • vrrp_instance VI_1 {    #监控多个网段的实例 
  •      state BACKUP     #全部服务器都设为BACKUP,让优先级高的自动为master 
  • #    dont track primary     #忽略VRRP的interface错误 
  •      track_interface { 
  •      eth0                 #跟踪接口,设置额外的监控,里面任意一块网卡出现问题,都会进入故障(FAULT)状态 
  •      #eth1 
  •      } 
  •      interface eth0         #实例绑定的网卡 
  •      virtual_router_id 51   #这里非常重要,相同的VRID为一个组 
  •      priority 100           #优先级, 
  •      advert_int 1           #检查间隔,默认1s 
  • #     nopreempt            #设置抢占,优先级高就做master 
  •      authentication {       #认证 
  •      auth_type PASS         #认证的方式,支持PASS和AH 
  •      auth_pass 123         #认证的密码 
  •      } 
  •      virtual_ipaddress {     #指定漂移地址(VIP) 
  •      192.168.1.100         #如果有多个VIP,继续换行填写 
  •      } 
  •     track_script {     #执行定义的命令 
  •     check_nginx 
  •     } 
  • Server 2的/etc/keepalived/keepalived.conf 需要修改的地方
  • router_id nginx_2       #运行keepalived机器的一个标识主备不能相同 
  • priority 99           #优先级 
  • Server 3的/etc/keepalived/keepalived.conf 需要修改的地方
  • router_id nginx_3       #运行keepalived机器的一个标识主备不能相同 
  • priority 98           #优先级 
  • Server 4的/etc/keepalived/keepalived.conf 需要修改的地方
  • router_id nginx_4       #运行keepalived机器的一个标识主备不能相同 
  • iority 97           #优先级 
  • 启动nginx和keepalived服务:
  • nginx 
  • service keepalived start
  • 客户机验证:一直刷新,始终看不到server 1提供的web页面,因为负载均衡设置本机为
    backup,这时server 1就只做为一个负载均衡器。

    客户机验证:一直刷新,始终看不到server 1提供的web页面,因为负载均衡设置本机为
    backup,这时server 1就只做为一个负载均衡器。

    测试keepalived
    在server 1 上关掉nginx进程,server 1自动成为backup状态。


    看server 2能否成为master:,这里server2 接管了vip,server 2成为了负载均衡器

    客户机刷新网页,只能看到server 3 和server 4 的页面。(因为前面server 1的nginx进程关掉了所以看不到server 1的页面)

    这时把server 1的nginx进程启动,server 1检测到ngxin进程在就开始抢占vip成为master

    客户机浏览:server 2 优先级不够server1高,只好乖乖的成为web服务器。

    把server 1,2,3的nginx 进程关掉,server 4成为了负载均衡器,不过这时web服务器群
    只剩servr4,客户机只能浏览server4 到的页面!

    至此,ngnix+keepalivd 实现N主高可用负载均衡web群集的实验结束。

    网上的nginx+keepalived 都是通过脚本实现nginx进程的监控,其实不用那么麻烦,用keepalived 自带就命令定义就可以了,这里检测到nginx进程不在了,就会降低优先级(-10),让高优先级的成为master接管vip,并没有关闭keepalived。

     

  • #vrrp_script区域定义脚本名字和脚本执行的间隔和脚本执行的优先级变更 
  • vrrp_script check_nginx { 
  • #定义监控nginx的命令,命令的$?返回1就改变优先级。 
  •         script "ps -C nginx --no-header" 
  •         interval 5     #脚本执行间隔 
  •         weight -10   #脚本结果1导致的优先级变更:10表示优先级+10;-10则表示优先级-10 
  •     fall   2     # 检测几次返回1为失败 
  •     rise   1     # 检测几次返回0成功为ok 
  •         } 
  •  

    转载于:https://blog.51cto.com/xzregg/976793

    总结

    以上是生活随笔为你收集整理的ngnix+keepalived 实现N主高可用负载均衡web群集的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。