知识库

配置 HAProxy 将写入请求仅发送到 Leader 节点

在 Neo4j 集群中,关于如何实现代理服务器以将写入请求定向到主节点,而将读取请求定向到从节点,有几个选项。通常建议在应用程序代码中处理此逻辑。但是,还有另一种方法。

通过对 HAProxy 使用以下配置,您可以将 GET 请求(读取)定向到从节点,同时将所有其他请求(DELETE, POST, PUT)定向到主节点。

global
daemon
maxconn 256

defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms

frontend http-in
bind *:80
acl write_methods method POST DELETE PUT
#Only POST and DELETE methods are used according to the documentation
use_backend neo4j-write if write_methods
default_backend  neo4j-read-only

backend neo4j-read-only
balance roundrobin
option httpchk GET /db/manage/server/causalclustering/read-only
server s1 10.0.1.10:7474 maxconn 32 check
server s2 10.0.1.11:7474 maxconn 32 check
server s3 10.0.1.12:7474 maxconn 32 check

backend neo4j-write
balance roundrobin
option httpchk GET /db/manage/server/causalclustering/writable
server s1 10.0.1.10:7474 maxconn 32 check
server s2 10.0.1.11:7474 maxconn 32 check
server s3 10.0.1.12:7474 maxconn 32 check

此处的逻辑表示默认情况下请求被路由到跟随者,如果它是写入请求(POST、DELETE、PUT),则将其路由到主节点。

有关此主题的更多信息,请参阅产品文档:https://neo4j.ac.cn/docs/operations-manual/3.5/ha-cluster/haproxy/

在 HAProxy 中配置基本身份验证的第一步是获取用户名:密码的 base64 表示形式。

要在命令行中执行此操作,对于用户名 neo4j 和密码 neo4j

$ echo -n "neo4j:neo4j" | base64
bmVvNGo6bmVvYWRtaW4=

请注意,此用户名-密码组合无效,仅用于演示目的。

然后追加 HTTP/1.0\r\nAuthorization:\ Basic\ base64_username_password 如下所示

option httpchk GET /db/manage/server/causalclustering/writable HTTP/1.0\r\nAuthorization:\ Basic\ bmVvNGo6bmVvYWRtaW4=