Hi Dmitriy,
On Thu, Jun 21, 2018 at 12:45 PM, Dmitriy Kuzmin <[email protected]> wrote:
> Greetings
>
> I’m using haproxy to load balance readonly queries between redis slaves.
> I want to use health check system to exclude slaves from load balancing,
> that are in a process of sync with master.
> The idea is to look for a string “master_sync_in_progress:1” in response
> to “info replication”.
>
Is this _exactly_ what is returned?
> If this string is found then backend should be marked as down.
>
> I’m trying to use “tcp-check expect ! string” (with exclamation mark [!])
> to get this working, but backends are permanently down regardless of sync
> status.
> During sync (slave’s response contains “master_sync_in_progress:1”) health
> check status is “L7RSP,TCPCHK matched unwanted content
> 'master_sync_in_progress:1' at step 5”.
> However, when slave’s response contains “master_sync_in_progress:0” (sync
> finished) health check status is “L7TOUT, at step 5 of tcp-check (expect
> string 'master_sync_in_progress:1’)”.
>
> Does negation with exclamation mark (!) work with tcp-check at all?
>
> I’ve observed this behaviour in haproxy 1.5.18, 1.7.11 and 1.8.9
>
>
> Example configuration:
>
> global
> log 127.0.0.1 local2
> chroot /var/lib/haproxy
> pidfile /var/run/haproxy.pid
> maxconn 4000
> user haproxy
> group haproxy
> daemon
>
> defaults
> mode tcp
> log global
> option tcplog
> option dontlognull
> option redispatch
> retries 3
> timeout http-request 10s
> timeout queue 1m
> timeout connect 10s
> timeout client 1m
> timeout server 1m
> timeout http-keep-alive 10s
> timeout check 10s
> maxconn 3000
>
> frontend redis_reads_ft
> bind /var/run/haproxy/redis_reads
> use_backend redis_reads_bk
>
> backend redis_reads_bk
> option log-health-checks
> balance roundrobin
>
> option tcp-check
> tcp-check connect
> tcp-check send PING\r\n
> tcp-check expect string +PONG
> tcp-check send info\ replication\r\n
> tcp-check expect ! string
>
> master_sync_in_progress:1
>
Try using *rstring* intead of *string*. I that fails too try escaping the
column like "
master_sync_in_progress\:1"
tcp-check send QUIT\r\n
> tcp-check expect string +OK
>
> server sc-redis1_63811 10.10.68.61:63811 check
> server sc-redis1_63812 10.10.68.61:63812 check
> server sc-redis1_63813 10.10.68.61:63813 check
>
>
> Best regards,
> Dmitriy Kuzmin
>