构建Nacos高可用集群

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

docker network create -d bridge bdg-nacos-cluster

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

mkdir -p /etc/nacos-mysql/initdb
cd /etc/nacos-mysql/initdbrm -f mysql-schema.sql
wget http://manongbiji.oss-cn-beijing.aliyuncs.com/ittailkshow/sca2023/download/mysql-schema.sqldocker rm -f mysql8
docker volume rm -f nacos-mysql-data
docker volume create nacos-mysql-datadocker 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}-logsdocker 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}-logsdocker 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}-logsdocker 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 节点会把各数据分片的数据进行合并恢复。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1487230.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL进阶之路 | 高级篇】事务的ACID特性

1. 数据库事务概述 事务是数据库区别于文件系统的重要特性之一,当我们有了事务就会让数据库始终保持一致性,同时我们还能通过事务的机制恢复到某个时间点,这样可以保证给已提交到数据库的修改不会因为系统崩溃而丢失。 1.1 基本概念 事务&…

AI学习记录 - 激活函数的作用

试验,通过在线性公式加入激活函数,可以拟合复杂的情况(使用js实现) 结论:1、线性函数的叠加,无论叠加多少次,都是线性的 如下图 示例代码 线性代码,使用ykxb的方式,叠加10个函数…

力扣 快慢指针

1 环形链表 141. 环形链表 - 力扣(LeetCode) 定义两个指针,一快一慢。慢指针每次只移动一步,而快指针每次移动两步。初始时,慢指针和快指针都在位置 head,这样一来,如果在移动的过程中&#x…

【单片机毕业设计选题24080】-老人外出监护系统设计

系统功能: 系统上电后,OLED显示“欢迎使用智能监护系统请稍后”两秒后进入正常页面显示。 第一行显示体温和心率值。 第二行显示压力值。 第三行显示经度值。 第四行显示纬度值。 注:经纬度信息需要在室外有信号的地方才会有显示。 短按B3按键向指…

【BUG】已解决:No Python at ‘C:Users…Python Python39python. exe’

No Python at ‘C:Users…Python Python39python. exe’ 目录 No Python at ‘C:Users…Python Python39python. exe’ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班…

函数-递归调用

目录 一、基本介绍 二、递归能解决什么问题? 三、递归案例 1、打印问题 2、阶乘问题 四、递归重要规则 五、课堂练习 1、斐波那契数 2、猴子吃桃问题 3、汉诺塔 一、基本介绍 1、简单地说:递归就是函数自己调用自己,每次调用时传入…

react中配置路径别名@

1.说明 在react项目中想要使用代替“src/”需要在项目根目录下配置两个文件,craco.config.js和sconfig.json; craco.config.js配置文件是用于项目解读为“src/” jsconfig.json配置文件是用于vsCode在编辑过程是输入后可以将src下的文件目录进行自动联…

阿里云OS Copilot:解锁操作系统运维与编程的智能助手

目录 引言 OS Copilot简介 OS Copilot的环境准备 创建实验资源 安全设置 设置安全组端口 创建阿里云AccessKey 准备系统环境 OS Copilot的实操 场景一、用OS Copilot写脚本和注释代码 场景二、使用OS Copilot进行对话问答 场景三、使用OS Copilot辅助编程学习 清理…

腾讯云k8s相关

1.某个服务腾讯云内网地址? 比如:spiderflow-web正式环境:http://spiderflow-web.sd-backend:30001 试一试:

前端使用 Konva 实现可视化设计器(17)- 素材嵌套 - 生成阶段

本章主要实现素材的嵌套(生成阶段)这意味着可以拖入画布的对象,不只是图片素材,还可以是嵌套的图片和图形。在未来的章节中,应该可以实现素材成组/解散的效果。 最近难以抽出时间继续本示例更新,以至于拖到…

C语言数据结构课设:基于EasyX前端界面的飞机订票系统

数据结构课程设计说明书 学 院、系: 软件学院 专 业: 软件工程 班 级: 学 生 姓 名: 范 学 号: 设 计 题 目: 飞机订票系统 起 迄 日 期: 2024年6月18日~ 20…

兰州交通大学电子与信息工程学院师资能力提升培训班圆满结束

7月21日,兰州交通大学电子与信息工程学院携手泰迪智能科技开展的“师资能力提升培训班(兰州交通大学电子与信息工程学院专场)”圆满结束,电子与信息工程学院副院长申东、泰迪智能科技区域总监曹玉红,教学组代表杨惠及电…

今日科普:什么是脑血管畸形,该怎么治疗?

谈及脑血管疾病,人们往往存在一种误解,认为这是老年群体的专属问题。然而,事实并非如此,尤其是脑动静脉畸形(AVM)这一特殊类型,它更倾向于侵袭20至40岁的青壮年人群。那么,脑血管畸形…

Transformer是什么?如何理解Transformer?

一、Transformer是什么 Transformer是一种深度学习模型架构,最初由Google的研究团队在2017年提出。这种架构最早用于自然语言处理(NLP),但后来也在其他领域表现出色。Transformer的关键特点是其自注意力机制(Self-Att…

第20讲:EtherCAT网络基础

EtherCAT概述 一、定义 二、EtherCAT原理 1、以太网帧通过到站不停车的方式进行数据交换 (1)如图,当中走过的就是以太网帧。当它经过从站的时候不会停留,但是它会跟从站进行信息交互。 即会把从站需要发送的信息给到了以太网帧里面去,然后把从站需要的信息,从以太网帧里…

河南萌新联赛2024第(二)场:南阳理工学院

A 国际旅行Ⅰ D A*BBBB F 水灵灵的小学弟 H 狼狼的备忘录 I 重生之zbk要拿回属于他的一切 J 这是签到 ##A 国际旅行Ⅰ 链接:https://ac.nowcoder.com/acm/contest/87255/A 来源:牛客网 题目描述 很久很久以前,有 n n n 个国家,第…

构建一个具有深色模式的简单React Web应用

在当今的Web开发世界里,创建一个既美观又功能丰富的用户界面是至关重要的。在本文中,我们将探讨如何使用React构建一个简单但功能强大的Web应用,它包含导航栏、内容展示区域和深色模式切换功能。 项目概述 我们的目标是创建一个具有以下特性的Web应用: 左侧导航栏,包含四个链…

MySQL 约束 (constraint)

文章目录 约束(constraint)列级约束和表级约束给约束起名字(constraint)非空约束(no null)检查约束(check)唯一性约束 (unique)主键约束 (primary key)主键分类单一主键复合主键主键自增 (auto_increment) 外键约束外什…

IP协议和路由转发

文章目录 IP协议IP报头网段划分特殊的IP私有IP和公有IP IP分片 路由 IP协议 IP协议提供了一种能力,将数据报从A主机送到B主机,TCP可以保证可靠性,所以TCP/IP协议可以将数据可靠的从A主机送到B主机。 IP报头 4位版本号(version): 指定IP协议…

Unity UGUI 之 Slider

本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 1.Slider是什么 滑块,由三部分组成:背景 填充条 手柄 填充条就是…