选举机制
Etcd是基于Raft协议实现的,为了了解etcd工作原理,需要先了解下Raft协议原理。先来看看Raft中的选举机制。初始启动时,节点都处于Follower状态,并设定了一个选举超时时间(election timeout),如果这段时间内没有手动来自Leader的heartbeat,节点将主动发起选举,将自己切换成candidate,向集群中其他Follower发送请求,询问是否同意自己成为Leader,如果收到来自集群过半节点数的同意后,节点即成为Leader,开始接受client的数据并向其他Follower节点同步日志,如果未达成一致,candidate会随机选择一个等待时间间隔(150ms-300ms)后再次发起投票。故为了避免冲突,一般情况下节点数据保持奇数,而非偶数。每成功选取一次新Leader的任期Term会比之前Leader的任期大1,且Leader为了保持自己的地位会持续给Follower发heartbeat。
日志复制机制
当Leader接受到client的数据请求后,是如何保持各个节点的数据同步的呢?是通过日志复制机制。当Leader收到客户端的请求后,会把日志追加到本地Log中,然后通过hearbeat把该信息同步给其他Follower,Follower接收到日志后记录日志然后向Leader发送ACK,当Leader收到半数以上的Follower的ACK信息后,将该日志设置为已提交并追加到本地磁盘中,通知客户端已经写入数据,且在下一次heartbeat中Leader通知所有Follower将该日志存储到自己的本地磁盘中。
安全保障机制
2.安装完成后通过如下命令启动etcd
etcd --listen-client-urls 'http://localhost:12379' \ --advertise-client-urls 'http://localhost:12379' \ --listen-peer-urls 'http://localhost:12380' \ --initial-advertise-peer-urls 'http://localhost:12380' \ --initial-cluster 'default=http://localhost:12380'
etcd中常用参数含义如下,更多参数含义可查看这里。
listen-client-url:用于监听客户端通讯的URL列表。这个标记告诉 etcd 在特定的 scheme://IP:port 组合上从客户端接收进来的请求.
listen-peer-url:用于监听伙伴通讯的URL列表。这个标记告诉 etcd 在特定的 scheme://IP:port 组合上从它的伙伴接收进来的请求.
3.写入/获取/查看etcd的数据
上面演示了如何启动etcd,并进行数据写入和查看,接下来看看如果要通过https访问etcd应该如何实现,如果要通过https访问需要签发证书,目前能制作根证书和服务器证书常用工具有cfssl和Openssl,这里演示如何cfssl签发生成证书,然后通过https访问访问etcd。
第一:安装cfssl,如果是mac,可使用命令brew install cfssl进行安装。更多安装细节可查看这里
第二:编写ca的证书请求配置文件ca-csr.json,内容如下所示
{ "CN": "Autogenerated CA", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "O": "Certificates", "OU": "Hastily-Generated Values Divison", "L": "Chengdu", "ST": "Chengdu", "C": "CN" } ] }
第三:通过命令生成证书签发机构CA的私有key的证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
执行命令后会生成ca.csr文件(证书请求文件,属于中间文件,后续不会用到),ca-key.pem文件,私有密钥文件,ca.pem文件即ca的证书文件,后续会用到。

第四:为需要签发证书的服务编写服务证书请求配置文件和CA的配置文件,内容如下所示
服务证书请求的配置文件req-csr.config,hosts里面存放需要签发证书的IP地址或者域名
req-csr.json { "CN": "etcd", "hosts": [ "localhost", "127.0.0.1" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "O": "autogenerated", "OU": "etcd cluster", "L": "the internet" } ] }
CA的配置文件ca-config.json,内容如下所示,里面设置了证书的实效时间
{ "signing": { "default": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "h" } } }
第五:通过命令给服务签发证书,会生成服务的私有key的pem证书文件
cfssl gencert -ca ca.pem -ca-key ca-key.pem -config ca-config.json req-csr.json | cfssljson -bare server
修改生成的文件prefix为peer,再次执行命令生成peer-key.pem,peer.pem以及中间的证书请求文件peer.csr
第六:证书生成后,通过如下命令启动etcd,启动etcd过程中需要传入ca.pem,server.pem,key.pem.
./etcd --listen-client-urls 'https://localhost:12379' \ --data-dir=/tmp/etcd/data \ --advertise-client-urls 'https://localhost:12379' \ --listen-peer-urls 'https://localhost:12380' \ --initial-advertise-peer-urls 'https://localhost:12380' \ --initial-cluster 'default=https://localhost:12380' \ --client-cert-auth --trusted-ca-file=/tmp/certs/ca.pem \ --cert-file=/tmp/certs/server.pem \ --key-file=/tmp/certs/server-key.pem \ --peer-client-cert-auth --peer-trusted-ca-file=/tmp/certs/ca.pem \ --peer-cert-file=/tmp/certs/peer.pem \ --peer-key-file=/tmp/certs/peer-key.pem
etcd成功启动后,尝试通过https方式向etcd写入、输出。
./etcdctl --endpoints=https://localhost:12379 \ --cert /tmp/certs/server.pem \ --key /tmp/certs/server-key.pem \ --cacert /tmp/certs/ca.pem put key1 value1
实验结果如下图所示,可以看到写入、查看数据成功,说明签发证书正确,能通过https的方式访问启动的etcd服务。

除了进行写入查看数据外,还可以对etcd中的数据进行备份和恢复,磁盘碎片整理等。
./etcdctl --endpoints=https://localhost:12379 \ --cert /tmp/certs/server.pem \ --key /tmp/certs/server-key.pem \ --cacert /tmp/certs/ca.pem snapshot save snapshot.db
./etcdctl --endpoints=https://localhost:12379 \ --cert /tmp/certs/server.pem \ --key /tmp/certs/server-key.pem \ --cacert /tmp/certs/ca.pem snapshot restore snapshot.db
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/213621.html原文链接:https://javaforall.net
