# Nacos 集群搭建
1. 集群结构图
官方给出的 Nacos 集群图:
其中包含 3 个 nacos 节点,然后一个负载均衡器代理 3 个 Nacos。这里负载均衡器可以使用 nginx。
我们计划的集群结构:
三个 nacos 节点的地址:
节点 | ip | port |
---|---|---|
nacos1 | 192.168.150.1 | 8845 |
nacos2 | 192.168.150.1 | 8846 |
nacos3 | 192.168.150.1 | 8847 |
# 2. 搭建集群
搭建集群的基本步骤:
- 搭建数据库,初始化数据库表结构
- 下载 nacos 安装包
- 配置 nacos
- 启动 nacos 集群
- nginx 反向代理
# 2.1. 初始化数据库
Nacos 默认数据存储在内嵌数据库 Derby 中,不属于生产可用的数据库。
官方推荐的最佳实践是使用带有主从的高可用数据库集群,主从模式的高可用数据库可以参考传智教育的后续高手课程。
这里我们以单点的数据库为例来讲解。
首先新建一个数据库,命名为 nacos,而后导入下面的 SQL:
CREATE TABLE `config_info` ( | |
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', | |
`data_id` varchar(255) NOT NULL COMMENT 'data_id', | |
`group_id` varchar(255) DEFAULT NULL, | |
`content` longtext NOT NULL COMMENT 'content', | |
`md5` varchar(32) DEFAULT NULL COMMENT 'md5', | |
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', | |
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', | |
`src_user` text COMMENT 'source user', | |
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', | |
`app_name` varchar(128) DEFAULT NULL, | |
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', | |
`c_desc` varchar(256) DEFAULT NULL, | |
`c_use` varchar(64) DEFAULT NULL, | |
`effect` varchar(64) DEFAULT NULL, | |
`type` varchar(64) DEFAULT NULL, | |
`c_schema` text, | |
PRIMARY KEY (`id`), | |
UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) | |
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info'; | |
/******************************************/ | |
/* 数据库全名 = nacos_config */ | |
/* 表名称 = config_info_aggr */ | |
/******************************************/ | |
CREATE TABLE `config_info_aggr` ( | |
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', | |
`data_id` varchar(255) NOT NULL COMMENT 'data_id', | |
`group_id` varchar(255) NOT NULL COMMENT 'group_id', | |
`datum_id` varchar(255) NOT NULL COMMENT 'datum_id', | |
`content` longtext NOT NULL COMMENT '内容', | |
`gmt_modified` datetime NOT NULL COMMENT '修改时间', | |
`app_name` varchar(128) DEFAULT NULL, | |
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', | |
PRIMARY KEY (`id`), | |
UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`) | |
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段'; | |
/******************************************/ | |
/* 数据库全名 = nacos_config */ | |
/* 表名称 = config_info_beta */ | |
/******************************************/ | |
CREATE TABLE `config_info_beta` ( | |
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', | |
`data_id` varchar(255) NOT NULL COMMENT 'data_id', | |
`group_id` varchar(128) NOT NULL COMMENT 'group_id', | |
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', | |
`content` longtext NOT NULL COMMENT 'content', | |
`beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps', | |
`md5` varchar(32) DEFAULT NULL COMMENT 'md5', | |
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', | |
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', | |
`src_user` text COMMENT 'source user', | |
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', | |
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', | |
PRIMARY KEY (`id`), | |
UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) | |
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta'; | |
/******************************************/ | |
/* 数据库全名 = nacos_config */ | |
/* 表名称 = config_info_tag */ | |
/******************************************/ | |
CREATE TABLE `config_info_tag` ( | |
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', | |
`data_id` varchar(255) NOT NULL COMMENT 'data_id', | |
`group_id` varchar(128) NOT NULL COMMENT 'group_id', | |
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', | |
`tag_id` varchar(128) NOT NULL COMMENT 'tag_id', | |
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', | |
`content` longtext NOT NULL COMMENT 'content', | |
`md5` varchar(32) DEFAULT NULL COMMENT 'md5', | |
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', | |
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', | |
`src_user` text COMMENT 'source user', | |
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip', | |
PRIMARY KEY (`id`), | |
UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`) | |
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag'; | |
/******************************************/ | |
/* 数据库全名 = nacos_config */ | |
/* 表名称 = config_tags_relation */ | |
/******************************************/ | |
CREATE TABLE `config_tags_relation` ( | |
`id` bigint(20) NOT NULL COMMENT 'id', | |
`tag_name` varchar(128) NOT NULL COMMENT 'tag_name', | |
`tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type', | |
`data_id` varchar(255) NOT NULL COMMENT 'data_id', | |
`group_id` varchar(128) NOT NULL COMMENT 'group_id', | |
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id', | |
`nid` bigint(20) NOT NULL AUTO_INCREMENT, | |
PRIMARY KEY (`nid`), | |
UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`), | |
KEY `idx_tenant_id` (`tenant_id`) | |
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation'; | |
/******************************************/ | |
/* 数据库全名 = nacos_config */ | |
/* 表名称 = group_capacity */ | |
/******************************************/ | |
CREATE TABLE `group_capacity` ( | |
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', | |
`group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群', | |
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', | |
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', | |
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', | |
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值', | |
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', | |
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', | |
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', | |
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', | |
PRIMARY KEY (`id`), | |
UNIQUE KEY `uk_group_id` (`group_id`) | |
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表'; | |
/******************************************/ | |
/* 数据库全名 = nacos_config */ | |
/* 表名称 = his_config_info */ | |
/******************************************/ | |
CREATE TABLE `his_config_info` ( | |
`id` bigint(64) unsigned NOT NULL, | |
`nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT, | |
`data_id` varchar(255) NOT NULL, | |
`group_id` varchar(128) NOT NULL, | |
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name', | |
`content` longtext NOT NULL, | |
`md5` varchar(32) DEFAULT NULL, | |
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
`src_user` text, | |
`src_ip` varchar(50) DEFAULT NULL, | |
`op_type` char(10) DEFAULT NULL, | |
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', | |
PRIMARY KEY (`nid`), | |
KEY `idx_gmt_create` (`gmt_create`), | |
KEY `idx_gmt_modified` (`gmt_modified`), | |
KEY `idx_did` (`data_id`) | |
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造'; | |
/******************************************/ | |
/* 数据库全名 = nacos_config */ | |
/* 表名称 = tenant_capacity */ | |
/******************************************/ | |
CREATE TABLE `tenant_capacity` ( | |
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', | |
`tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID', | |
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', | |
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', | |
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', | |
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数', | |
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', | |
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', | |
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', | |
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', | |
PRIMARY KEY (`id`), | |
UNIQUE KEY `uk_tenant_id` (`tenant_id`) | |
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表'; | |
CREATE TABLE `tenant_info` ( | |
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', | |
`kp` varchar(128) NOT NULL COMMENT 'kp', | |
`tenant_id` varchar(128) default '' COMMENT 'tenant_id', | |
`tenant_name` varchar(128) default '' COMMENT 'tenant_name', | |
`tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc', | |
`create_source` varchar(32) DEFAULT NULL COMMENT 'create_source', | |
`gmt_create` bigint(20) NOT NULL COMMENT '创建时间', | |
`gmt_modified` bigint(20) NOT NULL COMMENT '修改时间', | |
PRIMARY KEY (`id`), | |
UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`), | |
KEY `idx_tenant_id` (`tenant_id`) | |
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info'; | |
CREATE TABLE `users` ( | |
`username` varchar(50) NOT NULL PRIMARY KEY, | |
`password` varchar(500) NOT NULL, | |
`enabled` boolean NOT NULL | |
); | |
CREATE TABLE `roles` ( | |
`username` varchar(50) NOT NULL, | |
`role` varchar(50) NOT NULL, | |
UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE | |
); | |
CREATE TABLE `permissions` ( | |
`role` varchar(50) NOT NULL, | |
`resource` varchar(255) NOT NULL, | |
`action` varchar(8) NOT NULL, | |
UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE | |
); | |
INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE); | |
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN'); |
# 2.2. 下载 nacos
nacos 在 GitHub 上有下载地址:https://github.com/alibaba/nacos/tags,可以选择任意版本下载。
本例中才用 1.4.1 版本:
# 2.3. 配置 Nacos
将这个包解压到任意非中文目录下,如图:
目录说明:
- bin:启动脚本
- conf:配置文件
进入 nacos 的 conf 目录,修改配置文件 cluster.conf.example,重命名为 cluster.conf:
然后添加内容:
集群中每一个节点的信息
如果是在生产环境下那下面三个都应该是真实机器的 ip 地址和端口号
127.0.0.1:8845
127.0.0.1.8846
127.0.0.1.8847
然后修改 application.properties 文件,添加数据库配置
将配置文件中如下的配置的注释全部去掉也就是打开
spring.datasource.platform=mysql | |
db.num=1 | |
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC | |
db.user.0=root | |
db.password.0=123 |
# 2.4. 启动
将 nacos 文件夹复制三份,分别命名为:nacos1、nacos2、nacos3
然后分别修改三个文件夹中的 application.properties,
nacos1:
server.port=8845 |
nacos2:
server.port=8846 |
nacos3:
server.port=8847 |
然后分别启动三个 nacos 节点:
<font color='red'> 注意 </font>:此时启动不需要加参数了,直接启动即可。因为现在是集群启动 (默认)
startup.cmd
然后依次访问一下 url 看看是否正常启动了
正常启动了!
# 2.5.nginx 反向代理
找到课前资料提供的 nginx 安装包:
解压到任意非中文目录下:
修改 conf/nginx.conf 文件,配置如下:
http { | |
upstream nacos-cluster { | |
server 127.0.0.1:8845; | |
server 127.0.0.1:8846; | |
server 127.0.0.1:8847; | |
} | |
server { | |
listen 80; | |
server_name localhost; | |
location /nacos { | |
proxy_pass http://nacos-cluster; | |
} | |
} | |
} |
完整的配置文件信息:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 88;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
upstream nacos-cluster {
server 127.0.0.1:8845;
server 127.0.0.1:8846;
server 127.0.0.1:8847;
}
server {
listen 80;
server_name localhost;
location /nacos {
proxy_pass http://nacos-cluster;
}
}
}
配置完成后启动 nginx,执行命令:start nginx.exe
访问:http://localhost:88 / 查看是否能正常访问
nginx 启动成功!
而后在浏览器访问:http://localhost/nacos 即可。
到这儿!集群搭建就成功了。看着像是访问的一个 nacos,事实上它会在三个 nacos 之间做一个负载均衡
问题来了,java 代码该如何配呢,在 java 的 yml 配置文件中将 nacos 的服务地址改为对应的端口也就是 80 端口
代码中 bootstrap.yml 文件配置如下:
spring: | |
application: | |
name: userservice # 服务名称 | |
profiles: | |
active: dev # 环境 | |
cloud: | |
nacos: | |
server-addr: localhost:80 # nacos 地址,这里找的是 nginx 反向代理的地址它会根据负载均衡来启动 nacos | |
config: | |
file-extension: yaml # 配置文件后缀名 | |
# 三要素:服务名称,环境,后缀名 而这三个决定了 DateId |
启动 user-service 服务
我们查看 nacos 控制台中的服务列表。
可以看到成功的注册进来了。
我们创建一个配置文件,点击发布
发布后查看数据库中的 config_info 表里面的信息,就可以看到多了一条信息就是创建的环境配置文件的信息
总结:
集群搭建步骤:
- 搭建 MySQL 集群并初始化数据库表
- 下载解压 nacos
- 修改集群配置 (节点信息),数据库配置
- 分别启动多个 nacos 节点
- nginx 反向代理
# 2.6. 优化
实际部署时,需要给做反向代理的 nginx 服务器设置一个域名,这样后续如果有服务器迁移 nacos 的客户端也无需更改配置.
Nacos 的各个节点应该部署到多个不同服务器,做好容灾和隔离