mycat實現簡單的mysql叢集負載平衡

來源:互聯網
上載者:User

標籤:soft   負載平衡   事務   roo   dig   south   參與   處理   address   

什麼是mycat呢?

簡單理解為一個MySQL中介軟體,它支援分流、基於心跳的自動故障切換,支援讀寫分離,支援mysql主從,基於Nio管理線程的高並發…
詳見官網:http://www.mycat.io/

為什麼需要mysql叢集?

一個龐大的分布式系統的效能瓶頸中,最脆弱的就是串連,一個是用戶端與後端的串連,另一個是後端與資料庫的串連,說白了就是發送端請求太多,接收端能夠的接收和處理的請求並不多,在用戶端與後端中可以利用類似nginx的負載平衡解決,而在後端與資料庫中可以利用類似mycat的負載平衡實現mysql叢集,提高mysql的總體效能。

 

 

開始我們的旅程,在此之前,需要準備以下:

1 兩台伺服器(最少),一主(master)一從(slave),這裡用vmware裡面裝的兩個ubuntu server 虛擬機器示範,每台虛擬機器的網路連接方式都設定為橋接模式,兩台虛擬機器的ip如下

   主:ubuntu server1: 192.168.11.109   從:ubuntu server2: 192.168.11.117
  • 1
  • 2
  • 1
  • 2

(vmware安裝ubuntu server16.04在上兩篇博文有詳細介紹:
http://blog.csdn.net/change_on/article/details/74969314
http://blog.csdn.net/change_on/article/details/74979993)


 


2 虛擬機器分別安裝好mysql 5.7

3 jdk1.7以上,這裡以jdk-7u67-Linux-x64.tar.gz為例

4 mycat,以Mycat-server-1.6-RELEASE-20161012170031-linux.tar.gz為例

 

搭建mycat+mysql叢集的步驟
  • 1 mysql主從配置

    • 1.1 主要虛擬機器配置(192.168.11.109)

    • 1.2 從虛擬機器設定(192.168.11.117)

    • 1.3 測試

  • 2 配置mycat

    • 2.1 安裝jdk

    • 2.2 安裝mycat

    • 2.3 配置server.xml

    • 2.4 配置schema.xml

    • 2.5 測試

 

mysql主從配置 注意 :mysql5.7的設定檔是 /etc/mysql/mysql.conf.d/mysqld.cnf !不是/etc/mysql/my.cnf !
  • 1主要虛擬機器配置(192.168.11.109)

    • 1.1 修改/etc/mysql/mysql.conf.d/mysqld.cnf檔案

      • 1.1.1 在[mysqld]下添加以下
        vi /etc/mysql/mysql.conf.d/mysqld.cnf        character_set_server = utf8        init_connect = ‘SET NAMES utf8‘        log-bin=mysql-bin        server-id=109
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
    • 1.2 在[mysqld]下注釋掉bind-address = 127.0.0.1



    • 1.3 配置master

      • 1.3.1 進入mysql,建立一個具有slave複製許可權的使用者wen
       GRANT REPLICATION SLAVE ON *.* to ‘wen‘@‘%‘ identified by ‘wen‘;
      • 1
      • 1
      • 1.3.2 重新整理許可權
      flush privileges; 
      • 1
      • 1
      • 1.3.3 顯示master
      show master status;
      • 1
      • 1

 

 

 

  • 2 從虛擬機器設定(192.168.11.117)

    • 2.1 修改/etc/mysql/mysql.conf.d/mysqld.cnf檔案

      • 2.1.1 在[mysqld]下添加以下
        vi /etc/mysql/mysql.conf.d/mysqld.cnf        character_set_server = utf8        init_connect = ‘SET NAMES utf8‘        log-bin=mysql-bin        server-id=117
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
    • 2.2 在[mysqld]下注釋掉bind-address = 127.0.0.1

    • 2.3 配置slave

      • 2.3.1 進入mysql,重設slave

      這裡的 master_log_file 和 master_log_pos 在主要虛擬機器的 mysql 的 master 中,就是上面的圖所示!

        stop slave;    reset slave;    change master to           master_host=‘192.168.11.109‘,master_user=‘wen‘,master_password=‘wen‘,master_log_file=‘mysql-bin.000013‘,master_log_pos=1609;
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3
      • 2.3.2 啟動slave
         start slave; 
    • 1
    • 1
      • 2.2.3 顯示slave

        其中的Slave_IO_Running 和 Slave_SQL_Running 一定要 Yes 才表示slave啟動正確!

         show slave status \G
    • 1
    • 1

 

 

    • 2.4 測試

    在master虛擬機器中建立一個資料庫,然後再slave虛擬機器中查看,如果,slave中有剛剛測試的資料庫,說明mysql主從配置成功。

    主:


從:

 

配置mycat(在master虛擬機器中配置) jdk與mycat的壓縮包都放在/opt目錄下
  • 1 安裝jdk

    mycat依賴於java1.7以上的環境,先安裝jdk1.7

    解壓jdk

    tar -zxvf jdk-7u67-linux-x64.tar.gz

    配置環境變數

    vi /etc/profile

    在末尾添加

     # set for java     export JAVA_HOME=/opt/jdk1.7.0_67     export JRE_HOME=$JAVA_HOME/jre     export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib     export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

儲存退出

  • 2 安裝 mycat

    解壓mycat

        tar -zxvf Mycat-server-1.6-RELEASE-20161012170031-linux.tar.gz

    配置環境變數

         vi /etc/profile

    在末尾添加

         export MYCAT_HOME=/opt/mycat     export PATH=$PATH:$MYCAT_HOME/bin

    儲存退出

    使環境變數生效

         source /etc/profile

     

     

  • 3.配置server.xml

    到 mycat 的 conf 目錄下,修改 server.xml 檔案添加 test 和user 使用者,test 使用者,密碼也為 test,user 使用者,密碼也為user

       <user name="test">                <property name="password">test</property>                <property name="schemas">TESTDB</property>                <!-- 表級 DML 使用權限設定 -->                <!--                <privileges check="false">                        <schema name="TESTDB" dml="0110" >                                <table name="tb01" dml="0000"></table>                                <table name="tb02" dml="1111"></table>                        </schema>                </privileges>                 -->           </user>           <user name="user">                <property name="password">user</property>                <property name="schemas">TESTDB</property>                <property name="readOnly">true</property>           </user>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

 

  • 4.配置schema.xml

    設定讀和寫伺服器的ip與連接埠,以及叢集策略。這裡的 schema 的 name 要與 server.xml 的 schema 保持一致, database 對應的是 mysql 裡面已經存在的資料庫,也就是說,mycat 的 TESTDB 代理了 主/從虛擬機器的 mysql 的 test 資料庫

  <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">  </schema>  <dataNode name="dn1" dataHost="master" database="test" />  <dataHost name="master" maxCon="1000" minCon="10" balance="1" writeType="0"     dbType="mysql" dbDriver="native">             <heartbeat>show slave status</heartbeat>             <writeHost host="host2" url="192.168.11.109:3306" user="root" password="root" />            <writeHost host="host4" url="192.168.11.117:3306" user="root" password="root" /></dataHost>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

show slave status 表示一種叢集策略,只適用在一主一從的環境中,當主 down 掉, 從可以充當主和從

balance屬性

balance=”0”, 不開啟讀寫分離機制,所有讀操作都發送到當前可用的 writeHost 上
balance=”1”,全部的 readHost 與 stand by writeHost 參與 select 語句的負載平衡
balance=”2”,所有讀操作都隨機的在 writeHost、 readhost 上分發。
balance=”3”, 所有讀請求隨機的分發到 wiriterHost 對應的 readhost 執行,writerHost 不負擔讀壓力

writeType 屬性

負載平衡類型,目前的取值有 3 種:
writeType=”0”, 所有寫操作發送到配置的第一個 writeHost,第一個掛了切到還生存的第二個writeHost, 重新啟動後已切換後的為準,切換記錄在設定檔中:dnindex.properties
writeType=”1”,所有寫操作都隨機的發送到配置的 writeHost

 

  • 5 啟動mycat
 cd /opt/mycat/bin ./mycat start
  • 1
  • 2
  • 1
  • 2

補充:mycat的常用命令

關閉

mycat stop

重啟

mycat restart

查看mycat狀態

mycat status

 

  • 6 測試

現在 mycat 可以代理 mysql 了,用 navicat 串連 mycat(8066連接埠)

 

 

往資料庫裡面添加一條資料 wen

 

 

現在到主要虛擬機器用命令列查看資料庫,看看剛在 navicat 寫進 mycat 的資料有沒有顯示出來

用 mycat 的帳號密碼登入到主要虛擬機器的 mycat,查看並添加一條資料 tom

mysql -utest -ptest -h127.0.0.1 -P8066
  • 1
  • 1

 

 

再切到從虛擬機器,用 mysql -uroot -p 登入 mysql,看看剛剛在主要虛擬機器的 mycat 添加的資料 tom 在從虛擬機器能不能看到


 

如果想看看讀寫分離的細節,可以到 logs 目錄下查看日誌

/opt/mycat/logs/tail -f mycat.log
  • 1
  • 2
  • 1
  • 2


———————————————————分割線—————————————————————-

mysql的問題其實是由於一系列的軟肋決定的,所以不得不利用中介軟體或者其它方案去解決,包括:

  1. 在強制限制式和事務與全文索引之間做出選擇(InnoDb vs MyISAM)

  2. 在客戶機代碼中“類比”事務是不容易的

  3. 如果不執行約束,就很容易得到不一致的db狀態

  4. 如果沒有全文檢索搜尋,會變得瘋狂,比如% y %

  5. 必須在更新觸發器之前建立檢查約束的錯誤

  6. 當資料變得太大時,Mysql的承受能力就不妙了

  7. Mysql建立的執行計畫效率低下

  8. Mysql有超過多個串連的問題(最好說多個串連)


但是! Oracle是所有這些問題的解決方案,它是一個完整的DBMS:事務、檢查合約、視圖的很多選項、全文檢索搜尋…

 

所以問題的本質是:成本!,mysql 很討厭,卻又不得不用! 
0
0

mycat實現簡單的mysql叢集負載平衡

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.