先准备两台机器,用于测试,这里使用 192.168.1.168
和 192.168.1.146
两台机器测试。
默认你的nginx已经搭建好了,我这里使用的是docker方式搭建的,只是一个简单的模拟
docker run -p 8123:80 \ -dit \ --name nginx-web \ -v /opt/project/apps/nginx-web/nginx.conf:/etc/nginx/nginx.conf \ -v /opt/project/apps/web/:/usr/share/nginx/html \ --privileged=true \ --restart=always nginx
先决条件
禁用SElinux、清除iptables规则、关闭防火墙。就算因某种原因不能清除iptables规则,那么你需要增加一条规则放行多播
各个节点时间同步,启用时间同步服务systemctl start chronyd
确保Keepalive使用的网卡开启了多播
如果没有开启,可以使用该命令打开ip link set multicast on dev ens33
,ens33是网卡名称。
怎么查看网卡和子网掩码等信息,执行 ifconfig 命令
找到上面的ip 192.168.1.168
,这个就是我们要找的网卡信息, netmask 是子网掩码信息 esn192 是网卡信息。
多播配置
先在 192.168.1.168
主机上进行操作。
第一步,安装keepalived
yum install -y keepalived
第二步,配置keepalived
# 进入keepalived.conf所在目录: cd /etc/keepalived # 清除掉keepalived原有配置 > keepalived.conf
第三步,复制下面的配置文件,根据需要修改相关配置。比如网卡名等
global_defs { # 邮件通知配置,发生故障时候通知的人员 notification_email { 740610314@qq.com # 定义收件人 } notification_email_from sns-lvs@gmail.com # 定义发件人 smtp_server 192.168.1.114 # SMTP服务器地址 smtp_connection_timeout 30 router_id LVS_MASTER # 设置lvs的id,在一个网络应该是唯一的,一般不用改,也可以写成每个主机自己的主机名 } vrrp_instance VI_1 { state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备 interface ens192 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡),不知道就用 ifconfig 查一下 virtual_router_id 66 # 虚拟路由编号,主从要一致 priority 100 # 优先级,数值越大,获取处理请求的优先级越高 advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数) authentication { # 通信认证机制,这里是明文认证还有一种是加密认证 auth_type PASS auth_pass 1111 #密钥 } virtual_ipaddress { # 设置虚拟VIP地址,一般就设置一个,在LVS中这个就是为LVS主机设置VIP的,这样你就不用自己手动设置了 192.168.1.21 # 定义虚拟ip(VIP),可多设,每行一个 # IP/掩码 dev 配置在哪个网卡 # 192.168.200.16/24 dev eth1 } } # 定义LVS集群服务,可以是IP+PORT;也可以是fwmark 数字,也就是防火墙规则 virtual_server 192.168.1.21 8123 { delay_loop 6 # 设置健康检查时间,单位为秒 lb_algo wrr # 设置负载调度的算法为wrr lb_kind DR # 设置lvs实现负载的机制,有NAT、TUN、DR三个模式 nat_mask 255.255.255.0 # 子网掩码,这个掩码是VIP的掩码 persistence_timeout 0 # 同一IP 0秒内的请求都发到同个real server protocol TCP # 定义协议 # 后端应用服务器 IP PORT real_server 192.168.1.168 8123 { # 指定real server1的ip地址 weight 3 # 配置节点权值,数值越大权重越高 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 } } # 后端应用服务器 IP PORT real_server 192.168.1.146 8123 { weight 3 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 } } }
第四步,在另外一台 192.168.1.146
上进行操作,
先安装 keepalived ,然后也是进入到配置,修改配置文件。
global_defs { notification_email { 740610314@qq.com } notification_email_from sns-lvs@gmail.com smtp_server 192.168.1.112 smtp_connection_timeout 30 router_id LVS_BACKUP # 设置lvs的id,在一个网络应该是唯一的 } vrrp_instance VI_1 { state BACKUP # 指定keepalived的角色,MASTER为主,BACKUP为备 interface eno16780032 # 当前进行vrrp通讯的网络接口卡(当前进行vrrp通讯的网络接口卡) virtual_router_id 66 # 虚拟路由编号,主从要一致 priority 99 # 优先级,数值越大,获取处理请求的优先级越高 advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数) authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.21 # 定义虚拟ip(VIP),可多设,每行一个 } } # 定义对外提供的LVS的VIP以及port virtual_server 192.168.1.21 8123 { delay_loop 6 # 设置健康检查时间,单位为秒 lb_algo wrr # 设置负载调度的算法为wrr lb_kind DR # 设置lvs实现负载的机制,有NAT、TUN、DR三个模式 nat_mask 255.255.255.0 persistence_timeout 0 # 同一IP 0秒内的请求都发到同个real server protocol TCP real_server 192.168.1.168 8123 { # 指定real server1的ip地址 weight 3 # 配置节点权值,数值越大权重越高 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.1.146 8123 { weight 3 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 } } }
第五步,主从都启动服务,service keepalived start
单播配置
如果跨网段了,很可能无法访问到这个IP,比如我的网段是23,这个时候就需要关闭多播,因为数据未返回。一般情况下,上面的配置就已经支持nginx的高可用了。
192.168.1.168
使用如下配置:
global_defs { # 邮件通知配置,发生故障时候通知的人员 notification_email { 740610314@qq.com # 定义收件人 } notification_email_from sns-lvs@gmail.com # 定义发件人 smtp_server 192.168.1.114 # SMTP服务器地址 smtp_connection_timeout 30 router_id LVS_MASTER # 设置lvs的id,在一个网络应该是唯一的,一般不用改,也可以写成每个主机自己的主机名 } vrrp_instance VI_1 { state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备 interface ens192 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡),不知道就用 ifconfig 查一下 virtual_router_id 66 # 虚拟路由编号,主从要一致 priority 100 # 优先级,数值越大,获取处理请求的优先级越高 advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数) authentication { # 通信认证机制,这里是明文认证还有一种是加密认证 auth_type PASS auth_pass 1111 #密钥 } unicast_src_ip 192.168.1.168 #单播的源地址,写本机上的ip即可 unicast_peer { 192.168.1.146 #如果有多个主机组成集群,把其它主机ip都写上 } virtual_ipaddress { # 设置虚拟VIP地址,一般就设置一个,在LVS中这个就是为LVS主机设置VIP的,这样你就不用自己手动设置了 192.168.1.21 # 定义虚拟ip(VIP),可多设,每行一个 # IP/掩码 dev 配置在哪个网卡 # 192.168.200.16/24 dev eth1 } }
192.168.1.146
上将配置修改为如下:
global_defs { notification_email { 740610314@qq.com } notification_email_from sns-lvs@gmail.com smtp_server 192.168.1.112 smtp_connection_timeout 30 router_id LVS_BACKUP # 设置lvs的id,在一个网络应该是唯一的 } vrrp_instance VI_1 { state BACKUP # 指定keepalived的角色,MASTER为主,BACKUP为备 interface eno16780032 # 当前进行vrrp通讯的网络接口卡(当前进行vrrp通讯的网络接口卡) virtual_router_id 66 # 虚拟路由编号,主从要一致 priority 99 # 优先级,数值越大,获取处理请求的优先级越高 advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数) authentication { auth_type PASS auth_pass 1111 } unicast_src_ip 192.168.1.146 #单播的源地址,写本机上的ip即可 unicast_peer { #注意:花括号前有空格 192.168.1.163 #如果有多个主机组成集群,把其它主机ip都写上 } virtual_ipaddress { 192.168.1.21 # 定义虚拟ip(VIP),可多设,每行一个 } }
常用命令
// 启动 service keepalived start (建议用这个) systemctl start keepalived // 停止 service keepalived stop (备用,有时候关闭不了) systemctl stop keepalived (建议用这个) // 重启 systemctl restart keepalived // 查看日志 tail -f /var/log/messages
至此,nginx的高可用配置完成,注意,当测试的时候,关闭了 keepalived 也可能会有一会负载还生效,但过一会就不行了。