From f2b4d3b8da02be0080975b3ac522f52f054c71e0 Mon Sep 17 00:00:00 2001 From: ggbocoder <1832877748@qq.com> Date: Sun, 13 Oct 2024 22:34:14 +0800 Subject: [PATCH 1/4] add namingserver.md --- .../user/registry/namingserver.md | 71 +++++++++++++++++ .../user/registry/namingserver.md | 77 +++++++++++++++++++ .../user/registry/namingserver.md | 1 + versioned_sidebars/version-v2.2-sidebars.json | 3 +- 4 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 i18n/en/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md create mode 100644 i18n/zh-cn/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md create mode 100644 versioned_docs/version-v2.2/user/registry/namingserver.md diff --git a/i18n/en/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md b/i18n/en/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md new file mode 100644 index 0000000000..4c825cc887 --- /dev/null +++ b/i18n/en/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md @@ -0,0 +1,71 @@ +--- +Title: Seata Namingserver Registration Center +Keywords: [ Seata, Namingserver ] +Description: Namingserver registration center. +--- + + +# Namingserver Registration Center +Namingserver is the native registration center of Seata. + +## Preparations +You can choose to run the naming server in the compiler or after packaging it. + +### Running the naming server in the compiler +Go to the namingserver directory, set the port number for the naming server in resources/application.yml, and start the naming server. + +### Running the naming server after packaging +Execute the packaging command: +```shell +mvn clean install -U -Prelease-seata-namingserver +``` +Set the naming server port number in the `conf/application.yml` file located in the `\\distribution\\target\\apache-seata-2.2.0-SNAPSHOT-incubating-bin\\seata-namingserver` directory. +For macOS or Linux, run: + +```shell +bin\\seata-namingserver.sh +``` +For Windows, run: + +```shell +bin\\seata-namingserver.bat +``` +## Getting Started Quickly +The process to use the naming server as Seata's registration center is very simple and involves configuring both the client and server sides. + +### Client-side Configuration for the Registration Center +Add the corresponding registration center in the application.yml: + +```yaml +seata: + registry: + type: seata + seata: + server-addr: 127.0.0.1:8081 ## IP + port of the naming server configured in the first step. Use commas to separate multiple naming server nodes. + namespace: public ## Namespace + heartbeat-period: 5000 ## Heartbeat interval +``` +### Server-side Configuration for the Registration Center +Add the following configuration to `conf/application.yaml`, with the rest of the configuration referring to configuration options: + +```yaml +seata: + registry: + type: seata + seata: + server-addr: 127.0.0.1:8081 ## IP + port of the naming server configured in the first step. Use commas to separate multiple naming server nodes. + cluster: default ## Cluster name + namespace: public ## Namespace + heartbeat-period: 5000 ## Heartbeat interval +``` +Create a Mapping Between the Client's Transaction Group and the Seata Cluster +Send an HTTP request to one naming server node to create a transaction group-to-cluster mapping (the naming server node will automatically synchronize with other nodes): + +```shell +http://127.0.0.1:8081/naming/v1/changeGroup?clusterName=cluster2&namespace=public&unitName&vGroup=my_test_tx_group +``` +(In this, namespace is the namespace configured on the client side, vGroup is the transaction group configured on the client side, and clusterName is the cluster name on the server side that needs to be mapped.) + +Afterward, once Seata-Server is started and the client configuration is complete, you can begin to experience Seata services. + +Tips: Ensure that both the client and server are registered under the same namespace; otherwise, the service won't be found. diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md b/i18n/zh-cn/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md new file mode 100644 index 0000000000..5a86ad47db --- /dev/null +++ b/i18n/zh-cn/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md @@ -0,0 +1,77 @@ +--- +title: Seata Namingserver 注册中心 +keywords: [ Seata, Namingserver ] +description: namingserver 注册中心。 +--- + +# Namingserver 注册中心 + +Namingserver 是 Seata 原生的注册中心. + +## 预备工作 +可以选择在编译器中运行namingserver或者打包后运行namingserver +### 编译器运行namingserver + +进入`namingsever`目录,在`resources/application.yml`下设置namingserver启动的端口号,启动namingserver + +### 打包运行namingserver + +执行`mvn clean install -U -Prelease-seata-namingserver`打包命令 +```shell +`mvn clean install -U -Prelease-seata-namingserver` +``` +在`\distribution\target\apache-seata-2.2.0-SNAPSHOT-incubating-bin\seata-namingserver`目录下的`conf/application.yml`中配置namingserver启动的端口号, +mac或linux运行 +``` shell +bin\seata-namingserver.sh +``` +windows环境运行 +``` shell +bin\seata-namingserver.bat +``` + +## 快速上手 + +Seata 使用 namingserver 作为注册中心的操作步骤非常简单,分为在client端的配置以及在server端的配置 + +### Client端配置注册中心 + +在 [**application.yml**](https://github.com/apache/incubator-seata/blob/2.x/script/client/spring/application.yml) +中加入对应的注册中心。 + +```yaml +seata: + registry: + type: seata + seata: + server-addr: 127.0.0.1:8081 ##第一步配置的namingserver的ip+端口,若有多个namingserver节点则用逗号分割 + namespace: public ##命名空间 + heartbeat-period: 5000 ##心跳时间 +``` + +### Server端配置注册中心 + +在 `conf/application.yaml`加入以下配置, +其余配置参考 [configuration options](https://github.com/apache/incubator-seata/blob/2.x/server/src/main/resources/application.example.yml): + +```yaml +seata: + registry: + type: seata + seata: + server-addr: 127.0.0.1:8081 ##第一步配置的namingserver的ip+端口,若有多个namingserver节点则用逗号分割 + cluster: default ##集群名称 + namespace: public ##命名空间 + heartbeat-period: 5000 ##心跳时间 +``` + +### 创建client端的事务分组->seata集群的映射关系 +向一个namingserver节点发起创建事务分组映射关系的http请求(namingserver节点会自动同步给其它节点) +```shell +http://127.0.0.1:8081/naming/v1/changeGroup?clusterName=cluster2&namespace=public&unitName&vGroup=my_test_tx_group +``` +(其中namespace是client端配置的命名空间,vGroup是client端配置的事务分组,clusterName是需要映射到的server端的集群名称) + +随后,启动 Seata-Server 后,Client 配置完成后启动应用就可以正式体验 Seata 服务。 + +Tips:请确保client与server的注册处于同一个namespace,不然会找不到服务。 diff --git a/versioned_docs/version-v2.2/user/registry/namingserver.md b/versioned_docs/version-v2.2/user/registry/namingserver.md new file mode 100644 index 0000000000..e872b67af1 --- /dev/null +++ b/versioned_docs/version-v2.2/user/registry/namingserver.md @@ -0,0 +1 @@ +Placeholder. DO NOT DELETE. \ No newline at end of file diff --git a/versioned_sidebars/version-v2.2-sidebars.json b/versioned_sidebars/version-v2.2-sidebars.json index 26d02b41d3..291ae397df 100644 --- a/versioned_sidebars/version-v2.2-sidebars.json +++ b/versioned_sidebars/version-v2.2-sidebars.json @@ -57,7 +57,8 @@ "user/registry/eureka", "user/registry/etcd3", "user/registry/consul", - "user/registry/zookeeper" + "user/registry/zookeeper", + "user/registry/namingserver" ] }, "user/api", From 8385aa047d0968b50161d11333cc183d83b9ddc9 Mon Sep 17 00:00:00 2001 From: ggbocoder <1832877748@qq.com> Date: Mon, 14 Oct 2024 10:36:54 +0800 Subject: [PATCH 2/4] add namingserver.md --- docs/user/registry/namingserver.md | 1 + .../current/user/registry/namingserver.md | 80 +++++++++++++++++ .../user/registry/namingserver.md | 11 ++- .../current/user/registry/namingserver.md | 85 +++++++++++++++++++ .../user/registry/namingserver.md | 8 ++ sidebars.js | 3 +- 6 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 docs/user/registry/namingserver.md create mode 100644 i18n/en/docusaurus-plugin-content-docs/current/user/registry/namingserver.md create mode 100644 i18n/zh-cn/docusaurus-plugin-content-docs/current/user/registry/namingserver.md diff --git a/docs/user/registry/namingserver.md b/docs/user/registry/namingserver.md new file mode 100644 index 0000000000..8f9293a8d5 --- /dev/null +++ b/docs/user/registry/namingserver.md @@ -0,0 +1 @@ +Placeholder. DO NOT DELETE. diff --git a/i18n/en/docusaurus-plugin-content-docs/current/user/registry/namingserver.md b/i18n/en/docusaurus-plugin-content-docs/current/user/registry/namingserver.md new file mode 100644 index 0000000000..88c7b05f61 --- /dev/null +++ b/i18n/en/docusaurus-plugin-content-docs/current/user/registry/namingserver.md @@ -0,0 +1,80 @@ +--- +Title: Seata Namingserver Registration Center +Keywords: [ Seata, Namingserver ] +Description: Namingserver registration center. +--- + + +# Namingserver Registration Center +Namingserver is the native registration center of Seata. + +## Preparations +You can choose to run the naming server in the compiler or after packaging it. + +### Running the naming server in the compiler +Go to the namingserver directory, set the port number for the naming server in resources/application.yml, and start the naming server. + +### Running the naming server after packaging +Execute the packaging command: +```shell +mvn clean install -U -Prelease-seata-namingserver +``` +Set the naming server port number in the `conf/application.yml` file located in the `\\distribution\\target\\apache-seata-2.2.0-SNAPSHOT-incubating-bin\\seata-namingserver` directory. +For macOS or Linux, run: + +```shell +bin\\seata-namingserver.sh +``` +For Windows, run: + +```shell +bin\\seata-namingserver.bat +``` +## Getting Started Quickly +The process to use the naming server as Seata's registration center is very simple and involves configuring both the client and server sides. + +### Client-side Configuration for the Registration Center +Add the corresponding registration center in the application.yml: + +```yaml +seata: + registry: + type: seata + seata: + server-addr: 127.0.0.1:8081 ## IP + port of the naming server configured in the first step. Use commas to separate multiple naming server nodes. + namespace: public ## Namespace + heartbeat-period: 5000 ## Heartbeat interval +``` +### Server-side Configuration for the Registration Center +Add the following configuration to `conf/application.yaml`, with the rest of the configuration referring to configuration options: + +```yaml +seata: + registry: + type: seata + seata: + server-addr: 127.0.0.1:8081 ## IP + port of the naming server configured in the first step. Use commas to separate multiple naming server nodes. + cluster: default ## Cluster name + namespace: public ## Namespace + heartbeat-period: 5000 ## Heartbeat interval +``` +### Create a Mapping Between the Client's Transaction Group and the Seata Cluster +Send an HTTP request to one naming server node to create a transaction group-to-cluster mapping (the naming server node will automatically synchronize with other nodes): + +```shell +http://127.0.0.1:8081/naming/v1/addGroup?clusterName=cluster2&namespace=public&unitName&vGroup=my_test_tx_group +``` +(In this, namespace is the namespace configured on the client side, vGroup is the transaction group configured on the client side, and clusterName is the cluster name on the server side that needs to be mapped.) + + +### Change the Mapping Between the Client's Transaction Group and the Seata Cluster +Send an HTTP request to one naming server node to change the transaction group-to-cluster mapping (the naming server node will automatically synchronize with other nodes): + +```shell +http://127.0.0.1:8081/naming/v1/changeGroup?clusterName=cluster2&namespace=public&unitName&vGroup=my_test_tx_group +``` +(In this, namespace is the namespace configured on the client side, vGroup is the transaction group configured on the client side, and clusterName is the cluster name on the server side that needs to be mapped.) + +Afterward, once Seata-Server is started and the client configuration is complete, you can begin to experience Seata services. + +Tips: Ensure that both the client and server are registered under the same namespace; otherwise, the service won't be found. diff --git a/i18n/en/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md b/i18n/en/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md index 4c825cc887..88c7b05f61 100644 --- a/i18n/en/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md +++ b/i18n/en/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md @@ -58,9 +58,18 @@ seata: namespace: public ## Namespace heartbeat-period: 5000 ## Heartbeat interval ``` -Create a Mapping Between the Client's Transaction Group and the Seata Cluster +### Create a Mapping Between the Client's Transaction Group and the Seata Cluster Send an HTTP request to one naming server node to create a transaction group-to-cluster mapping (the naming server node will automatically synchronize with other nodes): +```shell +http://127.0.0.1:8081/naming/v1/addGroup?clusterName=cluster2&namespace=public&unitName&vGroup=my_test_tx_group +``` +(In this, namespace is the namespace configured on the client side, vGroup is the transaction group configured on the client side, and clusterName is the cluster name on the server side that needs to be mapped.) + + +### Change the Mapping Between the Client's Transaction Group and the Seata Cluster +Send an HTTP request to one naming server node to change the transaction group-to-cluster mapping (the naming server node will automatically synchronize with other nodes): + ```shell http://127.0.0.1:8081/naming/v1/changeGroup?clusterName=cluster2&namespace=public&unitName&vGroup=my_test_tx_group ``` diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/current/user/registry/namingserver.md b/i18n/zh-cn/docusaurus-plugin-content-docs/current/user/registry/namingserver.md new file mode 100644 index 0000000000..de5c54f4c6 --- /dev/null +++ b/i18n/zh-cn/docusaurus-plugin-content-docs/current/user/registry/namingserver.md @@ -0,0 +1,85 @@ +--- +title: Seata Namingserver 注册中心 +keywords: [ Seata, Namingserver ] +description: namingserver 注册中心。 +--- + +# Namingserver 注册中心 + +Namingserver 是 Seata 原生的注册中心. + +## 预备工作 +可以选择在编译器中运行namingserver或者打包后运行namingserver +### 编译器运行namingserver + +进入`namingsever`目录,在`resources/application.yml`下设置namingserver启动的端口号,启动namingserver + +### 打包运行namingserver + +执行`mvn clean install -U -Prelease-seata-namingserver`打包命令 +```shell +`mvn clean install -U -Prelease-seata-namingserver` +``` +在`\distribution\target\apache-seata-2.2.0-SNAPSHOT-incubating-bin\seata-namingserver`目录下的`conf/application.yml`中配置namingserver启动的端口号, +mac或linux运行 +``` shell +bin\seata-namingserver.sh +``` +windows环境运行 +``` shell +bin\seata-namingserver.bat +``` + +## 快速上手 + +Seata 使用 namingserver 作为注册中心的操作步骤非常简单,分为在client端的配置以及在server端的配置 + +### Client端配置注册中心 + +在 [**application.yml**](https://github.com/apache/incubator-seata/blob/2.x/script/client/spring/application.yml) +中加入对应的注册中心。 + +```yaml +seata: + registry: + type: seata + seata: + server-addr: 127.0.0.1:8081 ##第一步配置的namingserver的ip+端口,若有多个namingserver节点则用逗号分割 + namespace: public ##命名空间 + heartbeat-period: 5000 ##心跳时间 +``` + +### Server端配置注册中心 + +在 `conf/application.yaml`加入以下配置, +其余配置参考 [configuration options](https://github.com/apache/incubator-seata/blob/2.x/server/src/main/resources/application.example.yml): + +```yaml +seata: + registry: + type: seata + seata: + server-addr: 127.0.0.1:8081 ##第一步配置的namingserver的ip+端口,若有多个namingserver节点则用逗号分割 + cluster: default ##集群名称 + namespace: public ##命名空间 + heartbeat-period: 5000 ##心跳时间 +``` + +### 创建client端的事务分组->seata集群的映射关系 +向一个namingserver节点发起创建事务分组映射关系的http请求(namingserver节点会自动同步给其它节点) +```shell +http://127.0.0.1:8081/naming/v1/addGroup?clusterName=cluster2&namespace=public&unitName&vGroup=my_test_tx_group +``` +(其中namespace是client端配置的命名空间,vGroup是client端配置的事务分组,clusterName是需要映射到的server端的集群名称) + +### 切换client端的事务分组->seata集群的映射关系(切流) +向一个namingserver节点发起修改事务分组映射关系的http请求(namingserver节点会自动同步给其它节点) +```shell +http://127.0.0.1:8081/naming/v1/changeGroup?clusterName=cluster2&namespace=public&unitName&vGroup=my_test_tx_group +``` +(其中namespace是client端配置的命名空间,vGroup是client端配置的事务分组,clusterName是需要映射到的server端的集群名称) + + +随后,启动 Seata-Server 后,Client 配置完成后启动应用就可以正式体验 Seata 服务。 + +Tips:请确保client与server的注册处于同一个namespace,不然会找不到服务。 diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md b/i18n/zh-cn/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md index 5a86ad47db..de5c54f4c6 100644 --- a/i18n/zh-cn/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md +++ b/i18n/zh-cn/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md @@ -68,10 +68,18 @@ seata: ### 创建client端的事务分组->seata集群的映射关系 向一个namingserver节点发起创建事务分组映射关系的http请求(namingserver节点会自动同步给其它节点) ```shell +http://127.0.0.1:8081/naming/v1/addGroup?clusterName=cluster2&namespace=public&unitName&vGroup=my_test_tx_group +``` +(其中namespace是client端配置的命名空间,vGroup是client端配置的事务分组,clusterName是需要映射到的server端的集群名称) + +### 切换client端的事务分组->seata集群的映射关系(切流) +向一个namingserver节点发起修改事务分组映射关系的http请求(namingserver节点会自动同步给其它节点) +```shell http://127.0.0.1:8081/naming/v1/changeGroup?clusterName=cluster2&namespace=public&unitName&vGroup=my_test_tx_group ``` (其中namespace是client端配置的命名空间,vGroup是client端配置的事务分组,clusterName是需要映射到的server端的集群名称) + 随后,启动 Seata-Server 后,Client 配置完成后启动应用就可以正式体验 Seata 服务。 Tips:请确保client与server的注册处于同一个namespace,不然会找不到服务。 diff --git a/sidebars.js b/sidebars.js index a139cf6b5c..4f73bcead4 100644 --- a/sidebars.js +++ b/sidebars.js @@ -72,6 +72,7 @@ const sidebars = { 'user/registry/etcd3', 'user/registry/consul', 'user/registry/zookeeper', + 'user/registry/namingserver', ], }, 'user/api', @@ -180,7 +181,7 @@ const sidebars = { 'developers/committer-guide/label-an-issue-guide_dev', 'developers/committer-guide/website-guide_dev' ], - + }, { type: 'category', From 051bba552bb99233d54a3ee98383669fe25b0f37 Mon Sep 17 00:00:00 2001 From: ggbocoder <1832877748@qq.com> Date: Sat, 19 Oct 2024 17:29:38 +0800 Subject: [PATCH 3/4] add namingserver blog --- blog/seata-namingserver.md | 1 + .../seata-namingserver.md | 155 ++++++++++++++++++ static/img/blog/namingserver1.png | Bin 0 -> 31792 bytes static/img/blog/namingserver2.png | Bin 0 -> 21765 bytes static/img/blog/namingserver3.png | Bin 0 -> 35759 bytes 5 files changed, 156 insertions(+) create mode 100644 blog/seata-namingserver.md create mode 100644 i18n/zh-cn/docusaurus-plugin-content-blog/seata-namingserver.md create mode 100644 static/img/blog/namingserver1.png create mode 100644 static/img/blog/namingserver2.png create mode 100644 static/img/blog/namingserver3.png diff --git a/blog/seata-namingserver.md b/blog/seata-namingserver.md new file mode 100644 index 0000000000..8f9293a8d5 --- /dev/null +++ b/blog/seata-namingserver.md @@ -0,0 +1 @@ +Placeholder. DO NOT DELETE. diff --git a/i18n/zh-cn/docusaurus-plugin-content-blog/seata-namingserver.md b/i18n/zh-cn/docusaurus-plugin-content-blog/seata-namingserver.md new file mode 100644 index 0000000000..31957aa18f --- /dev/null +++ b/i18n/zh-cn/docusaurus-plugin-content-blog/seata-namingserver.md @@ -0,0 +1,155 @@ +--- +title: Seata Namingserver +author: 蒋俊敏 +description: 在本文中,我将分享seata的注册中心namingserver的设计思路以及使用方式 +date: 2024/9/25 +keywords: [seata,分布式事务,注册中心,namingserver] +--- + +# 1. 项目背景 +seata目前支持多种注册中心的实现,为了提供整个链路的闭环功能,seata设计推出了原生的注册中心namingserver + +# 2. 领域模型 + +### 2.1 命名空间与事务分组 + +- Namespace:在NamingServer模型中,命名空间(Namespace)用于实现命名空间的环境隔离。它允许在不同的环境(如开发、测试、生产)中隔离各自的服务实例。 +- Cluster与Unit:Cluster(集群)负责事务分组的处理,Unit则在每个集群内部做负载均衡。事务分组(vgroup)在命名空间和集群的配合下,通过元数据定位到具体的TC节点。 + +### 2.2 事务处理流程与namingserver的交互 + +![img](/img/blog/namingserver1.png) +事务处理流程与namingserver的交互的流程如下: + +1.在client侧配置好Namingserver的地址和相关配置 + +2.client启动后TM向namingserver发起服务发现的请求 + +3.namingserver根据TM传来的vGroup参数和内存中的事务分组映射关系返回相关的集群列表,namingserver返回的集群列表元数据如下 + +```json +{ + "clusterList": [ + { + "clusterName": "cluster2", + "clusterType": "default", + "groupList":[group1,group2] + "unitData": [ + { + "unitName": "115482ee-cf27-45d6-b17e-31b9e2d7892f", + "namingInstanceList": [ + { + "ip": "172.31.31.191", + "port": 8092, + "nettyPort": 0, + "grpcPort": 0, + "weight": 1.0, + "healthy": true, + "timeStamp": 1695042063334, + "role": member, + "metadata": { + "weight": 1, + "cluster-type": "default" + } + } + ] + }, + { + "unitName": "097e6ab7-d2d2-47e4-a578-fae1a4f4c517", + "namingInstanceList": [ + { + "ip": "172.31.31.191", + "port": 8091, + "nettyPort": 0, + "grpcPort": 0, + "weight": 1.0, + "healthy": true, + "timeStamp": 1695042076481, + "role": member, + "metadata": { + "weight": 1, + "cluster-type": "default" + } + } + ] + } + ] + } + ], + "term": 1695042076578 +} +``` + +4.客户端通过负载均衡策略找出合适的TC节点开启事务 + +5.TM将事务分组和TC节点传递给RM + +6.RM向TC节点发起分支注册的请求 + +7.TC节点完成二阶段下发 + +# 3.设计思路 + +### 3.1 AP还是CP? + +CAP协议又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。 分布式系统的CAP理论:理论首先把分布式系统中的三个特性进行了如下归纳: + +● 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本) + +● 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性) + +● 分区容错性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。 + +对于namingserver而言,我们更倾向于使用AP模型,即注重可用性和分区容错性,牺牲一定的一致性。NamingServer作为服务注册中心,主要职责是提供高效的服务发现与注册服务,而对短时间内的数据一致性要求可以适当放松。在分布式环境中,可能会出现多个节点短暂的注册数据不一致现象。例如,当多个NamingServer节点发生了网络分区时,某些节点获取的注册信息可能有延迟。 +对于NamingServer来说,这种短暂的不一致性我们认为是可以容忍的。由于服务注册与发现的强一致性要求并不高,即使在某个时刻有部分节点的注册数据滞后或不一致,也不会立刻影响到整个系统的正常服务。通过心跳机制、周期性同步等方式,最终一致性可以逐渐得到保证。 + + + +### 3.2 Quorum NWR机制在NamingServer中的应用 +Quorum NWR(仲裁读写)是一种在分布式系统中用于确保数据一致性的机制。该机制通过设置副本的总数(N)、写操作需要成功的副本数(W)、读操作需要访问的副本数(R)来协调数据的一致性。在NamingServer的设计中,采用了多写+补偿机制来保证多个NamingServer节点之间的信息一致性,而客户端则与某一个NamingServer节点交互以获取注册信息。 + +1. 写入操作(W-写仲裁): + 当有集群节点变化时,server端会将请求发送到NamingServer集群中的多个节点。 + 根据NWR机制,系统确保至少有W个副本成功写入注册信息。 通过多写机制,即使某些节点暂时不可用或存在网络延迟,仍能确保写操作的高可用性。一旦W个节点写入成功,客户端将收到成功响应。 + 补偿机制:对于没有立即成功写入的副本,系统会通过异步补偿方式,在稍后的时间段内同步这些节点,确保最终一致性。 +2. 读取操作(R-读仲裁): + 客户端通过与NamingServer集群中的任意一个节点进行交互,发送读取请求以获取服务注册信息。 + 系统会从至少R个副本中读取数据,采用最新版本的数据作为返回结果。即使某些节点的数据存在短暂不一致,客户端通过读取多个副本并比较其版本号或一致性标记,能够确保读取到最新的注册信息。 + 由于客户端只与一个NamingServer节点进行交互,读取操作的效率得到了提升,并且避免了多个节点之间的复杂协调,系统依然能保证最终一致性。 +3. NWR参数的设计与权衡: + 在namingserver中我们设置W=N、R=1。W=N虽然意味着写入需要发送到所有节点,但并不要求所有节点必须立即成功写入。系统允许某些节点暂时失败,通过补偿机制在后续阶段同步这些节点,从而提高系统的容错性,因为即便某些节点在写入时发生故障或网络中断,数据更新仍然可以通过补偿机制最终传播到所有节点。这既保证了系统的高可用性,也确保了数据最终在所有节点上是一致的。由于写操作要求所有节点参与,因此每个节点都会接收到最新的数据更新。 + 客户端在执行读取操作时,可以从任意一个NamingServer节点读取数据,而不必担心数据不一致的问题。即使某些节点未能在写入时立即成功,客户端仍能从其他已成功写入的节点获取最新的注册信息。这样,R值可以设定较低(如R=1),从而提高读取操作的效率,同时系统通过补偿机制确保所有节点最终达到一致。 +![img](/img/blog/namingserver2.png) + +## 3.2 架构图 + + +![img](/img/blog/namingserver3.png) + +namingserver的运行链路如上图所示: + +1. 通过控制台在某个cluster下创建一个事务分组vgroup。 +2. 创建vgroup->cluster的请求发送给namingserver,namingserver再传递给对应的tc节点。 +3. tc节点将vgroup->cluster映射关系持久化保存。 +4. tc节点在心跳的时候将vgroup->cluster的映射关系更新到所有的namingserver。 +5. client通过自己配置的事务分组vgroup从namingserver获取对应cluster元数据。 +6. client在事务流程中,使用cluster下的unit进行负载均衡,再进行begin,registry,commit,rollback等。 +7. 事务决议后,对应的unit下的leader节点下发二阶段,无状态节点下,每个unit的唯一node就是leader。 + + +## 3.3 设计细节 + +### 3.3.1 长轮询推送集群变化情况 + +![img](https://camo.githubusercontent.com/82b14f95feb7ce17af5ca953dbb0340f1a86519c9067433944ac5fa8c26711c8/68747470733a2f2f63646e2e6e6c61726b2e636f6d2f79757175652f302f323032332f706e672f33333531373535322f313639353236343333343035342d38393065623863382d653437302d343761362d623030372d3732343365303938313732652e706e67) + +如上图所示,每隔30s client侧需要向namingserver发起一次服务发现的请求,用以拉取最新的tc列表。而在这30s的间隔中,client侧将采用HTTP长轮询的方式一直watch namingserver节点,如果namingserver 侧有如下的变化: + +> 1.事务分组映射关系的变化; +> +> 2.集群中实例的增加或者减少; +> +> 3.集群中实例的属性的变化; + +那么watch返回200状态码,告知client需要获取最新集群信息;否则namingserver将一直挂起watch方法,直到HTTP长轮询超时,然后返回304状态码, 告知client进行下一轮watch。 + diff --git a/static/img/blog/namingserver1.png b/static/img/blog/namingserver1.png new file mode 100644 index 0000000000000000000000000000000000000000..6b4ff10465e6fb587fe74a43ec021ee4c89d1f1a GIT binary patch literal 31792 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 literal 0 HcmV?d00001 diff --git a/static/img/blog/namingserver3.png b/static/img/blog/namingserver3.png new file mode 100644 index 0000000000000000000000000000000000000000..9369e2283d0cfec3ccec751b82496b1562a6e9b1 GIT binary patch literal 35759 zcmdSBcU)6V_b-YSJ2pfFK}Ey|ga}A4Q4x>_1QZaZ1x1P=%}9rA6%|p6i1ZQ_r56>D zPDE+a0@9>QOX!e~%EXus!|u6LSaRM8i@YBg)!pp)Sf}9+#bso3>W=o>x>*P$=4Hy%1q- z<@R9}AcbxA&MGwPmrYlFh@bU4yN=Ak`lYR=va^1D?$FnOpWCG;nXDI1q7J~U$IlT@ zAl7dqS2dFLJF@xz$?J_>r5kwak~m$?us-@cFXPhNf!)v0)ZvI29g(qztQk)_>QVFD zNmtRk3rwfP)z5z?&y$C0xRctBT%L4Rnw)i*oCPgYGGaf3(ilR)%j7k7RpXvkvU{}6U9YcSY@oKvhB<~YbYt678p$H@u%jCuY#<^&#U zgh#BkFs$Es-+yoBxA6G*AT^Q1_kW$r?OVmp>vUnAH+_&_#%7)8^4loF$JyQ)tq%WVP3ihbK?Q{@XD41iVdNd zzDQr4`x*yei4bTtAgh9cXZXGD4;guLXR-a>{EiDvRVp4L!38)=MHP$QhX`6pD5*n_ ziHN)HCjU<1#4BlqJ(=l@!HYRQhV=0pb@U;TqzWI-Q_E6O7y^C1w^;%a1~I!{%rFe} zeTPs-$U1CPp%*4hRh&dOYAcDj+7G8*Y*AC9*lf7%BOdW~L?B55>Gd~%0Afjwi@y4i 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 QjoyEku7S>@?T0V_7YBp+FaQ7m literal 0 HcmV?d00001 From ad505ec54ae3014c3776fc0d18eab1063fe17491 Mon Sep 17 00:00:00 2001 From: ggbocoder <1832877748@qq.com> Date: Thu, 24 Oct 2024 16:17:53 +0800 Subject: [PATCH 4/4] add namingserver.md --- .../current/user/registry/namingserver.md | 22 +++++++++-------- .../user/registry/namingserver.md | 24 +++++++++++-------- .../current/user/registry/namingserver.md | 19 +++++++-------- .../user/registry/namingserver.md | 14 +++++------ 4 files changed, 42 insertions(+), 37 deletions(-) diff --git a/i18n/en/docusaurus-plugin-content-docs/current/user/registry/namingserver.md b/i18n/en/docusaurus-plugin-content-docs/current/user/registry/namingserver.md index 88c7b05f61..47b64f5773 100644 --- a/i18n/en/docusaurus-plugin-content-docs/current/user/registry/namingserver.md +++ b/i18n/en/docusaurus-plugin-content-docs/current/user/registry/namingserver.md @@ -14,22 +14,22 @@ You can choose to run the naming server in the compiler or after packaging it. ### Running the naming server in the compiler Go to the namingserver directory, set the port number for the naming server in resources/application.yml, and start the naming server. -### Running the naming server after packaging -Execute the packaging command: -```shell -mvn clean install -U -Prelease-seata-namingserver -``` -Set the naming server port number in the `conf/application.yml` file located in the `\\distribution\\target\\apache-seata-2.2.0-SNAPSHOT-incubating-bin\\seata-namingserver` directory. -For macOS or Linux, run: +### Running Naming Server +Download the Seata 2.2.0 binary package from the [link](https://seata.apache.org/unversioned/download/seata-server/) and unzip it. Then, enter the seata-namingserver directory. + +In the conf/application.yml file, configure the port number for starting the naming server. + +For Mac or Linux, run: ```shell -bin\\seata-namingserver.sh +bin/seata-namingserver.sh ``` For Windows, run: ```shell -bin\\seata-namingserver.bat +bin/seata-namingserver.bat ``` + ## Getting Started Quickly The process to use the naming server as Seata's registration center is very simple and involves configuring both the client and server sides. @@ -77,4 +77,6 @@ http://127.0.0.1:8081/naming/v1/changeGroup?clusterName=cluster2&namespace=publi Afterward, once Seata-Server is started and the client configuration is complete, you can begin to experience Seata services. -Tips: Ensure that both the client and server are registered under the same namespace; otherwise, the service won't be found. +Tips: +- 1.Please ensure that the client and server are registered under the same namespace; otherwise, the service will not be found. +- 2.Note that the naming server is only allowed to be used in a private network; do not expose it to the public environment. diff --git a/i18n/en/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md b/i18n/en/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md index 88c7b05f61..f62d17f933 100644 --- a/i18n/en/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md +++ b/i18n/en/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md @@ -14,21 +14,23 @@ You can choose to run the naming server in the compiler or after packaging it. ### Running the naming server in the compiler Go to the namingserver directory, set the port number for the naming server in resources/application.yml, and start the naming server. -### Running the naming server after packaging -Execute the packaging command: -```shell -mvn clean install -U -Prelease-seata-namingserver -``` -Set the naming server port number in the `conf/application.yml` file located in the `\\distribution\\target\\apache-seata-2.2.0-SNAPSHOT-incubating-bin\\seata-namingserver` directory. -For macOS or Linux, run: +### Running the naming server in the compiler +Go to the namingserver directory, set the port number for the naming server in resources/application.yml, and start the naming server. + +### Running Naming Server +Download the Seata 2.2.0 binary package from the [link](https://seata.apache.org/unversioned/download/seata-server/) and unzip it. Then, enter the seata-namingserver directory. + +In the conf/application.yml file, configure the port number for starting the naming server. + +For Mac or Linux, run: ```shell -bin\\seata-namingserver.sh +bin/seata-namingserver.sh ``` For Windows, run: ```shell -bin\\seata-namingserver.bat +bin/seata-namingserver.bat ``` ## Getting Started Quickly The process to use the naming server as Seata's registration center is very simple and involves configuring both the client and server sides. @@ -77,4 +79,6 @@ http://127.0.0.1:8081/naming/v1/changeGroup?clusterName=cluster2&namespace=publi Afterward, once Seata-Server is started and the client configuration is complete, you can begin to experience Seata services. -Tips: Ensure that both the client and server are registered under the same namespace; otherwise, the service won't be found. +Tips: +- 1.Please ensure that the client and server are registered under the same namespace; otherwise, the service will not be found. +- 2.Note that the naming server is only allowed to be used in a private network; do not expose it to the public environment. diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/current/user/registry/namingserver.md b/i18n/zh-cn/docusaurus-plugin-content-docs/current/user/registry/namingserver.md index de5c54f4c6..eb0d815cef 100644 --- a/i18n/zh-cn/docusaurus-plugin-content-docs/current/user/registry/namingserver.md +++ b/i18n/zh-cn/docusaurus-plugin-content-docs/current/user/registry/namingserver.md @@ -14,22 +14,19 @@ Namingserver 是 Seata 原生的注册中心. 进入`namingsever`目录,在`resources/application.yml`下设置namingserver启动的端口号,启动namingserver -### 打包运行namingserver +### 运行namingserver -执行`mvn clean install -U -Prelease-seata-namingserver`打包命令 -```shell -`mvn clean install -U -Prelease-seata-namingserver` -``` -在`\distribution\target\apache-seata-2.2.0-SNAPSHOT-incubating-bin\seata-namingserver`目录下的`conf/application.yml`中配置namingserver启动的端口号, +从[链接](https://seata.apache.org/unversioned/download/seata-server/)下载namingserver的发行包)下载seata2.2.0的二进制压缩包,解压后进入seata-namingserver目录 + +目录下的conf/application.yml中配置namingserver启动的端口号, mac或linux运行 -``` shell +```shell bin\seata-namingserver.sh ``` windows环境运行 -``` shell +```shell bin\seata-namingserver.bat ``` - ## 快速上手 Seata 使用 namingserver 作为注册中心的操作步骤非常简单,分为在client端的配置以及在server端的配置 @@ -82,4 +79,6 @@ http://127.0.0.1:8081/naming/v1/changeGroup?clusterName=cluster2&namespace=publi 随后,启动 Seata-Server 后,Client 配置完成后启动应用就可以正式体验 Seata 服务。 -Tips:请确保client与server的注册处于同一个namespace,不然会找不到服务。 +Tips: +- 1.请确保client与server的注册处于同一个namespace,不然会找不到服务。 +- 2.注意namingserver只允许在内网使用,切勿暴露到公网环境 diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md b/i18n/zh-cn/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md index de5c54f4c6..7af66721cb 100644 --- a/i18n/zh-cn/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md +++ b/i18n/zh-cn/docusaurus-plugin-content-docs/version-v2.2/user/registry/namingserver.md @@ -14,13 +14,11 @@ Namingserver 是 Seata 原生的注册中心. 进入`namingsever`目录,在`resources/application.yml`下设置namingserver启动的端口号,启动namingserver -### 打包运行namingserver +### 运行namingserver -执行`mvn clean install -U -Prelease-seata-namingserver`打包命令 -```shell -`mvn clean install -U -Prelease-seata-namingserver` -``` -在`\distribution\target\apache-seata-2.2.0-SNAPSHOT-incubating-bin\seata-namingserver`目录下的`conf/application.yml`中配置namingserver启动的端口号, +从[链接](https://seata.apache.org/unversioned/download/seata-server/)下载namingserver的发行包)下载seata2.2.0的二进制压缩包,解压后进入seata-namingserver目录 + +目录下的`conf/application.yml`中配置namingserver启动的端口号, mac或linux运行 ``` shell bin\seata-namingserver.sh @@ -82,4 +80,6 @@ http://127.0.0.1:8081/naming/v1/changeGroup?clusterName=cluster2&namespace=publi 随后,启动 Seata-Server 后,Client 配置完成后启动应用就可以正式体验 Seata 服务。 -Tips:请确保client与server的注册处于同一个namespace,不然会找不到服务。 +Tips: +- 1.请确保client与server的注册处于同一个namespace,不然会找不到服务。 +- 2.注意namingserver只允许在内网使用,切勿暴露到公网环境