MySQL集羣(三)mysql-proxy搭建負載均衡與讀寫分離

前言php

前面學習了主從複製和主主複製,接下來給你們分享一下怎麼去使用mysql-proxy這個插件去配置MySQL集羣中的負載均衡以及讀寫分離。mysql

注意:這裏比較坑的就是mysql-proxy一直沒有更新致使版本太落後了,我在MySQL5.7.19中搭建玩負載均衡後有bug,因此這裏我在windows中搭建了兩個MySQL(好像是5.6或5.6如下的均可以搭建成功)服務器linux

   還有就是可使用mysql-proxy的替代品mysql-Router功能更強大!廢話很少說,咱們直接幹起來。程序員

1、mysq-proxy簡介與安裝

1.一、mysql-proxy簡介

  mysql-proxy是官方提供的mysql中間件產品能夠實現負載平衡,讀寫分離,failover等web

  MySQL Proxy就是這麼一個中間層代理,簡單的說,MySQL Proxy就是一個鏈接池,負責將前臺應用的鏈接請求轉發給後臺的數據庫,而且經過使用lua腳本,能夠實現複雜的鏈接控制和過濾,sql

  從而實現讀寫分離和負載平衡。對於應用來講,MySQL Proxy是徹底透明的,應用則只須要鏈接到MySQL Proxy的監聽端口便可數據庫

  固然,這樣proxy機器可能成爲單點失效,但徹底可使用多個proxy機器作爲冗餘,在應用服務器的鏈接池配置中配置到多 個proxy的鏈接參數便可ubuntu

1.二、實例描述做用

  1)咱們在進行web開發的時候,每每一臺MySQL服務器是不夠用的,可能須要多臺,web到底鏈接哪一個數據庫?windows

    這個要程序員本身寫的代碼來決定的,如今是二臺mysql服務器,若是有多臺或者是N臺呢,靠用php代碼來管理鏈接數據庫,就很尷尬了。緩存

    

  2)mysql proxy就很好解決了這個問題,對於程序端而言,web端的請求,只要到mysql proxy的鏈接池就OK了,剩下的工做就交給mysql proxy了。對於程序代碼管理來講就簡單多了。我的以爲這一點最值得借用的了。

      

1.三、mysql-proxy的安裝

  其實這個也有windows的版本,可是我推薦在linux中去使用,由於在開發中大部分服務器都是安裝在linux中的。個人就是安裝在ubuntu17.04版本的server版中。

  1)首先你須要有這個安裝包:mysql-proxy-0.8.5-linux-debian6.0-x86-64bit.tar.gz(須要的話私聊我)

  2)通常咱們把這個第三方的軟件安裝在/opt目錄下

   解壓mysql-proxy-0.8.5-linux-debian6.0-x86-64bit.tar.gz到/opt/目錄並建立軟連接。    

    tar  zxvf  mysql-proxy-0.8.5-linux-debian6.0-x86-64bit.tar.gz  –C  /opt/
    ln  –snf  /opt/mysql-proxy-0.8.5-linux-debian6.0-x86-64bit  /opt/mysql-proxy(建立軟連接不懂的看前面的博文)

    

  3)配置環境變量

    這裏的話,通常配置在.bashrc下,由於每一個用戶有每一個用戶不一樣的功能,你也能夠配置在全局環境變量當中(/etc/profile)

    我在.baserc下的配置:

      sudo vi .bashrc 在最後面添加:

      

      完成以後注意要更新:source .bashrc若是配置在全局變量中也要更新

  4)查看是否安裝成功

    其實當你輸入mysql-p的時候,按tab鍵可以聯想出來,說明你已經配置成功了。咱們能夠經過mysql-proxy -V查看是否配置成功。  

    

2、使用mysql-proxy實現負載均衡

  那咱們該怎麼去配置負載均衡呢?咱們能夠經過mysql-proxy --help來查看參數的意思

  搭建步驟:

   個人mysql-proxy安裝在ubuntu中,兩個mysql服務器安裝在windows當中。

  1)在你的已經安裝了mysql-proxy的主機上建立一個腳本:mysql-proxy-replication.sh  

#!/bin/bash
/opt/mysql-proxy/bin/mysql-proxy \
--proxy-address=1.0.0.3:4040 \   #這個是安裝mysql-proxy的主機上的ip,這個4040端口是mysql-proxy的默認端口
--proxy-backend-addresses=192.168.2.45:3125 \ #這個是mysql服務器安裝主機的ip和mysql的端口
--proxy-backend-addresses=192.168.2.45:3126 \
--log-level=info \
--log-file=/opt/mysql-proxy/logs/mysql-proxy-12.log \ #存放日誌文件的位置
--daemon

  2)而後咱們執行這個腳本,我把腳本放在了家目錄上面

    建立好了,能夠修改一下文件的權限sudo chmod u+x  mysql-proxy-replication.sh

    還要建立一下存放日誌文件的目錄與文件sudo mkdir -r /opt/mysql-proxy/logs與touch mysql-proxy-12.log

    執行sudo ./mysql-proxy-replication.sh

    注意:這裏我爲了給你們演示我把mysql-proxy先關閉:使用ps -ef查看進程號,在使用sudo kill -9 進程號或者sudo killall mysql-proxy

  3)咱們查看一下日誌,看是否腳本運行成功

    sudo vi /opt/mysql-proxy/logs/mysql-proxy-12.log    

    

    從日誌文件能夠清楚的看到,插件proxy正在監聽着4040端口,它還添加了兩個MySQL服務器(主主複製)。

  4)獲取mysql-proxy中管理的兩個服務器的鏈接

    

      獲取鏈接:mysql -uroot -p123456 -h1.0.0.3 -P4040

      分析:咱們的用戶名和密碼是使用的是MySQL服務器的用戶名和密碼,由於是要從他們兩個當中獲取鏈接,ip和端口都是使用代理的ip和端口。      

  5)結果

        

        咱們在這裏執行建立一個數據庫:create database db_test_1

        使用mysql -uroot -p123456 -h1.0.0.3 -P4040獲取的鏈接

        

        而後在查看mysql兩臺服務器有沒有建立成功

        使用mysql -uroot -p -h192.168.2.45 -P3125和mysql -uroot -p -h192.168.2.45 -P3126登陸

        兩個都是同樣的,說明主主複製的兩個集羣,使用mysql-proxy管理成功!

 

總結:在這個負載均衡當中,其實就是使用mysql-proxy均衡兩個MySQL服務器的鏈接數。這裏無論這個鏈接裏面的鏈接處理的數據量有多大,處理時間有多長。

   好比主機A有5個鏈接,處理時間只須要10分鐘。二主機B有2個鏈接,處理時間須要1個小時。當有第8個鏈接時,更有可能獲取的是主機B的鏈接。    

   mysql_proxy會把鏈接mysql服務器的tcp/IP鏈接緩存進鏈接池,以提升性能. 在緩存池裏, 緩存的鏈接大體是平均分配在每臺mysql服務器上. 但具體的每個鏈接,始終連某臺服務器.

3、使用mysql-proxy實現讀寫分離

3.一、概述

  Mysql做爲目前世界上使用最普遍的免費數據庫,相信全部從事系統運維的工程師都必定接觸過。但在實際的生產環境中,由單臺Mysql做爲獨立的數據庫是徹底不能知足實際需求的,不管是在安全性,高可用性以及高併發等各個方面。

  所以,通常來講都是經過 主從複製(Master-Slave)的方式來同步數據,再經過讀寫分離(MySQL-Proxy)來提高數據庫的併發負載能力 這樣的方案來進行部署與實施的。

  

3.二、配置讀寫分離

  在這裏我只是配置的是主主複製。

    

  1)怎麼配置在兩臺MySQL服務器中的主主複製我就不介紹了,前面一篇博客已經介紹了。

  2)在你的已經安裝了mysql-proxy的主機上建立一個腳本:mysql-proxy-rw-splitting.sh,並運行 

    首先咱們在前面當中已經運行了mysql-proxy咱們須要先殺死這個進程:sudo killall mysql-proxy

#!bash/bin
/opt/mysql-proxy/bin/mysql-proxy \ --proxy-address=1.0.0.3:4040 \ --proxy-backend-addresses=17.16.15.112:3125 \ #在3125端口的服務器中配置可讀可寫 --proxy-read-only-backend-addresses=172.16.15.112:3126 \ #在3126端口的服務器中配置只讀 --proxy-lua-script=/opt/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua \ #用這個lua腳原本實現讀寫分離 --log-level=info \ --log-file=/opt/mysql-proxy/logs/mysql-proxy-12.log \ #這是它的日誌 --daemon

 

  3)咱們查看一下日誌,看是否腳本運行成功

    sudo vi /opt/mysql-proxy/logs/mysql-proxy-12.log 

2017-09-20 03:03:58: (critical) plugin proxy 0.8.5 started
2017-09-20 03:03:58: (message) proxy listening on port 1.0.0.3:4040
2017-09-20 03:03:58: (message) added read/write backend: 17.16.15.112:3125
2017-09-20 03:03:58: (message) added read-only backend: 172.16.15.112:3126

 

  4)獲取鏈接:mysql -uroot -p123456 -h1.0.0.3 -P4040

    分析:咱們的用戶名和密碼是使用的是MySQL服務器的用戶名和密碼,由於是要從他們兩個當中獲取鏈接,ip和端口都是使用代理的ip和端口。 

4、Mysql-proxy 中間件的使用

4.一、在mysql 客戶端經過中間件鏈接mysql集羣  

  mysql –uroot –p –h 192.168.41.201 –P 4040(注意修改my.conf中綁定ip後才能遠程登陸mysql,且有遠程登陸帳號 GRANT ALL PRIVILEGES ON *.* TO ‘root’@‘%’ IDENTIFIED BY ‘’ WITH GRANT OPTION;)

  若是遠程鏈接很卡,或者很慢,能夠關閉mysql節點 地址反向解析功能 在my.cnf 中添加 skip-name-resolve。

4.二、在mysql 客戶端經過中間件鏈接mysql集羣

  能夠經過 JDBC 訪問mysql-proxy進而訪問mysql集羣 Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql://192.168.41.201:4040/test?user=briup&password=briup";

 

不錯就點個「推薦」哦!

相關文章
相關標籤/搜索