利用HAProxy代理SQL Server的AlwaysOn辅助副本

公司最近数据库升级到SQL Server2014 ,并部署了alwayson高可用集群

机房内有三套程序需要读取数据库

第一套:主程序,读写数据库,连接主副本

第二套:报表程序,读报表,连接辅助副本

第三套:历史库程序,读历史库,连接辅助副本

软件环境

机器环境

架构图

为什麽需要使用HAProxy?

之前机房里面有2000个终端,这些终端是一个很小的嵌入式设备,第二套报表程序原来是使用直连数据库IP(10.11.10.36)来连接数据库

但这样有一个弊端,当36这台辅助副本宕机,那么报表程序就瘫痪了,因为2000个终端要更改数据库连接需要烧写程序到终端里面非常耗费时间

可能要几天时间

最后决定使用HAProxy做负载均衡和TCP连接重定向

使用HAProxy有几个好处

1、前端不需要后端数据库的实际IP,当需要升级后端数据库,比如打补丁的时候特别方便

2、HAProxy能够自动检测后端数据库服务,探测1433端口是否存活,如果1433端口出问题,能够自动重定向连接到37这台辅助副本

3、减轻单台读库压力,使用RR轮询算法,请求均衡分发到36和37这两台辅助副本,减轻36这台机器的压力


HAProxy相关配置步骤

#yum安装,版本是1.5.4

yum install -y haproxy.x86_64

#编辑rsyslog 文件,修改为-c 2 -r -x -m

vi /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-c 2 -m 0 -r -x"

#编辑rsyslog.conf 文件添加两行local3.*  和local0.*

vi /etc/rsyslog.conf
local7.* /var/log/boot.log
local3.* /var/log/haproxy.log
local0.* /var/log/haproxy.log

#重启rsyslog服务

service rsyslog restart

# 编辑haproxy配置文件 下面以mssql从库负载均衡为例

vi /etc/haproxy/haproxy.cfg

global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn
user haproxy
group haproxy
daemon
#stats socket /var/lib/haproxy/stats
stats socket /var/run/haproxy.sock mode level admin
stats timeout 2m defaults
mode http
log 127.0.0.1: local3
option dontlognull
#option http-server-close
#option forwardfor except 127.0.0.0/
option redispatch
retries
timeout http-request 10s
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn listen stats
mode http
bind *:
stats enable
stats refresh 30s
stats uri /haproxyadminstats
stats realm HAProxy\ Statistics
stats auth admin:admin
stats admin if TRUE listen mssql :
mode tcp
balance roundrobin
server mssqldb1 10.11.10.36: weight maxconn check port inter rise fall
server mssqldb2 10.11.10.37: weight maxconn check port inter rise fall

#检查配置文件是否有语法错误

haproxy -f /etc/haproxy/haproxy.cfg -c
Configuration file is valid

#启动haproxy

/etc/init.d/haproxy start

#检查haproxy是否在监听

netstat -lntp

注意:Centos机器只需要使用一个网口,不需要额外增加网口

#打开后台管理界面
http://10.11.30.47:2080/haproxyadminstats

HAProxy提供了一个后台管理界面

查看haproxy的日志

cat /var/log/haproxy.log


测试验证

使用SSMS2016来连接HAProxy的IP

10.11.10.39

现在是连接到GZC-SQL03这台机

现在把 GZC-SQL03这台机的SQL服务停了

HAProxy已经探测到 GZC-SQL03这台机的SQL服务停了

再次点击一下执行按钮,可以发现已经重定向到 GZC-SQL02这台机

虽然经过HAProxy这一层,但是性能方面也不算太差


HAProxy的通信方式

通信方式类似于LVS的NAT模式

LVS的NAT模式(调度器将请求的目标ip即vip地址改为Real server的ip, 返回的数据包也经过调度器,调度器再把源地址修改为vip)


总结

线上环境使用HAProxy已经差不多1个月,到现在没有出现过问题,比较稳定

对于HAProxy原理上的东西这里就不叙述了,网上有很多资料

参考文章:

http://www.cnblogs.com/dehai/p/4885021.html

如果是每个业务使用不同端口,可以使用下面的配置文件

比如报表使用1433端口,BI抽取数据使用2433端口

vi /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn
user haproxy
group haproxy
daemon
#stats socket /var/lib/haproxy/stats
stats socket /var/run/haproxy.sock mode level admin
stats timeout 2m defaults
mode http
log global
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/
option redispatch
retries
timeout http-request 10s
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn listen stats
mode http
bind *:
stats enable
stats refresh 30s
stats uri /haproxyadminstats
stats realm HAProxy\ Statistics
stats auth admin:admin
stats admin if TRUE listen mssql :
mode tcp
balance roundrobin
server mssqldb1 10.11.10.36: weight maxconn check port inter rise fall
server mssqldb2 10.11.10.37: weight maxconn check port inter rise fall listen mssql2 :
mode tcp
balance leastconn
server mssqldb3 10.11.10.37: maxconn check port inter rise fall

如有不对的地方,欢迎大家拍砖o(∩_∩)o 

本文版权归作者所有,未经作者同意不得转载。

最新文章

  1. 【初码干货】【Azure系列】1、再次感受Azure,体验Windows Server 2016并部署BlogEngine.NET
  2. 使用Visual Studio扩展插件Visual assist X给代码插入注释模板
  3. 记录第一次搭建svn服务器
  4. Python 科学计算涉及模块
  5. Ajax技术详解
  6. 【链表】【模拟】Codeforces 706E Working routine
  7. IOS 错误集合以及解决办法(持续整理中)
  8. WPF 常用样式
  9. eclipse 如何debug jdk源码(转)
  10. 模块划分--MVVM指南(课程学习)
  11. Docker - 访问仓库
  12. 201621123057 《Java程序设计》第1周学习总结
  13. (三十四)NavigationController初步
  14. spring+mybaits多数据源使用
  15. 更多细节的理解RSA算法
  16. U盘重装Win10系统视频教程
  17. ThinkPhp框架对“数据库”的基本操作
  18. C#访问和操作MYSQL数据库
  19. mysql类型对应Java的类型
  20. Sending Email In .NET Core 2.0

热门文章

  1. Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制
  2. [译]ZOOKEEPER RECIPES-Leader Election
  3. Yii1.1的验证规则
  4. 关于Vue.js 2.0 的 Vuex 2.0,你需要更新的知识库
  5. Function.prototype.toString 的使用技巧
  6. 命名sql数据集
  7. Hadoop的安装与设置(1)
  8. MongoDB学习笔记四—增删改文档下
  9. win10安装blueCFD
  10. BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]