分布式数据库--ETCD(一)
一、ETCD简介
ETCD 是一个高可用的分布式键值数据库,可用于服务发现。ETCD 采用 raft 一致性算法,基于 Go 语言实现。
![](https://img.haomeiwen.com/i14929498/ae6facbaf0faed53.png)
特点:
简单:安装配置简单,而且提供了 HTTP API 进行交互,使用也很简单
安全:支持 SSL 证书验证
快速:根据官方提供的 benchmark 数据,单实例支持每秒 2k+ 读操作
可靠:采用 raft 算法,实现分布式系统数据的可用性和一致性
它是一套开源的可靠的分布式存储(即需要做cluster),用于存储key-value 键值对,同时它不仅仅是存储,它还提供共享配置及服务发现(后面这两个特征非常有特点,主要用于container中),对于leader的选举非常优秀,它的leader选举更换对于前端是无感知的。
应用容器读写数据在etcd上,除此还有支持快照及查看历史事件的功能。
ETCD的数据模型是非常有特点的。
一个持久的、多版本的并发控制数据模型(这有点类似于svn),也就是说所有以前版本的key在修改后仍然可以访问和监视。同时对于旧数据,它会进行压缩存储区,丢弃最旧的版本,防止数据库数据暴涨(只要有数据的压缩,就会覆盖最旧版本的数据)。
ETCD适用于较小的元数据键值对的处理,对于大的键值对数据的处理会导致其他请求时间的增加。数据目前最大支持1M数据的RPC(远程过程调用)请求,目前来说没有办法实现更大的数据的配置。
ETCD目前默认使用 2379 端口提供 HTTP API 服务,2380 端口和 peer 通信(这两个端口已经被 IANA 官方预留给 ETCD);在之前的版本中,可能会分别使用 4001 和 7001,在使用的过程中需要注意这个区别。
二、集群的节点个数和容错
虽然 ETCD也支持单点部署,但是在生产环境中推荐集群方式部署,一般 etcd 节点数会选择 3、5、7。etcd 会保证所有的节点都会保存数据,并保证数据的一致性和正确性。
三、单点安装
# 安装
[root@master ~]# yum install -y etcd
# 启动服务
[root@node2 ~]# systemctl start etcd
# 开机启动
[root@node2 ~]# systemctl enable etcd
Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /usr/lib/systemd/system/etcd.service.
# 设置键值
[root@node2 ~]# etcdctl set name "测试";
测试
# 获取键值
[root@node2 ~]# etcdctl get name
测试
# 通过HTTP API获取
[root@node2 ~]# curl -L http://localhost:2379/v2/keys/name
{"action":"get","node":{"key":"/name","value":"测试","modifiedIndex":4,"createdIndex":4}}
三、 集群安装
- 主节点
etcd配置:
# 修改配置
[root@master ~]# vi /etc/etcd/etcd.conf
#[Member]
#ETCD_CORS=""
# etcd数据保存目录
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#ETCD_WAL_DIR=""
# 本节点与其他节点进行数据交换(选举,数据同步)的监听地址
ETCD_LISTEN_PEER_URLS="http://192.168.247.130:2380"
# 本节点访问地址
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
# 最大快照数量 0表示不限制,在window平台设置无效。
#ETCD_MAX_SNAPSHOTS="5"
# 最大预写日志数量 0表示不限制,在window平台设置无效。
#ETCD_MAX_WALS="5"
# etcd实例名称
ETCD_NAME="default"
#ETCD_SNAPSHOT_COUNT="100000"
#ETCD_HEARTBEAT_INTERVAL="100"
# 集群选举的超时时间
#ETCD_ELECTION_TIMEOUT="1000"
#ETCD_QUOTA_BACKEND_BYTES="0"
#ETCD_MAX_REQUEST_BYTES="1572864"
#ETCD_GRPC_KEEPALIVE_MIN_TIME="5s"
#ETCD_GRPC_KEEPALIVE_INTERVAL="2h0m0s"
#ETCD_GRPC_KEEPALIVE_TIMEOUT="20s"
#[Clustering]
# 通知其他节点与本节点进行数据交换(选举,同步)的地址
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.247.130:2380"
# 用于通知其他ETCD节点,客户端接入本节点的监听地址
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.247.130:2379"
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#ETCD_DISCOVERY_SRV=""
# 集群所有节点配置,多个用逗号隔开。
ETCD_INITIAL_CLUSTER="master=http://192.168.247.130:2380,node1=http://192.168.247.131:2380,node2=http://192.168.247.132:2380"
# 集群唯一标识,相同标识的节点将视为在一个集群内。
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
# 节点初始化方式,new 表示如果没有集群不存在,创建新集群,existing表示如果集群不存在,节点将处于加入集群失败状态。
ETCD_INITIAL_CLUSTER_STATE="new"
#ETCD_STRICT_RECONFIG_CHECK="true"
#ETCD_ENABLE_V2="true"
[root@master ~]# systemctl restart etcd
- 从节点
node1和node2为加入etcd-cluster集群的实例,需要将其ETCD_INITIAL_CLUSTER_STATE设置为"exist"
# 查看集群节点
[root@master ~]# etcdctl member list
集群管理命令:
# 查看API的版本
[root@master ~]# etcdctl -version
etcdctl version: 3.3.11
API version: 2
# 状态查看
[root@node1 ~]# systemctl status etcd
# 切换API版本
[root@master ~]# export ETCDCTL_API=3
# 新版本查看
[root@master ~]# etcdctl version
etcdctl version: 3.3.11
API version: 3.3
- 远程访问
etcd安装完成后,默认只能本地访问,如果需要开启远程访问,还需要修改/etc/etcd/etcd.conf
中的配置。例如,本实例中我安装etcd的机器IP是192.168.77.132
,我尝试通过自己的机器远程访问192.168.77.132
上安装的etcd的2379端口,结果访问被拒绝:
修改/etc/etcd/etcd.conf配置:
ETCD_LISTEN_CLIENT_URLS="http://192.168.77.132:2379,http://localhost:2379"
[root@node2 ~]# sudo systemctl restart etcd
- 禁用Swap:
永久生效:
echo "vm.swappiness=0">> /etc/sysctl.conf (尽量不使用交换分区,注意不是禁用)
刷新SWAP
可以执行命令刷新一次SWAP(将SWAP里的数据转储回内存,并清空SWAP里的数据)
swapoff -a && swapon -a
sysctl -p (执行这个使其生效,不用重启)
四、常见问题:
- sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables
解决:
[root@localhost ~]# modprobe br_netfilter
[root@localhost ~]# ls /proc/sys/net/bridge
[root@localhost ~]# sysctl -p