Nacos集群搭建实操

将数据存储切换为mysql

默认Nacos使用嵌入式数据库derby实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。
为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。

在nacos安装目录下的conf/文件夹下有一个nacos-mysql.sql文件,使用mysql执行该sql文件,如果没有建database可以先新建database:

create database nacos_config;
use nacos_config;

执行成功之后可以看到下面这些表:

Nacos集群搭建实操

然后修改conf/application.properties,添加mysql相关配置:

spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456

重启nacos,进入控制页面可以看到数据全部没了。。

集群部署

如果更改完了数据存储到mysql就可以开始部署集群了,这里还是搭建伪集群,但是会很麻烦,有机器条件的可以直接尝试真刀实枪上集群……

首先让nacos能指定端口启动

修改bin/startup.sh中的下面两个地方:

#################添加p:(即可以带-p参数)
57 while getopts ":m:f:s:p:" opt
58 do
59     case opt in
60         m)
61             MODE=OPTARG;;
62         f)
63             FUNCTION_MODE=OPTARG;;
64         s)
65             SERVER=OPTARG;;
################添加下面两行
66         p)
67             PORT=$OPTARG;;
83 if [[ "{MODE}" == "standalone" ]]; then
84     JAVA_OPT="{JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
85     JAVA_OPT="{JAVA_OPT} -Dnacos.standalone=true"
### 集群模式添加jvm启动参数
86 else
87     JAVA_OPT="{JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
88     JAVA_OPT="{JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath={BASE_DIR    }/logs/java_heapdump.hprof"
89     JAVA_OPT="{JAVA_OPT} -XX:-UseLargePages"
### 添加这一行
90     JAVA_OPT="{JAVA_OPT} -DServer.port=${PORT}"
91 fi

修改集群配置文件

conf/cluster.conf.example复制出来:

cp cluster.conf.example cluster.conf

然后修改cluster.conf文件,添加下面这几行,注意ip不能填写127.0.0.1,必须是hostname -i显示的ip(因为内部raft是通过网卡ip进行通信的)

192.168.91.1:3333
192.168.91.1:4444
192.168.91.1:5555

使用nginx做负载均衡

nginx.conf添加以下配置:

upstream cluster{
    server 127.0.0.1:3333;
    server 127.0.0.1:4444;
    server 127.0.0.1:5555;
}

server{
    listen 1111;
    server_name localhost;
    location / {
        proxy_pass http://cluster;
    }
}

启动集群:

启动三个nacos实例和nginx:

root@DESKTOP-TTLFG6F:~/nacos/bin# bash startup.sh -p 3333
root@DESKTOP-TTLFG6F:~/nacos/bin# bash startup.sh -p 4444
root@DESKTOP-TTLFG6F:~/nacos/bin# bash startup.sh -p 5555

root@DESKTOP-TTLFG6F:/usr/sbin# ./nginx -c /etc/nginx/nginx.conf

访问 http://192.168.91.1:1111/nacos 即可看到熟悉的nacos界面了……

微服务注册进nacos集群

我们以模块cloudalibaba-provider-payment9001为例,直接将配置文件中的spring.cloud.nacos.discovery.addr 修改为nginx代理的vip

server:
  port: 9001
spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:1111
management:
  endpoints:
    web:
      exposure:
        include: '*'

然后启动服务就可以正常注册了。

伪集群可能会踩的坑

因为伪集群的原因,可能造成实例之间无法通信,注册服务的时候就会看到这种情况:

java.lang.IllegalStateException: failed to req API:/nacos/v1/ns/instance after all servers([192.168.91.1:1111]) tried
        at com.alibaba.nacos.client.naming.net.NamingProxy.reqAPI(NamingProxy.java:335)
        at com.alibaba.nacos.client.naming.net.NamingProxy.reqAPI(NamingProxy.java:267)
        at com.alibaba.nacos.client.naming.net.NamingProxy.registerService(NamingProxy.java:167)
        at com.alibaba.nacos.client.naming.NacosNamingService.registerInstance(NacosNamingService.java:170)
        at org.springframework.cloud.alibaba.nacos.registry.NacosServiceRegistry.register(NacosServiceRegistry.java:56)
        at org.springframework.cloud.alibaba.nacos.registry.NacosServiceRegistry.register(NacosServiceRegistry.java:29)

但nacos服务后台三台机器均启动成功,且后台能正常进入,通过URL访问/nacos/v1/ns/instance,也是能正常访问。

实际上是跟通过主机名获取本机ip地址的原因有关(因为我是用的WSL可能会存在一些问题),这种情况还是修改bin/startup.sh,加一个虚拟机参数:

83 if [[ "{MODE}" == "standalone" ]]; then
84     JAVA_OPT="{JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
85     JAVA_OPT="{JAVA_OPT} -Dnacos.standalone=true"
86 else
87     JAVA_OPT="{JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
88     JAVA_OPT="{JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath={BASE_DIR    }/logs/java_heapdump.hprof"
89     JAVA_OPT="{JAVA_OPT} -XX:-UseLargePages"
90     JAVA_OPT="{JAVA_OPT} -DServer.port={PORT}"
### 将cluster.conf中配置的ip地址加上
91     JAVA_OPT="{JAVA_OPT} -Dnacos.server.ip=192.168.91.1"
92 fi

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/nacos%e9%9b%86%e7%be%a4%e6%90%ad%e5%bb%ba%e5%ae%9e%e6%93%8d/

发表评论

电子邮件地址不会被公开。