HAProxy简介

haproxy 是工作在四层之上的,这也就意味着它可以代理的服务要比 nginx 更广泛,性能比 nginx 也要更高一些。相比较 lvs,可配置性又比较好,需要的机器没有 lvs 那么多。因此 haproxy 在一定需求下使用还是不错的。比如使用haproxy 来对 mysql 的从节点进行负载均衡。下面我们就来简单的使用 haproxy来进行 MySQL 的负载均衡。

 

比较 Lvs,HaProxy,Nginx

Nginx  http

LVS

HaProxy TCP  -->代理mysql

HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS

LVS: 是基于四层的转发

HAproxy: 是基于四层和七层的转发,是专业的代理服务器

Nginx: 是WEB服务器,缓存服务器,又是反向代理服务器,可以做七层的转发

 

工作选择:

HAproxy和Nginx由于可以做七层的转发,所以URL和目录的转发都可以做,在很大并发量的时候我们就要选择LVS,像中小型公司的话并发量没那么大,选择HAproxy或者Nginx足已,由于HAproxy由是专业的代理服务器配置简单,所以中小型企业推荐使用HAproxy

 

Haproxy包下载地址

https://www.haproxy.org/​  --这个网站去下载你所需要的Haproxy包

Haproxy实现Mysql负载均衡_负载均衡

 

环境

一共四个节点 Mysql 5.7   Haproxy haproxy-1.7.8.tar.gz

Server1

192.168.179.66

master

Server2

192.168.179.67

Slave1

Server3

192.168.179.68

Slave2

Server4

192.168.179.69

Haproxy

写操作去找主节点192.168.179.66,读的时候通过负载均衡haproxy,在所有的从节点192.168.179.67,192.168.179.68前面搭载负载均衡proxy节点,这个节点192.168.179.69就维护了所有节点的列表,当应用过来的时候只需要请求haproxy节点就可以了,这个节点对我们的请求内容进行分发到下面192.168.179.67,192.168.179.68各节点,返回数据有该haproxy 192.168.179.69节点返回

 

 

Mysql主从配置

主库配置

(1)创建用户并且授权replication权限

mysql> create user 'repl'@'192.168.179.%' identified by 'repl';

mysql>  grant replication slave on *.* to 'repl'@'192.168.179.%' identified by 'repl';

 

(2)开启binlog

[root@master log]# vim /etc/my.cnf  --修改mysql的配置文件my.cnf

server-id=1

log-bin=/var/lib/mysql/mysql-bin  --指定binglog二进制文件位置和名称

[root@master ~]# service mysqld restart  --重启生效

 

(3)查看binlog是否开启

mysql> show variables like '%log_bin%';

+---------------------------------+--------------------------------+

| Variable_name                   | Value                          |

+---------------------------------+--------------------------------+

| log_bin                         | ON                             |

| log_bin_basename                | /var/lib/mysql/mysql-bin       |

| log_bin_index                   | /var/lib/mysql/mysql-bin.index |

 

 

查看master状态

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000001 |      154 |              |                  |                   |

+------------------+----------+--------------+------------------+-------------------+

 

从节点配置

[root@slave1 ~]# vim /etc/my.cnf  --从节点slave1配置如下,slave2照葫芦画瓢

server-id=2

[root@slave1 ~]# service mysqld restart

 

mysql>

change master to

master_host='192.168.179.66',master_port=3306,master_user='repl',master_password='repl',master_log_file='/var/lib/mysql/mysql-bin.000001',master_log_pos=154;

mysql> statrt slave;

mysql> show slave  status\G

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.179.66

                  Master_User: repl

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000001

          Read_Master_Log_Pos: 154

               Relay_Log_File: slave1-relay-bin.000002

                Relay_Log_Pos: 320

        Relay_Master_Log_File: mysql-bin.000001

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

 

 

搭建haproxy的步骤

1.创建用户,并赋予权限

2.编译安装haproxy

3.配置haproxy

4.启动haproxy

5.测试

 

1创建用户,并赋予权限

mysql> create user 'test'@'192.168.179.%' identified by 'test';

在配置好主从复制的主库创建test用户这个test用户是来测试负载均衡的用户

mysql> grant all on *.* to 'test'@'192.168.179.%';

mysql> flush privileges;

 

(2)编译安装haproxy

到/usr/src目录下面

[root@mysql ~]# tar -xvf /usr/src/haproxy-1.7.8.tar.gz  

 

[root@mysql haproxy-1.7.8]#cat /proc/version --编译之前,首先查看一下系统内核,因为参数与系统内核有关,此时该参数就为linux26

Linux version 2.6.32-696.el6.x86_64

 

[root@mysql haproxy-1.7.8]# make TARGET=linux26  --编译成Linux 2.6内核使用

gcc -Iinclude -Iebtree -Wall  -O2 -g -fno-strict-aliasing -Wdeclaration-after-statement -fwrapv       -DTPROXY -DCONFIG_HAP_CRYPT -DENABLE_POLL -DENABLE_EPOLL -DNETFILTER -DUSE_GETSOCKNAME  -DCONFIG_HAPROXY_VERSION=\"1.7.8\" -DCONFIG_HAPROXY_DATE=\"2017/07/07\" \

      -DBUILD_TARGET='"linux26"' \

      -DBUILD_ARCH='""' \

      -DBUILD_CPU='"generic"' \

      -DBUILD_CC='"gcc"' \

      -DBUILD_CFLAGS='"-O2 -g -fno-strict-aliasing -Wdeclaration-after-statement -fwrapv"' \

      -DBUILD_OPTIONS='""' \

       -c -o src/haproxy.o src/haproxy.c

make: gcc: Command not found

make: *** [src/haproxy.o] Error 127

--一般出现这个-bash: make: command not found提示,是因为安装系统的时候使用的是最小化mini安装,系统没有安装make、vim等常用命令,直接yum安装下即可。

 

[root@mysql haproxy-1.7.8]# yum install gcc-c++ -y  

 

[root@mysql haproxy-1.7.8]# make TARGET=linux26  --编译

      -DSBINDIR='"/usr/local/sbin"' \

       -c -o src/haproxy-systemd-wrapper.o src/haproxy-systemd-wrapper.c

gcc  -g -o haproxy-systemd-wrapper src/haproxy-systemd-wrapper.o   -lcrypt -ldl

Haproxy实现Mysql负载均衡_mysql_02

 

[root@mysql haproxy-1.7.8]# make install PREFIX=/usr/local/haproxy   --指定安装目录,默认为/usr/local,其他诸如文档之类的文件将会在PREFIX指定的相应目录下。

install -d "/usr/local/haproxy/sbin"

install haproxy  "/usr/local/haproxy/sbin"

install -d "/usr/local/haproxy/share/man"/man1

install -m 644 doc/haproxy.1 "/usr/local/haproxy/share/man"/man1

install -d "/usr/local/haproxy/doc/haproxy"

for x in 51Degrees-device-detection architecture close-options configuration cookie-options DeviceAtlas-device-detection intro linux-syn-cookies lua management netscaler-client-ip-insertion-protocol network-namespaces proxy-protocol SPOE WURFL-device-detection; do \

install -m 644 doc/$x.txt "/usr/local/haproxy/doc/haproxy" ; \

done

 

(3)配置haproxy

我们这里要自己创建两个文件夹,一个是 logs,一个是 conf。在这两个文件夹下,要创建一个 log 文件,一个 cnf 主配置文件和一个 pid 文件

[root@mysql haproxy-1.7.8]# cd /usr/local/haproxy/

[root@mysql haproxy]# ls

doc  sbin  share

[root@mysql haproxy]# mkdir conf  --将所有配置文件放到该目录下面

[root@mysql ~]# vim /usr/local/haproxy/conf/haproxy.pid  --创建其pid文件

1

[root@mysql conf]# vim haproxy.cnf  --/usr/local/haproxy/haproxy.cfg

###########全局配置#########

global

daemon #以后台形式运行harpoxy

nbproc 1 #设置进程数量

pidfile /usr/local/haproxy/conf/haproxy.pid #进程PID文件



########默认配置############

defaults

mode tcp #设置HAProxy默认的工作模式,有tcp,http,health三种

retries 2 #两次连接失败就认为是服务器不可用,也可以通过后面设置

option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器,以后将不支持

option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接

timeout connect 5000ms #连接超时

timeout client 30000ms #客户端超时

timeout server 30000ms #服务器超时

timeout check 2000 #心跳检测超时

log 127.0.0.1 local0 err



########统计页面配置########

listen test1 #这里是配置负载均衡,test1是名字,可以任意

bind 0.0.0.0:3306 #这里是监听的IP地址和端口,端口号可以在0-65535之间,要避免端口冲突



mode tcp #连接的协议,这里是tcp协议

server s1 192.168.179.67:3306 #负载的机器

server s2 192.168.179.68:3306 #负载的机器,负载的机器可以有多个,往下排列即可

 

(4)启动haproxy

[root@mysql conf]# ../sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cnf

[root@mysql conf]# netstat -tpln | grep 33  --可以看到启动成功

tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      2573/../sbin/haprox

 

 

(5)客户端通过Haproxy登入测试负载均衡

mysql> create database slave1;  --登入到92.168.179.67从库上面创建数据库slave1

mysql> create database slave2;  --登入到192.168.179.68从库上面创建数据库slave2

 

用之前创建的test用户通过192.168.179.69 haproxy 3306端口登入到mysql slave上

Haproxy实现Mysql负载均衡_linux_03

可以看到第一次登入到192.168.179.67上的mysql

Haproxy实现Mysql负载均衡_负载均衡_04

第二次登入到的是192.168.179.68上的mysql

Haproxy实现Mysql负载均衡_负载均衡_05

可以看到可以通过haproxy登入到不同slave的MySQL,负载均衡实现!