Haproxy實現Mysql負載均衡

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,負載均衡實現!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章