如何使用HAProxy的设置MySQL负载均衡

序幕

HAProxy是一个开源软件,可以负载平衡HTTP和TCP服务器。在 上HAProxy的前面的文章中 ,我们配置的负载均衡HTTP和在这其中,我们会为MySQL这样做。 你所有的MySQL服务器必须被配置为执行 主-主复制负载平衡涉及的读取和写入到所有的后端。 本文将使用以下三个Droplet: Droplet 1 - 负载平衡器 主机名:haproxy 操作系统:Ubuntu 私人IP:10.0.0.100 Droplet 2 - 节点1 主机名:mysql-1 操作系统:Debian 7 私人IP:10.0.0.1 Droplet 2 - Node 2 主机名:mysql-2 操作系统:Debian 7 私人IP:10.0.0.2 在继续之前,请确保所有MySQL服务器都已启动,正在运行并正确复制数据库写入。

准备MySQL服务器

我们需要通过为HAProxy创建两个额外的用户来准备MySQL服务器。 HAProxy将使用第一个用户来检查服务器的状态。
root@mysql-1# mysql -u root -p -e "INSERT INTO mysql.user (Host,User) values ('10.0.0.100','haproxy_check'); FLUSH PRIVILEGES;"
当从HAProxy访问MySQL集群时,需要具有root权限的MySQL用户。所有服务器上的默认root用户只允许本地登录。虽然可以通过向root用户授予其他权限来修复此问题,但最好是拥有具有root权限的单独用户。
root@mysql-1# mysql -u root -p -e "GRANT ALL PRIVILEGES ON *.* TO 'haproxy_root'@'10.0.0.100' IDENTIFIED BY 'password' WITH GRANT OPTION; FLUSH PRIVILEGES"
用你自己的安全值替换 haproxy_root密码 。在一个MySQL主机上执行这些查询就足够了,因为更改将复制到其他主机。

安装MySQL客户端

MySQL客户端必须安装在HAProxyDroplet上以测试连接。
root@haproxy# apt-get install mysql-client
现在试着在主人的 haproxy_root用户的一个执行查询。
root@haproxy# mysql -h 10.0.0.1 -u haproxy_root -p -e "SHOW DATABASES"
这应该显示MySQL数据库的列表。

安装HAProxy

在HAProxy服务器上安装软件包。
root@haproxy# apt-get install haproxy
启用HAProxy以由init脚本启动。
root@haproxy# sed -i "s/ENABLED=0/ENABLED=1/" /etc/default/haproxy
要检查此更改是否正确执行HAProxy的init脚本,不带任何参数。
root@haproxy:~# service haproxy
Usage: /etc/init.d/haproxy {start|stop|reload|restart|status}

配置HAProxy

重命名原始配置文件
mv /etc/haproxy/haproxy.cfg{,.original}
创建并编辑一个新的
nano /etc/haproxy/haproxy.cfg
第一个块是全局和默认配置块。
global
    log 127.0.0.1 local0 notice
    user haproxy
    group haproxy

defaults
    log global
    retries 2
    timeout connect 3000
    timeout server 5000
    timeout client 5000
有关这些选项的详细信息覆盖在 这篇文章 。 既然我们已经告诉HAProxy的发送日志消息为127.0.0.1,我们必须配置 rsyslog现在听就可以了。 这也被涵盖在 同一篇文章中 配置根据 日志记录HAProxy的 。 移动到主配置部分。
listen mysql-cluster
    bind 127.0.0.1:3306
    mode tcp
    option mysql-check user haproxy_check
    balance roundrobin
    server mysql-1 10.0.0.1:3306 check
    server mysql-2 10.0.0.2:3306 check
不同于HTTP负载均衡HAProxy的没有为MySQL特定的“模式”,所以我们使用 TCP。 我们已经设置HAProxy的,如果你的应用程序驻留在不同的Droplet只监听回送地址(假设应用程序是在同一台服务器上),但是让它侦听 0.0.0.0或私有IP地址。 我们需要一个配置块来查看负载平衡的统计信息。这是完全可选的,如果你不想要stats,可以省略。
listen 0.0.0.0:8080
    mode http
    stats enable
    stats uri /
    stats realm Strictly\ Private
    stats auth A_Username:YourPassword
    stats auth Another_User:passwd
替换“stats auth”中的用户名和密码。这将使HAProxy的 8080端口侦听HTTP请求和数据将与HTTP基本验证的保护。所以你可以访问stats
http://<Public IP of Load Balancer>:8080/
配置完成后,启动HAProxy服务。
service haproxy start
使用mysql客户端查询HAProxy。
root@haproxy# mysql -h 127.0.0.1 -u haproxy_root -p -e "SHOW DATABASES"
“-h”选项必须与环回IP地址一起显示。它省略或使用 本地主机将会使MySQL客户端连接到 的mysql.sock文件,该文件将失败。

测试负载平衡和故障转移

要检查是否负载均衡工作查询 SERVER_ID变量的两倍以上。
root@haproxy# mysql -h 127.0.0.1 -u haproxy_root -p -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
root@haproxy# mysql -h 127.0.0.1 -u haproxy_root -p -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
这表明 roundrobin负载重量相等的平衡,我们现在将改变 的mysql-2的重量和看到的结果。 nano /etc/haproxy/haproxy.cfg
server mysql-2 10.0.0.2:3306 check weight 2
重新加载以应用此更改。
service haproxy reload
查询为 SERVER_ID多次。
root@haproxy:~# for i in `seq 1 6`
do
mysql -h 127.0.0.1 -u haproxy_root -ppassword -e "show variables like 'server_id'"
done

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
现在,负载均衡作品以 1:2的比例与请求中的一个三分将MYSQL-1和的三分之二将在mysql-2。 通过停止服务失败MySQL服务器
root@mysql-1# service mysql stop
或使界面下降。
root@mysql-1# ifconfig eth1 down
现在尝试“显示变量”查询以查看结果。以下日志条目将指示HAProxy检测到故障的时间和方式。 tail /var/log/haproxy/haproxy.log
Nov 15 00:08:51 localhost haproxy[1671]: Server mysql-cluster/mysql-1 is DOWN, reason: Layer4 timeout, check duration: 2002ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.

减少故障转移间隔

当MySQL服务器关闭时HAProxy需要一些时间来检测此故障并将其从集群中删除。在本节中,我们将了解如何控制此时间。首先,我们将看到如何测量这个值。一种方法是使用阻止MySQL的端口 的iptables了一定的时间,然后删除该规则并检查日志。
root@mysql-1:~# ifconfig eth1 down &&
date &&
sleep 20 &&
ifconfig eth1 up &&
date

Fri Nov 15 00:37:09 IST 2013
Fri Nov 15 00:37:29 IST 2013
端口3306, 受阻 20秒,我们将看看日志文件现在。
root@haproxy:~# tail /var/log/haproxy.log
Nov 15 16:49:38 localhost haproxy[1275]: Server mysql-cluster/mysql-1 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Nov 15 16:49:56 localhost haproxy[1275]: Server mysql-cluster/mysql-1 is UP, reason: Layer7 check passed, code: 0, info: "5.5.31-0+wheezy1-log", check duration: 1ms. 2 active and 0 backup servers online. 0 sessions requeued, 0 total in queue.
检测到故障(在16:49:38和16:49:32之间的差异)和4秒钟检测到可以到达服务器(在16:49:56和16:49:52之间的差异)需要6秒。这由服务器参数rise,fall和inter决定。 上升参数设定要声明 操作一个服务器必须通过检查次数。默认值为2。 秋天的参数设置要宣告 死亡的服务器必须通过检查次数。默认值为3。 内部参数设置这些检查之间的时间间隔。默认值为2000毫秒。 把这个信息一起服务器必须失败这是在 2秒的间隔进行连续 3个检查被认为死亡。所以在上面的例子中,下面的代码将会发生。
16:49:32 - Port 3306 on mysql-1 was blocked
16:49:34 - Check - Failed - Failure No. 1
16:49:36 - Check - Failed - Failure No. 2
16:49:38 - Check - Failed - Failure No. 3 (server removed and event logged)
并且当防火墙规则被删除。
16:49:52 - Firewall rule removed port 3306 accessible
16:49:54 - Check - Passed - Success No. 1
16:49:56 - Check - Passed - Success No. 2 (server added to cluster and event logged)
以下设置将测试间隔减少到1秒,并减少跌落测试的次数。 nano /etc/haproxy/haproxy.cfg
server mysql-1 10.0.0.1:3306 check fall 2 inter 1000
server mysql-2 10.0.0.2:3306 check fall 2 inter 1000
有时你可能不希望洪水 专用网络有太多的“测试”数据包特别是具有如果你有大量的MySQL服务器。在这种情况下,fastinter和downinter参数将派上用场。 该 fastinter参数设置检查之间的时间间隔,同时将服务器转换UP或DOWN。 当一个服务器宕机的 downinter参数设置测试间隔。 这个解释可能会令人困惑,所以我们将看一个例子。 nano /etc/haproxy/haproxy.cfg
server mysql-1 10.0.0.1:3306 check fastinter 1000
server mysql-2 10.0.0.2:3306 check fastinter 1000
由于我们没有指定“inter”参数,它默认为2000ms。使用此配置,我们将重新启动HAProxy并再次进行测试。
root@mysql-1:~# iptables -A INPUT -p tcp --dport 3306 -j REJECT &&
date &&
sleep 20 &&
iptables -D INPUT -p tcp --dport 3306 -j REJECT &&
date
Fri Nov 15 17:18:48 IST 2013
Fri Nov 15 17:19:08 IST 2013
检查HAProxy日志文件。
root@haproxy:~# tail /var/log/haproxy.log
Nov 15 17:18:52 localhost haproxy[1353]: Server mysql-cluster/mysql-1 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Nov 15 17:19:11 localhost haproxy[1353]: Server mysql-cluster/mysql-1 is UP, reason: Layer7 check passed, code: 0, info: "5.5.31-0+wheezy1-log", check duration: 1ms. 2 active and 0 backup servers online. 0 sessions requeued, 0 total in queue.
现在只需要4秒(相比之前的6)检测到故障,3秒(与4相比)来检测服务器是否已启动。幕后这是发生了什么。
17:18:48 - Port 3306 blocked
17:18:50 - Check - Failed - Failure No. 1
17:18:51 - Check - Failed - Failure No. 2
17:18:52 - Check - Failed - Failure No. 3 (server removed and event logged)
并且当端口被解锁。
17:19:08 - Firewall rule removed
17:19:10 - Check - Passed - Success No. 1
17:19:11 - Check - Passed - Success No. 2 (server added to cluster and event logged)
首先注意端口块事件(17:18:48)和第一个检查(17:18:50)之间的间隔,它是2秒(“间隔”间隔)。然后注意到测试1 < - >测试2和测试2 < - >测试3之间的间隔,它仅为1秒(“快速”间隔)。当服务器从DOWN切换到UP时,可以注意到相同的间隔。因此,“fastinter”控制这些检查之间的间隔。 那么什么是downinter?当服务器已经宣 HAProxy的继续检查它每2秒(或间中提到的间隔)。 如果你觉得你使用了不必要的网络资源设置 downinter说5000将HAProxy的在5秒内检查DOWN服务器只有一次。

重要

我们做的测试先前被拒绝数据包时,HAProxy的启动通过发送一个SYN包到 mysql-1收到一个RST包(而不是SYN + ACK)的连接,这意味着。这就是为什么日志条目提到“连接被拒绝”。在这种情况下,只有fall,inter和fastinter值进入场景。 相反,如果HAProxy在发送SYN后没有收到任何连接的连接超时。在这种情况下,除了上述参数之外,“超时”持续时间进入场景。这种情况可能发生,如果
  • iptables的设置为DROP
  • 私有接口down
  • 私有网络基础设施存在问题

深入阅读

正式文件 http://cbonte.github.io/haproxy-dconv/configuration-1.4.html
:提交 Jesin一
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏