SpringCloud 从入门到精通 13---Nacos 集群搭建
Nacos的集群文档可以直接参考官网,本节,我们在官网的基础上,进行适当的调整来搭建Nacos集群.这里我们采用docker-compose进行集群环境的搭建,没有安装docker-compose的请自行百度.
因为Nacos需要持久化配置,之前采用docker部署的nacos使用的是内建的derby数据库,集群环境下derby就不能满足我们的需求了,所以在搭建nacos 集群之前,需要自己准备mysql数据库,并且创建nacos的数据库,创建nacos 数据表,sql内容如下
/* * Copyright 1999-2018 Alibaba Group Holding Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */
/******************************************//*   数据库全名 = nacos_config   *//*   表名称 = config_info   *//******************************************/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');然后准备一份nacos-cluster.yml的配置文件
version: '3' services:  nacos1:    image: nacos/nacos-server:latest    container_name: nacos1    ports:      - "8848:8848"      - "9555:9555"    restart: always    environment:      PREFER_HOST_MODE: ip #如果支持主机名可以使用hostname,否则使用ip,默认也是ip      SPRING_DATASOURCE_PLATFORM: mysql #数据源平台 仅支持mysql或不保存empty#      NACOS_SERVER_IP: 127.0.0.1 #多网卡情况下,指定ip或网卡      NACOS_SERVERS: nacos1:8848 nacos2:8848 nacos3:8848 #集群中其它节点[ip1:port ip2:port ip3:port]      MYSQL_SERVICE_HOST: 192.168.2.162      MYSQL_SERVICE_PORT: 3306      MYSQL_SERVICE_DB_NAME: nacos      MYSQL_SERVICE_USER: root      MYSQL_SERVICE_PASSWORD: b5c0f98553507347461ae6ffe4f907d9      #JVM调优参数      JVM_XMS: 512M      JVM_XMX: 512M      JVM_XMN: 512M    volumes:      - ~/mydata/nacos1/cluster-logs/nacos1:/home/nacos/logs #日志输出目录      - ~/mydata/nacos1/init.d/custom.properties:/home/nacos/init.d/custom.properties #../init.d/custom.properties内包含很多自定义配置,可按需配置
  nacos2:    image: nacos/nacos-server:latest    container_name: nacos2    ports:      - "8849:8848"    restart: always    environment:      PREFER_HOST_MODE: ip #如果支持主机名可以使用hostname,否则使用ip,默认也是ip      SPRING_DATASOURCE_PLATFORM: mysql #数据源平台 仅支持mysql或不保存empty#      NACOS_SERVER_IP: 127.0.0.1 #多网卡情况下,指定ip或网卡      NACOS_SERVERS: nacos1:8848 nacos2:8848 nacos3:8848 #集群中其它节点[ip1:port ip2:port ip3:port]      MYSQL_SERVICE_HOST: 192.168.2.162      MYSQL_SERVICE_PORT: 3306      MYSQL_SERVICE_DB_NAME: nacos      MYSQL_SERVICE_USER: root      MYSQL_SERVICE_PASSWORD: b5c0f98553507347461ae6ffe4f907d9      #JVM调优参数      JVM_XMS: 512M      JVM_XMX: 512M      JVM_XMN: 512M    volumes:      - ~/mydata/nacos2/cluster-logs/nacos2:/home/nacos/logs #日志输出目录      - ~/mydata/nacos2/init.d/custom.properties:/home/nacos/init.d/custom.properties #../init.d/custom.properties内包含很多自定义配置,可按需配置
  nacos3:    image: nacos/nacos-server:latest    container_name: nacos3    ports:      - "8850:8848"    restart: always    environment:      PREFER_HOST_MODE: ip #如果支持主机名可以使用hostname,否则使用ip,默认也是ip      SPRING_DATASOURCE_PLATFORM: mysql #数据源平台 仅支持mysql或不保存empty#      NACOS_SERVER_IP: 127.0.0.1 #多网卡情况下,指定ip或网卡      NACOS_SERVERS: nacos1:8848 nacos2:8848 nacos3:8848 #集群中其它节点[ip1:port ip2:port ip3:port]      MYSQL_SERVICE_HOST: 192.168.2.162      MYSQL_SERVICE_PORT: 3306      MYSQL_SERVICE_DB_NAME: nacos      MYSQL_SERVICE_USER: root      MYSQL_SERVICE_PASSWORD: b5c0f98553507347461ae6ffe4f907d9      #JVM调优参数      JVM_XMS: 512M      JVM_XMX: 512M      JVM_XMN: 512M    volumes:      - ~/mydata/nacos3/cluster-logs/nacos3:/home/nacos/logs #日志输出目录      - ~/mydata/nacos3/init.d/custom.properties:/home/nacos/init.d/custom.properties #../init.d/custom.properties内包含很多自定义配置,可按需配置大致介绍一下,NACOS_SERVICES 选项中,请勿填写 127.0.0.1,因为在 docker 环境下,127.0.0.1 指向的是 docker 容器自身,而不是我要做测试的本地电脑,所以这里大家要把NACOS_SERVICES中的 IP 地址填写为本机的 IP 地址.
然后使用docker-compose -f nacos-cluster.yml -d启动nacos集群
 
 启动之后,分别访问8848 8849 8850查看是否集群下的每个节点都可访问
 
  
  
  
 同时各个nacos节点都可查看到其他节点列表,当然,仅仅这样还不够,在常见的架构中,一般都是通过最前端的Nginx进行转发和负载均衡,那么接下来我们就配置Nginx,首先使用docker启动nginx,这里仅给出nginx的配置和 docker 启动命令
upstream cluster{    server 192.168.2.162:8848;    server 192.168.2.162:8849;    server 192.168.2.162:8850;}server {    listen       80;    server_name  localhost;
    #charset koi8-r;    #access_log  /var/log/nginx/log/host.access.log  main;
    location / {        #root   /usr/share/nginx/html;        #index  index.html index.htm;        proxy_pass http://cluster;    }
    #error_page  404              /404.html;
    # redirect server error pages to the static page /50x.html    #    error_page   500 502 503 504  /50x.html;    location = /50x.html {        root   /usr/share/nginx/html;    }
    # proxy the PHP scripts to Apache listening on 127.0.0.1:80    #    #location ~ \.php$ {    #    proxy_pass   http://127.0.0.1;    #}
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000    #    #location ~ \.php$ {    #    root           html;    #    fastcgi_pass   127.0.0.1:9000;    #    fastcgi_index  index.php;    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;    #    include        fastcgi_params;    #}
    # deny access to .htaccess files, if Apache's document root    # concurs with nginx's one    #    #location ~ /\.ht {    #    deny  all;    #}}这里我们让nginx监听 80 端口,然后将 80端口的访问分发nacos集群的地址,当然,这里我不想使用80端口,只想使用8847访问我的nacos集群,所以只需要在启动 nginx的时候,映射8847端口到nginx的 80端口即可
docker run -p 8847:80 --name nginx \-v ~/mydata/nginx/html:/usr/share/nginx/html \-v ~/mydata/nginx/logs:/var/log/nginx  \-v ~/mydata/nginx/conf:/etc/nginx \-d nginx:1.10等到nginx启动之后,我们就可以通过8847端口访问到nacos集群了,其他的服务都可以通过8847注册到nacos集群中
 
 版权声明: 本文为 InfoQ 作者【Felix】的原创文章。
原文链接:【http://xie.infoq.cn/article/5455d9de09804cb47668a56f8】。文章转载请联系作者。

Felix
还未添加个人签名 2020.12.24 加入
还未添加个人简介











 
    
评论