nacos集群部署方式(linux)
虽然nacos现在已经升级到2.0版本,但是部署方式没有发生变化.本文使用的1.0版本的安装部署方式仍然适用。
# 一、安装nacos集群
我准备了三台服务器(虚拟机),192.168.161.3、192.168.161.4、192.168.161.5。在三台服务器上分别下载、解压nacos安装包,并在防火墙开放8848端口(参考单机部署standalone部署的模式的操作)。然后我们开始nacos集群模式的安装。
# 1.1.MySQL数据库初始化
- 在生产环境中MySQL至少是主备模式,或者采用高可用模式。
- 为了将服务注册及配置相关的数据持久化存储,nacos实例之间共享数据并且方便查看,集群安装模式把数据存储到Mysql数据库里面。
- 建立Mysql数据库实例,并执行sql源文件是在nacos/conf解压目录下面的nacos-mysql.sql文件。sql语句源文件 (opens new window)。
数据库db、用户需要自己去创建,nacos-mysql.sql文件只有建表语句和初始化用户nacos的INSERT语句。
# 1.2.在nacos/conf/application.properties中增加mysql配置
在192.168.161.3、192.168.161.4、192.168.161.5都要配置。
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.161.3:3306/nacosdb?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=test
db.password=
2
3
4
5
6
- spring.datasource.platform说明支持数据持久化的数据库类型,已知目前只支持mysql
- db.num数据库实例的数量,我们实验环境只有一个mysql数据库实例,所以是1
- db.url.0表示第一个mysql数据库的jdbc url连接。如果还有第二个、第三个,请增加db.url.n中的n。
# 1.3.在nacos/conf/cluster.conf中加入ip配置
在192.168.161.3、192.168.161.4、192.168.161.5都要配置。如果没有这个文件,就新建一个。
#ip:port
192.168.161.3:8848
192.168.161.4:8848
192.168.161.5:8848
2
3
4
# 1.4.启动服务
在192.168.161.3、192.168.161.4、192.168.161.5执行nacos/bin/startup.sh
,在三台服务器上分别启动nacos。正常情况下,我们的集群节点就安装成功了。三个节点都可以提供服务,并且三个节点之间可以通信。通过浏览器访问nacos:http://ip:8848/nacos/
可以正常的访问nacos服务。
注意:启动单机模式的用的是
sh startup.sh -m standalone
,而启动集群模式不需要-m standalone
参数。
# 二、多网卡Ip选择问题
正常情况下,上面的步骤就可以安装成功了,三台服务器上的nacos可以对外提供服务,彼此间可以通信。但是,通常在生产环境下的服务器是多网卡的,nacos该如何正确的绑定网卡?其网卡的选择配置和Spring Cloud系列配置是差不多的,可以参考《eureka集群多网卡环境ip设置》学习,但有些许的不同,下文会讲到。
查看我的服务器网卡:
使用ip addr
命令查看linux主机的网卡。
- 第一个lo网络ip是回路ip,127.0.0.1,这个是标配
- 第二个enp0s3网络设备,ip是10.0.2.15,这个是因为我的服务器网络使用了双网卡:桥接+HostOnly模式。正常的服务器是没有的。
- 第三个enp0s8就是本服务器真正的使用到提供服务的网络ip,如:192.168.161.4。
- 第四个网络设备是因为我在这台虚拟机上安装过docker,所以有一个docker0的网络设备。
因为较多的网络设备,导致我在后续安装过程出现问题。这里先卖个关子。 **问题:**解决网卡获取的不是我们希望绑定的网卡的问题:当我们配置完成之后,使用startup.sh命令启动。发现集群节点列表中并没有任何记录。而且后台服务日志报错,内容如下:
**分析:**通过日志我们看到nacos程序自动获取的是10.0.2.15这个ip,而我们期望nacos绑定的是192.168.161.x的ip。
解决方案一(较新的nacos版本): 针对我的网卡和期望ip,我的application.properties配置如下:
nacos.inetutils.ip-address=192.168.161.5
解决方案二(较旧的nacos版本): 针对我的网卡和期望ip,我的application.properties增加配置如下:
# 期望被忽略掉的网卡名称
nacos.inetutils.ignored-interfaces[0]=enp0s3
nacos.inetutils.ignored-interfaces[1]=docker0
# 期望匹配的网卡ip前缀
nacos.inetutils.preferred-networks[0]=192.168.161.
2
3
4
5
需要注意的是这里的inetutils配置的前缀是nacos,不是我们之前学过的spring.cloud,这点区别要注意,别配置错了 当以上工作都完成之后,我们通过浏览器分别访问nacos服务,看到如下界面。集群管理的节点列表里面已经有三各节点,ip分别是192.168.161.3:8848、192.168.161.4:8848、192.168.161.5:8848。
# 三、nacos集群架构
在完成nacos集群的配置之后,我们可以通过三个入口分别访问集群内的nacos服务,那下面的问题就是如何将三个入口转成一个入口,实现nacos server对外服务的负载均衡和高可用。
# 3.1.方案一
目前许多个人开发者写的博客或教程中的方法就是在三个nacos服务的前端加一个负载均衡器,如:nginx、haproxy。然后号称是生产级别的搭建方法,但这种方法是绝对不能用于生产的,因为你的nginx和haproxy是单点,一旦nginx挂了,整个服务就挂了。
# 3.2.方案二
nacos官网推荐的方法是使用虚拟ip的方法,如下:
- 最开始虚拟ip192.168.161.6可能与192.168.161.3的主机绑定在一起,通过这两个ip都可以访问192.168.161.3主机的nacos服务。
- 一旦192.168.161.3主机宕机或者其他网络故障,192.168.161.6会自动切换到与192.168.161.4或者192.168.161.5主机绑定在一起。这个过程被叫做虚拟ip的漂移。
这种虚拟ip的方法问题就是没有使用到负载均衡,访问的仍然是某一个节点的nacos服务,只不过形成了主从备份,提供了高可用。对于微服务量级不大的,这种就已经完全够用了。
# 3.3.方案三(我的方案)
那既可以提供高可用,又可以提供负载均衡的办法,可能有的朋友已经想到了,如下图:
- 在nacos服务的前端加上nginx或者haproxy的负载均衡器(多节点)
- 然后对负载均衡器的部署服务器使用虚拟ip,即:通过keepalived实现虚拟ip的漂移
- 用户访问负载均衡器实现对nacos服务的访问,主nginx挂掉,虚拟ip漂移到从nginx负载均衡提供服务
- 任何一个nginx负载均衡都可以将请求负载,均衡的分流到nacos实例上面
# 四、nacos集群(虚拟ip漂移)
我们就拿官网中推荐的方法(方案二),使用虚拟ip访问nacos集群的方式做个例子讲解一下。为什么不讲第三种?一般系统架构水平到了的人听懂这种方式就知道第三种方式怎么做,水平不到的人听了第三种仍然还是不懂。
# 4.1.安装配置keepalived
在三台服务器上分别安装keepalived
yum install -y keepalived
在三台服务器上分别修改/etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface enp0s8
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.161.6
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
- 一台服务器是MASTER主节点,其他的服务器为BACKUP节点
- interface 配置为我们刚刚查看的网卡的名称
- virtual_router_id 必须一致,表示这三台服务器抢用一个虚拟ip。
- 修改priority 优先级,三台服务器要不一样,比如:100、101、102,优先级最高的优先使用虚拟ip。MASTER的优先级一定要高于BACKUP主机
- advert_int 是几台服务器之间的同步检查时间,1秒
- authentication 的设置必须一致,这样这几台服务器才能通信
- 修改virtual_ipaddress为三台服务器所在网段内未被占用的IP地址,比如:192.168.161.6
# 4.2.修改防火墙
CentOS7必须开放防火墙配置,否则三台主机无法就虚拟ip的使用优先级通信,将都是MASTER,都配置虚拟ip。
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --protocol vrrp -j ACCEPT;
firewall-cmd --reload;
2
# 4.3.启动keepalived服务
sudo systemctl restart keepalived.service
这时我们通过http://192.168.161.6:8848/nacos,访问的服务实际上是keepalived的MASTER节点192.168.161.3。如果我们把161.3的服务器停了,161.6的ip就漂移到161.4服务器上(按优先级)。总之可以保证192.168.161.6虚拟VIP提供的服务一直是可用的,除非nacos所有服务器节点都挂了。