PostgreSQL 来自欧罗巴Patroni 为什么选择ETCD 系列 2

2020-09-10 00:00:00 集群 分布式 节点 配置 信息

国庆节是过完了,实际上从本次国庆节看,不少人可能是没有过的太好,高速的车祸貌似更多了,在国庆节第二天加班后回家的高速上,看到一起车祸,车子被撞得的面目全非,堵车长达2个小时,而我停车的地方距离发生事故的地方1000多米,鼻子就可以闻到烧焦的轮胎味道,或许还有人烧焦的味道,从事故车过时只能从轮毂上费劲的辨认出是一辆别克,想想人的这一辈子不知道是明天来的更早还是.......   





接着上期说,既然在众多的postgresql的高可用中Patroni 是有让他被选择成为postgresql的一种高可用方式的先进性, 那下面就有另一个选择点,为什么选择etcd来作为Patroni 的分布式协调服务,而不是zookeeper,或其他的方式.


ETCD 本身是基于go语言编写的,具有下载后马上可以使用的类型,与zookeeper的结构相比,不需要JVM的支持. 这点在配置上就会省去一些精力和时间.

simple , secure, fast , reliable 表达的etcd初的设计初衷.

etcd is an open source distributed key-value store used to hold and manage the critical information that distributed systems need to keep running


ZooKeeper is an open source Apache project that provides a centralized service for providing configuration information, naming, synchronization and group services over large clusters in distributed systems


从上面的定义看etcd 主要的工作是存储分布式键值,管理重要的信,保证分布式系统的运行. Zookeeper 提供的是集中化的服务,为大型分布式的 cluster提供配置信息,命名,同步等服务, zookeeper 使用的是zab协议,而etcd使用的是raft协议, raft 协议已经被不少的分布式数据库中使用,定义明确简单,实现方便,对比PAXOS协议(之前写过 raft 和 paxos 相关协议的文字), leader, follower, candidate 三种服务器的状态,在RAFT 集群中的所有服务器中有体现, 一个时刻只能有一个leader 其他为follower,当出现问题的情况下,会出现candidate 状态,终选举出 new leader .


另外使用etcd作为patroni的搭档,在etcd 的官网上有这样一个信息


ETCD 整体的内部结构


整体的工作简单的描述, 当用户的情况通过客户端或者 http协议 https协议机械能访问,首先通过http server 接口, 将请求转发给store 进行具体的事务处理, 在有关整体集群的状态变更等问题会交给raft 模块处理, 后在本地通过wal 模块进行记录,在快速的提交给其他的节点进行信息同步.

关于信息的写入,有以下特点

对于ETCD的节点中的信息写在所有节点都可以进行,但如果在follower 节点的写会发送到 leader节点,leader节点在将这些数据转发到follower 节点,


作者:kevinyan
链接:https://juejin.im/post/6844903970461351944
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


安装上比较方便,去官网下载对应的安装包即可

etcd-v3.4.7-linux-amd64.tar.gz  以3.4.7 版本的etcd

解压后可以看到里面有两个文件

直接在对应账号中将系统变量设置,并且将相关的文件拷贝到你设置的目录

Etcd 通过2379  client request 和 2380 两个端口进行数据的沟通, 2379 是etcd 与 客户进行沟通的断开 2380 是 etcd 与另一个 etcd 之间沟通的通道.



启动单机非常简单,直接运行etcd命令即可 上图为执行命令后的打印信息,明确的相关的端口

ETCD 的配置方法主要分成 1  变量设置, 2 配置文件设置  3 执行命令中的后缀配置, 其中配置文件的优先级高

到底有那些信息需要进行配置


下面通过一个 etcd 的配置文件来说明一些相关的配置信息

# This is the configuration file for the etcd server.


# Human-readable name for this member.

name: 'default'   每一个etcd 都需要有一个名字, 默认使用default  


# Path to the data directory.

data-dir:   记录我们的etcd的数据目录


# Path to the dedicated wal directory.

wal-dir:  保存相关的日志文件的目录


# Time (in milliseconds) of a heartbeat interval.

heartbeat-interval: 100   心跳间隔, 目前默认是100ms


# Time (in milliseconds) for an election to timeout.

election-timeout: 1000   选举节点状态的时间


# Raise alarms when backend size exceeds the given quota. 0 means use the

# default quota.

quota-backend-bytes: 0


# List of comma separated URLs to listen on for peer traffic.

listen-peer-urls: http://localhost:2380

此项配置是对于etcd对于多节点之间的信息互通的端口设计,

一般希望指定IP 定向监听



# List of comma separated URLs to listen on for client traffic.

listen-client-urls: http://localhost:2379

对外的client 的访问端口 ,是2379 


# List of this member's peer URLs to advertise to the rest of the cluster.

# The URLs needed to be a comma-separated list.

initial-advertise-peer-urls: http://localhost:2380

这个位置是设置POSTGRESQL 的对于集群中自己定位的地址


# List of this member's client URLs to advertise to the public.

# The URLs needed to be a comma-separated list.

advertise-client-urls: http://localhost:2379

对于发布对外的客户端URL 名称


# Initial cluster configuration for bootstrapping.

initial-cluster:

初始化集群,类似数据库里面的peer 在 PXC  或MGR 中都需要有集群中所有节点的列表


# Initial cluster token for the etcd cluster during bootstrap.

initial-cluster-token: 'etcd-cluster'

cluster 的名字


# Initial cluster state ('new' or 'existing').

initial-cluster-state: 'new'

集群对于节点的状态,是新集群还是已经存在的集群



# Accept etcd V2 client requests

enable-v2: true


# Enable runtime profiling data via HTTP server

enable-pprof: true


logger: zap


# Specify 'stdout' or 'stderr' to skip journald logging even when running under systemd.

log-outputs: [stderr]



下面是其中一个ETCD 的配置信息,其他节点的配置信息在部分位置有所改变


name: 'etcd3'

data-dir: '/etcd/data'

wal-log: '/etcd/log'

snapshot-count: 10000

heartbeat-interval: 100

election-timeout: 1000

listen-peer-urls: 'http://192.168.198.68:2380'

listen-client-urls: 'http://0.0.0.0:2379'

max-snapshots: 5

max-wals: 5

cors:

initial-advertise-peer-urls: 'http://192.168.198.68:2380'

advertise-client-urls: 'http://192.168.198.68:2379'

initial-cluster: 'etcd1=http://192.168.198.66:2380,etcd2=http://192.168.198.67:2380,etcd3=http://192.168.198.68:2380'

initial-cluster-token: 'etcd'

initial-cluster-state: 'new'

strict-reconfig-check: false

enable-v2: true

enable-pprof: true

debug: false

logger: zap

log-outputs: [stderr]



启动ETCD 


etcd --config-file /etc/etcd.conf > /etcd/etcd3.log 2>&1 &


依次启动三个机器,启动完毕后,我们可以查看端口 2379 2380 都已经启动


现在我们开始查看目前的集群的状态


 etcdctl 是 etcd的客户端程序

etcdctl member list --write-out=table

可以看到所有的节点已经都在工作中

ETCDCTL_API=3 etcdctl endpoint status --write-out=table --endpoints=http://192.168.198.66:2379 

节点中信息写,读,和清理



操作系统中的一些命令集合


HOST_1=192.168.198.66

HOST_2=192.168.198.67

HOST_3=192.168.198.68

ENDPOINTS=$HOST_1:2379,$HOST_2:2379,$HOST_3:2379


etcdctl  --write-out=table --endpoints=$ENDPOINTS member list




HOST_2=192.168.198.67

HOST_3=192.168.198.68

ENDPOINTS=$HOST_1:2379,$HOST_2:2379,$HOST_3:2379

ETCDCTL_API=3 etcdctl endpoint status --write-out=table --endpoints=$ENDPOINTS


相关文章