• keepalived高可用学习 keepalived+nginx高可用负载均衡配置


    Keepalived

    1、概述

    keepalived是为lvs设计的,用于管理和监控lvs集群系统中各个服务节点的状态,后面又加入了VRRP虚拟路由冗余协议,可以实现路由器高可用,原理是多台提供路由功能的服务器组成一个路由组,一个master和多个backup,master有vip,可以发组播,当backup收不到就认为master挂了,这时候需要优先级确认下一位master这样就可以保证路由的高可用(lvs是通过ip公网访问,lvs调度私网web服务器。DR模式有vip,web坏掉一台,另一台还是可以访问的,lvs调度服务器挂了就不行了,lvs加上keepalived的话,keepalived就相当于配置了lvs的多个备份,坏掉一台,另一台顶上去)。

    Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL、vsnfsd等)的高可用解决方案软件

    2、配置文件说明
    ! Configuration File for keepalived
    #发送邮件的配置
    global_defs {
       notification_email {
         acassen@firewall.loc
         failover@firewall.loc
         sysadmin@firewall.loc
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 192.168.200.1
       smtp_connect_timeout 30
       router_id LVS_DEVEL
    }
    #vrrp协议的配置
    vrrp_instance VI_1 {
        #工作模式
        state MASTER
        #监听的网卡
        interface ens33
        #虚拟路由id 需要和备服务器一致
        virtual_router_id 51
        #权重 优先级
        priority 100
        #vrrp包的发送周期  1s
        advert_int 1
        #权限验证
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        #需要绑定切换的VIP
        virtual_ipaddress {
            192.168.1.200
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    3、简洁版配置过程
    keepalived 用于管理和监控lvs集群,并具有vrrp虚拟路由冗余协议,可以实现路由器的高可用
    主配置文件 /etc/keepalived/keepalived.conf
    VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。
    
    keepalived+lvs(DR模式)配置过程 
    1.lvs服务器配置
    安装ipvsadm,开启ip_vs模块
    配置vip(虚拟ip)地址
    配置bl命令,完成lvs的调度功能
    关闭重定向
    安装keepalived,配置/etc/keepalived/keepalived.conf文件
    2.lvs备份服务器配置
    安装ipvsadm,开启ip_vs模块
    配置vip(虚拟ip)地址
    配置bl命令,完成lvs的调度功能
    关闭重定向
    安装keepalived,配置/etc/keepalived/keepalived.conf文件
    3.多台web服务器配置
    安装httpd服务,并配置网页
    关闭重定向
    配置vip(虚拟ip)地址
    4. 启动两台lvs服务器 (主lvs先启动)
    5.测试
    [root@hd1 ~]# ip addr|grep 1.113
    inet 192.168.1.113/32 scope global ens33
    [root@hd8 ~]# curl 192.168.1.113
    this is 192.168.1.13
    6.验证keepalived的高可用性 
    停掉192.168.1.11的keepalived的服务
    [root@hd1 ~]# systemctl stop keepalived(keepalived.server)
    查看vip地址现在在哪里?(应该在192.168.1.12上)
    [root@hd2 ~]# ip addr |grep 1.113
        inet 192.168.1.113/32 scope global ens33
    通过客户端继续访问192.168.1.113   还是可以正常访问 后台的1.13和1.14的
    
    
    高可用配置
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    4、keepalived+lvs配置
    Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件
    
    keepalived是以VRRP协议为基础实现的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议  (冗余:多个)
    虚拟路由冗余协议,
    可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
    
    keepalived主要有三个模块,分别是core、check和vrrp。
    core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。
    check负责健康检查,包括常见的各种检查方式。
    vrrp模块是来实现VRRP协议的。
    
    3、keepalived组成和原理
    Keepalived软件主要是通过VRRP协议实现高可用功能的。
    作用:VRRP的目的是为了解决静态路由单点故障问题,它能够保证当个别节点宕机时,整个网络可以不间断地运行。
    Keepalived的功能体系结构,大致分两层:用户空间(user space)和内核空间(kernel space)。
    
    keepalived的配置文件
    keepalived只有一个配置文件
    /etc/keepalived/keepalived.conf
    里面主要包括以下几个配置区域,分别是
    global_defs、
    static_ipaddress、
    static_routes、
    vrrp_script、
    vrrp_instance和virtual_server。
    
    
    环境准备
    四台服务器
    主lvs 192.168.8.11 vip 192.168.8.111
    备lvs 192.168.8.12 vip 192.168.8.111
    web1  192.168.8.138 vip 192.168.8.111
    web2  192.168.8.139 vip 192.168.8.111
    
    主lvs
    root@hd1 ~]#yum -y install ipvsadm
    root@hd1 ~]#modprobe ip_vs
    root@hd1 ~]#cat /proc/net/ip_vs
    配置关闭icmp重定向
    echo "1" >/proc/sys/net/ipv4/conf/all/send_redirects 
    cat /proc/sys/net/ipv4/conf/all/send_redirects 
    echo "1" >/proc/sys/net/ipv4/conf/default/send_redirects 
    echo "1" >/proc/sys/net/ipv4/conf/ens33/send_redirects 
    安装keepalived
    [root@hd1 ~]# yum -y install keepalived
    配置keepalived的主配置文件
    清空配置文件的内容
    [root@hd1 ~]# > /etc/keepalived/keepalived.conf
    [root@hd1 ~]# cat  /etc/keepalived/keepalived.conf
    
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         acassen@firewall.loc
         failover@firewall.loc
         sysadmin@firewall.loc
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 192.168.200.1
       smtp_connect_timeout 30
       router_id LVS_DEVEL1
    }
    
    vrrp_instance VI_1 {
        state MASTER
        interface ens33
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.8.111
        }
    }
    
    virtual_server 192.168.8.111 80 {
        delay_loop 6
        lb_algo rr
        lb_kind DR
        net_mask 255.255.255.0
        persistence_timeout 50
        protocol TCP
    
        real_server 192.168.8.138 80 {
            weight 1
            TCP_CHECK {
                      connect_port 80
                      connect_timeout 3
                      nb_get_retry 3
                     delay_before_retry 4
    
        }
        }
        real_server 192.168.8.139 80 {
            weight 1
            TCP_CHECK {
                      connect_port 80
                      connect_timeout 3
                      nb_get_retry 3
                     delay_before_retry 4
    
        }
        }
    }
    
    第二台lvs192.168.1.12的配置
    
    安装工具包
    [root@hd2 ~]# yum -y install ipvsadm
    [root@hd2 ~]# modprobe ip_vs
    [root@hd2 ~]# cat /proc/net/ip_vs
    
    
    配置关闭icmp重定向
    echo "1" >/proc/sys/net/ipv4/conf/all/send_redirects 
    cat /proc/sys/net/ipv4/conf/all/send_redirects 
    echo "1" >/proc/sys/net/ipv4/conf/default/send_redirects 
    echo "1" >/proc/sys/net/ipv4/conf/ens33/send_redirects 
    
    
    
    安装keepalived
    [root@hd2 ~]# yum -y install keepalived
    
    配置keepalived的配置文件
    [root@hd2 ~]# > /etc/keepalived/keepalived.conf
    [root@hd2 ~]# cat  /etc/keepalived/keepalived.conf
    
    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         acassen@firewall.loc
         failover@firewall.loc
         sysadmin@firewall.loc
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 192.168.200.1
       smtp_connect_timeout 30
       router_id LVS_DEVEL2
    }
    
    vrrp_instance VI_1 {
        state BACKUP
        interface ens33
        virtual_router_id 51
        priority 90   #优先级要变低
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.8.111
        }
    }
    
    virtual_server 192.168.8.111 80 {
        delay_loop 6
        lb_algo rr
        lb_kind DR
        net_mask 255.255.255.0
        persistence_timeout 50  #持续的超时时间50s
        protocol TCP
    
        real_server 192.168.8.138 80 {
            weight 1
            TCP_CHECK {
                      connect_port 80
                      connect_timeout 3
                      nb_get_retry 3
                     delay_before_retry 4
    
        }
        }
        real_server 192.168.8.139 80 {
            weight 1
            TCP_CHECK {
                      connect_port 80
                      connect_timeout 3
                      nb_get_retry 3
                     delay_before_retry 4
    
        }
        }
    }
    配置192.168.1.13为web1服务器 
    
    [root@hd3 ~]# yum -y install httpd
    [root@hd3 ~]# echo "this is the web1 " >/var/www/html/index.html
    [root@hd3 ~]# systemctl start httpd
    [root@hd3 ~]# yum -y install net-tools
    [root@hd3 ~]#ifconfig lo:0 192.168.8.111 broadcast 192.168.8.111 netmask 255.255.255.255 up
    [root@hd3 ~]#route add -host 192.168.8.111 dev lo:0 
    
    vi /etc/sysctl.conf
    net.ipv4.conf.ens33.arp_ignore = 1
    net.ipv4.conf.ens33.arp_announce = 2
    net.ipv4.conf.all.arp_ignore = 1
    net.ipv4.conf.all.arp_announce = 2
    7>重启
    sysctl -p
    2. 配置192.168.1.14为web2服务器
    
    [root@hd4 ~]# yum -y install httpd
    [root@hd4 ~]# echo "this is the web2 " >/var/www/html/index.html
    [root@hd4 ~]# systemctl start httpd
    [root@hd4 ~]# yum -y install net-tools
    [root@hd4 ~]#ifconfig lo:0 192.168.8.111 broadcast 192.168.8.111 netmask 255.255.255.255 up
    [root@hd4 ~]#route add -host 192.168.8.111 dev lo:0 
    [root@hd4 ~]#vi  /etc/sysctl.conf
    net.ipv4.conf.ens33.arp_ignore = 1
    net.ipv4.conf.ens33.arp_announce = 2
    net.ipv4.conf.all.arp_ignore = 1
    net.ipv4.conf.all.arp_announce = 2
    重启
    [root@hd4 ~]#sysctl -p
    5. 启动两台lvs服务器 (主lvs先启动)
    在主lvs192.168.1.11上
    [root@hd1 ~]# systemctl start keepalived
    在备lvs192.168.1.12上
    [root@hd2 ~]# systemctl start keepalived
    6.测试
    查看vip地址是否落到了192.168.1.11上
    [root@hd1 ~]# ip addr|grep 1.113
    inet 192.168.1.113/32 scope global ens33
    [root@hd8 ~]# curl 192.168.1.113
    this is 192.168.1.13
    7.验证keepalived的高可用性 
    停掉192.168.1.11的keepalived的服务
    [root@hd1 ~]# systemctl stop keepalived(keepalived.server)
    查看vip地址现在在哪里?(应该在192.168.1.12上)
    [root@hd2 ~]# ip addr |grep 1.113
        inet 192.168.1.113/32 scope global ens33
    通过客户端继续访问192.168.1.113   还是可以正常访问 后台的1.13和1.14的
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    5、主lvs不可用 可能性
    服务器整机不可用,常见于服务器断网,或者断电关机等。
    
    方法一:模拟主服务器断电关闭
    
        #关闭主服务器  VIP所在服务器
        shell > poweroff
    
    方法二:模拟主服务器断网
    
        #关闭VIP所在服务器的网卡  使其不能够联网
        shell > service network stop
    
    方法三:停掉主服上keepalived服务
    
        shell > systemctl  stop keepalived
    
    通过以上实验检测,发现当主服务器整机不可用时,VIP会切换到备用服务器
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    6、防止脑裂,解决方式
    四、实现服务HA
    
    默认keepalived实现的是服务器的高可用,并没有实现基于某个程序的高可用(nginx、lvs) 
    但是实际情况下,往往并不是服务器整机不可用,只是对应的服务或者软件不可用。
    比如说:lvs提供负载均衡,lvs down掉了,但是主服务器依然可用,vip地址还在本地
    
    实现过程分析:
    VIP实际是由keepalived进行绑定的,所以当nginx服务不可用时,就关闭当前机器的keepalived即可,释放VIP。进而绑定到其他备用服务器。
    ①编写服务检测脚本,实现检测nginx是否可用,不可用则关闭当前所在主机的keepalived
    ②在keepalived配置中调用检测服务脚本
    
    1、Nginx服务可用检测脚本
    主备服务器都要实现此脚本
    ①编写测试脚本  赋予执行权限
        shell > cd /etc/keepalived
        shell > vim check_nginx.sh
    脚本内容:
        #!/bin/bash
        nginx_status=`ps -C nginx --no-header | wc -l`
        if [ $nginx_status -eq 0 ];then
           systemctl stop keepalived 
        fi
    赋予脚本执行权限    方便之后其他软件调用执行
        shell > chmod +x check_nginx.sh
    ②测试脚本可用性
    启动nginx和keepalived  
    关闭nginx   执行脚本  查看keepalived是否也关闭
    2、模拟宕机实现服务切换
    在多台服务器中配置keepalived定时触发检测nginx的脚本模块
        #在vrrp_instance外上面定义
        vrrp_script check_nginx {
           #调用脚本地址
           script  /etc/keepalived/check_nginx.sh
           #检测间隔时间
           interval 3
        }
        #在vrrp_instance里调用
        track_script {
            #上线定义的名称
            check_nginx
        }
    3、实现web服务器高可用
    以上案例已经实现了,服务不可用VIP切换到可用服务器。
    现在需求用户的服务是连续不间断的,故用户需要通过VIP进行访问
    ①解析域名到VIP
    ②模拟用户访问
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    7、keepalived的配置补充
    五、keepalived的配置补充
    
    脑裂(裂脑):vip出现在了多台机器上。网络不通畅,禁用了数据包,主备服务器没法通讯,造成备服务器认为主服务器不可用,绑定VIP,主服务器VIP不会释放。
    
    解决方案:
    ①双备或者多备模式  BACKUP  通过priority权重来区分谁的优先级更高
    ②单播(定向广播)的方式 (一些特定环境禁用了组播方式)
    ③时间不同步  服务器时间校时
    
    1、非抢占模式
    
    ①nopreempt
    在主备服务器的配置文件,vrrp_instance段中
    ②设置state工作模式为BACKUP
    两个keepalived节点都启动后,默认都是BACKUP状态,双方在发送组播信息后,会根据优先级来选举一个MASTER出来。由于两者都配置了nopreempt,所以MASTER从故障中恢复后,不会抢占vip。这样会避免VIP切换可能造成的服务延迟。
    
    2、单播模式
    
    一些特定环境下不允许发送组播,造成备服务器无法收到vrrp包,可能会造成脑裂现象。可以通过单播的方式解决。
    单播示例配置:注意此语法在keepalived1.2.11版本以上支持
    unicast_src_ip 192.168.1.10##(本地IP地址)
    unicast_peer {
    		192.168.1.11##(对端IP地址)此地址一定不能忘记
    }
    
    主服务器server01配置
        #在vrrp_instace段中加入
        #本地IP
        unicast_src_ip 192.168.1.11
        unicast_peer {
            #对象IP  发送vrrp包给备服务器
            192.168.1.10
        }
    备服务器server03配置
    
        #在vrrp_instace段中加入
        #本地IP
        unicast_src_ip 192.168.1.10
        unicast_peer {
            #对象IP  发送vrrp包给备服务器
            192.168.1.11
        }
    tcpdump抓vrrp包的方式:
    shell > tcpdump vrrp -n -i ens33
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    keepalived+nginx 高可用配置

    所有的请求流量,都要经过负载均衡服务器,负载均衡服务器压力很大,防止它宕机,导致后端服务所有都不可用,需要对负载均衡服务器,做高可用
    给负载均衡服务器做一台备用服务器,通过keepalived实现高可用。
    
    通过keepalived实现VIP在负载均衡服务器组的切换。
    server03   master LB   192.168.1.11
    server04   backup LB   192.168.1.14
    主负载均衡的keepalived配置
    
        vrrp_instance VI_1 {
            state BACKUP
            interface eth0
            #虚拟路由ID 新ID 不要之前的冲突
            virtual_router_id 52
            priority 100
            nopreempt
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass 1111
            }
            virtual_ipaddress {
                #添加新VIP
                192.168.1.100
            }
            track_script {
                check_nginx
            }
        }
    
    备负载均衡的keepalived配置
    vrrp_instance VI_1 {
        state BACKUP
        interface eth0
        #修改route_id
        virtual_router_id 52
        priority 99
        nopreempt
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        #unicast_src_ip 192.168.1.12
        #unicast_peer {
        #    192.168.1.11
        #}
        virtual_ipaddress {
            #新VIP
            192.168.1.100
        }
        track_script {
            check_nginx
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    nginx的负载均衡

    负载均衡
    负载均衡:分发流量、请求到不同的服务器。使流量平均分配(理想的状态的)
    作用:服务器容灾   流量分发
    主要作用:
    ①流量分发  请求平均  降低单例压力
    其他作用:
    ②安全  隐藏后端真实服务
    ③屏蔽非法请求(七层负载均衡)
    实现方式分类:
    ①软件级别  性价比高  可控性强
    ②硬件级别   性能好  价格高  几万到几十万不等
    硬件是实现方式:
    F5 BIG-IP   四层和七层
    七层   Nginx、HAProxy
    四层   LVS、HAProxy、Nginx(1.9版本后)
    
    1)二层负载均衡(mac)
    根据OSI模型分的二层进行负载,一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后,再分配后端实际的MAC地址响应 
    2)三层负载均衡(ip) 
    一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后,再分配后端实际的IP地址响应
    3)四层负载均衡(tcp)  网络运输层面的负载均衡
    在三层负载均衡的基础上,用ip+port接收请求,再转发到对应的机器
    4)七层负载均衡(http)  智能型负载均衡
    根据虚拟的url或IP,主机接收请求,再转向(反向代理)相应的处理服务器
    
    架构分析:
    
    ①用户访问请求Nginx负载均衡服务器 
    ②Nginx负载均衡服务器再分发请求到web服务器
    实际配置负载均衡,只需修改作为负载均衡服务器的Nginx即可。
    
    ①在客户端解析域名到负载均衡服务器
    ②在192.168.1.11上安装nginx做负载均衡
    [root@localhost ~]#wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 
    [root@localhost ~]#yum -y install epel-release 
    [root@localhost ~]#yum -y install nginx
    shell > cat /etc/nginx/nginx.conf
    配置文件示例:
    worker_processes  1;
    events {
        worker_connections  1024;
    }
    http {
    
    #在http段进行配置
    #分发请求到后端服务器
    upstream shop {
        #web1 server01
        server 192.168.1.12;
        #web2 server02
        server 192.168.1.13;
    }
    #修改之前的shop的server段配置
    server {
        listen 80;
        server_name www.a.com;
        location / {
            #匹配到上面的upstream
            proxy_pass http://shop;
            #以下两条配置,实质是设置了传输的header头信息  
            #传输域名给后端服务器  进行识别  方便匹配对应server虚拟主机
            proxy_set_header Host $host;
            #发送客户端IP  给后端服务器  用来方便后端服务器识别用户真实IP
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
    #重启nginx服务
    [root@localhost nginx]# systemctl restart nginx 
    
    
    ==方法一:在不同服务器写入不同信息==
    ①分别修改web服务器的信息
    
        shell11 > echo wo shi 192.168.1.12 >>/usr/share/nginx/html/index.html
        shell12 > echo wo shi 192.168.1.13 >>/usr/share/nginx/html/index.html
    测试:
        [root@localhost ~]# curl 192.168.1.11
        wo shi 1.13
        [root@localhost ~]# curl 192.168.1.11
        wo shi 1.12
    可以停掉其中一台web服务器进行测试
        #停掉192.168.1.13
        省略15个字...... 
        #再次访问nginx负载均衡发现 1.13故障机器自动被踢出,说明nginx负载均衡默认就具备健康检查功能
        [root@localhost ~]# curl 192.168.1.11
        wo shi 1.12
        [root@localhost ~]# curl 192.168.1.11
        wo shi 1.12
        
    方法二:查看后端web服务器的访问日志,有没有记录真正客户端的ip地址
        shell > cat /var/log/nginx/access.log
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94

    nginx遇到的问题之负载均衡后获取客户端IP

    负载均衡之后,在后端的web服务器获取到的是负载均衡服务器的IP,而不能够获取到客户端的真实IP。
    
    需要进行以下特殊配置:
    ①首先在负载均衡服务器中配置,转发客户端IP给后端web服务器
    location{
        ..........
          #发送客户端IP  给后端服务器  用来方便后端服务器识别用户真实IP
            proxy_set_header X-Real-IP $remote_addr;
    }
    ②后端web服务器需要配置,识别从负载均衡服务器传输过来的客户端真实IP
        set_real_ip_from  192.168.1.11;(负载均衡的ip)
    官方网址:http://nginx.org/en/docs/http/ngx_http_realip_module.html
    使用ngx_http_realip_module模块提供的set_real_ip_from语法,默认此模块没有安装,需要编译时添加编译参数
    web服务器上配置set_real_ip_from  代表从哪儿来源的IP,需要识别真实客户端IP
    示例配置:
        #此配置在web服务器上的nginx
        #可配置到http、server、location中,推荐配置到server中
        #配置需要识别的IP来源   负载均衡的IP
        set_real_ip_from  192.168.1.11;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    nginx配置中upstream的server关键字

    upstream中的分发之后的几个关键字:
    backup  备  其他的没有backup标识的都无响应,才分发到backup
    down   此条配置,不会被分发到
    upstream shop {
        server 192.168.1.12 ;
        server 192.168.1.13 backup;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    nginx遇到的问题之 session一致性问题

    访问管理后端页面,登录发现验证码不通过
    分析原因:
    ①比如分发到web1服务器,生成验证码,存储到session中,默认在服务器本地
    ②再次校验的时候,请求分发到web2服务器了,所有验证码一直校验不通过
    
    解决方案思路:
    ①生成和验证session都请求同一台服务器
    ②共享session  nfs  mysql ==内存缓存软件(memcached、redis)==
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Nginx的常见负载均衡算法实战

    Nginx 官方默认3种负载均衡的算法
    ①==Round-Robin  RR轮询(默认)==  一次一个的来(理论上的,实际实验可能会有间隔)
    ②==weight 权重==  权重高多分发一些  服务器硬件更好的设置权重更高一些
    ③==ip_hash==  同一个IP,所有的访问都分发到同一个web服务器
    Tip:
    第三方模块实现的调度算法  需要编译安装第三方模块
    ④fair  根据后端服务器的繁忙程度  将请求发到非繁忙的后端服务器
    ⑤url_hash  如果客户端访问的url是同一个,将转发到同一台后端服务器
    验证一:验证加权轮询算法
    示例配置:
        upstream shop {
            #web1 server01
            server 192.168.1.12 weight=5;
            #web2 server02
            server 192.168.1.13 weight=3;
        }
    
    server01   web 1      1    1   1   1   1
    server03   web 2      1    1   1
    8次中,server01分发5次,server03分发3次
    验证二:ip一致性算法
    示例配置:
        upstream shop {
            #ip hash 一致性算法配置  设置此项  weight就失效了
            ip_hash;
            #web1 server01
            server 192.168.1.12 weight=5;
            #web2 server02
            server 192.168.1.13 weight=3;
        }
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    nginx 四层代理,七层代理

    nginx两种反向代理区别
    7层反向代理和4层反向代理
    
    在nginx中,upstream和stream都是指向不同类型的模块。
    
    upstream模块用于HTTP协议的负载均衡,主要用于将客户端请求分发到多个后端服务器,从而提高系统的稳定性和执行效率。
    
    stream模块用于TCP/UDP协议的负载均衡,主要用于将客户端请求分发到多个后端服务器,从而提高系统的稳定性和执行效率,也可以用于TCP代理和UDP代理。
    
    因此,upstream和stream的区别在于它们适用的协议不同。
    upstream适用于HTTP协议的负载均衡,stream适用于TCP/UDP协议的负载均衡和代理。
    
    
    
    nginx做七层反向代理
    
    以下是使用nginx做七层反向代理的步骤:
    1. 安装nginx:在Linux系统中使用包管理器安装nginx,或者从官网下载源码后编译安装。
    2. 配置nginx:修改nginx配置文件,一般在/etc/nginx/nginx.conf(/usr/local/nginx/nginx.conf),增加以下内容:
        http {
            upstream backend {
                server backend1.example.com:8080;
                server backend2.example.com:8080;
            }
        
            server {
                listen 80;
                server_name example.com;
        
                location / {
                    proxy_pass http://backend;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                }
            }
        }
    
    其中,
    upstream定义了后端服务器集群,
    server定义了监听的端口和域名,
    location定义了访问路径。
    3. 重启nginx:执行以下命令重启nginx服务,使新的配置生效。
        # 查看nginx进程
        ps -ef | grep nginx
        # 重启nginx
        /usr/local/nginx/sbin/nginx -s reload
        /etc/nginx/sbin/nginx -s reload
        
        
    
     测试反向代理:
    访问配置的域名,可以看到nginx反向代理到后端服务器集群,将请求分发到多个后端服务器(负载均衡)处理,并返回响应。
    
    
    
    nginx做四层反向代理
    以下是使用nginx做四层反向代理的步骤:
    1. 安装nginx:在Linux系统中使用包管理器安装nginx,或者从官网下载源码后编译安装。
    2. 配置nginx:修改nginx配置文件,一般在/etc/nginx/nginx.conf,增加以下内容:
        stream {
            upstream backend {
                server backend1.example.com:8080;
                server backend2.example.com:8080;
            }
        
            server {
                listen 80;
                proxy_pass backend;
            }
        }
    
    其中,
    stream定义了四层代理,
    upstream定义了后端服务器集群,
    server定义了监听的端口和代理地址。
    
    1. 重启nginx:执行以下命令重启nginx服务,使新的配置生效。
        # 查看nginx进程
        ps -ef | grep nginx
        # 重启nginx
        /usr/local/nginx/sbin/nginx -s reload
        /etc/nginx/sbin/nginx -s reload
    测试反向代理:
    使用TCP客户端工具(如telnet、netcat、nc等)连接nginx代理地址,
    可以看到nginx反向代理到后端服务器集群,将请求分发到多个后端服务器处理,并返回响应。
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
  • 相关阅读:
    软件开发生命周期模型
    springboot整合jwt认证
    JavaWeb(Maven的安装,配置,常用命令 IDEA配置,创建,发布Maven)
    NET 6 实现滑动验证码(三)、接口
    35张图,直观理解Stable Diffusion
    会员管理系统适合什么行业?
    JavaScript —— APIs(四)
    RISC-V学习基础(四)
    如何使用qemu调试内核
    听我一句劝,别去外包,干了4年,废了....
  • 原文地址:https://blog.csdn.net/qq_48975137/article/details/132906498