Etcd 简介
etcd是一种高度一致的分布式键值存储,它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据。它在网络分区期间优雅地处理领导者选举,并且可以容忍机器故障,即使在领导节点中也是如此
环境
-
docker
-
docker-compose
-
docker swarm (可选)
-
python3
-
pipenv
-
pip3
配置
nginx
需要创建一个上游部分并声明我们的 etcd 服务器名称
upstream etcd_servers {
least_conn;
server etcd-00:2379 max_fails=3 fail_timeout=5s;
server etcd-01:2379 max_fails=3 fail_timeout=5s;
server etcd-02:2379 max_fails=3 fail_timeout=5s;
}
注意:由于我们在 docker 上运行,服务器名称由内部 dns 解析。name 是我们在 docker-compose.yml 中声明的服务的名称(etcd-00、etcd-01、etcd-02)
我们需要声明 server 部分,使用监听端口(etcd 默认监听端口)和 proxy_pass 规则将流量路由到我们的 etcd 服务
server {
listen 2379;
proxy_pass etcd_servers;
}
最终配置
worker_processes 4;
worker_rlimit_nofile 40000;
events {
worker_connections 8192;
}
stream {
log_format basic '$time_iso8601 $remote_addr '
'$protocol $status $bytes_sent $bytes_received '
'$session_time $upstream_addr '
'"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
access_log /dev/stdout basic;
upstream etcd_servers {
least_conn;
server etcd-00:2379 max_fails=3 fail_timeout=5s;
server etcd-01:2379 max_fails=3 fail_timeout=5s;
server etcd-02:2379 max_fails=3 fail_timeout=5s;
}
server {
listen 2379;
proxy_pass etcd_servers;
}
}
Etcd
要在集群模式下配置 etcd,我们需要在每个容器上指定以下设置
command:
- etcd
- --name=etcd-02
- --data-dir=data.etcd
- --advertise-client-urls=http://etcd-02:2379
- --listen-client-urls=http://0.0.0.0:2379
- --initial-advertise-peer-urls=http://etcd-02:2380
- --listen-peer-urls=http://0.0.0.0:2380
- --initial-cluster=etcd-00=http://etcd-00:2380,etcd-01=http://etcd-01:2380,etcd-02=http://etcd-02:2380
- --initial-cluster-state=new
- --initial-cluster-token=etcd-cluster-1
- --name:此成员的可读名称。
- --data-dir:数据目录的路径。
- --advertise-client-urls:该成员的客户端 URL 列表,用于向集群的其余部分做广告。这些 URL 可以包含域名。
- --listen-client-urls:监听客户端流量的 URL 列表。该标志告诉 etcd 接受来自客户端的指定 scheme://IP:port 组合的传入请求。
- --initial-advertise-peer-urls:该成员的对等 URL 列表,用于向集群的其余部分做广告。这些地址用于在集群周围通信 etcd 数据。至少一个必须可路由到所有集群成员。这些 URL 可以包含域名。
- --listen-peer-urls:监听对等流量的 URL 列表。这个标志告诉 etcd 接受来自指定 scheme://IP:port 组合上的对等方的传入请求。
- --initial-cluster:用于引导的初始集群配置。
- --initial-cluster-state:初始集群状态(“新”或“现有”)。将初始静态或 DNS 引导期间存在的所有成员设置为 new。如果此选项设置为 existing,etcd 将尝试加入现有集群。如果设置了错误的值,etcd 将尝试启动但安全失败。
- --initial-cluster-token:引导期间 etcd 集群的初始集群令牌。
docker compose 部署 etcd 集群
1.克隆这个存储库
git clone https://github.com/elephdev/docker-etcd-cluster.git
2.启动
cd docker-etcd-cluster
docker-compose up -d
3.检查环境状态并等待容器准备就绪
docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------------------------------
etcd_etcd-00_1 etcd --name=etcd-00 --data ... Up 2379/tcp, 2380/tcp
etcd_etcd-01_1 etcd --name=etcd-01 --data ... Up 2379/tcp, 2380/tcp
etcd_etcd-02_1 etcd --name=etcd-02 --data ... Up 2379/tcp, 2380/tcp
etcd_nginx_1 /docker-entrypoint.sh ngin ... Up 0.0.0.0:2379->2379/tcp,:::2379->2379/tcp, 80/tcp
测试环境
需要安装pipenv的环境
pipenv shell
pip install -r requirements.txt
python test/etcd-test.py
hey key1
hey key2
查看 nginx 服务的日志,查看重定向到 etcd 主机的流量
docker-compose logs -f nginx
Attaching to etcd_nginx_1
nginx_1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
nginx_1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
nginx_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
nginx_1 | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
nginx_1 | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
nginx_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
nginx_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
nginx_1 | /docker-entrypoint.sh: Configuration complete; ready for start up
nginx_1 | 2021-10-08T09:41:23+00:00 172.28.0.1 TCP 200 422 665 0.052 172.28.0.3:2379 "665" "422" "0.000"
nginx_1 | 2021-10-08T09:41:24+00:00 172.28.0.1 TCP 200 422 665 0.046 172.28.0.2:2379 "665" "422" "0.000"
nginx_1 | 2021-10-08T09:50:56+00:00 172.28.0.1 TCP 200 422 665 0.029 172.28.0.4:2379 "665" "422" "0.000"
Docker swarm stack
docker stack deploy -c etcd-stack.yml etcd
检查部署状态
docker stack ps etcd
mx6fvfwye547 etcd_etcd-00.1 quay.io/coreos/etcd:v3.5.0 node-2 Running Running 3 hours ago
wybd7n4oitae etcd_etcd-01.1 quay.io/coreos/etcd:v3.5.0 node-4 Running Running 3 hours ago
rmlycc3uvc8t etcd_etcd-02.1 quay.io/coreos/etcd:v3.5.0 node-2 Running Running 3 hours ago
rexh1smoalpo etcd_nginx.1 nginx:alpine node-2 Running Running 21 hours ago
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
1u709kzgmo2b etcd_etcd-00 replicated 1/1 quay.io/coreos/etcd:v3.5.0
m7ze76xi58ww etcd_etcd-01 replicated 1/1 quay.io/coreos/etcd:v3.5.0
1535r562g3az etcd_etcd-02 replicated 1/1 quay.io/coreos/etcd:v3.5.0
v8n8qlo3dm30 etcd_nginx replicated 1/1 nginx:alpine *:2379->2379/tcp
如果您想测试 swarm 设置,请打开 test/etcd-test.py 并将127.0.0.1更改为 docker swarm 集群中服务器的一个 ip(或 LB 的 ip)并运行测试
发表评论 取消回复