下文摘自孙卫琴的经典著作《Spring Cloud Alibaba微服务零基础入门到实操》,介绍了在Spring Cloud Alibaba微服务框架中通过KeepAlived建立Nginx集群的步骤。
阿云:“Nginx服务器是所有微服务访问Nacos集群的入口。如果Nginx服务器宕机,就相当于通向Nacos集群的大门关闭了,还是会降低Nacos集群的可用性。有什么改进办法吗?”
答主:“很简单,为Nginx服务器也建立集群。”
在动物界,有些动物天生就很合群,比如鸭子和狮子。一群鸭子中有一只领头鸭,其他鸭子都跟随其后。一群狮子有一个狮王,其他狮子都俯首称臣。还有些动物则天生就独来独往,比如猫和老虎,它们捕捉猎物都是单打独斗。
同样,在软件领域,有的服务器天生就合群,比如Nacos服务器就适合群居。一群Nacos服务器在一起,通过Raft协议通信,选举出Leader,然后协调工作。还有的服务器天生就独来独往,比如Nginx服务器。一群Nginx服务器各玩各的,无法直接通信,因此无法直接合作。
阿云:“既然多个Nginx服务器不能直接通信,那么如何建立集群呢?”
答主:“为每台Nginx服务器配置一个外交官,负责和其他Nginx服务器通信,这样就能建立集群了。这个外交官就是开源软件Keepalived。”
如图1所示,Keepalived采用VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)通信协议。VRRP为Nginx集群设立虚拟IP(VIP,Virtual IP)。hello-config模块通过虚拟IP访问Nginx集群,VRRP会把虚拟IP映射到特定的Nginx节点。
图1 通过Keepalived搭建Nginx集群
VRRP把节点的角色分为Master和Backup。通过选举产生Master,如果Master节点宕机,再从其余的Backup节点中选出新的Master。
Keepalived运行在Linux中,官方下载网址参见本文技术支持网页(www.javathinker.net/alibaba)的【链接10】。假定Linux的具体操作系统为CentOS,安装Keepalived的命令如下:
yum install -y keepalived
以下是Keepalived的一些常用操作命令:
service keepalived start #启动Keepalived
service keepalived stop #停止Keepalived(进程还在)
systemctl kill keepalived #杀死Keepalived进程
service keepalived restart #重启Keepalived
service keepalived status #查看keepalived 状态
在Linux中搭建由三个Nginx节点和Keepalived构成的集群,假定这三个节点位于不同的主机上,以下是搭建步骤。
(1)在三台主机上分别安装Nginx服务器。再参照5.4节,对每个Nginx服务器配置对Nacos集群的反向代理。
(2)在三台主机上分别安装Keepalived。
(3)在三台主机上分别修改/etc/keepalived/keepalived.conf配置文件。第一个节点的keepalived.conf文件的内容参见例程1。
例程1 keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_ server 192.168.100.110
smtp_connect_timeout 30
router_id server_1 #主机名
}
vrrp_script chk_nginx {
#检测Nginx节点是否存活的脚本
script "/usr/local/src/nginx_check.sh"
interval 2 #脚本执行的间隔,为2s
weight 2 #权重,如果这个脚本的检测结果为true,服务器权重+2
}
vrrp_instance VI_1 {
state MASTER #节点的角色
interface eth1 #网卡名称
virtual_router_id 51 #各个节点的virtual_router_id必须相同
priority 102 #各个节点的优先级
advert_int 1 #每隔1s发送一次心跳
authentication { #校验方式,类型为密码,密码为1234
auth type PASS
auth pass 1234
}
track_script { #指定追踪的脚本
chk_nginx
}
virtual_ipaddress { #虚拟IP(VIP)
192.168.100.188
}
}
keepalived.conf文件中设置了以下属性:
- smtp_server属性:主机的IP地址。
- router_id属性:主机的名称,在Linux中通过hostname命令查看主机的名称。
- state属性:节点的角色,把集群中一个节点的state属性设为MASTER,其余的设为BACKUP。
- interface属性:网卡的名称。在Linux中通过ifconfig命令查看网卡的名字。
- virtual_router_id属性:虚拟路由的ID。在三个节点上该属性必须相同。
- priority属性:节点的优先级。三个节点的priority属性不一样,比如:100、101、102。Master节点的优先级高于Backup节点。
- advert_int属性:节点发送心跳的间隔时间,设为1秒。
- authentication属性:校验方式,在三个节点上该属性必须相同。
- virtual_ipaddress属性:虚拟IP(VIP)地址,必须是三个节点所在网段内未被占用的IP地址。
表1列出了三个节点中keepalived.conf配置文件中主要配置属性的值。
表1 三个节点的Keepalived的主要配置属性
(4)在三台主机的/etc/keepalived目录下分别创建检测Nginx节点是否存活的脚本 nginx_check.sh,参见例程2。
例程2 nginx_check.sh
A=`ps -C nginx -no-header | wc - 1`
if [ $A -eq 0];then #如果Nginx服务不存在
/usr/local/nginx/sbin/nginx #启动Nginx
sleep 2
if [`ps -C nginx --no-header| wc -1` -eq 0 ];then
killall keepalived #如果Nginx启动失败,终止Keepalived
fi
fi
以上脚本先判断Nginx服务是否存在,如果不存在,就启动Nginx,并等待2秒,若Nginx启动失败,就终止Keepalived。
(5)在三台主机上分别启动Keepalived,Keepalived会通过执行nginx_check.sh脚本启动Nginx。启动Keepalived的命令为:service keepalived start。
(6)在浏览器中通过虚拟IP访问Nginx集群,URL为:http://192.168.100.188,如果看到5.4节的图5-9所示的Nginx的主页面,就表示Nginx集群搭建成功。
(7)通过浏览器访问http://192.168.100.188/nacos,如果能登录Nacos的管理平台,则表明Nginx集群和Nacos集群整合成功。
(8)修改hello-config模块的bootstrap.properties文件,把原先Nacos服务器的地址改为Nginx集群的虚拟IP的地址:
spring.cloud.nacos.discovery.server-addr=192.168.100.188:80
spring.cloud.nacos.config.server-addr=192.168.100.188:80
(9)运行HelloConfigApplication类,就会打印来自Nacos节点的db.username和db.password配置属性的值。
想要循序渐进学习Spring Cloud微服务开发,强烈推荐看孙卫琴老师的经典著作《Spring Cloud Alibaba微服务开发零基础入门到实操》,还附赠121集配套视频课程,免费观看网址参见http://www.javathinker.net/alibaba
本书深入浅出地讲解了利用Spring Cloud Alibaba框架开发分布式微服务系统的技术,详细阐述了各种组件的用法,包括:注册和配置中心Nacos、负载均衡器LoadBalancer、远程调用组件OpenFeign、远程调用框架Dubbo、流量控制组件Sentinel、网关Gateway、链路追踪组件SkyWalking、消息中间件Stream和 RocketMQ、分布式事务管理框架Seata、分库分表中间件ShardingSphere、分布式缓存数据库Redis、分布式任务调度框架XXL-JOB。
本书以一位学习微服务开发的新手阿云向答主(本书作者)请教微服务开发技术为线索,激发读者主动探索知识的学习兴趣,把本来看似深奥复杂的分布式微服务系统如庖丁解牛般剖析得淋漓尽致,浅显易懂。本书不仅详细介绍各种技术的使用步骤,而且运用了许多生动形象的生活化的比喻,帮助读者理解这些技术的运作原理。
本书的范例很具有实用性,整合了Spring Boot、Spring Cloud Alibaba、Hibernate、Mybatis、DruidDataSource、HikariDataSource、lombox软件包、SLF4J等流行的框架或工具软件。
本书主要面向所有具有Java编程基础的开发人员和在校学生。对于不熟悉Java编程的读者,阅读本书,也能领略Spring Cloud Alibaba框架的基本用法和微服务开发的核心思想。本书还可作为高校和企业的微服务开发教材。