[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-detail-ssr-49061803337976844":3},{"id":4,"title":5,"tag":6,"createTime":7,"updateTime":8,"renderedHtml":9,"description":10,"ogImageUrl":11},"49061803337976844","etcd 集群搭建","etcd","2023-12-05","2023-12-07","\u003Ch2 id=\"h2-0-\">准备工作\u003C\u002Fh2>\n\u003Cp>这里简单在本地同一台机器上搭建一个伪 etcd 集群，每个节点监听不同的端口，数据都存储在 \u003Cstrong>\u002Fvar\u002Flib\u002Fetcd\u002Fcluster\u002F\u003C\u002Fstrong> 目录下，如下：\u003C\u002Fp>\n\u003Cdiv class=\"ssr-table-wrap\">\u003Cbutton class=\"ssr-table-fs-btn\" type=\"button\" aria-label=\"全屏查看表格\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cdiv class=\"ssr-table-scroll\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>节点\u003C\u002Fth>\n\u003Cth>IP\u003C\u002Fth>\n\u003Cth>客户端端口\u003C\u002Fth>\n\u003Cth>内部端口\u003C\u002Fth>\n\u003Cth>数据路径\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>etcd01\u003C\u002Ftd>\n\u003Ctd>127.0.0.1\u003C\u002Ftd>\n\u003Ctd>12379\u003C\u002Ftd>\n\u003Ctd>12380\u003C\u002Ftd>\n\u003Ctd>\u002Fvar\u002Flib\u002Fetcd\u002Fcluster\u002Fetcd01\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>etcd02\u003C\u002Ftd>\n\u003Ctd>127.0.0.1\u003C\u002Ftd>\n\u003Ctd>22379\u003C\u002Ftd>\n\u003Ctd>22380\u003C\u002Ftd>\n\u003Ctd>\u002Fvar\u002Flib\u002Fetcd\u002Fcluster\u002Fetcd02\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>etcd03\u003C\u002Ftd>\n\u003Ctd>127.0.0.1\u003C\u002Ftd>\n\u003Ctd>32379\u003C\u002Ftd>\n\u003Ctd>32380\u003C\u002Ftd>\n\u003Ctd>\u002Fvar\u002Flib\u002Fetcd\u002Fcluster\u002Fetcd03\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Ch2 id=\"h2-1--etcd-\">搭建 etcd 伪集群\u003C\u002Fh2>\n\u003Cp>etcd 可以通过给命令行参数提供所有必要的配置信息来启动并形成集群，例如节点名称、客户端和对等通信的 URL、初始集群配置和数据目录等。这种方式在进行快速部署或测试时非常方便。在实际生产环境中，尤其是当配置变得更加复杂时，使用配置文件可能更为方便和可靠。无论是使用命令行参数还是配置文件来启动 etcd，其背后的集群逻辑和通信机制都是相同的。\u003C\u002Fp>\n\u003Ch3 id=\"h3-2-\">通过命令启动\u003C\u002Fh3>\n\u003Cp>启动脚本内容如下：\u003C\u002Fp>\n\u003Cdiv class=\"ssr-code-block\" data-lang=\"bash\">\u003Cdiv class=\"ssr-code-head\">\u003Cspan class=\"ssr-code-lang\">bash\u003C\u002Fspan>\u003Cdiv class=\"ssr-code-actions\">\u003Cbutton class=\"ssr-code-fullscreen ssr-code-iconbtn\" type=\"button\" aria-label=\"全屏查看代码\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-copy ssr-code-iconbtn\" type=\"button\" aria-label=\"复制代码\" title=\"复制\">\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--default\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--success\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--error\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"ssr-code-body\">\u003Cdiv class=\"ssr-code-pane\">\u003Cdiv class=\"ssr-code-gutter\" aria-hidden=\"true\">\u003Cspan class=\"ssr-code-num\">1\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">2\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">3\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">4\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">5\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">6\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">7\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">8\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">9\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">10\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">11\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">12\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">13\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">14\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">15\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">16\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">17\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">18\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">19\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">20\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">21\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">22\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">23\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">24\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">25\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">26\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">27\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">28\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">29\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">30\u003C\u002Fspan>\u003C\u002Fdiv>\u003Cpre class=\"ssr-code-pre\">\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#6A737D\">#!\u002Fbin\u002Fbash\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">​\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#6A737D\"># 定义变量\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">PID_FILE\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;\u002Fvar\u002Frun\u002Fetcd-cluster.pid&quot;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">NODES\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;etcd01&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;etcd02&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;etcd03&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">DATA_DIRS\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;\u002Fvar\u002Flib\u002Fetcd\u002Fcluster\u002Fetcd01&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;\u002Fvar\u002Flib\u002Fetcd\u002Fcluster\u002Fetcd02&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;\u002Fvar\u002Flib\u002Fetcd\u002Fcluster\u002Fetcd03&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">CLIENT_PORTS\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">12379\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">22379\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">32379\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">PEER_PORTS\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">12380\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">22380\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">32380\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">)\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">INITIAL_CLUSTER\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;etcd01=http:\u002F\u002Flocalhost:12380,etcd02=http:\u002F\u002Flocalhost:22380,etcd03=http:\u002F\u002Flocalhost:32380&quot;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">CLUSTER_TOKEN\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;etcd-cluster&quot;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">​\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#6A737D\"># 清空 PID 文件\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#F97583\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;${\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">PID_FILE\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">}&quot;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">​\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#6A737D\"># 启动每个 etcd 节点\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#F97583\">for\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> i \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">in\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;${\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">!\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">NODES\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">[\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">@\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">]}&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">do\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">etcd\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">--name\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ${NODES[$i]} \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">\\\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">         \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">--data-dir\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ${DATA_DIRS[$i]} \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">\\\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">         \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">--listen-peer-urls\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">http:\u002F\u002Flocalhost:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">${PEER_PORTS[$i]} \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">\\\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">         \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">--listen-client-urls\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">http:\u002F\u002Flocalhost:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">${CLIENT_PORTS[$i]} \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">\\\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">         \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">--advertise-client-urls\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">http:\u002F\u002Flocalhost:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">${CLIENT_PORTS[$i]} \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">\\\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">         \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">--initial-cluster\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ${INITIAL_CLUSTER} \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">\\\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">         \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">--initial-advertise-peer-urls\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">http:\u002F\u002Flocalhost:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">${PEER_PORTS[$i]} \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">\\\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">         \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">--initial-cluster-token\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ${CLUSTER_TOKEN} \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">\\\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">         \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">--initial-cluster-state\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">new\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">\\\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">         \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">--log-level\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">info\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;${\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">DATA_DIRS\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">[\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">$i\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">]}\u002Fetcd.log&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">2&gt;&amp;1\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> &amp;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">echo\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">$!\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">&gt;&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;${\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">PID_FILE\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">}&quot;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#F97583\">done\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">​\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#79B8FF\">echo\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;etcd 伪集群启动完毕，PID 已写入 ${\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">PID_FILE\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">}&quot;\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Cp>etcdctl 是 etcd 的命令行客户端，用于与 etcd 服务器交互。使用上面的脚本启动 etcd 集群后，使用\u003Ccode>etcdctl member list\u003C\u002Fcode>命令列出所有节点会发现报错，这是因为 etcdctl 找不到 etcd 集群。可以使用 ETCDCTL_ENDPOINTS 环境变量来让 etcdctl 找到 etcd 集群，所以该环境变量的作用就是告诉 etcdctl 客户端应该与哪些端口上的 etcd 服务器实例进行通信。下面是在当前会话中设置一个临时的环境变量：\u003C\u002Fp>\n\u003Cdiv class=\"ssr-code-block\" data-lang=\"text\">\u003Cdiv class=\"ssr-code-head\">\u003Cspan class=\"ssr-code-lang\">text\u003C\u002Fspan>\u003Cdiv class=\"ssr-code-actions\">\u003Cbutton class=\"ssr-code-fullscreen ssr-code-iconbtn\" type=\"button\" aria-label=\"全屏查看代码\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-copy ssr-code-iconbtn\" type=\"button\" aria-label=\"复制代码\" title=\"复制\">\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--default\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--success\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--error\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"ssr-code-body\">\u003Cdiv class=\"ssr-code-pane\">\u003Cdiv class=\"ssr-code-gutter\" aria-hidden=\"true\">\u003Cspan class=\"ssr-code-num\">1\u003C\u002Fspan>\u003C\u002Fdiv>\u003Cpre class=\"ssr-code-pre\">\u003Ccode class=\"hljs language-text\">\u003Cspan class=\"ssr-code-line\">export ETCDCTL_ENDPOINTS=http:\u002F\u002Flocalhost:12379,http:\u002F\u002Flocalhost:22379,http:\u002F\u002Flocalhost:32379\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Cp>这样使用\u003Ccode>etcdctl member list\u003C\u002Fcode>命令就可以列出集群的所有节点的信息。除此之外，还可以使用\u003Ccode>etcdctl endpoint status -w table\u003C\u002Fcode>命令查看集群的健康状态。\u003C\u002Fp>\n\u003Cp>\u003Cimg class=\"article-img article-img-zoomable\" src=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902549.png\" alt=\"image-20231204190040687\" loading=\"lazy\" decoding=\"async\" style=\"width: 100%; height: auto; max-width: 100%; display: block;\" srcset=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902549.png?imageMogr2\u002Fthumbnail\u002F400x\u002Fformat\u002Fwebp\u002Fquality\u002F85 400w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902549.png?imageMogr2\u002Fthumbnail\u002F800x\u002Fformat\u002Fwebp\u002Fquality\u002F85 800w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902549.png?imageMogr2\u002Fthumbnail\u002F1200x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1200w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902549.png?imageMogr2\u002Fthumbnail\u002F1920x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1920w\" sizes=\"(max-width: 576px) 100vw, (max-width: 992px) 90vw, 720px\">\u003C\u002Fp>\n\u003Cp>停止脚本内容如下：\u003C\u002Fp>\n\u003Cdiv class=\"ssr-code-block\" data-lang=\"bash\">\u003Cdiv class=\"ssr-code-head\">\u003Cspan class=\"ssr-code-lang\">bash\u003C\u002Fspan>\u003Cdiv class=\"ssr-code-actions\">\u003Cbutton class=\"ssr-code-fullscreen ssr-code-iconbtn\" type=\"button\" aria-label=\"全屏查看代码\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-copy ssr-code-iconbtn\" type=\"button\" aria-label=\"复制代码\" title=\"复制\">\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--default\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--success\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--error\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"ssr-code-body\">\u003Cdiv class=\"ssr-code-pane\">\u003Cdiv class=\"ssr-code-gutter\" aria-hidden=\"true\">\u003Cspan class=\"ssr-code-num\">1\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">2\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">3\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">4\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">5\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">6\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">7\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">8\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">9\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">10\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">11\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">12\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">13\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">14\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">15\u003C\u002Fspan>\u003C\u002Fdiv>\u003Cpre class=\"ssr-code-pre\">\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#6A737D\">#!\u002Fbin\u002Fbash\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">​\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">PID_FILE\u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;\u002Fvar\u002Frun\u002Fetcd-cluster.pid&quot;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">​\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#F97583\">if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> [ \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">-f\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;${\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">PID_FILE\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">}&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ]; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">then\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">while\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">read\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">-r\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">pid\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">do\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">        \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">if\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> [ \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">-n\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;${\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">pid\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">}&quot;\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> ]; \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">then\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">            \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">kill\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;${\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">pid\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">}&quot;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">        \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">fi\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">done\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#F97583\">&lt;\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;${\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">PID_FILE\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">}&quot;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C\u002Fspan>\u003Cspan style=\"color:#B392F0\">rm\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">-f\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;${\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\">PID_FILE\u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">}&quot;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">echo\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;所有 etcd 伪集群进程已停止&quot;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#F97583\">else\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C\u002Fspan>\u003Cspan style=\"color:#79B8FF\">echo\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&quot;PID 文件不存在，无法停止 etcd 伪集群。&quot;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#F97583\">fi\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Ch3 id=\"h3-3-\">通过配置文件启动\u003C\u002Fh3>\n\u003Cp>使用脚本的好处就是部署方便，但是如果是真正的 etcd 集群（每个节点都在不同的机器上），那么就无法使用脚本进行集群部署。但是，etcd 同样支持使用 YAML 或 JSON 格式的配置文件来部署集群。首先需要创建一个配置文件，然后使用 \u003Ccode>--config-file\u003C\u002Fcode> 参数来指定这个配置文件即可。\u003C\u002Fp>\n\u003Cp>由于克隆虚拟机也比较麻烦，所以下面使用配置文件的方式来部署 etcd 伪集群。\u003C\u002Fp>\n\u003Cp>首先要为每个 etcd 成员创建一个配置文件。配置文件通常为 YAML 格式，下面是具体的配置文件：\u003C\u002Fp>\n\u003Cdiv class=\"ssr-code-block\" data-lang=\"bash\" data-collapsible=\"true\" data-collapsed=\"true\" data-line-count=\"32\">\u003Cdiv class=\"ssr-code-head\">\u003Cspan class=\"ssr-code-lang\">bash\u003C\u002Fspan>\u003Cdiv class=\"ssr-code-actions\">\u003Cbutton class=\"ssr-code-toggle ssr-code-toggle--head ssr-code-iconbtn\" type=\"button\" aria-expanded=\"true\" aria-label=\"收起代码\" title=\"收起\">\u003Csvg viewBox=\"0 0 24 24\" width=\"19\" height=\"19\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M12 8.59l-6.3 6.3 1.4 1.42L12 11.4l4.9 4.9 1.4-1.4z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-toggle ssr-code-toggle--head-expand ssr-code-iconbtn\" type=\"button\" aria-expanded=\"false\" aria-label=\"展开代码\" title=\"展开\">\u003Csvg viewBox=\"0 0 24 24\" width=\"19\" height=\"19\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M12 15.41l6.3-6.3-1.4-1.42L12 12.59 7.1 7.7l-1.4 1.4z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-fullscreen ssr-code-iconbtn\" type=\"button\" aria-label=\"全屏查看代码\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-copy ssr-code-iconbtn\" type=\"button\" aria-label=\"复制代码\" title=\"复制\">\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--default\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--success\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--error\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"ssr-code-body\">\u003Cdiv class=\"ssr-code-pane\">\u003Cdiv class=\"ssr-code-gutter\" aria-hidden=\"true\">\u003Cspan class=\"ssr-code-num\">1\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">2\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">3\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">4\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">5\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">6\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">7\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">8\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">9\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">10\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">11\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">12\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">13\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">14\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">15\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">16\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">17\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">18\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">19\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">20\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">21\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">22\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">23\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">24\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">25\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">26\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">27\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">28\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">29\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">30\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">31\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">32\u003C\u002Fspan>\u003C\u002Fdiv>\u003Cpre class=\"ssr-code-pre\">\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#6A737D\"># etcd01.yaml\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">name:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;etcd01&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">data-dir:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;\u002Fvar\u002Flib\u002Fetcd\u002Fetcd01&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">listen-peer-urls:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;http:\u002F\u002F127.0.0.1:12380&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">listen-client-urls:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;http:\u002F\u002F127.0.0.1:12379&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">advertise-client-urls:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;http:\u002F\u002F127.0.0.1:12379&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">initial-cluster:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;etcd01=http:\u002F\u002F127.0.0.1:12380,etcd02=http:\u002F\u002F127.0.0.1:22380,etcd03=http:\u002F\u002F127.0.0.1:32380&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">initial-advertise-peer-urls:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;http:\u002F\u002F127.0.0.1:12380&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">initial-cluster-token:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;etcd-cluster&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">initial-cluster-state:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;new&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">​\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#6A737D\"># etcd02.yaml\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">name:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;etcd02&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">data-dir:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;\u002Fvar\u002Flib\u002Fetcd\u002Fetcd02&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">listen-peer-urls:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;http:\u002F\u002F127.0.0.1:22380&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">listen-client-urls:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;http:\u002F\u002F127.0.0.1:22379&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">advertise-client-urls:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;http:\u002F\u002F127.0.0.1:22379&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">initial-cluster:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;etcd01=http:\u002F\u002F127.0.0.1:12380,etcd02=http:\u002F\u002F127.0.0.1:22380,etcd03=http:\u002F\u002F127.0.0.1:32380&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">initial-advertise-peer-urls:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;http:\u002F\u002F127.0.0.1:22380&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">initial-cluster-token:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;etcd-cluster&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">initial-cluster-state:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;new&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">​\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#6A737D\"># etcd03.yaml\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">name:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;etcd03&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">data-dir:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;\u002Fvar\u002Flib\u002Fetcd\u002Fetcd03&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">listen-peer-urls:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;http:\u002F\u002F127.0.0.1:32380&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">listen-client-urls:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;http:\u002F\u002F127.0.0.1:32379&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">advertise-client-urls:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;http:\u002F\u002F127.0.0.1:32379&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">initial-cluster:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;etcd01=http:\u002F\u002F127.0.0.1:12380,etcd02=http:\u002F\u002F127.0.0.1:22380,etcd03=http:\u002F\u002F127.0.0.1:32380&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">initial-advertise-peer-urls:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;http:\u002F\u002F127.0.0.1:32380&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">initial-cluster-token:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;etcd-cluster&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">initial-cluster-state:\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">&#39;new&#39;\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"ssr-code-mask\" aria-hidden=\"true\">\u003C\u002Fdiv>\u003Cbutton class=\"ssr-code-toggle ssr-code-toggle--floating\" type=\"button\" aria-expanded=\"false\">展开全部 (32 行)\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Cp>下面是配置文件每一行的解释：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>name\u003C\u002Fcode>: 这个字段指定了 etcd 成员的名称，在同一个集群中必须是唯一的。\u003C\u002Fli>\n\u003Cli>\u003Ccode>data-dir\u003C\u002Fcode>: 这个字段指定了 etcd 数据的存储位置，etcd 将所有的数据存储在这个目录下。\u003C\u002Fli>\n\u003Cli>\u003Ccode>listen-peer-urls\u003C\u002Fcode>: etcd 服务端的监听 URL，可以有多个地址。这个地址是 etcd 用来监听来自其他 etcd 节点的请求。\u003C\u002Fli>\n\u003Cli>\u003Ccode>listen-client-urls\u003C\u002Fcode>: etcd 监听客户端请求的 URL。客户端请求是指来自如 etcdctl 或者其他使用 etcd 客户端库的应用程序的请求。\u003C\u002Fli>\n\u003Cli>\u003Ccode>advertise-client-urls\u003C\u002Fcode>: etcd 成员通告给客户端的 URL，这些是客户端用来连接服务的地址。\u003C\u002Fli>\n\u003Cli>\u003Ccode>initial-cluster\u003C\u002Fcode>: 这个配置项列出了集群中所有成员的名称和它们的 peer URLs，用于在启动时通告集群中的其他成员。\u003C\u002Fli>\n\u003Cli>\u003Ccode>initial-advertise-peer-urls\u003C\u002Fcode>: 这个 URL 用于告诉集群中的其他节点如何与该节点通信（对等通信）。它是集群内部通信用的。\u003C\u002Fli>\n\u003Cli>\u003Ccode>initial-cluster-token\u003C\u002Fcode>: 集群令牌，是集群的一个唯一标识符。这对于创建多个集群很有用，以防止不同集群的成员彼此通信。\u003C\u002Fli>\n\u003Cli>\u003Ccode>initial-cluster-state\u003C\u002Fcode>: 当一个成员首次启动时，这个值用来指示这个成员是加入一个已经存在的集群（existing），还是初始化一个新集群（new）。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>由于 etcd 在启动时会把日志直接输出到终端，所以可以使用 nohup 命令解决这个问题。\u003C\u002Fp>\n\u003Cdiv class=\"ssr-code-block\" data-lang=\"text\">\u003Cdiv class=\"ssr-code-head\">\u003Cspan class=\"ssr-code-lang\">text\u003C\u002Fspan>\u003Cdiv class=\"ssr-code-actions\">\u003Cbutton class=\"ssr-code-fullscreen ssr-code-iconbtn\" type=\"button\" aria-label=\"全屏查看代码\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-copy ssr-code-iconbtn\" type=\"button\" aria-label=\"复制代码\" title=\"复制\">\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--default\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--success\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--error\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"ssr-code-body\">\u003Cdiv class=\"ssr-code-pane\">\u003Cdiv class=\"ssr-code-gutter\" aria-hidden=\"true\">\u003Cspan class=\"ssr-code-num\">1\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">2\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">3\u003C\u002Fspan>\u003C\u002Fdiv>\u003Cpre class=\"ssr-code-pre\">\u003Ccode class=\"hljs language-text\">\u003Cspan class=\"ssr-code-line\">nohup etcd --config-file .\u002Fetcd01.yaml &amp;\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">nohup etcd --config-file .\u002Fetcd02.yaml &amp;\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">nohup etcd --config-file .\u002Fetcd03.yaml &amp;\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Cp>接下来设置临时环境变量：\u003C\u002Fp>\n\u003Cdiv class=\"ssr-code-block\" data-lang=\"text\">\u003Cdiv class=\"ssr-code-head\">\u003Cspan class=\"ssr-code-lang\">text\u003C\u002Fspan>\u003Cdiv class=\"ssr-code-actions\">\u003Cbutton class=\"ssr-code-fullscreen ssr-code-iconbtn\" type=\"button\" aria-label=\"全屏查看代码\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-copy ssr-code-iconbtn\" type=\"button\" aria-label=\"复制代码\" title=\"复制\">\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--default\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--success\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--error\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"ssr-code-body\">\u003Cdiv class=\"ssr-code-pane\">\u003Cdiv class=\"ssr-code-gutter\" aria-hidden=\"true\">\u003Cspan class=\"ssr-code-num\">1\u003C\u002Fspan>\u003C\u002Fdiv>\u003Cpre class=\"ssr-code-pre\">\u003Ccode class=\"hljs language-text\">\u003Cspan class=\"ssr-code-line\">export ETCDCTL_ENDPOINTS=http:\u002F\u002F127.0.0.1:12379,http:\u002F\u002F127.0.0.1:22379,http:\u002F\u002F127.0.0.1:32379\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Cp>结果如下：\u003C\u002Fp>\n\u003Cp>\u003Cimg class=\"article-img article-img-zoomable\" src=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902923.png\" alt=\"image-20231204212855518\" loading=\"lazy\" decoding=\"async\" style=\"width: 100%; height: auto; max-width: 100%; display: block;\" srcset=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902923.png?imageMogr2\u002Fthumbnail\u002F400x\u002Fformat\u002Fwebp\u002Fquality\u002F85 400w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902923.png?imageMogr2\u002Fthumbnail\u002F800x\u002Fformat\u002Fwebp\u002Fquality\u002F85 800w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902923.png?imageMogr2\u002Fthumbnail\u002F1200x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1200w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902923.png?imageMogr2\u002Fthumbnail\u002F1920x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1920w\" sizes=\"(max-width: 576px) 100vw, (max-width: 992px) 90vw, 720px\">\u003C\u002Fp>\n\u003Ch2 id=\"h2-4--docker-etcd-\">使用 docker 搭建 etcd 集群\u003C\u002Fh2>\n\u003Ch3 id=\"h3-5--docker-\">创建一个 docker 网络\u003C\u002Fh3>\n\u003Cp>在创建 etcd 集群时，如果所有的 etcd 容器实例都在同一台宿主机上运行，那么\u003Ccode>bridge\u003C\u002Fcode>网络就足够了。如果 etcd 容器需要跨多个宿主机通信，那么需要设置一个\u003Ccode>overlay\u003C\u002Fcode>网络。在这里由于是同一个宿主机，所以选择默认的 bridge 网络就行。\u003C\u002Fp>\n\u003Cdiv class=\"ssr-code-block\" data-lang=\"bash\">\u003Cdiv class=\"ssr-code-head\">\u003Cspan class=\"ssr-code-lang\">bash\u003C\u002Fspan>\u003Cdiv class=\"ssr-code-actions\">\u003Cbutton class=\"ssr-code-fullscreen ssr-code-iconbtn\" type=\"button\" aria-label=\"全屏查看代码\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-copy ssr-code-iconbtn\" type=\"button\" aria-label=\"复制代码\" title=\"复制\">\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--default\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--success\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--error\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"ssr-code-body\">\u003Cdiv class=\"ssr-code-pane\">\u003Cdiv class=\"ssr-code-gutter\" aria-hidden=\"true\">\u003Cspan class=\"ssr-code-num\">1\u003C\u002Fspan>\u003C\u002Fdiv>\u003Cpre class=\"ssr-code-pre\">\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">docker\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">network\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">create\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">etcd-net\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Ch3 id=\"h3-6-\">拉取镜像\u003C\u002Fh3>\n\u003Cp>这里我使用的是 \u003Ca href=\"http:\u002F\u002Fquay.io\u002Fcoreos\u002Fetcd:v3.5.10\">quay.io\u002Fcoreos\u002Fetcd:v3.5.10\u003C\u002Fa> 镜像。\u003C\u002Fp>\n\u003Cdiv class=\"ssr-code-block\" data-lang=\"bash\">\u003Cdiv class=\"ssr-code-head\">\u003Cspan class=\"ssr-code-lang\">bash\u003C\u002Fspan>\u003Cdiv class=\"ssr-code-actions\">\u003Cbutton class=\"ssr-code-fullscreen ssr-code-iconbtn\" type=\"button\" aria-label=\"全屏查看代码\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-copy ssr-code-iconbtn\" type=\"button\" aria-label=\"复制代码\" title=\"复制\">\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--default\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--success\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--error\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"ssr-code-body\">\u003Cdiv class=\"ssr-code-pane\">\u003Cdiv class=\"ssr-code-gutter\" aria-hidden=\"true\">\u003Cspan class=\"ssr-code-num\">1\u003C\u002Fspan>\u003C\u002Fdiv>\u003Cpre class=\"ssr-code-pre\">\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"ssr-code-line\">\u003Cspan style=\"color:#B392F0\">docker\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">pull\u003C\u002Fspan>\u003Cspan style=\"color:#E1E4E8\"> \u003C\u002Fspan>\u003Cspan style=\"color:#9ECBFF\">quay.io\u002Fcoreos\u002Fetcd:v3.5.10\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Cp>但是去官网查看这个镜像的 Dockerfile 会发现没有 CMD [“\u002Fbin\u002Fsh”]指令，因此在构建好 etcd 的容器后是无法通过 docker exec -it etcd-1 \u002Fbin\u002Fsh 命令来进入容器内部。所以，要么基于这个镜像自己构建一个具有\u002Fbin\u002Fsh 的 etcd 镜像，要么不使用\u002Fbin\u002Fsh，直接使用 etcdctl 命令来操作 etcd 服务器。\u003C\u002Fp>\n\u003Ch3 id=\"h3-7--etcd-\">启动 etcd 容器\u003C\u002Fh3>\n\u003Cp>对于一个简单的三节点 etcd 集群，需要启动三个容器。每个节点需要知道其他节点的地址来形成集群。\u003C\u002Fp>\n\u003Cdiv class=\"ssr-code-block\" data-lang=\"text\" data-collapsible=\"true\" data-collapsed=\"true\" data-line-count=\"44\">\u003Cdiv class=\"ssr-code-head\">\u003Cspan class=\"ssr-code-lang\">text\u003C\u002Fspan>\u003Cdiv class=\"ssr-code-actions\">\u003Cbutton class=\"ssr-code-toggle ssr-code-toggle--head ssr-code-iconbtn\" type=\"button\" aria-expanded=\"true\" aria-label=\"收起代码\" title=\"收起\">\u003Csvg viewBox=\"0 0 24 24\" width=\"19\" height=\"19\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M12 8.59l-6.3 6.3 1.4 1.42L12 11.4l4.9 4.9 1.4-1.4z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-toggle ssr-code-toggle--head-expand ssr-code-iconbtn\" type=\"button\" aria-expanded=\"false\" aria-label=\"展开代码\" title=\"展开\">\u003Csvg viewBox=\"0 0 24 24\" width=\"19\" height=\"19\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M12 15.41l6.3-6.3-1.4-1.42L12 12.59 7.1 7.7l-1.4 1.4z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-fullscreen ssr-code-iconbtn\" type=\"button\" aria-label=\"全屏查看代码\" title=\"全屏\">\u003Csvg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M5 5h6v2H7v4H5V5zm14 0v6h-2V7h-4V5h6zM5 19v-6h2v4h4v2H5zm14 0h-6v-2h4v-4h2v6z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003Cbutton class=\"ssr-code-copy ssr-code-iconbtn\" type=\"button\" aria-label=\"复制代码\" title=\"复制\">\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--default\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--success\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"\u002F>\u003C\u002Fsvg>\u003Csvg class=\"ssr-code-copy-icon ssr-code-copy-icon--error\" viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" aria-hidden=\"true\">\u003Cpath fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\u002F>\u003C\u002Fsvg>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"ssr-code-body\">\u003Cdiv class=\"ssr-code-pane\">\u003Cdiv class=\"ssr-code-gutter\" aria-hidden=\"true\">\u003Cspan class=\"ssr-code-num\">1\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">2\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">3\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">4\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">5\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">6\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">7\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">8\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">9\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">10\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">11\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">12\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">13\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">14\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">15\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">16\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">17\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">18\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">19\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">20\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">21\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">22\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">23\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">24\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">25\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">26\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">27\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">28\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">29\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">30\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">31\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">32\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">33\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">34\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">35\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">36\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">37\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">38\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">39\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">40\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">41\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">42\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">43\u003C\u002Fspan>\u003Cspan class=\"ssr-code-num\">44\u003C\u002Fspan>\u003C\u002Fdiv>\u003Cpre class=\"ssr-code-pre\">\u003Ccode class=\"hljs language-text\">\u003Cspan class=\"ssr-code-line\"># etcd01\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">docker run -d --net etcd-net --name etcd-1 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">-v \u002Fvar\u002Flib\u002Fetcd\u002Fdocker\u002Fetcd01:\u002Fetcd-data \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_NAME=etcd01 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_DATA_DIR=\u002Fetcd-data \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_LISTEN_PEER_URLS=http:\u002F\u002F0.0.0.0:2380 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_LISTEN_CLIENT_URLS=http:\u002F\u002F0.0.0.0:2379 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_ADVERTISE_CLIENT_URLS=http:\u002F\u002Fetcd-1:2379 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCDCTL_ENDPOINTS=http:\u002F\u002Fetcd-1:2379,http:\u002F\u002Fetcd-2:2379,http:\u002F\u002Fetcd-3:2379 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_INITIAL_CLUSTER=&quot;etcd01=http:\u002F\u002Fetcd-1:2380,etcd02=http:\u002F\u002Fetcd-2:2380,etcd03=http:\u002F\u002Fetcd-3:2380&quot; \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_INITIAL_ADVERTISE_PEER_URLS=http:\u002F\u002Fetcd-1:2380 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster-1 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_INITIAL_CLUSTER_STATE=new \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">quay.io\u002Fcoreos\u002Fetcd:v3.5.10\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">​\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\"># etcd02\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">docker run -d --net etcd-net --name etcd-2 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">-v \u002Fvar\u002Flib\u002Fetcd\u002Fdocker\u002Fetcd02:\u002Fetcd-data \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_NAME=etcd02 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_DATA_DIR=\u002Fetcd-data \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_LISTEN_PEER_URLS=http:\u002F\u002F0.0.0.0:2380 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_LISTEN_CLIENT_URLS=http:\u002F\u002F0.0.0.0:2379 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_ADVERTISE_CLIENT_URLS=http:\u002F\u002Fetcd-2:2379 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCDCTL_ENDPOINTS=http:\u002F\u002Fetcd-1:2379,http:\u002F\u002Fetcd-2:2379,http:\u002F\u002Fetcd-3:2379 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_INITIAL_CLUSTER=&quot;etcd01=http:\u002F\u002Fetcd-1:2380,etcd02=http:\u002F\u002Fetcd-2:2380,etcd03=http:\u002F\u002Fetcd-3:2380&quot; \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_INITIAL_ADVERTISE_PEER_URLS=http:\u002F\u002Fetcd-2:2380 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster-1 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_INITIAL_CLUSTER_STATE=new \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">quay.io\u002Fcoreos\u002Fetcd:v3.5.10\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">​\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\"># etcd03\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">docker run -d --net etcd-net --name etcd-3 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">-v \u002Fvar\u002Flib\u002Fetcd\u002Fdocker\u002Fetcd03:\u002Fetcd-data \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_NAME=etcd03 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_DATA_DIR=\u002Fetcd-data \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_LISTEN_PEER_URLS=http:\u002F\u002F0.0.0.0:2380 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_LISTEN_CLIENT_URLS=http:\u002F\u002F0.0.0.0:2379 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_ADVERTISE_CLIENT_URLS=http:\u002F\u002Fetcd-3:2379 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCDCTL_ENDPOINTS=http:\u002F\u002Fetcd-1:2379,http:\u002F\u002Fetcd-2:2379,http:\u002F\u002Fetcd-3:2379 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_INITIAL_CLUSTER=&quot;etcd01=http:\u002F\u002Fetcd-1:2380,etcd02=http:\u002F\u002Fetcd-2:2380,etcd03=http:\u002F\u002Fetcd-3:2380&quot; \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_INITIAL_ADVERTISE_PEER_URLS=http:\u002F\u002Fetcd-3:2380 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster-1 \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">--env ETCD_INITIAL_CLUSTER_STATE=new \\\u003C\u002Fspan>\u003Cspan class=\"ssr-code-line\">quay.io\u002Fcoreos\u002Fetcd:v3.5.10\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\u003Cdiv class=\"ssr-code-mask\" aria-hidden=\"true\">\u003C\u002Fdiv>\u003Cbutton class=\"ssr-code-toggle ssr-code-toggle--floating\" type=\"button\" aria-expanded=\"false\">展开全部 (44 行)\u003C\u002Fbutton>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Cp>这样就成功启动三个 docker 容器，每个容器中都有一个 etcd 服务器。\u003C\u002Fp>\n\u003Cp>\u003Cimg class=\"article-img article-img-zoomable\" src=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902318.png\" alt=\"image-20231205155000570\" loading=\"lazy\" decoding=\"async\" style=\"width: 100%; height: auto; max-width: 100%; display: block;\" srcset=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902318.png?imageMogr2\u002Fthumbnail\u002F400x\u002Fformat\u002Fwebp\u002Fquality\u002F85 400w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902318.png?imageMogr2\u002Fthumbnail\u002F800x\u002Fformat\u002Fwebp\u002Fquality\u002F85 800w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902318.png?imageMogr2\u002Fthumbnail\u002F1200x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1200w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902318.png?imageMogr2\u002Fthumbnail\u002F1920x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1920w\" sizes=\"(max-width: 576px) 100vw, (max-width: 992px) 90vw, 720px\">\u003C\u002Fp>\n\u003Ch3 id=\"h3-8-\">查看集群状态\u003C\u002Fh3>\n\u003Cp>由于 \u003Ca href=\"http:\u002F\u002Fquay.io\u002Fcoreos\u002Fetcd:v3.5.10\">quay.io\u002Fcoreos\u002Fetcd:v3.5.10\u003C\u002Fa> 镜像没有 shell 环境，不能进入容器内部的文件系统，所以只能通过 etcdctl 命令来查看集群的健康状态。\u003C\u002Fp>\n\u003Cp>\u003Cimg class=\"article-img article-img-zoomable\" src=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902388.png\" alt=\"image-20231205165534388\" loading=\"lazy\" decoding=\"async\" style=\"width: 100%; height: auto; max-width: 100%; display: block;\" srcset=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902388.png?imageMogr2\u002Fthumbnail\u002F400x\u002Fformat\u002Fwebp\u002Fquality\u002F85 400w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902388.png?imageMogr2\u002Fthumbnail\u002F800x\u002Fformat\u002Fwebp\u002Fquality\u002F85 800w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902388.png?imageMogr2\u002Fthumbnail\u002F1200x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1200w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902388.png?imageMogr2\u002Fthumbnail\u002F1920x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1920w\" sizes=\"(max-width: 576px) 100vw, (max-width: 992px) 90vw, 720px\">\u003C\u002Fp>\n\u003Ch3 id=\"h3-9-\">写入数据\u003C\u002Fh3>\n\u003Cp>\u003Cimg class=\"article-img article-img-zoomable\" src=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902800.png\" alt=\"image-20231205170242642\" loading=\"lazy\" decoding=\"async\" style=\"width: 100%; height: auto; max-width: 100%; display: block;\" srcset=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902800.png?imageMogr2\u002Fthumbnail\u002F400x\u002Fformat\u002Fwebp\u002Fquality\u002F85 400w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902800.png?imageMogr2\u002Fthumbnail\u002F800x\u002Fformat\u002Fwebp\u002Fquality\u002F85 800w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902800.png?imageMogr2\u002Fthumbnail\u002F1200x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1200w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902800.png?imageMogr2\u002Fthumbnail\u002F1920x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1920w\" sizes=\"(max-width: 576px) 100vw, (max-width: 992px) 90vw, 720px\">\u003C\u002Fp>\n\u003Cp>刚开始的时候，我发现 etcd-1 这个节点是一个 leader 节点（主节点），而 etcd-2 和 etcd-3 则是从节点。但是当我在 etcd-3 这个节点上成功写入数据的时候就产生了一个疑问。etcd 集群不是使用 Raft 算法来保持一致性吗？既然是 Raft 算法，那么集群中只能有一个节点来执行写操作，这个节点就是 leader 节点。但是 etcd-3 节点又是从节点，为什么能执行写操作呢？\u003C\u002Fp>\n\u003Cp>于是，在网上百度后找到了答案。当客户端向任何 etcd 节点（包括从节点）写入数据时，如果该节点不是 leader，它会自动将写请求转发到当前的 leader 节点。然后 leader 节点将这个写入操作复制到其它从节点。这个过程对于客户端是透明的。\u003C\u002Fp>\n\u003Cp>举一反三：但是 Redis 的高可用集群就没有类似的功能，在 Redis 的高可用集群中，如果向从节点写入数据，则会报错。\u003C\u002Fp>\n\u003Cp>\u003Cimg class=\"article-img article-img-zoomable\" src=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902557.png\" alt=\"image-20231205172316904\" loading=\"lazy\" decoding=\"async\" style=\"width: 100%; height: auto; max-width: 100%; display: block;\" srcset=\"https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902557.png?imageMogr2\u002Fthumbnail\u002F400x\u002Fformat\u002Fwebp\u002Fquality\u002F85 400w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902557.png?imageMogr2\u002Fthumbnail\u002F800x\u002Fformat\u002Fwebp\u002Fquality\u002F85 800w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902557.png?imageMogr2\u002Fthumbnail\u002F1200x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1200w, https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902557.png?imageMogr2\u002Fthumbnail\u002F1920x\u002Fformat\u002Fwebp\u002Fquality\u002F85 1920w\" sizes=\"(max-width: 576px) 100vw, (max-width: 992px) 90vw, 720px\">\u003C\u002Fp>\n","准备工作 这里简单在本地同一台机器上搭建一个伪 etcd 集群，每个节点监听不同的端口，数据都存储在 \u002Fvar\u002Flib\u002Fetcd\u002Fcluster\u002F 目录下，如下： | 节点 | IP | 客户端端口 | 内部端口 | 数据路径 | | | | | | | | etcd01 | 127.0.0.1 | 12379 | 1","https:\u002F\u002Fliubing-1314895948.cos.ap-chengdu.myqcloud.com\u002Fimg\u002F202312051902549.png"]