Nacos集群架构说明(重要)

官网说明

官网

Nacos的单节点,也就是我们最开始使用的standalone模式,配置的数据是默认存储到内嵌的数据库derby中。

如果我们要搭建集群的话,那么肯定是不能用内嵌的数据库,不然数据无法共享。集群搭建的时候我们需要将Nacos对接Mysql进行数据存储。

集群模式跟我们平时进行扩容是一样的,可以通过Nginx转发到多个节点,最前面挂一个域名即可,如下图:

官网架构图(写的(┬_┬))

1610803439836.png

上图官网翻译,真实情况

1610803439871.png

说明

1610803439932.png

1610803439999.png

再以单机模式启动 nacos, nacos所有写嵌入式数据库的数据都写到了mysql

Nacos持久化配置解释(重要)

Nacos默认自带的是嵌入式数据库derby:[https://github.com/alibaba/nacos/blob/develop/config/pom.xml](https://github.com/alibaba/nacos/blob/develop/config/pom.xml)

derby到mysql切换配置步骤

在nacos\conf目录下找到sql脚本 nacos-mysql.sql

配置文件官网

在数据库中执行脚本

  1. /*
  2. * Copyright 1999-2018 Alibaba Group Holding Ltd.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. /******************************************/
  17. /* 数据库全名 = nacos_config */
  18. /* 表名称 = config_info */
  19. /******************************************/
  20. CREATE TABLE `config_info` (
  21. `id` bigint(http://img.itvip666.com/group1/M00/00/07/wKgB_F-eHI2APRVCAAEAtFB6Uec161.png) NOT NULL AUTO_INCREMENT COMMENT 'id',
  22. `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  23. `group_id` varchar(255) DEFAULT NULL,
  24. `content` longtext NOT NULL COMMENT 'content',
  25. `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  26. `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  27. `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  28. `src_user` text COMMENT 'source user',
  29. `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
  30. `app_name` varchar(128) DEFAULT NULL,
  31. `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  32. `c_desc` varchar(256) DEFAULT NULL,
  33. `c_use` varchar(64) DEFAULT NULL,
  34. `effect` varchar(64) DEFAULT NULL,
  35. `type` varchar(64) DEFAULT NULL,
  36. `c_schema` text,
  37. PRIMARY KEY (`id`),
  38. UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
  39. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
  40. /******************************************/
  41. /* 数据库全名 = nacos_config */
  42. /* 表名称 = config_info_aggr */
  43. /******************************************/
  44. CREATE TABLE `config_info_aggr` (
  45. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  46. `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  47. `group_id` varchar(255) NOT NULL COMMENT 'group_id',
  48. `datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
  49. `content` longtext NOT NULL COMMENT '内容',
  50. `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  51. `app_name` varchar(128) DEFAULT NULL,
  52. `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  53. PRIMARY KEY (`id`),
  54. UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
  55. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';
  56. /******************************************/
  57. /* 数据库全名 = nacos_config */
  58. /* 表名称 = config_info_beta */
  59. /******************************************/
  60. CREATE TABLE `config_info_beta` (
  61. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  62. `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  63. `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  64. `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  65. `content` longtext NOT NULL COMMENT 'content',
  66. `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
  67. `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  68. `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  69. `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  70. `src_user` text COMMENT 'source user',
  71. `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
  72. `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  73. PRIMARY KEY (`id`),
  74. UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
  75. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';
  76. /******************************************/
  77. /* 数据库全名 = nacos_config */
  78. /* 表名称 = config_info_tag */
  79. /******************************************/
  80. CREATE TABLE `config_info_tag` (
  81. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  82. `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  83. `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  84. `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  85. `tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
  86. `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  87. `content` longtext NOT NULL COMMENT 'content',
  88. `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  89. `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  90. `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  91. `src_user` text COMMENT 'source user',
  92. `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
  93. PRIMARY KEY (`id`),
  94. UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
  95. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';
  96. /******************************************/
  97. /* 数据库全名 = nacos_config */
  98. /* 表名称 = config_tags_relation */
  99. /******************************************/
  100. CREATE TABLE `config_tags_relation` (
  101. `id` bigint(20) NOT NULL COMMENT 'id',
  102. `tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
  103. `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
  104. `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  105. `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  106. `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  107. `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  108. PRIMARY KEY (`nid`),
  109. UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
  110. KEY `idx_tenant_id` (`tenant_id`)
  111. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';
  112. /******************************************/
  113. /* 数据库全名 = nacos_config */
  114. /* 表名称 = group_capacity */
  115. /******************************************/
  116. CREATE TABLE `group_capacity` (
  117. `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  118. `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
  119. `quota` int(http://img.itvip666.com/group1/M00/00/07/wKgB_F-eHBKAdHLRAABsMG33lYk051.png) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  120. `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  121. `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  122. `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
  123. `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  124. `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  125. `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  126. `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  127. PRIMARY KEY (`id`),
  128. UNIQUE KEY `uk_group_id` (`group_id`)
  129. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';
  130. /******************************************/
  131. /* 数据库全名 = nacos_config */
  132. /* 表名称 = his_config_info */
  133. /******************************************/
  134. CREATE TABLE `his_config_info` (
  135. `id` bigint(64) unsigned NOT NULL,
  136. `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  137. `data_id` varchar(255) NOT NULL,
  138. `group_id` varchar(128) NOT NULL,
  139. `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  140. `content` longtext NOT NULL,
  141. `md5` varchar(32) DEFAULT NULL,
  142. `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  143. `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  144. `src_user` text,
  145. `src_ip` varchar(20) DEFAULT NULL,
  146. `op_type` char(10) DEFAULT NULL,
  147. `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  148. PRIMARY KEY (`nid`),
  149. KEY `idx_gmt_create` (`gmt_create`),
  150. KEY `idx_gmt_modified` (`gmt_modified`),
  151. KEY `idx_did` (`data_id`)
  152. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';
  153. /******************************************/
  154. /* 数据库全名 = nacos_config */
  155. /* 表名称 = tenant_capacity */
  156. /******************************************/
  157. CREATE TABLE `tenant_capacity` (
  158. `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  159. `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
  160. `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  161. `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  162. `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  163. `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
  164. `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  165. `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  166. `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  167. `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  168. PRIMARY KEY (`id`),
  169. UNIQUE KEY `uk_tenant_id` (`tenant_id`)
  170. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';
  171. CREATE TABLE `tenant_info` (
  172. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  173. `kp` varchar(128) NOT NULL COMMENT 'kp',
  174. `tenant_id` varchar(128) default '' COMMENT 'tenant_id',
  175. `tenant_name` varchar(128) default '' COMMENT 'tenant_name',
  176. `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
  177. `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
  178. `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
  179. `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
  180. PRIMARY KEY (`id`),
  181. UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
  182. KEY `idx_tenant_id` (`tenant_id`)
  183. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';
  184. CREATE TABLE `users` (
  185. `username` varchar(50) NOT NULL PRIMARY KEY,
  186. `password` varchar(500) NOT NULL,
  187. `enabled` boolean NOT NULL
  188. );
  189. CREATE TABLE `roles` (
  190. `username` varchar(50) NOT NULL,
  191. `role` varchar(50) NOT NULL,
  192. UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
  193. );
  194. CREATE TABLE `permissions` (
  195. `role` varchar(50) NOT NULL,
  196. `resource` varchar(255) NOT NULL,
  197. `action` varchar(http://img.itvip666.com/group1/M00/00/07/wKgB_F-eG-6Ac6_4AAAMyCmJGmM917.png) NOT NULL,
  198. UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
  199. );
  200. INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
  201. INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

启动nacos

启动nacos,可以看到是个全新的空记录界面,以前是记录进derby

Linux 安装nacos

预计需要,1个nginx+3个nacos注册中心+1个mysql

下载地址

解压后安装

tar -zxvf nacos-server-1.3.1.tar.gz

1610803440039.png

nacos开机启动配置

安装完成nacos后进行配置开机启动。

  1. 编写开机启动文件
  2. 文件内容如下:
[Unit]
Description=nacos
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nacos/nacos8848/bin/startup.sh -m standalone
ExecReload=/usr/local/nacos/nacos8848/bin/shutdown.sh
ExecStop=/usr/local/nacos/nacos8848/bin/shutdown.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

其中/usr/local/nacos/nacos8848为本机安装的nacos文件路径,-m standalone表示作为单机启动,不加的话表示集群启动,目前先作为单机启动。

  1. 设置开机启动
systemctl daemon-reload        #先进行文件生效配置
systemctl enable nacos.service #设置为开机启动
systemctl start nacos.service  #启动nacos服务
systemctl stop nacos.service
  1. 启动并查看是否成功

启动成功后进行查看:systemctl status nacos.service

启动遇到的问题

java路径配置不正确

1610803440070.png

因为sh文件下的java路径与本机安装的java文件路径不符合,所以要对startup.sh文件进行修改。

1610803440109.png

权限不足

将 /opt/nacos 替换成自己的nacos的安装目录

1610803440138.png

执行以下命令添加777权限:

chmod 777 /opt/nacos/bin/startup.sh

Linux服务器上mysql数据库配置

在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:

  1. 安装数据库,版本要求:5.6.5+
  2. 初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
  3. 修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://192.168.1.108:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=suiyueran
db.password=SRNDxrhc=1314

再以单机模式启动nacos,nacos所有写嵌入式数据库的数据都写到了mysql

sh startup.sh -m standalone

Linux nacos的集群配置cluster.conf

梳理出3台nacos机器的不同服务端口号

复制出cluster.conf

以后我们就修改cluster.conf

1610803440176.png

内容

#it is ip
#example
192.168.168.108:8847
192.168.168.108:8848
192.168.168.108:8846

1610803440217.png

注意事项

这个IP不能写127.0.0.1,必须是Linux命令hostname -i能够识别的IP

1610803440276.png

复制出两份nacos

通常如果我们只是为了体验的话直接在本地起动3个实例就可以了,没必要真的去搞三台服务器,下面我们就以在本地的方式来搭建集群。

将Nacos的解压包复制分成3份,分别是:

1610803440335.png

修改nacos8847和nacos8846端口号

其他2个实例的端口我们需要进行修改,比如nacos8847修改成 8847,nacos8846修改成 8846。

1610803440380.png

启动集群并测试

到每个节点 bin 目录下 执行sh startup.sh

分别访问
http://192.168.1.108:8846/nacos/#/login
http://192.168.1.108:8847/nacos/#/login
http://192.168.1.108:8848/nacos/#/login

如果出现如下界面证明搭建成功

1610803440418.png

Nginx的配置,由它作为负载均衡器

nginx.conf

upstream cluster {
    server 127.0.0.1:8848;
    server 127.0.0.1:8847;
    server 127.0.0.1:8846;
}   
server {
    listen       1111;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        #root   html;
        #index  index.html index.htm;
        proxy_pass http://cluster;
    }
}

启动nginx

到sbin目录下执行./nginx

使用浏览器访问:http://192.168.1.108:1111/nacos/#/login

如果出现如下界面证明,集群搭建成功

1610803440455.png

新建一个配置文件测试

1610803440480.png

查看mysql数据库

1610803440517.png

集群综合测试

修改cloudalibaba-provider-payment9002

pom

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--nacos-config-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

配置文件

创建一个application.yaml

server:
  port: 9002
spring:
  application:
    name: nacos-payment-provider

management:
  endpoints:
    web:
      exposure:
        include: "*"

创建bootstrap.yaml

spring:
  cloud:
    nacos:
      discovery:
        #Nacos注册中心地址
        server-addr: 192.168.1.108:1111 #,127.0.0.1:8849,127.0.0.1:8850
        enabled: true
      config:
        #Nacos配置中心地址
#        server-addr: 127.0.0.1:8848 #,127.0.0.1:8849,127.0.0.1:8850
        server-addr: 192.168.1.108:1111 # nacos集群搭建 的nginx入口
        #分组选择
        group: DEV_GROUP
        #类型(默认加载.properties),默认指定查找nacos-config.yml
        file-extension: yaml
        # 命名空间id
        namespace: dev-id

  #读取环境配置,指定环境后,还会加载nacos-config-dev.yml文件
  profiles:
    #    active: info
    #   active: test # 测试环境配置文件
    active: dev # 开发环境配置文件

1610803440547.png

主启动类

@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderMain9002 {
    public static void main(String[] args) {
        SpringApplication.run(NacosProviderMain9002.class,args);
    }
}

业务类

@RestController
@RefreshScope  // spirngboot原生注解,实现自动刷新
public class TestController {

    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo() {
        return configInfo;
    }
}

在nacos中创建命名空间和配置文件

创建命名空间

1610803440578.png

创建nacos-payment-provider-dev.yaml配置文件

1610803440606.png

1610803440639.png

测试

启动cloudalibaba-provider-payment9002

使用浏览器访问 http://127.0.0.1:9002/config/info

1610803440667.png

在nacos中修改配置文件并发布

1610803440689.png

再次使用浏览器访问 http://127.0.0.1:9002/config/info

1610803440720.png

高可用小总结

1610803440777.png