HAProxy + Percona XtraDB 集群

HAProxy + Percona XtraDB 集群

我正在尝试在一系列 3 个 EC2 实例上结合 Percona XtraDB Cluster 设置 HAproxy。我在网上找到了一些处理此特定问题的教程,但我有点不知所措。

Percona 服务器和 HAproxy 服务器均运行 ubuntu 12.04。HAProxy 版本为 1.4.18,

当我启动 HAProxy 时出现以下错误:服务器 pxc-back/db01 已关闭,原因:套接字错误,检查持续时间:2ms。

我不太确定问题可能出在哪里。我已验证了以下内容:

  1. EC2 安全组端口已开放
  2. 仔细检查了我的配置文件,寻找问题。目前我还没有发现任何问题。
  3. 确保 xinetd 已安装
  4. 确保我使用的是 mysql 服务器的正确 ip 地址。

任何帮助都将不胜感激。

这是我当前的配置

负载均衡器

/etc/haproxy/haproxy.cfg

global
  log 127.0.0.1 local0
  log 127.0.0.1 local1 notice
  maxconn 4096
  user haproxy
  group haproxy
  debug
  #quiet
  daemon

defaults
  log global
  mode http
  option tcplog
  option dontlognull
  retries 3
  option redispatch
  maxconn 2000
  contimeout 5000
  clitimeout 50000
  srvtimeout 50000

frontend pxc-front
  bind 0.0.0.0:3307
  mode tcp
  default_backend pxc-back

frontend stats-front
  bind 0.0.0.0:22002
  mode http
  default_backend stats-back

backend pxc-back
  mode tcp
  balance leastconn
  option httpchk
  server db01 10.86.154.105:3306 check port 9200 inter 12000 rise 3 fall 3

backend stats-back 
  mode http
  balance roundrobin
  stats uri /haproxy/stats

MySQL 服务器

/etc/xinetd.d/mysqlchk

# default: on
# description: mysqlchk
service mysqlchk
{
# this is a config for xinetd, place it in /etc/xinetd.d/
        disable = no
        flags           = REUSE
        socket_type     = stream
        port            = 9200
        wait            = no
        user            = nobody
        server          = /usr/bin/clustercheck
        log_on_failure  += USERID
        #only_from       = 0.0.0.0/0
        # recommended to put the IPs that need
        # to connect exclusively (security purposes)
        per_source      = UNLIMITED
}

MySQL 服务器

/etc/services

添加了行 mysqlchk 9200/tcp # mysqlchk

MySQL 服务器

/usr/bin/clustercheck

# GNU nano 2.2.6 File: /usr/bin/clustercheck
#!/bin/bash
#
# Script to make a proxy (ie HAProxy) capable of monitoring Percona XtraDB Cluster nodes properly
#
# Author: Olaf van Zandwijk <[email protected]>
# Documentation and download: https://github.com/olafz/percona-clustercheck
#
# Based on the original script from Unai Rodriguez
#

MYSQL_USERNAME="testuser"
MYSQL_PASSWORD=""
ERR_FILE="/dev/null"
AVAILABLE_WHEN_DONOR=0

#
# Perform the query to check the wsrep_local_state
#
WSREP_STATUS=`mysql --user=${MYSQL_USERNAME} --password=${MYSQL_PASSWORD} -e "SHOW STATUS LIKE 'wsrep_local_state';" 2>${ERR_FILE} | awk '{if (NR!=1){print $2}}' 2>${ERR_FILE}`

if [[ "${WSREP_STATUS}" == "4" ]] || [[ "${WSREP_STATUS}" == "2" && ${AVAILABLE_WHEN_DONOR} == 1 ]]
then
    # Percona XtraDB Cluster node local state is 'Synced' => return HTTP 200
    /bin/echo -en "HTTP/1.1 200 OK\r\n"
    /bin/echo -en "Content-Type: text/plain\r\n"
    /bin/echo -en "\r\n"
    /bin/echo -en "Percona XtraDB Cluster Node is synced.\r\n"
    /bin/echo -en "\r\n"
else
    # Percona XtraDB Cluster node local state is not 'Synced' => return HTTP 503
    /bin/echo -en "HTTP/1.1 503 Service Unavailable\r\n"
    /bin/echo -en "Content-Type: text/plain\r\n"
    /bin/echo -en "\r\n"
    /bin/echo -en "Percona XtraDB Cluster Node is not synced.\r\n"
    /bin/echo -en "\r\n"
fi

答案1

请确保以下步骤并在此处发布结果。

  1. xinetd 正在运行。
  2. testuser按照你提到的创建 mysql 测试用户
  3. 验证监听 TCP 端口(9200)netstat -nlt
  4. 如果你启用了 iptables,请允许端口 9200
  5. 如果端口已打开且处于监听状态,请在 percona 节点中安装 telnet 客户端,然后尝试通过以下方式进行 telnet:telnet 127.0.0.1 9200
  6. 如果 xinetd 正在工作,您应该会看到 http 响应。
  7. 如果不是,则执行/usr/bin/clustercheck

完成所有这些后,请在此处发布结果。

答案2

telnet 127.0.0.1 9200我遇到了出现 503 服务器不可用响应的问题,但当我/usr/bin/clustercheck以 root 身份执行时,它显示一切正常。

使用此命令,我能够以用户身份执行 clusterchecknobody并得到真正的 MySQL 错误/tmp/cluster.log

sudo -H -u nobody bash -c "/usr/bin/clustercheck clustercheckuser clustercheckpassword! 0 /tmp/cluster.log"

/tmp/cluster.log包含:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysql/mysql.sock' (13)

问题在于所在目录mysql.sock没有执行(+x)标志,因此用户无法读取,nobody解决方法是:

chmod o+x /var/run/mysql

相关内容