一、单个etcd节点(測试开发用)git
以前我一直开发測试一直是用的一个Etcd节点,而后启动命令一直都是直接打一个etcd(我已经将etcd安装文件夹的bin文件夹增长到PATH环境变量中),而后启动信息显示etcd server监听在默认的4001port。peer server监听在默认的7001port。github
或者指定路径和名称:etcd -data-dir /usr/local/etcdData/machine0 -name machine0算法
二、三个Etcd节点组成Clusteringapi
而后今天想測试一下集群功能,就依照gutHub上面的教程:curl
參考: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:this
./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.0
so 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.url
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.spa
./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节点没有没有关系,因为不是使用一样的数据路径。
三、三个Etcd节点组成Clustering的数据持久性
刚才已经把三个etcd集群的节点关掉了,现在又一次启动这三个节点。
发现以前写入的节点以及值都还在。说明持久性没有问题。
而后我在/home文件夹如下找到了machines这个文件夹,将如下的三个machines,machine2,machine3全部删掉,再次用上面的三个命令启动集群。再次查看以前加的节点。发现已经不存在了。说明集群的数据都是存储在其指定的数据路径如下。
备注:因此说,如要要全然又一次使用你的etcdserver,即要清掉以前的所有数据,将文件夹删除掉就能够。
四、三个Etcd节点组成Clustering应该訪问那个(进行操做请求)
(1)针对读取操做三个随意一个都可以,即便它不是leader
(2)针对写入操做。好像仅仅能经过链接leader来进行写入。
我有一个由三个节点组成的集群(127.0.0.1:400一、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); }
问题: 为何我依照这个教程启动的三个节点的集群,随时时间推移,leader会变来变去???
etcd还比較新,现在还在不断开发中。1.0版本号都尚未出来,让咱们拭目以待@!
五、必须要三个节点组成Clustering?
要构建ETCD集群,至少需要三个节点。
多于三个节点都可以。但是一旦超过9个。ETCD集群仅仅会将当中的一个子集做为集群来执行Raft算法。其它多出来的节点将会以单独启动的方式执行,做为备胎。
因此3-9个最合适。
但是从如下的表可以看出,因为涉及到写入延迟和可靠性两个问题,3-9之间的奇数个节点组成的集群老是最有效、最优的。
六、集群中的节点分布在多个不一样机器上。效果是否同样?
同样。
=========== 如下内容是我从ETCD的GutHub上面翻译而来 ==============
etcd的Raft一致性算法在比較小的集群(3-9个节点)上面最有效,对于超过9个节点的集群,etcd将会选择所有节点的一个子集来运行Raft算法。以便保证有效性。
你可以经过 cluster config API.来管理活跃的集群的大小, activeSize
描写叙述了etcd集群活跃节点(etcd peers)的数目。
假如etcd实例的总数超过了这个数目。那么多出来的节点(peers)将会以独立(standbys)的方式启动,假如集群中一个活跃的节点挂掉或者被移除掉,那么这些多出来的单独启动的节点将会增长到活跃集群中。
写一个etcd节点老是会被重定向到这个集群的leader。以及被分发到集群中所有的节点,仅仅有当大多数节点(Majority --- 參见如下的表)确认这个写入操做成功了,那么这个写入才算是成功的。
好比。一个有个节点的集群。那么一个写入操做最快也要等成功写了三个节点才算写入成功。这就是为何节点数目最好小于9的缘由。咱们需要考虑写入的高性能(低延迟)。
领导者选举过程相似于写一个key。集群中大多数的节点需要认可这个新的领导者,才干继续集群相关的操做。
一个重要的集群优化策略是要保障集群中活跃节点的数目(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.