构建Nacos高可用集群

Docker构建过程
在这里插入图片描述
创建Docker网络

docker network create -d bridge bdg-nacos-cluster

创建MySQL容器,并初始化数据库nacos_config

mkdir -p /etc/nacos-mysql/initdb
cd /etc/nacos-mysql/initdb

rm -f mysql-schema.sql
wget http://manongbiji.oss-cn-beijing.aliyuncs.com/ittailkshow/sca2023/download/mysql-schema.sql


docker rm -f mysql8
docker volume rm -f nacos-mysql-data
docker volume create nacos-mysql-data

docker run --name mysql8 --hostname=mysql8 -d \
-p=8306:3306 --network=bdg-nacos-cluster --restart=always \
-e MYSQL_ROOT_PASSWORD=root \
-v nacos-mysql-data:/var/lib/mysql \
-v /etc/nacos-mysql/initdb:/docker-entrypoint-initdb.d \
mysql:8

该命令使用 Docker 运行了一个名为 mysql8 的容器,使用 MySQL 8 镜像。该容器被分配了 bdg-nacos-cluster 网络,并且容器内部的主机名被设置为 mysql8。容器还被配置为始终重启,并在 8306 端口上公开 MySQL 服务。
该命令还设置了一系列参数,包括:
● -e MYSQL_ROOT_PASSWORD=root:指定 MySQL 的 root 用户的密码为 root,该密码将用于初始登录和访问 MySQL 数据库。
● -v nacos-mysql-data:/var/lib/mysql:创建名为 nacos-mysql-data 的数据卷,并将其挂载到容器中的 /var/lib/mysql 目录,用于存储 MySQL 数据库文件,以实现持久化存储。
● -v /etc/nacos-mysql/initdb:/docker-entrypoint-initdb.d:将主机上的 /etc/nacos-mysql/initdb 目录挂载到容器中的 /docker-entrypoint-initdb.d 目录。该目录包含 SQL 脚本文件,用于在容器启动时自动执行 MySQL 数据库初始化操作,以创建数据库和表等。
● -p 8306:3306:将容器内的 MySQL 服务的默认端口 3306 映射到主机上的 8306 端口,以便在主机上通过 8306 端口访问 MySQL 服务。
运行后
在这里插入图片描述
这些数据表是Nacos中存储配置信息和权限信息的表格,它们的作用如下:
● config_info:存储配置信息的主要表格,包含配置信息的ID、数据ID、分组、配置内容、MD5值、配置类型、创建时间、最后修改时间等信息。
● config_info_aggr:聚合配置信息的表格,用于存储聚合配置信息的ID、数据ID、分组、配置内容、MD5值、配置类型、创建时间、最后修改时间等信息。
● config_info_beta:存储配置信息的Beta版本,用于存储Beta版本的ID、数据ID、分组、配置内容、MD5值、配置类型、创建时间、最后修改时间等信息。
● config_info_tag:存储配置信息标签的表格,用于存储标签信息的ID、标签名称、标签描述等信息。
● config_tags_relation:存储配置信息和标签关系的表格,用于存储配置信息和标签之间的对应关系,包含关系ID、配置信息ID、标签ID等信息。
● group_capacity:存储分组容量信息的表格,用于存储分组容量的ID、分组名称、最大容量等信息。
● his_config_info:存储历史配置信息的表格,用于存储配置信息的历史版本,包含历史版本ID、数据ID、分组、配置内容、MD5值、配置类型、创建时间、最后修改时间等信息。
● permissions:存储权限信息的表格,用于存储权限信息的ID、权限名称、权限描述等信息。
● roles:存储角色信息的表格,用于存储角色信息的ID、角色名称、角色描述等信息。
● tenant_capacity:存储租户容量信息的表格,用于存储租户容量的ID、租户名称、最大容量等信息。
● tenant_info:存储租户信息的表格,用于存储租户信息的ID、租户名称、租户描述等信息。
● users:存储用户信息的表格,用于存储用户信息的ID、用户名、密码、角色等信息。
创建3个Nacos节点
● nacos1:8848 -> 8848
● nacos2:8849 -> 8848
● nacos3:8850 -> 8848

export CNAME=nacos1
docker rm -f ${CNAME}
docker volume rm -f ${CNAME}-logs
docker volume create ${CNAME}-logs

docker run -d --name ${CNAME} \
--network=bdg-nacos-cluster --restart=always \
--hostname=${CNAME} \
-e PREFER_HOST_MODE=hostname \
-e NACOS_SERVERS="nacos1:8848 nacos2:8848 nacos3:8848" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=mysql8 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_PARAM="characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true" \
-e NACOS_AUTH_IDENTITY_KEY=2222 \
-e NACOS_AUTH_IDENTITY_VALUE=2xxx \
-e NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789 \
-v ${CNAME}-logs:/home/nacos/logs \
-p 8848:8848 -p 9848:9848  -d \
nacos/nacos-server:v2.2.1-slim 
export CNAME=nacos2
docker rm -f ${CNAME}
docker volume rm -f ${CNAME}-logs
docker volume create ${CNAME}-logs

docker run -d --name ${CNAME} \
--network=bdg-nacos-cluster --restart=always \
--hostname=${CNAME} \
-e PREFER_HOST_MODE=hostname \
-e NACOS_SERVERS="nacos1:8848 nacos2:8848 nacos3:8848" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=mysql8 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_PARAM="characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true" \
-e NACOS_AUTH_IDENTITY_KEY=2222 \
-e NACOS_AUTH_IDENTITY_VALUE=2xxx \
-e NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789 \
-v ${CNAME}-logs:/home/nacos/logs \
-p 8849:8848 -p 9849:9848  -d \
nacos/nacos-server:v2.2.1-slim 

该命令使用Docker运行了一个名为 C N A M E 的容器,使用 N a c o s S e r v e r v 2.2.1 − s l i m 镜像。该容器被分配了 b d g − n a c o s − c l u s t e r 网络,并且容器内部的主机名被设置为 {CNAME}的容器,使用Nacos Server v2.2.1-slim镜像。该容器被分配了bdg-nacos-cluster网络,并且容器内部的主机名被设置为 CNAME的容器,使用NacosServerv2.2.1slim镜像。该容器被分配了bdgnacoscluster网络,并且容器内部的主机名被设置为{CNAME}。容器还被配置为始终重启,并在8849和9849端口上公开Nacos Server服务。
该命令还设置了一系列环境变量,包括:
● PREFER_HOST_MODE=hostname:设置容器内部使用容器的主机名
● NACOS_SERVERS=“nacos1:8848 nacos2:8848 nacos3:8848”:指定Nacos Server的地址列表,用于集群中的多个Nacos节点之间进行通信
● SPRING_DATASOURCE_PLATFORM=mysql:指定使用MySQL数据库作为数据源
● MYSQL_SERVICE_HOST=mysql8:指定MySQL数据库的主机名或IP地址
● MYSQL_SERVICE_DB_NAME=nacos_config:指定要使用的MySQL数据库名称
● MYSQL_SERVICE_PORT=3306:指定MySQL数据库的端口号
● MYSQL_SERVICE_USER=root:指定MySQL数据库的用户名
● MYSQL_SERVICE_PASSWORD=root:指定MySQL数据库的密码
● MYSQL_SERVICE_DB_PARAM=“characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true”:指定其他MySQL连接参数,例如字符编码和连接超时等
● NACOS_AUTH_IDENTITY_KEY=2222:指定Nacos Server的认证标识符密钥
● NACOS_AUTH_IDENTITY_VALUE=2xxx:指定Nacos Server的认证标识符值
● NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789:指定Nacos Server的身份验证令牌
此外,该命令还使用了一个数据卷${CNAME}-logs,用于将Nacos Server日志持久化到主机上。

export CNAME=nacos3
docker rm -f ${CNAME}
docker volume rm -f ${CNAME}-logs
docker volume create ${CNAME}-logs

docker run -d --name ${CNAME} \
--network=bdg-nacos-cluster --restart=always \
--hostname=${CNAME} \
-e PREFER_HOST_MODE=hostname \
-e NACOS_SERVERS="nacos1:8848 nacos2:8848 nacos3:8848" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=mysql8 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_PARAM="characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true" \
-e NACOS_AUTH_IDENTITY_KEY=2222 \
-e NACOS_AUTH_IDENTITY_VALUE=2xxx \
-e NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789 \
-v ${CNAME}-logs:/home/nacos/logs \
-p 8850:8848 -p 9850:9848  -d \
nacos/nacos-server:v2.2.1-slim 

Spring Boot微服务实例接入

server.port=8081
spring.application.name=first-microservice
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.discovery.server-addr=192.168.31.230:8850,192.168.31.230:8849,192.168.31.230:8848

按配置顺序从前到后尝试登录Nacos,之后基于随机策略接入某一个节点通过Distro 协议进行集群内部消息同步

DEBUG 17208 --- [           main] com.alibaba.nacos.client.naming          : HTTP method: POST, url: http://192.168.31.230:8850/nacos/v1/auth/users/login?username=nacos, body: {password=nacos}
...
INFO 17208 --- [           main] com.alibaba.nacos.common.remote.client   : [RpcClientFactory] create a new rpc client of e7e25e68-df6b-410d-a5f1-3cb4919b221f
INFO 17208 --- [           main] com.alibaba.nacos.common.remote.client   : [e7e25e68-df6b-410d-a5f1-3cb4919b221f] RpcClient init, ServerListFactory = com.alibaba.nacos.client.naming.core.ServerListManager
INFO 17208 --- [           main] com.alibaba.nacos.common.remote.client   : [e7e25e68-df6b-410d-a5f1-3cb4919b221f] Registry connection listener to current client:com.alibaba.nacos.client.naming.remote.gprc.redo.NamingGrpcRedoService
INFO 17208 --- [           main] com.alibaba.nacos.common.remote.client   : [e7e25e68-df6b-410d-a5f1-3cb4919b221f] Register server push request handler:com.alibaba.nacos.client.naming.remote.gprc.NamingPushRequestHandler
INFO 44088 --- [           main] com.alibaba.nacos.common.remote.client   : [2e12c2db-d7de-4ff3-a8b2-d361673ad050] Try to connect to server on start up, server: {serverIp = '192.168.31.230', server main port = 8849}


----restart-----
INFO 17208 --- [           main] com.alibaba.nacos.common.remote.client   : [e7e25e68-df6b-410d-a5f1-3cb4919b221f] Try to connect to server on start up, server: {serverIp = '192.168.31.230', server main port = 8848}

----restart-----
INFO 17208 --- [           main] com.alibaba.nacos.common.remote.client   : [e7e25e68-df6b-410d-a5f1-3cb4919b221f] Try to connect to server on start up, server: {serverIp = '192.168.31.230', server main port = 8850}

Distro 协议
在这里插入图片描述
Distro 协议是 Nacos 社区自研的⼀种 AP 分布式协议,是面向临时实例设计的⼀种分布式协议,其保证了在某些 Nacos 节点宕机后,整个临时实例处理系统依旧可以正常工作。作为⼀种有状态的中间件应用的内嵌协议,Distro 保证了各个 Nacos 节点对于海量注册请求的统⼀协调和存储。
Distro 协议的主要设计思想如下:
● Nacos 每个节点是平等的都可以处理写请求,同时把新数据同步到其他节点。
● 每个节点只负责部分数据,定时发送自己负责数据的校验值到其他节点来保持数据⼀致性。
● 每个节点独立处理读请求,及时从本地发出响应
写操作
对于⼀个已经启动完成的 Distro 集群,在⼀次客户端发起写操作的流程中,当注册非持久化的实例的写请求打到某台 Nacos 服务器时,Distro 集群处理的流程图如下:
在这里插入图片描述
读操作
由于每台机器上都存放了全量数据,因此在每⼀次读操作中,Distro 机器会直接从本地拉取数据,快速响应
在这里插入图片描述
这种机制保证了 Distro 协议可以作为⼀种 AP 协议,对于读操作都进行及时的响应。在网络分区的情况下,对于所有的读操作也能够正常返回;当网络恢复时,各个 Distro 节点会把各数据分片的数据进行合并恢复。

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Docker集群Nacos是指使用Docker容器技术来部署和管理Nacos服务注册和发现中心的集群架构。Nacos是一个开源的服务发现、配置中心和动态DNS解析器,能够让我们更方便地管理和维护分布式系统中的服务。 使用Docker来部署Nacos集群可以带来许多好处。首先,Docker的容器化技术可以实现快速部署和扩展。只需创建一个Nacos镜像,并在集群中运行多个容器,就可以快速搭建一个高可用Nacos集群。同时,Docker的容器可以根据需求动态扩展和缩减,极大地提高了系统的可伸缩性和弹性。 其次,Docker的容器可以隔离和保护各个Nacos节点。每个Nacos节点都运行在独立的容器中,彼此之间互不干扰。即使某个节点出现故障或崩溃,也不会影响整个集群的正常工作。这种隔离性能够大大提高系统的稳定性和可靠性。 另外,Docker集群Nacos还可以简化系统的管理和维护。通过定义和使用Docker容器,我们可以实现自动化的部署和监控。同时,Docker还提供了丰富的工具和接口,方便我们管理和调度Nacos集群的各个节点。这样,我们就可以更有效地进行系统监控、故障处理和性能优化。 总结来说,Docker集群Nacos是一种基于Docker容器技术的Nacos集群架构。它可以通过快速部署、扩展、隔离和管理,提高系统的可伸缩性、弹性、稳定性和可靠性。使用Docker集群Nacos,我们可以更方便地构建和管理分布式系统中的服务注册和发现功能。 ### 回答2: Docker集群Nacos是一种使用Docker容器技术的分布式服务发现和配置管理平台。Nacos(Naming and Configuration Service)是阿里巴巴开源的一款用于服务发现、动态配置和服务元数据的系统,可以帮助我们实现研发、测试和运维团队的快速迭代和快速启动。 Docker集群是一种使用Docker技术的分布式系统,通过将应用程序打包为可移植的容器,可以方便地在不同的计算环境中进行部署和运行。在Docker集群中使用Nacos可以实现服务发现和配置管理的功能。 在Docker集群中部署Nacos,首先需要创建一个Nacos的Docker镜像。可以使用Dockerfile定义Nacos的镜像构建过程,然后使用Docker命令来构建镜像。构建完成后,可以通过Docker命令在集群中部署多个Nacos容器。 在Nacos容器中,可以通过配置文件来配置服务发现和配置管理的功能。可以指定Nacos容器的IP地址和端口,并配置集群的地址信息。可以将Nacos容器连接到数据库来存储服务元数据和配置信息。还可以配置包括注册中心、服务发现、配置管理等一系列功能。 使用Docker集群部署Nacos可以提供高可用性和可扩展性。通过运行多个Nacos容器,可以实现高可用性,当一个容器故障时其他容器可以继续提供服务。同时,可以根据需要动态地增加或删除Nacos容器,实现系统的横向扩展。 总之,Docker集群Nacos是一种方便快捷地部署和管理分布式服务和配置的解决方案,可以帮助我们简化开发、测试和运维的流程,提高系统的可靠性和可扩展性。 ### 回答3: Docker集群nacos是一种基于Docker容器技术的轻量级微服务注册中心和配置中心。通过使用Docker容器技术,可以实现nacos高可用性和弹性伸缩性。 首先,我们可以使用Docker容器将nacos部署为一个集群。通过在多个主机上启动多个nacos容器节点,并使用容器编排工具(如Docker Compose或Kubernetes)进行管理和协调,我们可以实现nacos高可用性。当一个节点发生故障时,其他节点可以接管其工作,从而确保服务的连续性和稳定性。 其次,Docker集群nacos可以轻松实现弹性伸缩。当需要处理大量的微服务实例时,我们可以通过在Docker集群中部署多个nacos容器实例来提高性能和容量。这样,我们可以根据负载情况动态添加或删除nacos容器节点,以满足实时的需求变化。 另外,使用Docker集群还可以简化nacos的部署和管理。通过将nacos的配置、依赖和环境打包到Docker镜像中,我们可以很容易地部署和迁移整个nacos集群。同时,Docker集群的管理工具可以提供自动化的容器管理、监控和自愈功能,进一步简化了nacos的运维工作。 总结来说,Docker集群nacos通过利用Docker容器技术,实现了nacos高可用性、弹性伸缩性和易用性。它为微服务架构提供了一个可靠的注册中心和配置中心,帮助开发团队更好地管理和调度微服务应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗的老史

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值