严格意义上来说nginx实现的是反向代理版本的负载均衡
实现方式很简单

负载均衡

lb端:
在http区域中插入

  1. # 默认池塘,这些服务器中放静态资源
  2. upstream default_pools {
  3. least_conn; # least_conn是同时考虑加权和连接数
  4. # 轮询算法:默认是rr轮询,加了weight是加权(wrr)轮询
  5. server 10.0.0.7:80 weight=1 max_fails=3 fail_timeout=15;
  6. # 向web服务器发送连接超过15s算失败,超过三次,认为你挂了,每15s在向你发送连接,成功了就接入
  7. server 10.0.0.8:80 weight=1 max_fails=3 fail_timeout=15;
  8. server 10.0.0.7:80 weight=1 max_fails=3 fail_timeout=15;
  9. server 10.0.0.8:80 weight=1 max_fails=3 fail_timeout=15;
  10. }
  11. # 动态池塘
  12. upstream active_pools {
  13. server 10.0.0.7:80 weight=1 max_fails=3 fail_timeout=15;
  14. server 10.0.0.8:80 weight=1 max_fails=3 fail_timeout=15;
  15. server 10.0.0.7:80 weight=1 max_fails=3 fail_timeout=15 backup;
  16. server 10.0.0.8:80 weight=1 max_fails=3 fail_timeout=15 down;
  17. }

在location中插入(proxy模块只能插入到 location 中)

  1. location / {
  2. proxy_pass http://default_pools;
  3. proxy_set_header X-Forwarded-For $remote_addr/$proxy_add_x_forwarded_for;
  4. proxy_set_header Host $http_host ;
  5. }
  6. location ~*\.(jsp|php)$ {
  7. proxy_pass http://active_pools;
  8. proxy_set_header X-Forwarded-For $remote_addr/$proxy_add_x_forwarded_for;
  9. proxy_set_header Host $http_host;
  10. }

keepalived (实现HA

!!是不一样的地方

  1. cat /etc/keepalived/keepalived.conf
  2. ! Configuration File for keepalived
  3. global_defs {
  4. router_id keepalived_lb01 # !!
  5. }
  6. vrrp_instance lb_vip01 {
  7. state MASTER # !!
  8. interface eth0
  9. virtual_router_id 51
  10. priority 100 # !!优先级
  11. advert_int 1 # 多久发一次数据
  12. authentication {
  13. auth_type PASS
  14. auth_pass 1111
  15. }
  16. virtual_ipaddress {
  17. 10.0.0.3/24 dev eth0 label eth0:1
  18. }
  19. }
  1. cat /etc/keepalived/keepalived.conf
  2. ! Configuration File for keepalived
  3. global_defs {
  4. router_id keepalived_lb02 #!! keepalived名字
  5. }
  6. vrrp_instance lb_vip01 { # 家庭名
  7. state BACKUP # !!
  8. interface eth0 # vip指定网卡
  9. virtual_router_id 51
  10. priority 50 # !!优先级
  11. advert_int 1
  12. authentication {
  13. auth_type PASS
  14. auth_pass 1111
  15. }
  16. virtual_ipaddress {
  17. 10.0.0.3/24 dev eth0 label eth0:1
  18. }
  19. }

监听nginx(复制去预备手动搭建)

  1. vim /server/scripts/check_lb.sh
  2. !/bin/bash
  3. #author: Rdymy
  4. #desc: check nginx port
  5. #1.检查端口是否存在,个数
  6. count=`ss -lntup|grep nginx |wc -l`
  7. #2.如果端口数量为0,则关闭keepalived
  8. if [ $count -eq 0 ];then
  9. systemctl stop keepalived
  10. fi
  11. chmod +x /server/scripts/check_lb.sh
# 1.vrrp_instance 实例上面,独立与其他的都是并列.

vrrp_script check_lb {                  chk_lb名字给脚本起个命令(keepalived使用)
   script /server/scripts/check_lb.sh   指定脚本路径,要有执行权限.
   interval 1                           执行脚本的间隔,默认1秒
   timeout 30                           脚本执行的超时时间 一般用于curl/wget等操作
   weight 1                             权重(优先级) 如果仅仅1个脚本,可以忽略.一般用于keepalived中有多个监控脚本
 }
# 2.vrrp_instance 内部与state 或virtual_ipaddress并列. 

 track_script {   # 写在vrrp 实例部分 表示调用之前定义的监控脚本
   check_lb   # 名字 是上面vrrp_script 的名字
}

双主机

一台机器同时是active同时又是standby

脑裂

  1. 配置文件写错了
  2. 网线出问题了
  3. 网络原因等

备备模式

原机器活了也不会漂移vip 感觉从原理上来说不能和双主机一起使用,会把一台负载撑爆

云上实现

申请havip
创建havip
创建eip
havip绑定eip
创建esc实例,部署nginx,成为lb
havip绑定lb实例
keepalived配置书写

 # 与物理/虚拟机不同的就这些
    unicast_src_ip 192.168.0.209   #设置ECS实例的私网IP地址,本示例配置为192.168.0.209
    unicast_peer {
        192.168.0.210           #对端ECS实例的私网IP地址,本示例配置为192.168.0.210
    }
    virtual_ipaddress {
        192.168.0.88          #设置HaVip的IP地址,本示例配置为192.168.0.88