如何使用依赖请求的 acl 作为 stick match 或 stick response-store 中的条件

如何使用依赖请求的 acl 作为 stick match 或 stick response-store 中的条件

neo4j这是交易密码端点Location。这允许客户端通过多个 REST 请求生成数据库事务。第一个请求打开一个新事务,并在包含事务 ID 的http 标头中返回用于对同一事务的后续请求的 URL ,例如

Location: http://192.168.0.10:7474/db/data/transaction/24

末尾的数字是内部交易 ID。随后关闭交易的请求将发送到http://192.168.0.10:7474/db/data/transaction/24/commit

为了实现这一点,我使用以下代码片段进行 haproxy 的后端配置:

backend neo4j-all
    option httpchk GET /db/manage/server/ha/available
    stick-table type integer size 1k expire 10m
    stick match path,word(4,/) 
    stick store-response hdr(Location),word(6,/) 
    server s1 127.0.0.1:7474 maxconn 32 check
    server s2 127.0.0.1:7475 maxconn 32 check
    server s3 127.0.0.1:7476 maxconn 32 check

粘性表会填充交易 ID(位置标头中的第 6 个字)。后续请求path包含交易 ID 作为第 4 个字。此部分工作正常。

然而,我想将 stick 表的使用限制在以 开头的路径,/db/data/transaction因为 Neo4j 可能还有其他端点,并且具有不同的行为。

我的第一个天真的方法是简单地acl向后端添加一个:

 acl tx_cypher_endpoint path_beg /db/data/transaction

然后将上面的stick match和修改为。启动时,这将导致以下消息:stick store-responseif tx_cypher_endpoint

解析 [haproxy.cfg:32]:acl‘tx_cypher_endpoint’永远不会匹配,因为它只涉及与‘后端 stick-store 规则’不兼容的关键字

问题 1:有人能解释一下这个原因吗?

作为一种解决方法,我将 acl 移到了前端部分,并有条件地存储txn在后端使用的范围的变量:

frontend http-in
    bind *:8090
    acl tx_cypher_endpoint path_beg /db/data/transaction
    http-request set-var(txn.tx_cypher_endpoint) bool(true) if tx_cypher_endpoint
    default_backend neo4j-all

backend neo4j-all
    option httpchk GET /db/manage/server/ha/available
    acl tx_cypher_endpoint var(txn.tx_cypher_endpoint),bool
    stick-table type integer size 1k expire 10m
    stick match path,word(4,/) if tx_cypher_endpoint
    stick store-response hdr(Location),word(6,/) if tx_cypher_endpoint
    server s1 192.168.0.10:7474 maxconn 32 check
    server s2 192.168.0.11:7474 maxconn 32 check
    server s3 192.168.0.12:7474 maxconn 32 check

问题#2:上述设置是最优雅的方法吗?或者是否有更简单的设置?

问题 3:我如何才能看到 haproxy 内部发生了什么,例如,变量或 stick 表中存储了哪些值? 是stats socket可行的方法吗? 或者有没有比使用 更详细的控制台输出-d

相关内容