# 11. 粘性表与对等节点

> 粘性表存储与对等节点复制声明

---

LLMS 索引： [llms.txt](/zh/llms.txt)

---

<!-- Generated by scripts/generate-haproxy-docs.py from pinned upstream text. -->

在 HAProxy 中，stick-table 是一种机制，允许将一定数量的信息和指标与特定类型的键关联，并在最后一次更新后持续一定时间。这可视为表格中的一行多列数据，其中行号由键值决定，各列代表不同的衡量标准。

会话粘性表最初设计用于存储客户端-服务器会话粘性信息，以维持两者之间的持久会话。客户端连接或发送请求时，将通过一个标识符（源地址、Cookie 或 URL 参数）进行识别，并将选定的服务器与该标识符关联存储在粘性表中，持续时间为可配置时长，以便来自同一客户端的后续访问可自动路由至同一服务器，从而确保客户端在其创建的应用会话中保持连接。

如今，stick-table 可存储的信息已不仅限于服务器编号，还可存储与特定客户端相关的活动指标（如请求次数/速率、连接次数/速率、字节数/速率等），以及一些任意事件计数器（"gpc" 用于“通用计数器”）和用于标记客户端特性的标签（"gpt" 用于“通用标签”）。

会话粘性表可被 "stick" 指令引用，用于实现客户端-服务器会话粘性；可被 "track-sc" 规则引用，用于定义需在哪个表中追踪何种键以收集指标；还可被多种样本提取函数和转换器引用，这些函数和转换器可对指定键执行即时查找，以获取特定指标或数据。基本原则是：对表（gpt/gpc/指标）的更新以及对会话粘性信息的查找会刷新访问条目并推迟其过期时间；而仅通过样本提取函数和转换器执行的查找仅提取数据，不会推迟条目的过期时间。

为使该机制具备可扩展性并抵御 HAProxy 重载和故障切换的影响，可通过 "Peers" 机制在其他节点（称为 "peers"）之间共享 stick-table 更新，该机制详见 [第 11.2 节](/zh/docs/haproxy/stick-tables-and-peers/#section-11-2)。为精细调整与对等节点的通信，还可选择指定某些表仅接收来自对等节点的信息，或指定对等节点的更新应转发至其他表。

最后，粘性表可声明于代理段（前端或后端）中，使用 "stick-table" 关键字，每个段中仅允许一个粘性表，且其名称将自动采用该段的名称；也可声明于对等节点段中，使用 "table" 关键字后跟表名，该方式允许在同一个 "peers" 段中声明多个粘性表。若需多个粘性表，通常推荐方案为：若表需共享，应声明于对等节点段中；或为每个表创建独立的后端段，每个段中仅包含 "stick-table" 定义。

## 11.1. 粘性表声明 {#section-11-1}

在代理段（"frontend"、"backend"、"listen"）和 "peers" 段中声明粘性表的语法非常相似，区别在于对等节点段中的声明必须指定一个名称，且不支持 "peers" 选项。

在 "frontend"、"backend" 或 "listen" 段中：

stick-table type `<type>` size `<size>` [expire `<expire>`] [nopurge] [recv-only] [write-to
`<wtable>`] [srvkey `<srvkey>`] [store `<data_type>`]\* [brates-factor `<factor>`] [peers
`<peersect>`]

在 "peers" 段中：

table `<name>` type `<type>` size `<size>` [expire `<expire>`] [nopurge] [recv-only]
[write-to `<wtable>`] [srvkey `<srvkey>`] [store `<data_type>`]\* [brates-factor `<factor>`]

参数：（先列出必选参数，后按字母顺序排序）

- type `<type>` 此必选参数用于设置键类型为 `<type>`，通常为单个单词，但也可能包含其自身的参数：

  - ip 此类型应避免使用，建议改用更明确的类型，例如 "ipv4" 或 "ipv6"。在 3.2 版本之前，它是配置 IPv4 的唯一方式。从 3.2 版本起，"ip" 是 "ipv4" 的别名，而 "ipv4" 为首选。在未来的版本中，"ip" 将改为对应 "ipv6"。该类型仅用于帮助从 3.2 之前版本向 3.2 之后版本平稳过渡。

  - ipv4 以此类型声明的表，仅存储 IPv4 地址。该形式非常紧凑（每个条目约 50 字节），支持极快的条目查找与存储，几乎无额外开销。主要用于存储客户端源 IP 地址。

  - ipv6 使用 "type ipv6" 声明的表仅存储 IPv6 地址。该形式非常紧凑（每个条目约 60 字节），支持极快的条目查找与存储，几乎无额外开销。主要用于存储客户端源 IP 地址。

  - integer 使用 "type integer" 声明的表将存储 32 位整数，例如可用于存储请求中的客户端标识符。

  - string [len `<len>`] 声明为 "type string" 的表将存储最多 `<len>` 个字符的子字符串。如果模式提取器提供的字符串长度超过 `<len>`，在存储前将被截断。匹配时，表中字符串与提取的模式之间最多比较 `<len>` 个字符。未指定时，字符串默认限制为 32 个字符。增加长度可能带来不可忽略的内存使用影响。

  - binary [len `<len>`] 声明为 "type binary" 的表将存储长度为 `<len>` 字节的二进制块。若模式提取器提供的块大于 `<len>`，将在存储前被截断。若样本表达式提供的块短于 `<len>`，将用 0 填充至指定长度。未指定时，块长度默认自动限制为 32 字节。增大长度可能导致不可忽略的内存使用影响。

- size `<size>` 此必选参数用于设置表中可容纳的最大条目数 `<size>`。该值直接影响内存使用量。每个条目需额外估算 50 字节，加上上述键的大小、可选存储的指标大小，以及如有字符串则还需加上字符串大小。size 支持后缀 "k"、"m"、"g"，分别表示 2^10、2^20 和 2^30 的倍数。

- expire `<delay>` 定义表中条目自创建以来、或通过 'track-sc' 更新、或通过 'stick match' 或 'stick on' 规则匹配后的最大持续时间。过期延迟 `<delay>` 使用标准时间格式定义，与各类超时设置类似，默认单位为毫秒。最大持续时间略高于 24 天。详见 [第 2.5 节](/zh/docs/haproxy/configuration-basics/#section-2-5) 获取更多信息。若未指定此延迟，会话将不会自动过期，但表满时将移除最旧的条目。请注意，若未指定过期延迟，切勿使用 "nopurge" 参数。注意：'table\_\*' 转换器执行查找操作，但不会更新触碰过期时间，因为它们不需要 'track-sc'。

- brates-factor `<factor>` 指定应用于入/出字节速率的系数。不逐字节计数，而是按字节块进行计数。内部速率基于 32 位计数器定义，每周期上限约为 40 亿字节。通过使用此参数，可在指定周期内实现超过 4G 字节的速率。系数必须大于 0 且小于或等于 1024。

- nopurge 表示当表已满时拒绝清除较旧的条目。若未指定此选项，当 HAProxy 试图向已满的表中存储条目时，将清除部分最旧的条目以释放空间供新条目使用。这通常是期望的行为。在某些特定情况下，更希望拒绝新条目而非清除较旧的条目。例如，当需存储的数据量远超硬件限制时，宁愿拒绝新客户端的接入，也不愿中断已连接的客户端。使用此参数时，请务必正确设置 "expire" 参数（参见上文）。

- recv-only 表示我们不打算使用该表执行更新操作，而仅计划通过该表从感兴趣的远程对等节点获取数据。实际上，使用此关键字可检索本地独有的值，例如 "conn_cur"，这些值默认不会被学习，因为它们可能与本地对等节点对该表执行的本地更新产生冲突。此选项仅适用于不参与跟踪规则或执行表更新操作的方法的表，或更简单地说：仅用于获取信息的远程表。

- peers `<peersect>` 在段 `<peersect>` 中配置的对等节点将接收已创建、更新或刷新的条目以实现同步，同时从该段中配置的对等节点学习到的键也将插入或更新至表中。此外，在启动时，可尝试从指定为“本地对等节点”的旧进程实例中学习条目，该实例通过本段指定。

- srvkey `<srvkey>` 指定服务器在粘性表中的标识方式。有效值为 "name" 和 "addr"。若指定 "name"，则服务器的标识由其 `<name>` 参数决定（可由模板生成）。若指定 "addr"，则服务器通过当前网络地址（含端口）进行标识。"addr" 在使用服务发现为对等节点的粘性表生成服务器地址时尤为有用，可确保对等节点间对同一会话粘性令牌始终使用相同的主机。

- store `<data_type>` 用于在粘性表中存储附加信息。该信息可被 ACL 用于控制与匹配粘性表的客户端活动相关的各种条件。针对此处指定的每一项，每个条目的大小将被扩大，以容纳附加数据。一个条目中可存储多种数据类型。可在 "store" 关键字后以逗号分隔的列表形式指定多个数据类型。或者，也可重复使用 "store" 关键字并随后指定一个或多个数据类型。除 "server_id" 类型会自动检测并启用外，所有其他数据类型必须显式声明以进行存储。若 ACL 引用了未存储的数据类型，该 ACL 将不会匹配。部分数据类型需要参数，该参数必须紧跟在类型名后的括号内提供。详见下文支持的数据类型及其参数。

- write-to `<wtable>` 指定另一个粘性表的名称，对等节点的更新将被写入该表，同时也会写入源表。`<wtable>` 的类型必须与所定义的表类型相同，且键长度必须一致，源表自身不能作为目标表。每当通过一个对等节点接收到源表的条目更新时，HAProxy 将尝试刷新相关的 `<wtable>` 条目。如果该条目尚不存在，将被创建；否则其值以及计时器将被更新。请注意，仅那些不参与算术运算的类型（如 server_id、server_key 和 gpt）才会被写入 `<wtable>`，以防止远程表的处理结果干扰本地目标表上的算术运算（例如：防止共享累计计数器无限增长）。此选项的一个常见用途是在对等节点集群环境中使用粘性规则（用于服务器持久性），因为匹配的键将从远程表中学习到。

可通过 "store" 指令关联的数据显示类型如下。请注意，存储大量数据类型时，内存需求可能成为关键因素。事实上，若在每个条目中同时存储以下所有指标，每个条目可能需要数百字节，百万条目表则可能占用数百 MB。因此，每种类型的近似存储大小已在下方各参数后以括号形式注明。

参数：

- bytes_in_cnt [4 字节] 这是客户端到服务器的字节数。它是一个 64 位正整数，用于统计与该条目匹配的客户端所接收的累计字节数。头信息包含在计数中。此指标可用于限制对照片或视频服务器上传功能的滥用。请注意，该值在数据进入 HAProxy 时进行测量，因此计数不受压缩影响。

- bytes_in_rate(`<period>`) [12 字节] 这是一个从客户端到服务器的字节速率计数器。它接受一个整数参数 `<period>`，表示以毫秒为单位的平均值测量周期长度。该指标报告在该周期内平均的入站字节速率，单位为每周期字节数。可用于检测上传量过大且过快的用户。
请注意：在大文件上传场景下，上传数据量可能在连接终止时仅被统计一次，从而导致平均传输速率出现峰值，而非平滑变化。尽管启用“option contstats”可部分缓解此问题，但并非完全解决。建议使用 byte_in_cnt 以获得更公平的统计效果。

- bytes_out_cnt [4 字节] 这是服务器到客户端的字节数。它是一个正的 64 位整数，用于统计发送给匹配此条目的客户端的累计字节数。头信息包含在计数中。可用于限制机器人大量消耗整个站点资源的行为。请注意，该值在数据进入 HAProxy 时进行测量，因此计数不受压缩影响。

- bytes_out_rate(`<period>`) [12 字节] 这是一个从服务器到客户端的字节速率计数器。它接受一个整数参数 `<period>`，表示以毫秒为单位的平均值测量周期长度。该指标报告该周期内平均的出站字节速率，单位为每周期字节数。可用于检测下载量过大且过快的用户。
请注意：在大文件传输过程中，传输数据量可能在连接终止时被重复计数一次，从而导致平均传输速率出现峰值，而非平滑变化。尽管启用“option contstats”可部分缓解此问题，但目前尚不完善。建议使用 byte_out_cnt 以获得更公平的统计结果。

- conn_cnt [4 字节] 这是连接计数。它是一个正的 32 位整数，用于统计从客户端接收并匹配此条目的连接的绝对数量。该数值不代表连接已被接受，仅表示连接已被接收。

- conn_cur [4 字节] 当前连接数。这是一个正的 32 位整数，用于存储该条目当前的并发连接数。每当一个入站连接匹配该条目时，计数加 1；当连接断开时，计数减 1。通过这种方式，可以随时准确获知该条目当前的并发连接数量。默认情况下，该类型不会从对等节点学习，因为其会忽略本地计数，无法反映真实情况。然而，与 recv-only 配合使用时，可用于学习对等节点所观测到的并发连接数量。

- conn_rate(`<period>`) [12 字节] 这是一个连接频率计数器。它接受一个整数参数 `<period>`，表示测量平均值的时间周期长度，单位为毫秒。该计数器报告在该周期内平均的入站连接速率，单位为每周期连接数。结果为整数，可使用 ACL 进行匹配。连接是否被接受或拒绝，均不影响其测量。

- glitch_cnt [4 字节] 这是前端连接的异常事件计数。它是一个正的 32 位整数，用于累计记录前端连接上报的异常事件数量。异常事件指客户端在协议层面发生的异常或意外行为，可能表明客户端存在严重缺陷，或可能是攻击行为。因此，该计数器可用于判断在发生此类情况时应采取何种动作。

- glitch_rate(`<period>`) [12 字节] 这是一个用于统计异常事件频率的计数器。它接受一个整数参数 `<period>`，表示以毫秒为单位的平均值测量周期长度。该指标报告在该周期内平均的前端异常事件发生率。可用于检测存在缺陷的客户端或可能的攻击者，这些客户端在协议层面执行了不常见或出乎意料的行为，前提是 HAProxy 已将其标记为此类行为。

- gpc(`<nb>`) [4 \* `<nb>` 字节] 这是一个包含 `<nb>` 个通用计数器元素的数组。
  该数组由正 32 位整数构成，可用于计数任意内容。通常情况下，它们将作为某些条目的增量计数器使用，例如记录某项限制已达到并触发相应动作。该数组最多限制为 100 个元素：gpc0 至 gpc99，以确保对等节点更新消息的构建可容纳于缓冲区中。请注意，大量计数器会增加数据量及对等协议的流量负载，因为每次任一计数器更新时，所有数据/计数器都会被推送。
  此数据类型将排除在同一表中使用旧版数据类型 'gpc0' 和 'gpc1'。使用 'gpc' 数组数据类型时，所有与 'gpc0' 和 'gpc1' 相关的样本提取函数及动作均适用于该数组的前两个元素。

- gpc_rate(`<nb>`,`<period>`) [12 \* `<nb>` 字节] 这是一个在一段时间内通用计数器增量速率的数组。这些元素为正的 32 位整数，可用于任意用途。与 `<gpc>` 类似，但不同于累积计数，它们维护的是计数器的增量速率。通常用于测量特定事件的发生频率（例如，对某个特定 URL 的请求）。该数组最多可包含 100 个元素：gpt(100)，以确保 gpc0 至 gpc99 的存储，并保证对等节点更新消息的构建可容纳于缓冲区。该数组不能少于 1 个元素：若仅需存储 gpc0，应使用 gpc(1)。请注意，大量计数器会增加数据量及使用对等节点协议时的流量负载，因为每次任一计数器更新时，所有数据/计数器均会被推送。此 data_type 将排除在同一表中使用旧版 data_type 'gpc0_rate' 和 'gpc1_rate'。使用 'gpc_rate' 数组 data_type 时，所有 'gpc0' 和 'gpc1' 相关的获取和动作将作用于该数组的前两个元素。

- gpc0 [4 字节] 这是第一个通用计数器。它是一个无符号 32 位整数，可用于任何用途。通常情况下，它将用于为某些条目打上特殊标签，例如标记已检测到特定行为，以便在后续匹配中识别。

- gpc0_rate(`<period>`) [12 字节] 这是第一个通用计数器在一段时间内的增量速率。它是一个正 32 位整数，可用于任何用途。与 `<gpc0>` 类似，它统计事件，但不保留累计数值，而是维持计数器的增量速率。通常用于测量特定事件的发生频率（例如，对特定 URL 的请求）。

- gpc1 [4 字节] 这是第二个通用计数器。它是一个正 32 位整数，可用于任何用途。通常情况下，它将用于为某些条目打上特殊标签，例如标记已检测到特定行为，以便在后续匹配中识别。

- gpc1_rate(`<period>`) [12 字节] 这是第二个通用计数器在一段时间内的增量速率。它是一个正 32 位整数，可用于任何用途。与 `<gpc1>` 类似，它用于统计事件，但不保留累计数值，而是维护计数器的增量速率。通常用于测量特定事件的发生频率（例如，对特定 URL 的请求）。

- gpt(`<nb>`) [4 \* `<nb>` 字节] 这是一个包含 `<nb>` 个通用标签元素的数组。该数组由正 32 位整数构成，可用于任意用途。通常情况下，这些元素用于为某些条目添加特殊标签，例如标记已检测到特定行为，以便后续匹配时识别。该数组最多可包含 100 个元素：gpt(100)，支持存储 gpt0 至 gpt99，以确保对等节点更新消息可适配缓冲区。数组至少需包含 1 个元素：若仅需存储标签 gpt0，请使用 gpt(1)。请注意，大量计数器将增加数据量并提升对等协议的流量负载，因为每次任一计数器更新时，所有数据/计数器均会被推送。该 data_type 将排除在同一表中使用旧版 data_type 'gpt0'。使用 'gpt' 数组 data_type 时，所有与 'gpt0' 相关的获取操作和动作均作用于该数组的第一个元素。

- gpt0 [4 字节] 这是第一个通用标签。它是一个正 32 位整数，可用于任何用途。通常情况下，它将用于为某些条目打上特殊标签，例如标记已检测到特定行为，以便在后续匹配中识别。

- http_req_cnt [4 字节] 这是 HTTP 请求计数。它是一个正 32 位整数，用于统计从客户端接收的、与该条目匹配的 HTTP 请求数量。无论请求是否有效，均计入总数。请注意，当客户端启用持久连接时，该计数与会话数存在差异。

- http_req_rate(`<period>`) [12 字节] 这是一个请求频率计数器。它接受一个整数参数 `<period>`，表示以毫秒为单位的统计平均值的时间周期长度。该指标报告该周期内的平均 HTTP 请求速率，单位为每周期请求数。结果为整数，可使用 ACL 进行匹配。是否为有效请求无关紧要。请注意，当客户端启用持久连接时，此指标与会话数不同。

- http_err_cnt [4 字节] 这是 HTTP 请求错误计数。它是一个正 32 位整数，用于统计由匹配此条目的客户端引发的 HTTP 请求错误的绝对数量。错误包括无效或截断的请求、被拒绝或被限速的请求，以及认证失败的请求。若服务器返回 4xx 状态码，则该请求也计入错误，因为这是由客户端触发的错误（例如，漏洞扫描）。

- http_err_rate(`<period>`) [12 字节] 这是一个 HTTP 请求频率计数器。它接受一个整数参数 `<period>`，表示以毫秒为单位的统计周期长度，用于计算平均值。该指标报告该周期内的平均 HTTP 请求错误率，单位为每周期请求数（关于错误的定义，请参见上方的 http_err_cnt）。结果为一个整数，可使用 ACL 进行匹配。

- http_fail_cnt [4 字节] 这是 HTTP 响应失败计数。它是一个正的 32 位整数，用于统计由匹配此条目的服务器引起的 HTTP 响应失败的绝对数量。无效或截断的响应，以及除 501 或 505 以外的所有 5xx 响应均被计入错误。该指标旨在与 path 或 URI 结合使用，以检测服务故障。

- http_fail_rate(`<period>`) [12 字节] 这是一个 HTTP 响应失败频率计数器。它接受一个整数参数 `<period>`，表示以毫秒为单位的统计平均值的时间周期长度。该指标报告在该周期内每周期的平均 HTTP 响应失败率，单位为每周期请求数（关于失败的定义，请参见上述 http_fail_cnt）。结果为一个整数，可使用 ACL 进行匹配。

- server_id [4 字节] 该值为整数，用于存储请求被分配到的服务器的数值 ID。此字段由“stick match”、“stick store”和“stick on”规则使用。当被引用时，该字段会自动启用。请注意，基于学习信息的会话粘性存在一些限制，例如所有学习到的关联关系在重启后将丢失，除非对等节点已正确配置为在重启时传输此类信息（建议配置）。通常情况下，会话粘性可作为其他会话粘性机制的补充，但不应始终作为唯一机制。

- sess_cnt [4 字节] 会话计数。这是一个正的 32 位整数，用于统计匹配此条目的客户端所发起的会话绝对数量。会话指由第 4 层规则（"tcp-request connection"）接受的连接。

- sess_rate(`<period>`) [12 字节] 这是一个会话频率计数器。它接受一个整数参数 `<period>`，表示以毫秒为单位的统计周期长度。该计数器报告在该周期内平均的入站会话速率，单位为每周期会话数。结果为整数，可使用 ACL 进行匹配。

示例：

```shell
# Keep track of counters of up to 1 million IP addresses over 5 minutes
# and store a general purpose counter and the average connection rate
# computed over a sliding window of 30 seconds.
stick-table type ip size 1m expire 5m store gpc0,conn_rate(30s)
```

另请参阅：“stick match”、“stick on”、“stick store-request”、"track-sc"、[第 2.5 节](/zh/docs/haproxy/configuration-basics/#section-2-5) 关于时间格式、[第 11.2 节](/zh/docs/haproxy/stick-tables-and-peers/#section-11-2) 关于对等节点、[第 9.7 节](/zh/docs/haproxy/filters/#section-9-7) 关于带宽限制，以及 [第 7 节](/zh/docs/haproxy/acls-and-samples/) 关于 ACL。

## 11.2. 对等节点声明 {#section-11-2}

可以在多个 HAProxy 实例之间通过 TCP 连接以多主模式传播粘性表中的任意数据类型条目。每个实例会将其本地的更新和插入操作推送至远程对等节点。推送的值会直接覆盖远程值，不会进行聚合。

一个例外是数据类型 "conn_cur"，默认情况下不会从对等节点学习该值，因为它应反映本地状态。早期版本默认会同步该值，这已知会导致主动-主动配置中出现负值，以及在重载或主动-被动切换时出现持续增长的值，因为本地值会反映比实际存在的连接数更多的连接。然而，在某些场景下，从对等节点学习该值可能是有意义的，例如当该表为仅用于学习/监控数据的被动远程表，而不依赖其进行写操作或更新时。为实现此目的，可在表声明中添加 "recv-only" 关键字。无论如何，"conn_cur" 信息始终会被推送，以便监控系统能够对其进行观察。

中断的交换会自动检测并从已知的最新点恢复。此外，在执行平滑重启时，旧进程会通过此类 TCP 连接与新进程建立连接，将所有条目推送至新进程，然后再由新进程尝试连接其他对等节点。这确保了重载过程中的快速复制，即使对于大型表，通常也只需不到一秒的时间。

请注意，服务器 ID 用于远程识别服务器，因此配置必须相似，或至少在所有参与方的服务器上强制使用相同的 ID。

<a id="entry-11-2-peers"></a>

**`peers <peersect>`**

```haproxy
peers <peersect>
```

创建一个名为 `<peersect>` 的新对等节点列表。该列表为独立段，可被一个或多个粘性表引用。

<a id="entry-11-2-bind"></a>

**`bind [<address>]:port [param*]`**

```haproxy
bind [<address>]:port [param*]
bind /<path> [param*]
```

定义本 "peers" 段中本地对等节点的绑定参数。此类行在同属一个 "peers" 段时，不支持与 "peer" 行共存。

<a id="entry-11-2-disabled"></a>

**`disabled`**

```haproxy
disabled
```

禁用一个对等节点段。该操作将同时禁用监听功能以及与此段相关的任何同步。此功能用于在不注释掉所有 "peers" 引用的情况下，禁用粘性表的同步。

<a id="entry-11-2-default-bind"></a>

**`default-bind [param*]`**

```haproxy
default-bind [param*]
```

定义本地对等节点的绑定参数，不包括其地址。

<a id="entry-11-2-default-server"></a>

**`default-server [param*]`**

```haproxy
default-server [param*]
```

更改 "peers" 段中服务器的默认选项。

参数：

```text
<param*>  is a list of parameters for this server. The "default-server"
          keyword accepts an important number of options and has a complete
          section dedicated to it. In a peers section, the transport
          parameters of a "default-server" line are supported. Please refer
          to section 5 for more details, and the "server" keyword below in
          this section for some of the restrictions.
```

另请参阅："server" 和 [第 5 节](/zh/docs/haproxy/bind-and-server-options/) 关于服务器选项

<a id="entry-11-2-enabled"></a>

**`enabled`**

```haproxy
enabled
```

此操作重新启用此前通过 "disabled" 关键字禁用的对等节点段。

<a id="entry-11-2-log"></a>

**`log <target> [len <length>] [format <format>] [sample <ranges>:<sample_size>]`**

```haproxy
log <target> [len <length>] [format <format>] [sample <ranges>:<sample_size>]
    <facility> [<level> [<minlevel>]]
```

"peers" 段支持与代理相同的 "log" 关键字，用于记录关于 "peers" 监听器的信息。有关详细信息，请参阅代理的 "log" 选项。

<a id="entry-11-2-peer"></a>

**`peer <peername> [<address>]:port [param*]`**

```haproxy
peer <peername> [<address>]:port [param*]
peer <peername> /<path> [param*]
```

定义 peers 段内的对等节点。若 `<peername>` 设置为本地对等节点名称（默认为主机名，或通过 "-L" 命令行选项或 "localpeer" 全局配置项强制指定），HAProxy 将在指定地址上监听来自远程对等节点的连接。否则，该地址定义了用于连接以加入远程对等节点的目标地址，且 `<peername>` 在协议层面用于在服务器端识别和验证远程对等节点。

在平滑重启期间，旧实例使用本地对等节点地址连接新实例，并启动完整的复制（教学过程）。

强烈建议在所有对等节点上使用完全相同的 peers 声明，并仅通过 "-L" 命令行参数或 "localpeer" 全局配置项来更改本地对等节点名称。这有助于在所有对等节点间保持配置文件的一致性。

地址参数可以引用环境变量，详见 [第 2.3 节](/zh/docs/haproxy/configuration-basics/#section-2-3) 的环境变量说明。

请注意："peer" 关键字可透明地被 "server" 关键字替换（详见下文 "server" 关键字说明）。

<a id="entry-11-2-server"></a>

**`server <peername> [<address>:<port>] [param*]`**

```haproxy
server <peername> [<address>:<port>] [param*]
server <peername> [/<path>] [param*]
```

如前所述，"peer" 关键字可被 "server" 关键字替代，后者支持 5.2 段中与传输设置相关的全部 "server" 参数。若底层对等节点为本地节点，则地址参数不得出现；必须在 "bind" 行上提供，参见本 "peers" 段中的 "bind" 关键字。

若干 "server" 参数对 "peers" 段无效。对等节点本质上不支持动态主机名解析或健康检查，因此 "init_addr"、"resolvers"、"check"、"agent-check" 或 "track" 等参数不受支持。同理，不存在负载均衡或会话粘性，因此 "weight" 或 "cookie" 等参数无任何作用。

示例：

```text
 # The old way.
 peers mypeers
     peer haproxy1 192.168.0.1:1024
     peer haproxy2 192.168.0.2:1024
     peer haproxy3 10.2.0.1:1024

 backend mybackend
     mode tcp
     balance roundrobin
     stick-table type ip size 20k peers mypeers
     stick on src

     server srv1 192.168.0.30:80
     server srv2 192.168.0.31:80

Example:
  peers mypeers
     bind 192.168.0.1:1024 ssl crt mycerts/pem
     default-server ssl verify none
     server haproxy1 #local peer
     server haproxy2 192.168.0.2:1024
     server haproxy3 10.2.0.1:1024
```

shards `<shards>`

在某些配置中，用户希望将粘性表内容分发至部分对等节点，而非将全部粘性表内容发送给 "peers" 段中声明的每个对等节点。在此类情况下，"shards" 指定参与此粘性表内容分发的对等节点数量。另请参见 "shard" 服务器参数。

<a id="entry-11-2-table"></a>

**`table <tablename> type {ip | integer | string [len <length>] | binary [len <length>]}`**

```haproxy
table <tablename> type {ip | integer | string [len <length>] | binary [len <length>]}
```

      size `<size>` [expire `<expire>`] [write-to `<wtable>`] [nopurge] [store `<data_type>`]*
      [recv-only]

为当前段配置会话粘性表。该行的解析方式与其它段中的 "stick-table" 关键字完全相同，但此处的 "peers" 参数非必需，并需额外指定一个必填的首个参数以标识粘性表。与其它段不同，"peers" 段中可存在多个 "table" 行（另请参见 [第 11.1 节](/zh/docs/haproxy/stick-tables-and-peers/#section-11-1) 中对 "table" 和 "stick-table" 关键字的完整定义）。

请注意，"peers" 段具有独立的 stick-table 命名空间，以避免不同 "peers" 段中名称相同的 stick-table 发生冲突。此机制在内部通过在 "peers" 段名称后添加斜杠（/）字符来实现，从而为 stick-table 名称添加前缀。若在配置文件的其他位置需引用 "peers" 段中声明的 stick-table，请务必使用带前缀的 stick-table 名称，格式如下：

```text
peers mypeers
    peer A ...
    peer B ...
    table t1 ...

frontend fe1
    tcp-request content track-sc0 src table mypeers/t1
```

这也必须是粘性表名称的前缀版本，通过 CLI 引用粘性表时需使用该格式。

关于 "peers" 协议，由于仅属于同一段的 "peers" 才能相互通信，因此无需进行此类区分。多个 "peers" 段可声明名称相同的 stick-table。这是通过网络传输的 stick-table 名称的简写形式。仅以斜杠字符 '/' 作为前缀，以避免在以后端形式声明的 stick-table 与在 "peers" 段中声明的 stick-table 之间发生名称冲突，如下所示的奇特但受支持的配置：

```text
peers mypeers
    peer A ...
    peer B ...
    table t1 type string size 10m store gpc0

backend t1
    stick-table type string size 10m store gpc0 peers mypeers
```

此处 "t1" 表在 "mypeers" 段中声明，其全局名称为 "mypeers/t1"。"t1" 表作为后端声明，其全局名称为 "t1"。但在对等节点协议层面，前者表名为 "/t1"，后者再次命名为 "t1"。

---

反链：

- [4. 代理](/zh/docs/haproxy/proxies/)
