<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>教程 on PIG.CENTER</title><link>https://pig.center/zh/categories/%E6%95%99%E7%A8%8B/</link><description>Recent content in 教程 on PIG.CENTER</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Tue, 08 Sep 2026 21:29:01 +0800</lastBuildDate><atom:link href="https://pig.center/zh/categories/%E6%95%99%E7%A8%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>安装</title><link>https://pig.center/zh/docs/patroni/installation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pig.center/zh/docs/patroni/installation/</guid><description>&lt;p&gt;&lt;a id="installation"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="mac-os-前置依赖"&gt;Mac OS 前置依赖&#10;&lt;/h2&gt;&#10;&lt;p&gt;在 Mac 上安装依赖，执行以下命令：&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-496211c2-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-496211c2-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install postgresql etcd haproxy libyaml python&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&lt;a id="psycopg2_install_options"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="psycopg"&gt;Psycopg&#10;&lt;/h2&gt;&#10;&lt;p&gt;从 &lt;a href="https://www.psycopg.org/articles/2019/04/04/psycopg-28-released/"&gt;psycopg2-2.8&lt;/a&gt;&#10; 开始，psycopg2 的二进制版本不再默认安装。从源码编译安装需要 C 编译器以及 postgres 和 python 的开发包。由于 Python 生态中无法将依赖声明为 &lt;strong&gt;&lt;code&gt;psycopg2 OR psycopg2-binary&lt;/code&gt;&lt;/strong&gt;，您需要自行选择安装方式。&lt;/p&gt;</description></item><item><title>下载与安装</title><link>https://pig.center/zh/docs/pgbadger/download/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pig.center/zh/docs/pgbadger/download/</guid><description>&lt;h2 id="distribution-channels"&gt;选择分发渠道&#10;&lt;/h2&gt;&#10;&lt;div class="td-table-scroll td-table-scroll--static"&gt;&#10;&lt;table&gt;&#10; &lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th scope="col"&gt;渠道&lt;/th&gt;&#10; &lt;th scope="col"&gt;适用场景&lt;/th&gt;&#10; &lt;th scope="col"&gt;地址&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;官方发布&lt;/td&gt;&#10; &lt;td&gt;源码归档与版本说明&lt;/td&gt;&#10; &lt;td&gt;&lt;a href="https://github.com/darold/pgbadger/releases"&gt;GitHub Releases&lt;/a&gt;&#10;&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;RPM 软件包&lt;/td&gt;&#10; &lt;td&gt;基于 RPM 的 Linux 发行版&lt;/td&gt;&#10; &lt;td&gt;&lt;a href="https://yum.postgresql.org/packages/"&gt;PostgreSQL Yum 仓库&lt;/a&gt;&#10;&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;Debian/Ubuntu 软件包&lt;/td&gt;&#10; &lt;td&gt;基于 APT 的 Linux 发行版&lt;/td&gt;&#10; &lt;td&gt;&lt;a href="https://wiki.postgresql.org/wiki/Apt"&gt;PostgreSQL Apt 仓库&lt;/a&gt;&#10;&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;开发源码&lt;/td&gt;&#10; &lt;td&gt;尚未正式发布的最新代码&lt;/td&gt;&#10; &lt;td&gt;&lt;a href="https://github.com/darold/pgbadger"&gt;darold/pgbadger&lt;/a&gt;&#10;&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;本站文档快照基于 13.2 源码树。下载前始终应查看发布页面：本地快照为了可复现而固定，上游版本仍会继续更新。&lt;/p&gt;</description></item><item><title>用户指南（Debian/Ubuntu）</title><link>https://pig.center/zh/docs/pgbackrest/user-guide/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pig.center/zh/docs/pgbackrest/user-guide/</guid><description>&lt;hr&gt;&#10;&lt;h2 id="简介"&gt;简介&#10;&lt;/h2&gt;&#10;&lt;p&gt;本用户指南适合从头到尾顺序阅读——每章内容均依赖前一章的配置基础。例如， &lt;a href="#%e6%81%a2%e5%a4%8d-1"&gt;&lt;strong&gt;恢复&lt;/strong&gt;&lt;/a&gt;&#10; 章节依赖 &lt;a href="#%e5%bf%ab%e9%80%9f%e5%bc%80%e5%a7%8b"&gt;&lt;strong&gt;快速开始&lt;/strong&gt;&lt;/a&gt;&#10; 章节中已完成的配置。pgBackRest 运行起来之后，跳章阅读也无妨，但建议初次阅读时按顺序跟随本指南。&lt;/p&gt;</description></item><item><title>用户指南（RHEL/Rocky/CentOS）</title><link>https://pig.center/zh/docs/pgbackrest/user-guide-rhel/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pig.center/zh/docs/pgbackrest/user-guide-rhel/</guid><description>&lt;hr&gt;&#10;&lt;h2 id="简介"&gt;简介&#10;&lt;/h2&gt;&#10;&lt;p&gt;本用户指南设计为从头到尾顺序阅读——每个章节都依赖前一章节的内容。例如， &lt;a href="#%e6%81%a2%e5%a4%8d-1"&gt;&lt;strong&gt;恢复&lt;/strong&gt;&lt;/a&gt;&#10; 章节依赖 &lt;a href="#%e5%bf%ab%e9%80%9f%e5%bc%80%e5%a7%8b"&gt;&lt;strong&gt;快速开始&lt;/strong&gt;&lt;/a&gt;&#10; 章节中完成的配置。熟悉 pgBackRest 之后可以跳章查阅，但初次阅读建议按顺序跟随。&lt;/p&gt;</description></item><item><title>PgBouncer 编译与安装</title><link>https://pig.center/zh/docs/pgbouncer/install/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pig.center/zh/docs/pgbouncer/install/</guid><description>&lt;hr&gt;&#10;&lt;h2 id="编译"&gt;编译&#10;&lt;/h2&gt;&#10;&lt;p&gt;PgBouncer 的编译依赖以下组件：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://www.gnu.org/software/make/"&gt;GNU Make&lt;/a&gt;&#10; 3.81+&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="http://libevent.org/"&gt;Libevent&lt;/a&gt;&#10; 2.0+&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://www.freedesktop.org/wiki/Software/pkg-config/"&gt;pkg-config&lt;/a&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://www.openssl.org/"&gt;OpenSSL&lt;/a&gt;&#10; 1.0.1+（TLS 支持）&lt;/li&gt;&#10;&lt;li&gt;（可选）&lt;a href="http://c-ares.haxx.se/"&gt;c-ares&lt;/a&gt;&#10;，作为 Libevent 内置 evdns 的替代方案&lt;/li&gt;&#10;&lt;li&gt;（可选）LDAP 库&lt;/li&gt;&#10;&lt;li&gt;（可选）PAM 库&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;安装依赖后，执行以下命令：&lt;/p&gt;</description></item><item><title>快速入门</title><link>https://pig.center/zh/docs/etcd/quickstart/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pig.center/zh/docs/etcd/quickstart/</guid><description>&lt;p&gt;按照以下步骤本地安装、运行并测试单成员 etcd 集群：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;从预构建的二进制文件或源码安装 etcd。详情请参见 [安装][]。&lt;/p&gt;&#10;&lt;div class="td-callout td-callout--warning" role="note"&gt;&#10; &lt;div class="td-callout__title"&gt;&lt;i class="td-callout__icon fa-solid fa-triangle-exclamation" aria-hidden="true"&gt;&lt;/i&gt;&lt;span class="td-callout__label"&gt;警告&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="td-callout__body"&gt;&#10;&lt;p&gt;&lt;strong&gt;重要&lt;/strong&gt;：务必完成安装说明的最后一步，确认可执行文件搜索路径中包含 &lt;code&gt;etcd&lt;/code&gt;。&lt;/p&gt;</description></item><item><title>示例</title><link>https://pig.center/zh/docs/etcd/demo/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pig.center/zh/docs/etcd/demo/</guid><description>&lt;p&gt;本系列示例展示了操作 etcd 集群的基本流程。&lt;/p&gt;&#10;&lt;h2 id="auth"&gt;认证&#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;auth&lt;/code&gt;、&lt;code&gt;user&lt;/code&gt;、&lt;code&gt;role&lt;/code&gt; 用于身份认证：&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-e4418d17-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="shell" data-td-line-count="24"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-e4418d17-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ETCDCTL_API&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ENDPOINTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;localhost:2379&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;etcdctl --endpoints&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ENDPOINTS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; role add root&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;etcdctl --endpoints&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ENDPOINTS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; role get root&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;etcdctl --endpoints&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ENDPOINTS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; user add root&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;etcdctl --endpoints&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ENDPOINTS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; user grant-role root root&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;etcdctl --endpoints&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ENDPOINTS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; user get root&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;etcdctl --endpoints&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ENDPOINTS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; role add role0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;etcdctl --endpoints&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ENDPOINTS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; role grant-permission role0 readwrite foo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;etcdctl --endpoints&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ENDPOINTS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; user add user0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;etcdctl --endpoints&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ENDPOINTS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; user grant-role user0 role0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;etcdctl --endpoints&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ENDPOINTS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; auth &lt;span class="nb"&gt;enable&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# now all client requests go through auth&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;etcdctl --endpoints&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ENDPOINTS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; --user&lt;span class="o"&gt;=&lt;/span&gt;user0:123 put foo bar&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;etcdctl --endpoints&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ENDPOINTS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; get foo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# permission denied, user name is empty because the request does not issue an authentication request&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;etcdctl --endpoints&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ENDPOINTS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; --user&lt;span class="o"&gt;=&lt;/span&gt;user0:123 get foo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# user0 can read the key foo&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;etcdctl --endpoints&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ENDPOINTS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; --user&lt;span class="o"&gt;=&lt;/span&gt;user0:123 get foo1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>配置本地集群</title><link>https://pig.center/zh/docs/etcd/dev-guide/local_cluster/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pig.center/zh/docs/etcd/dev-guide/local_cluster/</guid><description>&lt;p&gt;对于测试和开发部署，最快捷简便的方式是配置本地集群。对于生产部署，请参考 &lt;a href="https://pig.center/zh/docs/etcd/op-guide/clustering/"&gt;clustering&lt;/a&gt;&#10; 章节。&lt;/p&gt;&#10;&lt;h2 id="local-standalone-cluster"&gt;本地独立集群&#10;&lt;/h2&gt;&#10;&lt;h3 id="starting-a-cluster"&gt;启动集群&#10;&lt;/h3&gt;&#10;&lt;p&gt;运行以下命令以将 etcd 集群部署为独立集群：&lt;/p&gt;</description></item></channel></rss>