1. 程式人生 > >mycat實現簡單的mysql集群負載均衡

mycat實現簡單的mysql集群負載均衡

退出 start ase datanode 文件 1.2 test 開始 select

什麽是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
(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 在[mysqld]下註釋掉bind-address = 127.0.0.1

這裏寫圖片描述

1.3 配置master

1.3.1 進入mysql,創建一個具有slave復制權限的用戶wen
GRANT REPLICATION SLAVE ON *.* to [email protected]%‘ identified by ‘wen‘;
1.3.2 刷新權限
flush privileges;
1.3.3 顯示master
show master status;
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
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.2 啟動slave
start slave;

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

保存退出

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"> www.wmyl88.com user</property>
<property name="schemas"> www.wmyl15.com TESTDB</property>
<property name="readOnly">true</property>
</user>

4.配置schema.xml

設置讀和寫服務器的ip與端口,以及集群策略。這裏的 schema 的 name 要與 server.xml 的 schema 保持一致, database 對應的是 mysql 裏面已經存在的數據庫,也就是說,mycat 的 TESTDB 代理了 主/從虛擬機的 mysql 的 test 數據庫

<schema name=" www.hbwfjx.cn/ TESTDB" www.feifanshifan8.cn checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>

<dataNode name="dn1" dataHost="master" database="test" />

<dataHost name="master" maxCon="1000" www.caihonyule.com minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>show slave status</heartbeat>
<writeHost host="host2"www.wmyl11.com url="192. www.yigozongdai2.cn 168.11.109:3306" user="root" password="root" />
<writeHost host="host4" url="192.168.11.117:3306" user="root" password="root" />
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 www.lieqibiji.com/ /opt/mycat/bin
./mycat start

補充: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/ www.yongshiyule178.com mycat/logs/
tail -f mycat.log
———————————————————分割線—————————————————————-

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

在強制約束和事務與全文索引之間做出選擇(InnoDb vs MyISAM)

在客戶機代碼中“模擬”事務是不容易的

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

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

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

當數據變得太大時,Mysql的承受能力就不妙了

Mysql創建的執行計劃效率低下

Mysql有超過多個連接的問題(最好說多個連接)


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

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

mycat實現簡單的mysql集群負載均衡