查看原文
其他

Nacos 1.3.0 发布,一个修炼内功的版本:全新内核构建!

程序猿DD 2020-10-16

Na点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

作者 | 

来源 | 

1.3.0版本开始修炼内功,聚焦“简单”、“性能”、“高可用”这核心的三个点进一步提升Nacos核心竞争力。

  • 内嵌关系型分布式数据库,简化集群部署模式
  • 集群管理下沉统一,提供全新集群管理能力
  • 一致性协议抽象升级,提供更高的性能
  • 安全升级,解决Fastjson和越权风险

内嵌关系型分布式数据库

集群部署可以不依赖Mysql,以便降低中小用户的集群运维部署成本(大客户,生产环境依然建议依赖Mysql,以便有更高的性能),其开启命令为./startup.sh -p embedded

然后查看启动日志是否有出现以下信息:Nacos started successfully in cluster mode. use embedded storage

同时,为了方便用户查询本机节点的数据同步情况,Nacos 1.3.0 配置模块开放了新的运维 Open-API,供其查询当前节点本地数据存储情况,其使用方式如下

GET /nacos/v1/cs/ops/derby?sql=select * from config_info

使用该命令时,最好加上分页查询,避免一次查处大量的数据影响Nacos的正常对外业务工作,如果没有加上分页查询,则会自动添加分页查询语句,默认查询最开始的1k条数据。其分页查询的SQL的例子如下。

select * from config_info OFFSET 0 ROWS FETCH NEXT 1000 ROWS ONLY

其数据返回结果如下

{
    "code":200,
    "message":null,
    "data":[
        {
            "ID":242149783664332800,
            "DATA_ID":"application.properties",
            "GROUP_ID":"DEFAULT_GROUP",
            "TENANT_ID":"",
            "APP_NAME":"",
            "CONTENT":"this.is.test=liaochuntao",
            "MD5":"bedbfd7069e999edf2adf9d8a1af3083",
            "GMT_CREATE":"2020-06-03T05:30:47.345+0000",
            "GMT_MODIFIED":"2020-06-03T05:30:47.345+0000",
            "SRC_USER":null,
            "SRC_IP":"127.0.0.1",
            "C_DESC":null,
            "C_USE":null,
            "EFFECT":null,
            "TYPE":"properties",
            "C_SCHEMA":null
        }
    ]
}

注意事项

分布式ID——Snowflake

Nacos 1.3.0的分布式存储,其数据的主键依赖雪花ID算法进行生成,雪花算法ID需要 DataCenterIdWorkerId,默认情况下,WorkerId不需要进行设置,会根据InetAddress.getLocalHost()进行计算生成。如果需要自己指定,则在application.properties进行如下配置设置

### set the dataCenterID manually
nacos.core.snowflake.data-center=
### set the WorkerID manually
nacos.core.snowflake.worker-id=

数据迁移

由于Nacos 1.3.0新增的内嵌存储模式是全新的数据存储模式,因此在进行Nacos-Server升级时,如果是需要使用这种新能力,需要另外部署一个Nacos 1.3.0集群,然后进行数据迁移,由于Nacos 1.3.0 新增的内嵌存储模式,还无法自动的将原本MySQL的数据直接一键进行数据迁移,因此只能用户使用数据导出导入的方式进行。

全新的集群管理

提供全新集群管理页面

Nacos 1.3.0版本开始,对集群节点管理进行了统一,将原有配置模块以及服务模块的集群节点管理统一下沉到内核模块,并且优化了集群节点信息展示,使得其更贴近Nacos集群模式的数据信息显示,其显示的内容包括如下几个方面

  1. 服务发现模块旧的Raft协议的元数据数据

  2. 配置管理模块使用新Raft协议的元数据

  • a. 新Raft协议的RPC端口
  • b. 节点的版本信息
  • c. 节点的权重信息(该权重的功能暂未提供,以后服务端节点的负载均衡使用)
  • d. 节点元数据信息上次刷新时间
  1. Nacos节点自身的元数据信息

新的集群寻址模式设置

Nacos 1.3.0版本开始,对集群节点的寻址模式做了统一,用户可以通过如下设置自己选择需要使用哪一种寻址模式作为集群节点的管理

  • 文件寻址模式

nacos.core.member.lookup.type=file(默认值)

  • 地址服务寻址模式

nacos.core.member.lookup.type=address-server

全新的一致性协议

Nacos 1.3.0版本开始,将对现有的一致性协议层进行统一抽象以及下沉,在Nacos 1.3.0,我们实现了Raft协议的下沉,并且将其与配置管理模块进行了对接。用户可以通过调整下面的参数对Raft协议进行调整。

# Sets the Raft cluster election timeout, default value is 5 second
# 设置Raft群集选举超时,默认值为5秒
nacos.core.protocol.raft.data.election_timeout_ms=5000
# Sets the amount of time the Raft snapshot will execute periodically, default is 30 minute
# 设置Raft快照定期执行的时间,默认值为30分钟
nacos.core.protocol.raft.data.snapshot_interval_secs=30
# Raft internal worker threads
# Raft 内部工作线程数量
nacos.core.protocol.raft.data.core_thread_num=8
# Number of threads required for raft business request processing
# Raft 业务请求处理所需的线程数
nacos.core.protocol.raft.data.cli_service_thread_num=4
# raft 线性读取策略,默认为ReadOnlySafe,可以选择ReadOnlyLeaseBased
nacos.core.protocol.raft.data.read_index_type=ReadOnlySafe
### rpc请求超时,默认5秒
nacos.core.protocol.raft.data.rpc_request_timeout_ms=5000`

同时,为了方便运维对新的Raft协议能够进行一些简单的运维操作,Nacos 1.3.0 内核模块开放了相关一致性协议运维的 Open-API,供其对Raft进行一些运维操作,其相关的运维操作如下

切换某一个Raft Group的Leader节点

POST /nacos/v1/core/ops/raft
{
    "groupId": "xxx",
    "command": "transferLeader"
    "value": "ip:{raft_port} or ip:{raft_port},ip:{raft_port},ip:{raft_port}"
}

重置某一个Raft Group的集群成员

POST /nacos/v1/core/ops/raft
{
    "groupId": "xxx",
    "command": "resetRaftCluster",
    "value": "ip:{raft_port},ip:{raft_port},ip:{raft_port},ip:{raft_port}"
}

注意,该操作是一个高危操作,仅仅当Raft集群的 n/2 + 1节点crash之后无法满足过半投票的要求才可以使用该运维命令,用于快速让当前剩余的节点重组Raft集群,对外提供服务

触发某一个Raft Group执行快照操作

POST /nacos/v1/core/ops/raft
{
    "groupId": "xxx",
    "command": "doSnapshot",
    "value": "ip:{raft_port}"
}

移除某一个Raft Group中的某一成员

POST /nacos/v1/core/ops/raft
{
    "groupId": "xxx",
    "command": "removePeer",
    "value": "ip:{raft_port}"
}

批量移除某一个Raft Group中的多个成员

POST /nacos/v1/core/ops/raft
{
    "groupId": "xxx",
    "command": "removePeers",
    "value": "ip:{raft_port},ip:{raft_port},ip:{raft_port},..."
}

安全升级

  1. 修复fastjson安全漏洞
  2. 修复tenant越权漏洞


往期推荐

微软 WinGet 抄袭 AppGet 始末,个人开源的困境该如何破?

技术硬核还不够?互联网企业出海指南来了!

万字超强图文讲解 AQS 以及 ReentrantLock 应用

架构师究竟要不要写代码?

代码优化的 5 大原则,第 1 条相信你一开始就没想到!


前段时间组织过一波,关于面试内容的学习与讨论,效果还不错。有兄弟提议可以考虑把大家一起分享或者读到的干货内容都整理起来,除了我们自己查阅方便,可能也对其他人也会很有帮助。所以,我们决定一起弄个以「后端面试」为主题的公众号,平日主要推送一些面试中常见的技术点干货,以帮助大家学习和备战面试!



一起进大厂,每日学干货

关注我,不迷路

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存