|
|
|
|
移动端

澳门永利最新娱乐公司:Keepalived+Lvs+Nginx搭建Nginx高可用集群

本文来源:http://www.2233122.com/lusongsong_com/

太阳城娱乐网最快登入,有赖RE工程部的努力,恐怖的写实感提升至一个全新的境界,玩家并没有任何退路可选。时间:2016-12-0708:48:57来源:中国新闻网日本政府6日开始拟定首相安倍晋三将于当地时间27日在美国夏威夷珍珠港发表的感想草稿。  “法规是第三方调整,关键在于基础运营商的社会责任意识和自律意识,校园业务市场应由学生自己决定,学校和运营商都不应签订排他性协议”  法治周末见习记者  文丽娟“我以为是学校送的,直接激活就能用了,没想到激活还要200元钱呢。您若对该稿件内容有任何疑问或质疑,请即与中文科技资讯联系,本网将迅速给您回应并做处理。

创立百度之前,李彦宏已经跻身全球最顶尖的搜索引擎工程师行列。新华社发(王泽蔚摄)  这是10月6日在内蒙古扎兰屯国家级风景名胜区拍摄的深秋景色。  冯仑:创业者要学会少是非  当新生代创业者都在谈论开场、中场时,著名企业家冯仑在时代峰会谈起了收场,冯仑眼中的成功,就是有健康、有自由,要通往成功,则要会收场。在互联网时代,每个人都是网络资源的享用者,同时又都是信息资源的提供者。

  内容为王,回归用户,并且保证内容和平台的兼容。  通知自2017年5月1日起施行。当日清晨,山东省枣庄市山亭区上空出现大面积“鱼鳞云”,在初秋蓝天的映衬下,美不胜收。  (二十三)网络游戏运营企业违反本通知第(十)项有关规定的,由县级以上文化行政部门或者文化市场综合执法机构按照《网络游戏管理暂行办法》第三十条予以查处。

nginx是一款非常优秀的反向代理工具,支持请求分发,负载均衡,以及缓存等等非常实用的功能。

作者:IT技术分享来源:今日头条|2019-10-09 16:02

nginx是一款非常优秀的反向代理工具,支持请求分发,负载均衡,以及缓存等等非常实用的功能。在请求处理上,nginx采用的是epoll模型,这是一种基于事件监听的模型,因而其具备非常高效的请求处理效率,单机并发能力能够达到上百万。nginx接收到的请求可以通过负载均衡策略分发到其下一级的应用服务器,这些服务器一般是以集群方式部署的,因而在性能不足的情况下,应用服务器可以通过加机器的方式扩展流量。此时,对于一些特大型的网站,性能的瓶颈就来自于nginx了,因为单机的nginx的并发能力是有上限的,而nginx本身是不支持集群模式的,因而此时对nginx的横向扩展就显得尤为重要。

keepalived是一款服务器状态检测和故障切换的工具。在其配置文件中,可以配置主备服务器和该服务器的状态检测请求。也就是说keepalived可以根据配置的请求,在提供服务期间不断向指定服务器发送请求,如果该请求返回的状态码是200,则表示该服务器状态是正常的,如果不正常,那么keepalived就会将该服务器给下线掉,然后将备用服务器设置为上线状态。

lvs是一款用于四层负载均衡的工具。所谓的四层负载均衡,对应的是网络七层协议,常见的如HTTP协议是建立在七层协议上的,而lvs作用于四层协议上,也即:传输层,网络层,数据链路层和物理层。这里的传输层主要协议有TCP和UDP协议,也就是说lvs主要支持的方式是TCP和UDP。也正是因为lvs是处于四层负载均衡上的,因而其处理请求的能力比常见的服务器要高非常多,比如nginx的请求处理就是建立在网络七层上的,lvs的负载均衡能力是nginx的十倍以上。

通过上面的介绍,我们可以发现,在特大型网站中,应用服务器是可以横向扩容的,而nginx是不支持横向扩容的,此时nginx就会成为性能瓶颈。而lvs是一款负载均衡工具,因而如果我们结合lvs和nginx,那么就可以通过部署多台nginx服务器,通过lvs的负载均衡能力,将请求均衡的分发到各个nginx服务器上,再由nginx服务器分发到各个应用服务器,这样,我们就实现了nginx的横向扩展了。由于nginx本质上也是一款应用服务器,因而其也有可能宕机,因而这里结合keepalived就可以实现nginx的故障检测和服务切换。也就是说,通过keepalived+lvs+nginx,我们实现了nginx的高可用集群模式。

在上面的介绍中,我们会注意到,虽然keepalived+lvs+nginx实现了nginx的集群模式,但是在我们使用nginx的时候,其本身是有一个ip和端口的,默认监听的端口是80和443,那么lvs是如何实现将请求分发给具有不同ip和端口的nginx服务器的呢?这里就是通过虚拟ip实现的,所谓虚拟ip就是对外提供一个公共的ip,外部客户端请求的都是这个ip,lvs在接收到虚拟ip的请求之后,通过配置的调度器和负载均衡策略,选择一个目标nginx服务器,然后将请求转发给该服务器。这里lvs有两个概念,就是调度器和负载均衡策略,所谓的调度器指的是lvs将会以何种方式处理请求和响应数据,其主要有三种调度器:

Virtual Server via Network Address Translation(VS/NAT):这种方式的主要原理是,用户发送请求到虚拟ip上后,lvs会根据负载均衡算法选择一个目标处理服务,然后将请求报文中的目标ip地址修改为计算得到的目标服务器,并且发送给该服务器。对于响应的报文,调度器会将目标服务器返回的响应数据中的源地址修改为虚拟ip地址。通过这种方式,对客户端而言,其形式上面向的是一台服务器。不过这种方式的缺点在于,所有的响应数据都需要通过调度器,如果请求量比较大的情况下,那么调度器就会成为整个系统的瓶颈。

Virtual Server via IP Tunneling(VS/TUN):这种方式主要解决的就是VS/NAT中,响应数据会经过调度器的问题。同VS/NAT一样 ,调度器还是会接收请求的数据,并且将报文中的目标ip修改为目标服务的ip,但是在目标服务处理完数据之后,其会直接将响应报文中的源ip修改为虚拟ip,然后将请求发送给客户端。通过这种方式,响应数据就由各个目标服务进行了处理,而无需通过调度器进行返回,这种方式会大大提高系统的吞吐量,而且由于一般请求报文比响应报文小很多,调度器也只需要处理请求报文,那么系统的整体负载将会被均摊到各个服务器上。

Virtual Server via Direct Routing(VS/DR):这种方式相对于VS/TUN,其主要区别在于,VS/NAT是将请求报文中的ip地址修改为目标服务的ip地址,而VS/DR则是直接将请求报文中的MAC地址修改为目标地址,这种方式效率会更高,因为VS/TUN中的ip地址最终还是需要转换为MAC地址来发送数据的。

1. 环境准备

  1. VMware; 
  2. 4台CentOs7虚拟主机:172.16.28.130, 172.16.28.131, 172.16.28.132, 172.16.28.133 
  3. 系统服务:LVS, Keepalived 
  4. Web服务器:nginx 
  5. 集群搭建:LVS DR模式 

2. 软件安装

在四台虚拟机上,我们以如下方式搭建集群:

  1. 172.16.28.130 lvs+keepalived 
  2. 172.16.28.131 lvs+keepalived 
  3. 172.16.28.132 nginx 
  4. 172.16.28.133 nginx 

这里我们使用172.16.28.130 和172.16.28.131 两台机器作为lvs+keepalived 的工作机器,也就是说这两台机器的作用主要是进行负载均衡和故障检测和下线的;我们使用172.16.28.132和172.16.28.133 两台机器作为应用服务器,主要是对外提供服务的。这四台服务器作为整个后端集群服务,并且对外提供的虚拟ip是172.16.28.120 。需要说明的是,这里的keepalived 所检测的服务是两台lvs 服务器,这两台服务器,一台作为master服务器,一台作为backup服务器,两者在负载均衡的配置上是完全一样的。在正常情况下,客户端请求虚拟ip的时候,lvs 会将该请求转发到master服务器上,然后master服务器根据配置的负载均衡策略选择一台应用服务器,并且将请求发送给该应用服务器进行处理。如果在某个时刻,lvs的master服务器由于故障宕机了,keepalived就会检测到该故障,并且进行故障下线,然后将backup机器上线用于提供服务,从而实现故障转移的功能。

2.1 lvs+keepalived安装

在172.16.28.130 和172.16.28.131 上安装ipvs和keepalived:

  1. # 安装ipvs 
  2. sudo yum install ipvsadm 
  3. # 安装keepalived 
  4. sudo yum install keepalived 

在172.16.28.132 和172.16.28.133 上安装nginx:

  1. # 安装nginx 
  2. sudo yum install nginx 

需要注意的是,在两台nginx服务器上需要将防火墙关闭,否则lvs+keepalived的两台机器就无法将请求发送到两台nginx服务器上来:

  1. # 关闭防火墙 
  2. systemctl disable firewalld.service 

查看两台负载均衡机器是否支持lvs:

  1. sudo lsmod |grep ip_vs 
  2. # 如果看到如下结果,则说明是支持的 
  3. [zhangxufeng@localhost ~]$ sudo lsmod|grep ip_vs 
  4. ip_vs 145497 0 
  5. nf_conntrack 137239 1 ip_vs 
  6. libcrc32c 12644 3 xfs,ip_vs,nf_conntrack 

如果上述命令没有任何结果,则执行sudo ipvsadm 命令启动ipvs之后,再通过上述命令进行查看即可。启动ipvs之后,我们就可以在/etc/keepalived/ 目录下编辑keepalived.conf 文件,我们以172.16.28.130 机器作为master机器,master节点配置如下:

  1. Global Configuration 
  2. global_defs { 
  3.  lvs_id director1 # 指定lvs的id 
  4. # VRRP Configuration 
  5. vrrp_instance LVS { 
  6.  state MASTER   # 指定当前节点为master节点 
  7.  interface ens33    # 这里的ens33是网卡的名称,通过ifconfig或者ip addr可以查看 
  8.  virtual_router_id 51   # 这里指定的是虚拟路由id,master节点和backup节点需要指定一样的 
  9.  priority 151   # 指定了当前节点的优先级,数值越大优先级越高,master节点要高于backup节点 
  10.  advert_int 1   # 指定发送VRRP通告的间隔,单位是秒 
  11.  authentication { 
  12.  auth_type PASS # 鉴权,默认通过 
  13.  auth_pass 123456   # 鉴权访问密码 
  14.  } 
  15.  virtual_ipaddress { 
  16.  172.16.28.120  # 指定了虚拟ip 
  17.  } 
  18. # Virtual Server Configuration - for www server 
  19. # 后台真实主机的配置 
  20. virtual_server 172.16.28.120 80 { 
  21.  delay_loop 1   # 健康检查的时间间隔 
  22.  lb_algo rr # 负载均衡策略,这里是轮询 
  23.  lb_kind DR # 调度器类型,这里是DR 
  24.  persistence_time 1 # 指定了持续将请求打到同一台真实主机的时间长度 
  25.  protocol TCP   # 指定了访问后台真实主机的协议类型 
  26.  # Real Server 1 configuration 
  27.  # 指定了真实主机1的ip和端口 
  28.  real_server 172.16.28.132 80 { 
  29.  weight 1   # 指定了当前主机的权重 
  30.  TCP_CHECK { 
  31.  connection_timeout 10  # 指定了进行心跳检查的超时时间 
  32.  nb_get_retry 3 # 指定了心跳超时之后的重复次数 
  33.  delay_before_retry 3   # 指定了在尝试之前延迟多长时间 
  34.  } 
  35.  } 
  36.  # Real Server 2 Configuration 
  37.  real_server 172.16.28.133 80 { 
  38.  weight 1   # 指定了当前主机的权重 
  39.  TCP_CHECK { 
  40.  connection_timeout 10  # 指定了进行心跳检查的超时时间 
  41.  nb_get_retry 3 # 指定了心跳超时之后的重复次数 
  42.  delay_before_retry 3   # 指定了在尝试之前延迟多长时间 
  43.  } 
  44.  } 

上面是master节点上keepalived的配置,对于backup节点,其配置与master几乎是一致的,只是其state和priority参数不同。如下是backup节点的完整配置:

  1. Global Configuration 
  2. global_defs { 
  3.  lvs_id director2 # 指定lvs的id 
  4. # VRRP Configuration 
  5. vrrp_instance LVS { 
  6.  state BACKUP   # 指定当前节点为master节点 
  7.  interface ens33    # 这里的ens33是网卡的名称,通过ifconfig或者ip addr可以查看 
  8.  virtual_router_id 51   # 这里指定的是虚拟路由id,master节点和backup节点需要指定一样的 
  9.  priority 150   # 指定了当前节点的优先级,数值越大优先级越高,master节点要高于backup节点 
  10.  advert_int 1   # 指定发送VRRP通告的间隔,单位是秒 
  11.  authentication { 
  12.  auth_type PASS # 鉴权,默认通过 
  13.  auth_pass 123456   # 鉴权访问密码 
  14.  } 
  15.  virtual_ipaddress { 
  16.  172.16.28.120  # 指定了虚拟ip 
  17.  } 
  18. # Virtual Server Configuration - for www server 
  19. # 后台真实主机的配置 
  20. virtual_server 172.16.28.120 80 { 
  21.  delay_loop 1   # 健康检查的时间间隔 
  22.  lb_algo rr # 负载均衡策略,这里是轮询 
  23.  lb_kind DR # 调度器类型,这里是DR 
  24.  persistence_time 1 # 指定了持续将请求打到同一台真实主机的时间长度 
  25.  protocol TCP   # 指定了访问后台真实主机的协议类型 
  26.  # Real Server 1 configuration 
  27.  # 指定了真实主机1的ip和端口 
  28.  real_server 172.16.28.132 80 { 
  29.  weight 1   # 指定了当前主机的权重 
  30.  TCP_CHECK { 
  31.  connection_timeout 10  # 指定了进行心跳检查的超时时间 
  32.  nb_get_retry 3 # 指定了心跳超时之后的重复次数 
  33.  delay_before_retry 3   # 指定了在尝试之前延迟多长时间 
  34.  } 
  35.  } 
  36.  # Real Server 2 Configuration 
  37.  real_server 172.16.28.133 80 { 
  38.  weight 1   # 指定了当前主机的权重 
  39.  TCP_CHECK { 
  40.  connection_timeout 10  # 指定了进行心跳检查的超时时间 
  41.  nb_get_retry 3 # 指定了心跳超时之后的重复次数 
  42.  delay_before_retry 3   # 指定了在尝试之前延迟多长时间 
  43.  } 
  44.  } 

将master和backup配置成完全一样的原因是,在master宕机时,可以根据backup的配置进行服务的无缝切换。

在lvs+keepalived机器配置完成之后,我们下面配置两台应用服务器的nginx配置。这里我们是将nginx作为应用服务器,在其配置文件中配置返回状态码为200,并且会将当前主机的ip返回,如下是其配置:

  1. worker_processes auto; 
  2. # pid /run/nginx.pid; 
  3. events { 
  4.  worker_connections 786; 
  5. http { 
  6.  server { 
  7.  listen 80; 
  8.  # 这里是直接返回200状态码和一段文本 
  9.  location / { 
  10.  default_type text/html; 
  11.  return 200 "Hello, Nginx! Server zhangxufeng@172.16.28.132\n"
  12.  } 
  13.  } 
  14. worker_processes auto; 
  15. # pid /run/nginx.pid; 
  16. events { 
  17.  worker_connections 786; 
  18. http { 
  19.  server { 
  20.  listen 80; 
  21.  # 这里是直接返回200状态码和一段文本 
  22.  location / { 
  23.  default_type text/html; 
  24.  return 200 "Hello, Nginx! Server zhangxufeng@172.16.28.133\n"
  25.  } 
  26.  } 

可以看到,两台机器返回的文本中主机ip是不一样的。nginx配置完成后,可以通过如下命令进行启动:

  1. sudo nginx 

在启动nginx之后,我们需要配置虚拟ip,这是因为我们使用的lvs调度器是DR模式,前面我们讲到过,这种模式下,对客户端的响应是真实服务器直接返回给客户端的,而真实服务器需要将响应报文中的源ip修改为虚拟ip,这里配置的虚拟ip就是起这个作用的。我们编辑/etc/init.d/lvsrs 文件,写入如下内容:

  1. #!/bin/bash 
  2. ifconfig lo:0 172.16.28.120 netmask 255.255.255.255 broadcast 172.16.28.120 up 
  3. route add -host 172.16.28.120 dev lo:0 
  4. echo "0" > /proc/sys/net/ipv4/ip_forward 
  5. echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore 
  6. echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce 
  7. echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore 
  8. echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce 
  9. exit 0 
  • lo:表示当前主机真实网卡的名称;
  • 172.16.28.120:表示虚拟ip;

编写完成后运行该脚本文件即可。然后将两台lvs+keepalived机器上的keepalived服务启动起来即可:

  1. sudo service keepalived start 

最后可以通过如下命令查看配置的lvs+keepalived的策略:

  1. [zhangxufeng@localhost keepalived]$ sudo ipvsadm -ln 
  2. IP Virtual Server version 1.2.1 (size=4096) 
  3. Prot LocalAddress:Port Scheduler Flags 
  4.  -> RemoteAddress:Port Forward Weight ActiveConn InActConn 
  5. TCP 172.16.28.120:80 rr 
  6.  -> 172.16.28.132:80 Route 1 0 0 

2.2 集群测试

根据上述步骤,我们配置完成了一个lvs+keepalived+nginx的集群。在浏览器中,我们可以访问/172_16_28_120 即可看到如下响应:

  1. Hello, Nginx! Server zhangxufeng@172.16.28.132 

多次刷新浏览器之后,可以看到浏览器中显示的文本切换如下,这是因为lvs的负载均衡策略产生的:

  1. Hello, Nginx! Server zhangxufeng@172.16.28.133 

3. 小结

本文首先对lvs和keepalived的工作原理进行了讲解,分别介绍了其工作的几种模式,然后对lvs+keepalived+nginx搭建nginx集群的方式进行详细讲解,并且说明了其中所需要注意的问题。

【编辑推荐】

    【责任编辑:太阳城娱乐网最快登入武晓燕 TEL:(010)68476606】


    点赞 0
    大家都在看
    猜你喜欢

    订阅专栏+更多

    用Python玩转excel

    用Python玩转excel

    让重复操作傻瓜化
    共3章 | DE8UG

    189人订阅学习

    AI入门级算法

    AI入门级算法

    算法常识
    共22章 | 周萝卜123

    164人订阅学习

    这就是5G

    这就是5G

    5G那些事儿
    共15章 | armmay

    133人订阅学习

    视频课程+更多

    讲师:人学习过

    讲师:人学习过

    读 书 +更多

    《ASP.NET AJAX Web 应用开发秘诀(VB版)》

    本书详细介绍了AJAX在Web开发上的应用。主要内容包括:ASP.NET AJAX技术概述、实现异步局部更新页面、UpdatePanel编程功能、PageRequestMan...

    订阅51CTO邮刊

    点击这里查看样刊

    订阅51CTO邮刊

    51CTO服务号

    51CTO官微

    菲律宾太阳网娱乐登入 菲律宾申博太阳城登入 申博现金网直营 www.86msc.com www.8888msc.com 申博游戏网址
    菲律宾申博太阳城 申博太阳城登入 太阳城亚洲游戏登入 百家乐支付宝充值 太阳城提款申请登入 申博开户官网登入
    申博电子游戏 申博官网娱乐开户登入 www.99msc.com 太阳城娱乐138申博直营网 菲律宾申博红太阳娱乐直营网 138申博体育在线娱乐直营网