PostgreSQL 来自欧罗巴Patroni 为什么选择ETCD 系列 2
国庆节是过完了,实际上从本次国庆节看,不少人可能是没有过的太好,高速的车祸貌似更多了,在国庆节第二天加班后回家的高速上,看到一起车祸,车子被撞得的面目全非,堵车长达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
相关文章