Haproxy包下載地址
https://www.haproxy.org/ --這個網站去下載你所需要的Haproxy包
比較 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
環境
一共四個節點 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
[root@mysql haproxy-1.7.8]# cd /usr/local/haproxy/
[root@mysql haproxy]# ls
doc sbin share
[root@mysql haproxy]# mkdir conf --將所有配置文件放到該目錄下面
[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 #默認的模式mode
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 #負載的機器,負載的機器可以有多個,往下排列即可
[root@mysql ~]# vim /usr/local/haproxy/conf/haproxy.pid --創建其pid文件
1
(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
測試負載均衡
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,負載均衡實現!