负载均衡集群
架构是这样子的:一台主服务器,只负责写;多台从服务器(起码两台),只负责读;一台负载均衡节点,负责均匀的分配请求到多台从服务器。
所以负载均衡集群至少需要4台服务器。
使用负载均衡的好处:
1.如果有一台从服务器挂掉了,负责负载均衡的服务器会将本来分配到该从服务器的请求分配给其他从服务器,不至于导致挂了一台从服务器,那么该台服务器的请求就得不到相应。
2.如果没有负载均衡节点的调度,那么可能请求从节点A的人很多,造成A节点压力很大,请求节点C的人很少,造成资源浪费,但是有了负载均衡节点就不会有这种情况。
负载均衡工具:
Lvs,HaProxy,Nginx等
Nginx是基于http协议的,也就是说,只能用于web应用(网站,Api之类的),也就是说不能单独对MySQL进行负载均衡,只能对HTTP请求进行负载均衡
LVS Linux的虚拟服务,但是需要的机器很多,适合大型服务
HaProxy 基于TCP协议,可以代理MySQL
性能 LVS > HaProxy > Nginx
这里主要演示搭建HaProxy实现mysql从节点的负载均衡。
1个主节点A,2个从节点B,C,1个负载均衡节点D
架构如下:
A 和 B,C已建立主从复制关系
业务逻辑层(如PHP),已经配置好读写分离,当执行增删改时会去请求A,执行select时会随机请求B,C中的随便一个节点。
搭建haproxy负载均衡,将B,C绑定到节点D上面(注意D节点上不需要安装有数据库,只需要安装有haproxy即可),业务逻辑层的配置也进行修改,改为:执行增删改时会去请求A,执行select时会请求D节点。D节点就会将请求平均的分配到B,C节点,然后将从节点返回的数据返回给业务层。
当然,由于像TP5这样的框架,请求数据库节点默认时3306端口,所以D节点的haproxy最好绑定3306端口,当业务层请求“D的ip:3306”时,业务层认为他请求的时一个数据库,其实D节点不是数据库,只是个中间代理而已,当然返回的是数据库的数据。
下面是具体操作:
A 首先,对主节点和2个从节点进行主从复制
B 搭建haproxy:
先对2个从节点创建2个用户名密码相同的用户(在主节点创建即可,因为另外两个从节点会复制主节点的数据,在mysql库的user表自动增加用户记录)。
关闭四台机器的防火墙。将下载好的haproxy放到负载均衡节点,解压,编译安装,具体安装过程可以上网查,这里我将安装过程贴出来:
将下载的tar.gz文件放到/root下,然后:
tar -xzf haproxy-2.1.2.tar.gz
cd haproxy-2.1.2
make TARGET=Linux31 # 这里需要使用uname -r查看系统版本centos6.X需要使用TARGET=linux26 centos7.x使用linux31
make install PREFIX=/usr/local/haproxy
mkdir /usr/local/haproxy/conf # 创建配置文件目录
cp examples/option-http_proxy.cfg /usr/local/haproxy/conf/haproxy.cfg # 复制配置文件
配置文件内容如下:
global
maxconn 20000
ulimit-n 16384
log 127.0.0.1 local0
uid 200
gid 200
chroot /var/empty
nbproc 1
daemon
frontend test-proxy
bind 192.168.200.10:8080
mode http
log global
option httplog
option dontlognull
option nolinger
option http_proxy
maxconn 8000
global
用来设定全局配置参数,属于进程级的配置,通常和操作系统配置有关。
global下
log:全局的日志配置,local0 是日志设备,info表示日志级别。其中日志级别有err、warning、info、debug四种可选。这个配置表示使用 127.0.0.1 上的 rsyslog 服务中的local0日志设备,记录日志等级为info。
maxconn:设定每个haproxy进程可接受的最大并发连接数,此选项等同于Linux命令行选项“ulimit -n”。
user/group:设置运行 haproxy进程的用户和组,也可使用用户和组的 uid和gid 值来替代。
daemon:设置 HAProxy进程进入后台运行。这是推荐的运行模式。
nbproc:设置 HAProxy 启动时可创建的进程数,此参数要求将HAProxy 运行模式设置为“daemon”,默认只启动一个进程。根据使用经验,该值的设置应该小于服务器的 CPU核数。创建多个进程,能够减少每个进程的任务队列,但是过多的进程可能会导致进程的崩溃。
pidfile:指定 HAProxy进程的 pid文件。启动进程的用户必须有访问此文件的权限。
defaults 部分
默认参数的配置部分。在此部分设置的参数值,默认会自动被引用到下面的 frontend、backend和 listen部分中,因此,如果某些参数属于公用的配置,只需在 defaults 部分添加一次即可。而如果在 frontend、backend和 listen部分中也配置了与 defaults 部分一样的参数,那么defaults部分参数对应的值自动被覆盖。
frontend部分
此部分用于设置接收用户请求的前端虚拟节点。frontend是在 HAProxy1.3版本之后才引入的一个组件,同时引入的还有 backend组件。通过引入这些组件,在很大程度上简化了 HAProxy配置文件的复杂性。frontend可以根据 ACL规则直接指定要使用的后端
backend部分
此部分用于设置集群后端服务集群的配置,也就是用来添加一组真实服务器,以处理前端用户的请求。添加的真实服务器类似于 LVS中的real server节点。
5、listen部分
此部分是 frontend 部分和 backend 部分的结合体。在 HAProxy1.3 版本之前,HAProxy 的所有配置选项都在这个部分中设置。为了保持兼容性,HAProxy 新的版本仍然保留了 listen 组件的配置方式。目前在 HAProxy 中,两种配置方式任选其一即可。
这里我不过多的讲解选项,只讲解比较重要的选项:
上面的是官方给出的配置文件,下面是我自己设置的配置:
global
daemon
nbproc 1
pidfile /usr/local/haproxy/conf/haproxy.pid # 这个待会要自己建
defaults
mode tcp # 默认的模式(tcp|http|health),tcp是4曾,http是7层,health只返回OK
retries 2 # 两次连接失败就认为服务器不可用,也可以通过后面设置
option redispatch # 当server选项指定的服务器挂掉后,强制定向到其他健康的服务器
option abortonclose #当服务器负载很高,自动结束当前队列处理的比较久的连接
maxconn 4096 # 默认最大连接数
timeout connect 5000ms #连接超时时间
timeout client 30000ms #客户端超时
timeout server 30000ms #服务器超时
log 127.0.0.1 local0 err
# 上面这些配置直接拿来用即可,不用死机,有印象知道其含义即可
# 下面的配置就是我们要自己设置的
listen test1 # 配置负载均衡的节点,test1是名字,可以随意
bind 0.0.0.0:3300 # haproxy服务监听的IP和端口,这里的0.0.0.0就是本机
mode tcp # 数据库连接,肯定是tcp协议,这里其实可以不指定,因为前面已经指定过了
server s1 节点1的IP:3306 # 指定从节点1的IP和端口
server s2 节点2的IP:3306 # 指定从节点2的IP和端口
# haproxy只需要绑定从节点的IP,因为读写时分离的,读都会去请求haproxy服务,然后haproxy服务才会去请求绑定的从节点,写会单独去请求主节点,不会经过haproxy的。
接下来,创建pid文件,并启动haproxy
vi /usr/local/haproxy/conf/haproxy.pid
echo 1 > haproxy.pid
haproxy -f /usr/local/haproxy/conf/haproxy.cfg # -f是指定配置文件,haproxy命令要添加到环境变量中,这个命令在/usr/local/haproxy/sbin下。
启动成功后,就已经搭建负载均衡完毕。
下一节将介绍如何实操通过Haproxy搭建一个mysql负载均衡集群