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包
环境
一共四个节点 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
[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
(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上
可以看到第一次登入到192.168.179.67上的mysql
第二次登入到的是192.168.179.68上的mysql
可以看到可以通过haproxy登入到不同slave的MySQL,负载均衡实现!