SpringCloud----nacos配置注册中心基于docker部署

Nacos配置注册中心

  • 一、nacos简介
  • 二、nacos单机部署
    • 2.1、使用嵌入式数据库derby
      • 配置文件
    • 2.2、单机模式支持mysql
      • mysql数据搭建
      • 单机nacos部署
  • 三、nacos集群部署
    • 3.1、mysql主从搭建(基于docker)
      • 配置文件准备
      • 启动mysql主库和从库
      • sql文件导入
    • 3.2、nacos集群搭建
      • 配置文件准备
      • 启动nacos集群
      • 查看集群状态
    • 3.3、nginx高可用配置
      • nginx配置
      • keepalived配置

一、nacos简介

详情见:https://nacos.io/zh-cn/docs/what-is-nacos.html

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

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

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

  • Kubernetes Service
  • gRPC & Dubbo RPC Service
  • Spring Cloud RESTful Service

Nacos的关键特性包括:

  • 服务发现和服务健康监测

    Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。

    Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

  • 动态配置服务

    动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。

    动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。

    配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

    Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

  • 动态 DNS 服务

    动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。

    Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.

  • 服务及其元数据管理

    Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

二、nacos单机部署

2.1、使用嵌入式数据库derby

主机ip:192.168.99.242

配置文件

mkdir -p /root/nacos/config

custom.properties

cat > /root/nacos/config/custom.properties <<-EOF
#spring.security.enabled=false
#management.security=false
#security.basic.enabled=false
#nacos.security.ignore.urls=/**
#management.metrics.export.elastic.host=http://localhost:9200
# metrics for prometheus
management.endpoints.web.exposure.include=*

# metrics for elastic search
#management.metrics.export.elastic.enabled=false
#management.metrics.export.elastic.host=http://localhost:9200

# metrics for influx
#management.metrics.export.influx.enabled=false
#management.metrics.export.influx.db=springboot
#management.metrics.export.influx.uri=http://localhost:8086
#management.metrics.export.influx.auto-create-db=true
#management.metrics.export.influx.consistency=one
#management.metrics.export.influx.compressed=true
EOF

启动命令

docker run -d --name nacos --hostname nacos -p 8848:8848 \
-e PREFER_HOST_MODE=hostname \
-e MODE=standalone \
-v /root/nacos/logs:/home/nacos/logs \
-v /root/nacos/config/custom.properties:/home/nacos/init.d/custom.properties \
nacos/nacos-server:1.1.4

访问:http://192.168.99.242:8848/nacos

用户密码:nacos/nacos

2.2、单机模式支持mysql

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

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

mysql数据搭建

主机ip:192.168.99.242

docker run -d --name mysql-nacos -p 3306:3306 \
-e MYSQL_USER=nacos \
-e MYSQL_PASSWORD=nacos@123456 \
-e MYSQL_DATABASE=nacos \
-e MYSQL_ROOT_PASSWORD=admin@123456 \
-v /root/mysql/data:/var/lib/mysql \
mysql:5.7

去github上下载对应版本的:https://github.com/alibaba/nacos/releases

解压后得到nacos-mysql.sql,导入mysql数据库

nacos-mysql.sql

/******************************************/
/*   数据库全名 = 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 '2010-05-05 00:00:00' COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(20) 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 '2010-05-05 00:00:00' COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(20) 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 '2010-05-05 00:00:00' COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(20) 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 '2010-05-05 00:00:00' COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' 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 '2010-05-05 00:00:00',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00',
  `src_user` text,
  `src_ip` varchar(20) 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 '2010-05-05 00:00:00' COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' 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
);

INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);

INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

单机nacos部署

custom.properties配置如上

环境变量的配置可以见application.properties

# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_SERVER_PORT:8848}
spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:""}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:2}
db.url.0=jdbc:mysql://${MYSQL_MASTER_SERVICE_HOST}:${MYSQL_MASTER_SERVICE_PORT:3306}/${MYSQL_MASTER_SERVICE_DB_NAME}?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.url.1=jdbc:mysql://${MYSQL_SLAVE_SERVICE_HOST}:${MYSQL_SLAVE_SERVICE_PORT:3306}/${MYSQL_MASTER_SERVICE_DB_NAME}?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=${MYSQL_MASTER_SERVICE_USER}
db.password=${MYSQL_MASTER_SERVICE_PASSWORD}
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D
# default current work dir
server.tomcat.basedir=
## spring security config
### turn off security

nacos.security.ignore.urls=/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/login,/v1/console/health/**,/v1/cs/**,/v1/ns/**,/v1/cmdb/**,/actuator/**,/v1/console/server/**
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false

nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true

启动命令

docker run -d --name nacos --hostname nacos -p 8848:8848 \
-e PREFER_HOST_MODE=hostname \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_MASTER_SERVICE_HOST=192.168.99.242 \
-e MYSQL_MASTER_SERVICE_PORT=3306 \
-e MYSQL_MASTER_SERVICE_DB_NAME=nacos \
-e MYSQL_MASTER_SERVICE_USER=nacos \
-e MYSQL_MASTER_SERVICE_PASSWORD=nacos@123456 \
-e MYSQL_DATABASE_NUM=1 \
-v /root/nacos/logs:/home/nacos/logs \
-v /root/nacos/config/custom.properties:/home/nacos/init.d/custom.properties \
nacos/nacos-server:1.1.4

访问:http://192.168.99.242:8848/nacos

用户密码:nacos/nacos

随便创建一个配置,查看数据库config_info表是否存有数据

三、nacos集群部署

虚拟机准备:

主机名 ip 用途
master 192.168.99.240 mysql-master,nacos1,nginx,keepalived
worker1 192.168.99.241 mysql-slave,nacos2,nginx,keepalived
worker2 192.168.99.242 nacos3

3.1、mysql主从搭建(基于docker)

配置文件准备

master,worker1做如下操作:

mkdir -p /root/mysql
docker run -d --name mysql --rm -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
cd /root/mysql
docker cp mysql:/etc/mysql .
mv mysql config
docker stop mysql

config目录结构如下:

config/
├── conf.d
│   ├── docker.cnf
│   ├── mysql.cnf
│   └── mysqldump.cnf
├── my.cnf -> /etc/alternatives/my.cnf
├── my.cnf.fallback
├── mysql.cnf
└── mysql.conf.d
    └── mysqld.cnf

master修改mysql.conf.d目录下的mysqld.cnf配置如下:

cat >> /root/mysql/config/mysql.conf.d/mysqld.cnf <<-EOF
server-id=1
log-bin=/var/lib/mysql/mysql-bin
binlog_format=ROW
gtid_mode=on
enforce_gtid_consistency=on
EOF

worker1修改mysql.conf.d目录下的mysqld.cnf配置如下:

cat >> /root/mysql/config/mysql.conf.d/mysqld.cnf <<-EOF
server-id=2
log-bin=/var/lib/mysql/mysql-bin
binlog_format=ROW
gtid_mode=on
enforce_gtid_consistency=on
EOF

启动mysql主库和从库

主库:

# 启动命令
docker run -d --name mysql-master -p 3306:3306 \
-e MYSQL_USER=nacos \
-e MYSQL_PASSWORD=nacos@123456 \
-e MYSQL_DATABASE=nacos \
-e MYSQL_ROOT_PASSWORD=admin@123456 \
-v /root/mysql/config/:/etc/mysql \
-v /root/mysql/data:/var/lib/mysql \
mysql:5.7

# 验证
[root@master mysql]# docker exec -it mysql-master mysql -unacos -pnacos@123456 -e "show databases;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| nacos              |
+--------------------+

# 创建复制账户
docker exec -it mysql-master mysql -uroot -padmin@123456 -e "grant replication slave on *.* to repl@'192.168.99.%' identified by 'repl@123456';"

# 查看master位点
[root@master mysql]# docker exec -it mysql-master mysql -uroot -padmin@123456 -e "show master status;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------------+----------+--------------+------------------+-------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                         |
+------------------+----------+--------------+------------------+-------------------------------------------+
| mysql-bin.000004 |      488 |              |                  | 45177db9-0b9a-11eb-82c5-0242ac110002:1-11 |
+------------------+----------+--------------+------------------+-------------------------------------------+

从库:

# 启动命令
docker run -d --name mysql-slave -p 3306:3306 \
-e MYSQL_USER=nacos \
-e MYSQL_PASSWORD=nacos@123456 \
-e MYSQL_DATABASE=nacos \
-e MYSQL_ROOT_PASSWORD=admin@123456 \
-v /root/mysql/config/:/etc/mysql \
-v /root/mysql/data:/var/lib/mysql \
mysql:5.7

# 根据master位点建立主从
docker exec -it mysql-slave mysql -uroot -padmin@123456 -e "stop slave;"
docker exec -it mysql-slave mysql -uroot -padmin@123456 -e "stop slave;"
docker exec -it mysql-slave mysql -uroot -padmin@123456 -e "change master to master_user='repl', master_password='repl@123456', master_host='192.168.99.240', master_port=3306, master_log_file='mysql-bin.000004', master_log_pos=488;"
docker exec -it mysql-slave mysql -uroot -padmin@123456 -e "start slave;"
docker exec -it mysql-slave mysql -uroot -padmin@123456 -e "show slave status\G"

# 如下均为yes即可
# Slave_IO_Running: Yes
# Slave_SQL_Running: Yes

再次验证主从

# 主库创建数据test
docker exec -it mysql-master mysql -uroot -padmin@123456 -e "create database test;"

# 查看从库是否含有test
docker exec -it mysql-slave mysql -uroot -padmin@123456 -e "show databases;"

[root@worker1 ~]# docker exec -it mysql-slave mysql -uroot -padmin@123456 -e "show databases;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| nacos              |
| performance_schema |
| sys                |
| test               |
+--------------------+

sql文件导入

如单机模式导入nacos-mysql.sql文件

3.2、nacos集群搭建

配置文件准备

custom.properties

mkdir -p /root/nacos/config

cat > /root/nacos/config/custom.properties <<-EOF
#spring.security.enabled=false
#management.security=false
#security.basic.enabled=false
#nacos.security.ignore.urls=/**
#management.metrics.export.elastic.host=http://localhost:9200
# metrics for prometheus
management.endpoints.web.exposure.include=*

# metrics for elastic search
#management.metrics.export.elastic.enabled=false
#management.metrics.export.elastic.host=http://localhost:9200

# metrics for influx
#management.metrics.export.influx.enabled=false
#management.metrics.export.influx.db=springboot
#management.metrics.export.influx.uri=http://localhost:8086
#management.metrics.export.influx.auto-create-db=true
#management.metrics.export.influx.consistency=one
#management.metrics.export.influx.compressed=true
EOF

启动nacos集群

# nacos1
docker run -d --name nacos1 --hostname nacos1 -p 8848:8848 \
--add-host nacos1:192.168.99.240 \
--add-host nacos2:192.168.99.241 \
--add-host nacos3:192.168.99.242 \
-e PREFER_HOST_MODE=hostname \
-e NACOS_SERVERS="nacos1:8848 nacos2:8848 nacos3:8848" \
-e MYSQL_MASTER_SERVICE_HOST=192.168.99.240 \
-e MYSQL_MASTER_SERVICE_DB_NAME=nacos \
-e MYSQL_MASTER_SERVICE_USER=nacos \
-e MYSQL_MASTER_SERVICE_PASSWORD=nacos@123456 \
-e MYSQL_MASTER_SERVICE_PORT=3306 \
-e MYSQL_SLAVE_SERVICE_HOST=192.168.99.241 \
-e MYSQL_SLAVE_SERVICE_PORT=3306 \
-v /root/nacos/config/custom.properties:/home/nacos/init.d/custom.properties \
-v /root/nacos/logs:/home/nacos/logs \
nacos/nacos-server:1.1.4

# nacos2
docker run -d --name nacos2 --hostname nacos2 -p 8848:8848 \
--add-host nacos1:192.168.99.240 \
--add-host nacos2:192.168.99.241 \
--add-host nacos3:192.168.99.242 \
-e PREFER_HOST_MODE=hostname \
-e NACOS_SERVERS="nacos1:8848 nacos2:8848 nacos3:8848" \
-e MYSQL_MASTER_SERVICE_HOST=192.168.99.240 \
-e MYSQL_MASTER_SERVICE_DB_NAME=nacos \
-e MYSQL_MASTER_SERVICE_USER=nacos \
-e MYSQL_MASTER_SERVICE_PASSWORD=nacos@123456 \
-e MYSQL_MASTER_SERVICE_PORT=3306 \
-e MYSQL_SLAVE_SERVICE_HOST=192.168.99.241 \
-e MYSQL_SLAVE_SERVICE_PORT=3306 \
-v /root/nacos/config/custom.properties:/home/nacos/init.d/custom.properties \
-v /root/nacos/logs:/home/nacos/logs \
nacos/nacos-server:1.1.4

# nacos3
docker run -d --name nacos3 --hostname nacos3 -p 8848:8848 \
--add-host nacos1:192.168.99.240 \
--add-host nacos2:192.168.99.241 \
--add-host nacos3:192.168.99.242 \
-e PREFER_HOST_MODE=hostname \
-e NACOS_SERVERS="nacos1:8848 nacos2:8848 nacos3:8848" \
-e MYSQL_MASTER_SERVICE_HOST=192.168.99.240 \
-e MYSQL_MASTER_SERVICE_DB_NAME=nacos \
-e MYSQL_MASTER_SERVICE_USER=nacos \
-e MYSQL_MASTER_SERVICE_PASSWORD=nacos@123456 \
-e MYSQL_MASTER_SERVICE_PORT=3306 \
-e MYSQL_SLAVE_SERVICE_HOST=192.168.99.241 \
-e MYSQL_SLAVE_SERVICE_PORT=3306 \
-v /root/nacos/config/custom.properties:/home/nacos/init.d/custom.properties \
-v /root/nacos/logs:/home/nacos/logs \
nacos/nacos-server:1.1.4

查看集群状态

访问:http://192.168.99.240:8488/nacos

默认用户密码:nacos/nacos

SpringCloud----nacos配置注册中心基于docker部署_第1张图片

3.3、nginx高可用配置

基于nginx负载均衡keepalived高可用

nginx配置

mkdir -p /root/nginx
cd /root/nginx
docker run -d --rm --name nginx nginx:1.18.0
docker cp nginx:/etc/nginx/nginx.conf
docker stop nginx

添加如下配置到nginx.conf

cat >> /root/nginx/nginx.conf <<-EOF
stream {
    upstream nacos {
        server 192.168.99.240:8848;
        server 192.168.99.241:8848;
        server 192.168.99.242:8848;
    }
    server {
        listen 8000;
        proxy_pass nacos;
    }
}
EOF

启动nginx:

docker run -d --name nginx-nacos -p 8000:8000 -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf nginx:1.18.0

keepalived配置

下载

yum install -y keepalived

主:keepalived.conf

global_defs {
   router_id LVS_DEVEL
}

vrrp_script chk_http_port {
    script "/root/nginx_check.sh"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state MASTER
    interface enp0s8
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.99.24
    }
    track_script {
        chk_http_port
    }
}

备:keepalived.conf

global_defs {
   router_id LVS_DEVEL
}

vrrp_script chk_http_port {
    script "/root/nginx_check.sh"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface enp0s8
    virtual_router_id 51
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.99.24
    }
    track_script {
        chk_http_port
    }
}

nginx_check.sh

#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
	docker restart nginx-nacos
        sleep 2
	if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
		killall keepalived
	fi
fi

修改检测脚本权限

chmod a+x nginx_check.sh

启动keepalived

systemctl start keepalived.service && systemctl enable keepalived.service

访问:http://192.168.99.24:8000/nacos

你可能感兴趣的:(SpringCloud,Docker)