0%

手动安装Nacos集群

因最近要上微服务,采用spring-cloud-alibaba,组件如下:

https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md

Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。

Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。

Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。

Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。

Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。

Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

更多组件请参考 Roadmap

最近先上Nacos,这里记录一下笔记。

官网:https://nacos.io/

GitHub:https://github.com/alibaba/nacos

DockerHub:https://hub.docker.com/r/nacos/nacos-server

Docker:https://github.com/nacos-group/nacos-docker

Nacos On Kubernetes:https://github.com/nacos-group/nacos-k8s

Nacos 简介

具体请参考:https://nacos.io/zh-cn/docs/what-is-nacos.html

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

服务(Service)是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:

Kubernetes Service

gRPC & Dubbo RPC Service

Spring Cloud RESTful Service

Nacos 的关键特性包括:

关键特性

  • 服务发现和服务健康监测
  • 动态配置服务
  • 动态 DNS 服务
  • 服务及其元数据管理

Nacos地图

Nacos生态圈

Nacos架构

https://nacos.io/zh-cn/docs/architecture.html

Nacos部署

环境说明:

  • EC2主机Amazon Linux 2 AMI,本身是基于CentOS 7的。
  • Oracle Java 1.8.0
  • Nacos 1.1.4

前提依赖

依赖java环境:

最快速的方式yum安装openjdk:

$ sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel -y

这里以Oracle Java为例:

下载:

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

安装:

$ tar xf jdk-8u231-linux-x64.tar.gz -C /usr/local
$ ln -s /usr/local/jdk1.8.0_231 /usr/local/java
$ ll /usr/local/
total 0
drwxr-xr-x 1 root root 512 Nov 8 14:16 bin/
drwxr-xr-x 1 root root 512 May 21 2019 etc/
drwxr-xr-x 1 root root 512 May 21 2019 games/
drwxr-xr-x 1 root root 512 May 21 2019 include/
lrwxrwxrwx 1 root root 23 Dec 3 16:37 java -> /usr/local/jdk1.8.0_231/
drwxr-xr-x 1 uucp 143 512 Oct 5 18:13 jdk1.8.0_231/
drwxr-xr-x 1 root root 512 May 21 2019 lib/
lrwxrwxrwx 1 root root 9 May 21 2019 man -> share/man/
drwxr-xr-x 1 root root 512 May 21 2019 sbin/
drwxr-xr-x 1 root root 512 May 21 2019 share/
drwxr-xr-x 1 root root 512 May 21 2019 src/

配置环境变量:

$ sudo vim /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar

应用:

$ source /etc/profile

测试:

$ java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)

单机测试模式 - Derby DB

下载并安装Nacos:

地址:https://github.com/alibaba/nacos/releases

$ wget -c "https://github.com/alibaba/nacos/releases/download/1.1.4/nacos-server-1.1.4.tar.gz"
$ tar xf nacos-server-1.1.4.tar.gz -C /usr/local
$ mv /usr/local/nacos /usr/local/nacos-server-1.1.4
$ ln -s /usr/local/nacos-server-1.1.4 /usr/local/nacos

目录结构:

$ tree
.
├── bin
│   ├── shutdown.cmd
│   ├── shutdown.sh
│   ├── startup.cmd
│   └── startup.sh
├── conf
│   ├── application.properties # nacos 主配置文件
│   ├── application.properties.example
│   ├── cluster.conf.example # 去掉.example,是nacos集群的配置,只需要吧Nacos集群的IP:PORT 写入这个文件即可
│   ├── nacos-logback.xml # logback日志配置
│   ├── nacos-mysql.sql # 使用mysql 数据库,需要导入这个文件
│   └── schema.sql
├── LICENSE
├── NOTICE
└── target
└── nacos-server.jar # nacos核心jar包

3 directories, 13 files

配置

Nacos默认使用嵌入式数据库Derby,在单机测试默认下基本上无需任何的配置;如果所在机器有内网网卡和公网网卡的,建议配置Nacos使用的网卡和IP地址:

参考:https://nacos.io/zh-cn/docs/deployment.html

配置如下:

$ echo "nacos.inetutils.use-only-site-local-interfaces=true" >> /usr/local/nacos/config/application.properties

启动

$ cd /usr/local/nacos
$ ./bin/startup.sh -m standalone

查看进程以及监听端口(默认:8848):

$ ps -ef|grep nacos
microoak 25827 1 0 Nov19 ? 00:52:16 /usr/local/java/bin/java -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Djava.ext.dirs=/usr/local/java/jre/lib/ext:/usr/local/java/lib/ext:/usr/local/nacos/plugins/cmdb:/usr/local/nacos/plugins/mysql -Xloggc:/usr/local/nacos/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Dnacos.home=/opt/microoak/nacos -Dloader.path=/usr/local/nacos/plugins/health -jar /usr/local/nacos/target/nacos-server.jar --spring.config.location=classpath:/,classpath:/config/,file:./,file:./config/,file:/usr/local/nacos/conf/ --logging.config=/usr/local/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288 nacos.nacos

$ netstat -lnutp|grep 8848
tcp6 0 0 :::8848 :::* LISTEN 25827/java

此时的目录结构:

$ tree
.
├── bin
│   ├── shutdown.cmd
│   ├── shutdown.sh
│   ├── startup.cmd
│   └── startup.sh
├── conf
│   ├── application.properties
│   ├── application.properties.example
│   ├── cluster.conf.example
│   ├── nacos-logback.xml
│   ├── nacos-mysql.sql
│   └── schema.sql
├── data # 新生成的数据目录
│   ├── derby-data #derby数据库目录
│   │   ├── dbex.lck
│   │   ├── db.lck
│   │   ├── log
│   │   │   ├── log1.dat
│   │   │   ├── log.ctrl
│   │   │   ├── logmirror.ctrl
│   │   │   └── README_DO_NOT_TOUCH_FILES.txt
│   │   ├── README_DO_NOT_TOUCH_FILES.txt
│   │   ├── seg0
│   │   │   ├── c101.dat
│   │   │   ├── ...... # 省略
│   │   │   ├── cf0.dat
│   │   │   └── README_DO_NOT_TOUCH_FILES.txt
│   │   ├── service.properties
│   │   └── tmp
│   └── naming
│   ├── data
│   └── meta.properties
├── derby.log
├── LICENSE
├── logs # 新生成的日志目录
│   ├── access_log.2019-12-03.log
│   ├── cmdb-main.log
│   ├── config-client-request.log
│   ├── config-dump.log
│   ├── config-fatal.log
│   ├── config-memory.log
│   ├── config-notify.log
│   ├── config-pull-check.log
│   ├── config-pull.log
│   ├── config-server.log
│   ├── config-trace.log
│   ├── istio-main.log
│   ├── nacos-address.log
│   ├── nacos_gc.log.0.current
│   ├── nacos.log
│   ├── naming-distro.log
│   ├── naming-event.log
│   ├── naming-performance.log
│   ├── naming-push.log
│   ├── naming-raft.log
│   ├── naming-rt.log
│   ├── naming-server.log
│   └── start.out
├── NOTICE
├── target
│   └── nacos-server.jar
└── work # 新生成
└── Tomcat
└── localhost
└── nacos

15 directories, 165 files

单机测试模式 - Mysql DB

配置

在单机模式的时候也是可以使用Mysql的,配置如下:

# 指定使用内网IP
nacos.inetutils.use-only-site-local-interfaces=true

# 编辑配置文件config/application.properties,增加如下配置:
# 这里指定了db.num是指2个数据库,db.url.0为主库,db.url.1为从库,官方建议使用2个数据库的主从模式。
spring.datasource.platform=mysql # 指定数据库类型为mysql
db.num=2
db.url.0=jdbc:mysql://x.x.x.x:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.url.1=jdbc:mysql://y.y.y.y:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos
db.password=password

# 如果你只有一台数据库,需要指定如下:
spring.datasource.platform=mysql # 指定数据库类型为mysql
db.num=1
db.url.0=jdbc:mysql://x.x.x.x:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos
db.password=password

导入数据库

首先创建名称为:nacos的数据库:

CREATE DATABASE `nacos` DEFAULT CHARACTER SET utf8mb4;

创建用户,并授权给nacos数据库读写权限:

CREATE USER 'nacos'@'%' IDENTIFIED BY 'password'; # 创建账户nacos,密码password,可以从任意主机登陆。
GRANT ALL ON nacos.* TO 'nacos'@'%'; # 授权nacos用户能够对nacos数据库有所有权。

导入数据:

数据文件位置:config/nacos-mysql.sql

$ cd /usr/local/nacos/config
$ mysql -hx.x.x.x -unacos -ppassword nacos < nacos-mysql.sql
$ mysql -hx.x.x.x -unacos -ppassword nacos
MySQL [nacos]> show tables;
+----------------------+
| Tables_in_nacos |
+----------------------+
| config_info |
| config_info_aggr |
| config_info_beta |
| config_info_tag |
| config_tags_relation |
| group_capacity |
| his_config_info |
| roles |
| tenant_capacity |
| tenant_info |
| users |
+----------------------+
11 rows in set (0.00 sec)

启动

启动方式同Derby数据库:

$ cd /usr/local/nacos
$ ./bin/startup.sh -m standalone

此时的目录结构:

$ tree
.
├── bin
│   ├── shutdown.cmd
│   ├── shutdown.sh
│   ├── startup.cmd
│   └── startup.sh
├── conf
│   ├── application.properties
│   ├── application.properties.example
│   ├── cluster.conf.example
│   ├── nacos-logback.xml
│   ├── nacos-mysql.sql
│   └── schema.sql
├── data # 已经没有了Derby数据库文件
│   └── naming
│   ├── data
│   └── meta.properties
├── derby.log
├── LICENSE
├── logs
│   ├── access_log.2019-12-03.log
│   ├── cmdb-main.log
│   ├── config-client-request.log
│   ├── config-dump.log
│   ├── config-fatal.log
│   ├── config-memory.log
│   ├── config-notify.log
│   ├── config-pull-check.log
│   ├── config-pull.log
│   ├── config-server.log
│   ├── config-trace.log
│   ├── istio-main.log
│   ├── nacos-address.log
│   ├── nacos_gc.log.0.current
│   ├── nacos.log
│   ├── naming-distro.log
│   ├── naming-event.log
│   ├── naming-performance.log
│   ├── naming-push.log
│   ├── naming-raft.log
│   ├── naming-rt.log
│   ├── naming-server.log
│   └── start.out
├── NOTICE
├── target
│   └── nacos-server.jar
└── work
└── Tomcat
└── localhost
└── nacos

11 directories, 38 files

高可用集群模式

环境说明:三台机器组成的Nacos集群

IP Nacos Port 说明
172.16.30.18 8848 nacos 节点1
172.16.31.84 8848 nacos 节点2
172.16.32.40 8848 nacos 节点3

首先创建数据库所需:

同样的需要导入Mysql数据,参考 导入数据库,这里不再赘述,参考上方。

配置nacos

配置同 单机测试模式-Mysql DB 配置

# 指定使用内网IP
nacos.inetutils.use-only-site-local-interfaces=true

# 编辑配置文件config/application.properties,增加如下配置:
spring.datasource.platform=mysql
db.num=2
db.url.0=jdbc:mysql://x.x.x.x:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.url.1=jdbc:mysql://y.y.y.y:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos
db.password=password

编辑集群配置文件:cluster.conf

# 只需要将所有的nacos节点的IP:PORT,插入到该文件,如下:
$ cd /usr/local/nacos
$ cat > config/cluster.conf <<EOF
172.16.32.40:8848
172.16.31.84:8848
172.16.30.18:8848
EOF

好了,将配置好的两个配置文件cluster.confapplication.properties 拷贝到其他两台上。

配置Nacos JVM

配置地址:bin/startup.sh

默认的JVM配置:

  • 单机模式:-Xms512m -Xmx512m -Xmn256m
  • 集群模式:-server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m

编辑配置文件:bin/startup.sh

vim bin/startup.sh
# 搜索:JVM Configuration,然后更改下面的配置即可:
if [[ "${MODE}" == "standalone" ]]; then
JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
else
JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"

fi

启动Nacos集群

然后分别启动三个节点:注意启动方式,不再加参数。

$ cd /usr/local/nacos
$ ./bin/startup.sh

最后配置LB,分别指向这三台Nacos,我这里是阿里云环境,直接创建SLB即可,自带健康检查。如果你是Bare-metal环境可以是:Lvs + Keepalived 或者 Nginx Http即可。

登陆Nacos Dashboard

默认端口:8848

地址:http://localhost:8848/nacos

默认用户名和密码都是:nacos

登陆:

nacos节点列表:

此时172.16.32.40:8848 为Leader节点,我们停掉它:再次查看节点列表:

此时会触发选举,另一台已经担任了Leader,集群还是可用状态:

然后在启动刚才停止的Nacos节点,查看Nacos节点列表:

因为Leader节点状态是正常的,所以呢,新加的Nacos节点以Follower状态加入集群中。

警告:

虽然访问Nacos Dashboard需要用户名和密码认证。但是当直接访问其OpenAPI接口是不需要认证的

例如:查看当前集群Server节点列表:参考:

https://nacos.io/zh-cn/docs/open-api.html#2.15

$ curl http://x.x.x.x:8848/nacos/v1/ns/operator/servers

则直接输出如下,无需用户名和密码的认证。

{"servers":[{"ip":"172.16.30.18","servePort":8848,"site":"unknown","weight":1,"adWeight":0,"alive":false,"lastRefTime":0,"lastRefTimeStr":null,"key":"172.16.30.18:8848"},{"ip":"172.16.31.84","servePort":8848,"site":"unknown","weight":1,"adWeight":0,"alive":false,"lastRefTime":0,"lastRefTimeStr":null,"key":"172.16.31.84:8848"},{"ip":"172.16.32.40","servePort":8848,"site":"unknown","weight":1,"adWeight":0,"alive":false,"lastRefTime":0,"lastRefTimeStr":null,"key":"172.16.32.40:8848"}]}

例如:查看当前集群leader:参考:

https://nacos.io/zh-cn/docs/open-api.html#2.16

$ curl http://x.x.x.x:8848/nacos/v1/ns/raft/leader

直接输出如下:

{"leader":"{\"heartbeatDueMs\":3500,\"ip\":\"172.16.30.18:8848\",\"leaderDueMs\":14872,\"state\":\"LEADER\",\"term\":3,\"voteFor\":\"172.16.30.18:8848\"}"}

上面都是GET的,这里来个写的,POST方式,注册实例,参考:

https://nacos.io/zh-cn/docs/open-api.html#2.1

$ curl -XPOST 'http://x.x.x.x:8848/nacos/v1/ns/instance?serviceName=test&ip=8.8.8.8&port=53'
ok # 直接返回OK

查看Dashboard:

点击上面test服务的详情:

是不是很恐怖,所以记得一定要通过Nginx或者其他工具将暴露出来的Dashboard加上Basic Auth认证。


本文到这里就结束了,欢迎期待后面的文章。您可以关注下方的公众号二维码,在第一时间查看新文章。

公众号

如有疏忽错误欢迎在留言区评论指正,如果对您有所帮助欢迎点击下方进行打赏。