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)并运行测试

点赞(0)

评论列表 共有 0 评论

暂无评论