2

我已经设置了经过测试的 MariaDB Galera 集群,它在以下服务器上运行良好:db1 192.169.0.1 db2 192.169.0.2 db3 192.169.0.3

它们都运行在 CentOS-6.5 上,MariaDB 版本是 10.0

我的目标是使用 HAproxy 来执行负载平衡。我已经在单独的服务器上安装和配置了 HAproxy

db4 192.168.0.4 

没有安装集群设置或 MariaDB,只有 HAproxy。问题是,HAproxy 似乎没有工作,即做负载平衡。它开始正常,我可以通过网络界面访问它:

http://192.168.0.4:9000/haproxy

但是服务器的状态显示它们已关闭,即使它们实际上已启动并在各自的计算机上运行。HAproxy 配置如下:

global
log 127.0.0.1 local0 notice
user haproxy
group haproxy

defaults
log global
retries 2
timeout connect 1000
timeout server 5000
timeout client 5000

listen mariadb-cluster
bind 0.0.0.0:3306
mode tcp
option mysql-check user haproxy
balance roundrobin
server db1 192.168.0.1:3306 check
server db2 192.168.0.2:3306 check
server db4 192.168.0.3:3306 check

listen webinterface
bind 0.0.0.0:9000
mode http
stats enable
stats uri /haproxy
stats realm Strictly\ Private
stats auth admin:password

db1、db2、db3 和 db4 只是每个服务器的主机名。因此,当我在第一台服务器上运行命令 #hostname 时,它​​将显示 db1。

4

3 回答 3

2

我相信您已经检查了日志,您可以在其中看到连接的进入和存在,或者没有定向到它们应该也被定向到的节点/服务器。

我不知道这是否是拼写错误,但我相信您已将 db4(haproxy 机器)作为节点包含在内,对吧?它应该是db3)

还要检查您是否可以从 HAproxy 机器访问端口 3306 到每个数据库节点

如果没有,请检查您为检查过程定义的 haproxy 用户是否具有 mysql 权限。如果没有,请登录到您的节点服务器之一,然后:

mysql> GRANT USAGE ON *.* TO 'haproxy'@'%'; 

(出于安全目的,您应该将“%”限制为运行 HAproxy 的 IP 地址)

我的配置与您的配置相似,但添加了用于引导节点权重和每个节点的最大连接数的选项。我也更喜欢使用“leastcon”而不是“循环”,所以请评估它是否符合您的目的。

haproxy.cfg

global
    log         127.0.0.1 local0
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     512
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats mode 666

defaults
        log     global
        mode    http
        option  tcplog
        option  dontlognull
        retries 3
        option redispatch
        maxconn 1024
        timeout connect     3s
        timeout client      50s
        timeout server      50s
        timeout check       10s

listen website_cluster 0.0.0.0:3306
        mode tcp
        balance leastconn
        option tcpka
        option httpchk
        option mysql-check user haproxy
        stick store-request src
        stick-table type ip size 200k expire 30m
        server db1 192.168.0.1:3306 weight 40 check port 3306 inter 5000 rise 1 fall 3 maxconn 120
        server db2 192.168.0.2:3306 weight 30 check port 3306 inter 5000 rise 1 fall 3 maxconn 75
        server db3 192.168.0.3:3306 weight 30 check port 3306 inter 5000 rise 1 fall 3 maxconn 75

在 MariaDB 的站点中,还有一个教程也可以帮助您完成:这里

于 2014-10-23T17:02:35.170 回答
0

就我而言,是SELinux阻止了连接。

于 2019-04-26T20:03:42.700 回答
0

我也遇到了这个问题,花了将近一天的时间才发现 HAPROXY 有两种后端平衡/健康检查模式。第 4 层检查在 OSI 第 4 层上运行,而第 7 层在应用程序级别上运行。我option mysql-check在第 7 层使用 which 检查,需要mysql-client安装在 HAPROXY 服务器/节点上。我在 HAPROXY 机器/容器(docker)上没有任何 Mysql-client 包。然后我将选项检查转换为option tcp-check它工作正常。这是我的完整代码haproxy.cfg

global
    log haproxy-logger local0 notice
    fuser haproxy
    group haproxy
    defaults
log global
    retries 2
    timeout connect 3000
    timeout server 5000
    timeout client 5000
listen mysql-cluster
    bind 0.0.0.0:3306
    mode tcp
    #option mysql-check user haproxy_check
    option tcp-check
    balance roundrobin
    server mysql1 mysql1:3306 check
    server mysql2 mysql2:3306 check weight 2
listen mysql-clusterstats
    bind 0.0.0.0:8080
    mode http
    stats enable
    stats uri /
    stats realm Strictly\ Private
    stats auth status:mypass

最后通过将其转换为第 4 层负载均衡来修复

更多细节可以看我的博客——HAProxy ——Docker上的Mysql集群

于 2016-09-21T14:07:20.127 回答