Etcd学习(二)集群搭建Clustering

Etcd学习(二)集群搭建Clustering

大家好,又见面了,我是全栈君。

1、单个etcd节点(測试开发用)

之前我一直开发測试一直是用的一个Etcd节点,然后启动命令一直都是直接打一个etcd(我已经将etcd安装文件夹的bin文件夹增加到PATH环境变量中),然后启动信息显示etcd server监听在默认的4001port。peer server监听在默认的7001port。

或者指定路径和名称:etcd -data-dir /usr/local/etcdData/machine0 -name machine0

2、三个Etcd节点组成Clustering

然后今天想測试一下集群功能,就依照gutHub上面的教程:

參考:https://github.com/coreos/etcd/blob/master/Documentation/clustering.md

Let start by creating 3 new etcd instances.

We use -peer-addr to specify server port and -addr to specify client port and -data-dir to specify the directory to store the log and info of the machine in the cluster:

./etcd -peer-addr 127.0.0.1:7001 -addr 127.0.0.1:4001 -data-dir machines/machine1 -name machine1

Note: If you want to run etcd on an external IP address and still have access locally, you’ll need to add -bind-addr 0.0.0.0so that it will listen on both external and localhost addresses. A similar argument -peer-bind-addr is used to setup the listening address for the server port.

Let’s join two more machines to this cluster using the -peers argument. A single connection to any peer will allow a new machine to join, but multiple can be specified for greater resiliency.

./etcd -peer-addr 127.0.0.1:7002 -addr 127.0.0.1:4002 -peers 127.0.0.1:7001,127.0.0.1:7003 -data-dir machines/machine2 -name machine2
./etcd -peer-addr 127.0.0.1:7003 -addr 127.0.0.1:4003 -peers 127.0.0.1:7001,127.0.0.1:7002 -data-dir machines/machine3 -name machine3

备注:

We can also get the current leader in the cluster:

curl -L http://127.0.0.1:4001/v2/leader

We can retrieve a list of machines in the cluster using the HTTP API:

curl -L http://127.0.0.1:4001/v2/machines

打开三个终端将上面三个命令都原原本本运行了一下。

然后运行Get操作查看我之前单个节点时加进去的节点的内容:

curl -L http://127.0.0.1:4002/v2/keys/configA

结果发现key not found的提示。难道在原来一个节点的基础上加了两个节点组成一个集群。会导致之前的数据丢失?

后来研究了一下这个命令。发现指定了数据存储路径,我猜想:

(1)仅仅要同一时候执行的etcd命令<IP。 Port>不冲突,能够同一时候启动多个etcd节点。

(2)即时启动在不同一时候间启动在同样<IP。Port>上,仅仅要数据路径指定的不一样。也不是同一个etcd节点。

所以我果断关掉刚才打开的这三个终端。还是用执行我曾经的那个etcd命令(默认启动在哪个数据路径我还不知道),然后执行Get操作查看我之前单个节点时加进去的节点的内容:

curl -L http://127.0.0.1:4002/v2/keys/configA

发现内容都在。看来我后来启动的这三个组成clustering的etcd节点和我之前启动的那个etcd节点没有没有关系,由于不是使用同样的数据路径。

3、三个Etcd节点组成Clustering的数据持久性

刚才已经把三个etcd集群的节点关掉了,如今又一次启动这三个节点。

发现之前写入的节点以及值都还在。说明持久性没有问题。

然后我在/home文件夹以下找到了machines这个文件夹,将以下的三个machines,machine2,machine3所有删掉,再次用上面的三个命令启动集群。再次查看之前加的节点。发现已经不存在了。说明集群的数据都是存储在其指定的数据路径以下。

备注:所以说,如要要全然又一次使用你的etcdserver,即要清掉之前的全部数据,将文件夹删除掉就可以。

4、三个Etcd节点组成Clustering应该訪问那个(进行操作请求)

(1)针对读取操作三个随意一个都能够,即使它不是leader

(2)针对写入操作。好像仅仅能通过连接leader来进行写入。

我有一个由三个节点组成的集群(127.0.0.1:4001、127.0.0.1:4002以及127.0.0.1:4003),有一个连接到集群开启定时器定时注冊服务(实际上是定时创建带TTL的Node)的程序。例如以下所看到的:

string sysFlag = "CBIP";
            IRegistryCenterClient rCenter = RegistryCenterClientFactory.GetRegistryCenterClient();

            ServiceInfo sInfo1 = new ServiceInfo();
            sInfo1.serviceName = "HelloService";
            sInfo1.serviceIP = "127.0.0.111";
            sInfo1.servicePort = 1888;
            rCenter.RegisterService(sInfo1);

            while (true)
            {
                Console.WriteLine(rCenter.GetConfigItem(sysFlag, "configA"));
                Console.WriteLine(rCenter.GetConfigItem(sysFlag, "configB"));
                Thread.Sleep(200);
            }

我连接到的是集群中的127.0.0.1:4001节点,開始的时候集群的leader是127.0.0.1:4001,可是随着时间推移leader会产生变化。可能会变成127.0.0.1:4002或者127.0.0.1:4003。我发现一个结论:
仅仅要leader是127.0.0.1:4001,服务就行成功注冊(成功写入集群)。仅仅要leader不是127.0.0.1:4001,就会注冊失败!而循环中读取配置项会一直有效,不会随着leader的变化失效。

问题: 为什么我依照这个教程启动的三个节点的集群,随时时间推移,leader会变来变去???

etcd还比較新,如今还在不断开发中。1.0版本号都还没有出来,让我们拭目以待@!

5、必需要三个节点组成Clustering?

要构建ETCD集群,至少须要三个节点。

多于三个节点都能够。可是一旦超过9个。ETCD集群仅仅会将当中的一个子集作为集群来执行Raft算法。其它多出来的节点将会以单独启动的方式执行,作为备胎。

所以3-9个最合适。

可是从以下的表能够看出,由于涉及到写入延迟和可靠性两个问题,3-9之间的奇数个节点组成的集群总是最有效、最优的。

6、集群中的节点分布在多个不同机器上。效果是否一样?

一样。

===========  以下内容是我从ETCD的GutHub上面翻译而来 ==============

Optimal etcd Cluster Size

etcd的Raft一致性算法在比較小的集群(3-9个节点)上面最有效,对于超过9个节点的集群,etcd将会选择全部节点的一个子集来运行Raft算法。以便保证有效性。

Cluster Management

你能够通过 cluster config API.来管理活跃的集群的大小, activeSize 描写叙述了etcd集群活跃节点(etcd peers)的数目。

假如etcd实例的总数超过了这个数目。那么多出来的节点(peers)将会以独立(standbys)的方式启动,假如集群中一个活跃的节点挂掉或者被移除掉,那么这些多出来的单独启动的节点将会增加到活跃集群中。

Internals of etcd

Writing to etcd

写一个etcd节点总是会被重定向到这个集群的leader。以及被分发到集群中全部的节点,仅仅有当大多数节点(Majority — 參见以下的表)确认这个写入操作成功了,那么这个写入才算是成功的。

比如。一个有个节点的集群。那么一个写入操作最快也要等成功写了三个节点才算写入成功。这就是为什么节点数目最好小于9的原因。我们须要考虑写入的高性能(低延迟)。

Leader Election

领导者选举过程类似于写一个key。集群中大多数的节点须要承认这个新的领导者,才干继续集群相关的操作。

Odd Active Cluster Size

一个重要的集群优化策略是要保障集群中活跃节点的数目(i.e. activeSize)始终为奇数个。

比方你看3个节点与4个节点对照,5个节点与6个节点对照,7个节点和8个节点对照: Majority数目添加了,导致写入操作延时更高了,可是Failure Tolerance数目并没有不论什么添加。就可以靠性(同意挂掉的节点数)没有添加。

Active Peers Majority Failure Tolerance
1 peers 1 peers None
3 peers 2 peers 1 peer
4 peers 3 peers 1 peer
5 peers 3 peers 2 peers
6 peers 4 peers 2 peers
7 peers 4 peers 3 peers
8 peers 5 peers 3 peers
9 peers 5 peers 4 peers

如你所见,添加新的节点奖集群中节点数目变成奇数个总是值得的。

During a network partition, an odd number of active peers also guarantees that there will almost always be a majority of the cluster that can continue to operate and be the source of truth when the partition ends.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115607.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • pytest报错_eclipse提交代码到git

    pytest报错_eclipse提交代码到git前言我们每天写完自动化用例后都会提交到git仓库,随着用例的增多,为了保证仓库代码的干净,当有用例新增的时候,我们希望只运行新增的未提交git仓库的用例。pytest-picked插件可以

  • vmware linux安装教程_vmware10虚拟机安装教程

    vmware linux安装教程_vmware10虚拟机安装教程一、安装VMware下载地址(16pro):https://www.aliyundrive.com/s/FSktJJXsfa8安装:选一下安装地址,一直下一步即可。(可能会要求重启电脑,重启即可)二、安装Linux下载地址:CentOS-7.5提取码:486k接下来看图操作2.1新建虚拟机现在我们就相当于买电脑,先把电脑配置整好。什么cpu啊内存条啊硬盘啊什么乱七八糟的,先不着急装系统。这里看你装什么版本的Linux了,我装的是GenOS7.564位所以选的是Ge

  • 微生物组-宏基因组分析第9期(报名直播课免费参加线下2020.10本年最后一期)

    微生物组-宏基因组分析第9期(报名直播课免费参加线下2020.10本年最后一期)福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析、宏基因组、Python课程和转录组的线上直播课。报名参加线上直播课的老师可在1年内选择参加同课…

  • Spring中,三级缓存解决循环依赖[通俗易懂]

    Spring中,三级缓存解决循环依赖[通俗易懂]发现Spring三级缓存没有写到博客里,这里从自己的笔记迁移一下,补上:创建的都是单例,如果是构造方法注入,不能解决;如果是设值方法注入,用三级缓存解决:DefaultSingletonBeanRegistry:singletonObjectsearlySingletonObjectssingletonFactories代码流程:bean在createBeanInstance后,populateBean前:DefaultSingletonBeanRegistry:addSingl

  • 静态方法中可以访问非静态成员变量_多线程局部变量会不会互相影响

    静态方法中可以访问非静态成员变量_多线程局部变量会不会互相影响静态内部类访问包含它的外部类的非静态成员变量时,可以通过new外部类().成员的方式访问,这是因为静态的只能访问静态的,因为他们在对象没创建前就存在了。如果想访问非静态的则必须初始化该对象,因为只有初始化后对象在内存才存在(静态的除外)…

  • 链表排序总结(全)(C++)[通俗易懂]

    链表排序总结(全)(C++)[通俗易懂]文章目录链表排序与数组排序的区别借助外部空间冒泡排序插入排序归并排序快速排序链表排序与数组排序的区别数组的排序几乎所有人都很熟悉了,常用的算法插入、冒泡、归并以及快排等都会或多或少依赖于数组可以在O(1)时间随机访问的特点。链表排序一般指单链表排序,链表是不支持随机访问的,需要访问后面的节点只能从表头顺序遍历,所以链表的排序是一个相对比较复杂的问题。那么怎样进行链表排序呢?借助外部空间既然数组排序简单,那可以借助数组进行排序:把链表中的值一次遍历导入数组(时间复杂度O(n))对数组进行排序

    2022年10月11日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号