在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-response
if 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
?