mycat實現MySQL讀寫分離
mycat實現MySQL讀寫分離
mycat是什麽
Mycat是一個開源的分布式數據庫系統,但是由於真正的數據庫需要存儲引擎,而Mycat並沒有存儲引擎,所以並不是完全意義的分布式數據庫系統。Mycat是數據庫中間件,就是介於數據庫與應用之間,進行數據處理與交互的中間服務。對數據進行分片處理之後,從原有的一個庫,被切分為多個分片數據庫,所有的分片數據庫集群構成了整個完整的數據庫存儲。
Mycat的幾個典型的應用場景:
單純的讀寫分離,此時配置最為簡單,支持讀寫分離,主從切換;
分表分庫,對於超過1000萬的表進行分片,最大支持1000億的單表分片;
多租戶應用,每個應用一個庫,但應用程序只連接Mycat,從而不改造程序本身,實現多租戶化;
表系統,借助於Mycat的分表能力,處理大規模報表的統計;
代替Hbase,分析大數據;
作為海量數據實時查詢的一種簡單有效方案,比如 1〇〇億條頻繁查詢的記錄需要在3秒內查詢出來結果,除了基於主鍵的查詢,還可能存在範圍查詢或其他屬性查詢,此時Mycat可能是最簡單有效的選擇;
單純的MyCAT讀寫分離,配置最為簡單,支持讀寫分離,主從切換分表分庫,對於超過1000萬的表進行分片,最大支持1000億的單表分片;
多租戶應用,每個應用一個庫,但應用程序只連接Mycat,從而不改造程序本身,實現多租戶化;
報表系統,借助於Mycat的分表能力,處理大規模報表的統計替代Hbase,分析大數據,作為海量數據實時查詢的一種簡單有效方案,比如100億條頻繁查詢的記錄需要在3秒內查詢出來結果,除了基於主鍵的查詢,還可能存在範圍查詢或其他屬性查詢,此時Mycat可能是最簡單有效的選擇。
實現讀寫分離
1)實驗環境 centos 6.5
192.168.1.11 http服務(discuz論壇)
192.168.1.103 mycat服務
192.168.1.21 master_mysql
192.168.1.23 slave_mysql
2)配置mysql主從
1. 在master-mysql服務器的配置文件[mysqld]下加如下兩句
# vim /etc/my.cnf[mysqld]server-id= 1log-bin=mysql-bin
重啟服務器 # /etc/init.d/mysqld start 登陸master-mysql服務器,進行用戶授權並查看狀態:
mysql> GRANT REPLICATION SLAVE ON *.* TO [email protected]
2. 配置slave-mysql, 在配置文件中[mysqld]下添加下面語句,並重啟服務器
# vim /etc/my.cnf [mysqld]server-id=2 # /etc/init.d/mysqld restart
接下來登陸slave-mysql服務器:進行主服務master-mysql認證。命令為:
CHANGE MASTER TO master_host=‘192.168.1.21‘,master_user=‘dianel‘,master_password=‘dianel‘,master_log_file=‘mysql-bin.000012‘,master_log_pos=6045464;
其中master_host,master_user....等都要和master-mysql一一對應.然後slave start
開啟從服務器。並SHOW SLAVE STATUS\G;
查看主從狀態。如果Slave_IO_Running: Yes Slave_SQL_Running: Yes
這兩個線程都為yes即表示mysql主從成功。
mysql> mysql> CHANGE MASTER TO master_host=‘192.168.1.21‘,master_user=‘dianel‘,master_password=‘dianel‘,master_log_file=‘mysql-bin.000012‘,master_log_pos=6045464; Query OK, 0 rows affected (0.04 sec) mysql> SLAVE START; Query OK, 0 rows affected (0.00 sec) mysql> SHOW SLAVE STATUS\G;*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.21 Master_User: dianel Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000012 Read_Master_Log_Pos: 6045464 Relay_Log_File: localhost-relay-bin.000002 Relay_Log_Pos: 253 Relay_Master_Log_File: mysql-bin.000012 Slave_IO_Running: Slave_SQL_Running:
接下來在master-mysql上授權root用戶密碼:GRANT ALL ON *.* TO [email protected]%‘ IDENTIFIED BY ‘123456‘;
3) 安裝mycat
安裝mycat之前。需要先準備好jdk環境。下載jdk-8u144-linux-x64.tar.gz
包,點擊jdk下載。 解壓:
# tar -zxf jdk-8u144-linux-x64.tar.gz # mkdir -p /usr/java/ # mv jdk1.8.0_144/ /usr/java/
配置java環境變量。/etc/profile中添加如下語句:
export JAVA_HOME=/usr/java/jdk1.8.0_144/ export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOMR/bin
使環境變量立即生效並驗證是否安裝成功:
# source /etc/profile # java -version
接下來下載和安裝mycat:
# wget # tar xzf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz # mv mycat/ /usr/local/ # ls /usr/local/mycat/bin catlet conf lib logs version.txt
修改Mycat服務器參數調整和用戶授權的配置文件server.xml。主要修改配置段如下:
# vim /usr/local/mycat/conf/server.xml
<user name="jiajie1"> <property name="password">jiajie1</property> <property name="schemas">TESTDB</property> </user> <user name="jiajie2"> <property name="password">jiajie2</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> </user> # 創建jiajie1,jiajie2兩個用戶用於連接mycat中間件。 # 用戶名jiajie1密碼jiajie1.對邏輯數據庫TESTDB具有增刪改查的權限,也即WEB連接MyCAT的用戶名和密碼。 # 用戶名jiajie2密碼jiajie2該用戶對邏輯數據庫TESTDB只讀的權限;
修改邏輯庫定義和表及分片定義的配置文件schema.xml。
# vim /usr/local/mycat/conf/schema.xml <?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="1000" dataNode="dn1"> </schema> <dataNode name="dn1" dataHost="localhost1" database="discuz" /> <dataHost name="localhost1" maxCon="2000" minCon="1" balance="3" writeType="1" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="192.168.1.21:3306" user="root" password="123456"> <!-- can have multi read hosts --> <readHost host="hostS1" url="192.168.1.23:3306" user="root" password="123456" /> </writeHost> </dataHost> </mycat:schema>
schema.xml配置文件詳解:
<?xml version="1.0"?> xml文件格式; <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> 文件標簽屬性; <mycat:schema xmlns:mycat="http://io.mycat/"> Mycat起始標簽 <schema name="testdb" checkSQLschema="false" sqlMaxLimit="1000" dataNode="dn1"></schema> 配置邏輯庫,與server.xml指定庫名保持一致,綁定數據節點dn1; <dataNode name="dn1" dataHost="localhost1" database="discuz" /> 添加數據節點dn1,設置數據節點host名稱,同時設置數據節點真實database為discuz; <dataHost name="localhost1" maxCon="2000" minCon="1" balance="3" writeType="1" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> 數據節點主機,綁定數據節點,設置連接數及均衡方式、切換方法、驅動程序、連接方法; Balance均衡策略設置: 1) balance=0 不開啟讀寫分離機制,所有讀操作都發送到當前可用writehost; 2) balance=1 全部的readHost與stand by writeHost參與select語句的負載均衡,簡單的說,當雙主雙從模式(M1->S1,M2->S2,並且M1與 M2互為主備),正常情況下,M2,S1,S2都參與select語句的負載均衡 3) balance=2 所有讀操作都隨機的在readhost和writehost上分發; 4) balance=3 所有讀請求隨機的分發到wiriterHost對應的readhost執行,writerHost不負擔讀壓力。 writeType 寫入策略設置 1) writeType=0, 所有寫操作發送到配置的第一個writeHost; 2) writeType=1,所有寫操作都隨機的發送到配置的writeHost; 3) writeType=2,不執行寫操作。 switchType 策略設置 1) switchType=-1,表示不自動切換; 2) switchType=1,默認值,自動切換; 3) switchType=2,基於MySQL 主從同步的狀態決定是否切換; 4) switchType=3,基於MySQL galary cluster的切換機制(適合集群)(1.4.1),心跳語句為 show status like ‘wsrep%‘。 <heartbeat>select user()</heartbeat>檢測後端MYSQL實例,SQL語句; <writeHost host="hostM1" url="192.168.1.21:3306" user="root" password="123456"><readHost host="hostS1" url="192.168.1.23:3306" user="root" password="123456" /></writeHost> 指定讀寫請求,同時轉發至後端MYSQL真實服務器,配置連接後端MYSQL用戶名和密碼(該用戶名和密碼為MYSQL數據庫用戶名和密碼); </dataHost> 數據主機標簽;</mycat:schema> mycat結束標簽;
mycat配置完畢。啟動並查看端口8066和9066端口是否起來:
# /usr/local/mycat/bin/mycat start # ss -tnl|egrep "8066|9066"LISTEN 0 100 :::8066 :::* LISTEN 0 100 :::9066 :::* # 註意:如果沒有這兩個端口沒有啟動,查看java環境是否生效。 # 8066是用於web連接mycat. # 9066是用於SA|DBA管理端口.
接下來以8066登陸查看數據庫:
# mysql -h192.168.1.103 -ujiajie1 -pjiajie1 -P8066 mysql> show databases; +----------+| DATABASE | +----------+| TESTDB | +----------+1 row in set (0.01 sec)
以9066登陸查看數據源:
# mysql -h192.168.1.103 -ujiajie1 -pjiajie1 -P9066 mysql> show @@datasource; +----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+ | DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD | +----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+ | dn1 | hostM1 | mysql | 192.168.1.21 | 3306 | W | 0 | 0 | 2000 | 0 | 0 | 0 | | dn1 | hostS1 | mysql | 192.168.1.23 | 3306 | R | 0 | 0 | 2000 | 0 | 0 | 0 | +----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+ 2 rows in set (0.00 sec)
4)配置http服務:
修改httpd中discuz的配置文件。將dbhost,dbuser,dbpw,dbname中的參數改為和mycat一一對應。實現讀寫分離。重啟服務.
# vim /var/www/html/config/config_global.php $_config = array(); // ---------------------------- CONFIG DB ----------------------------- // $_config[‘db‘][‘1‘][‘dbhost‘] = ‘‘; $_config[‘db‘][‘1‘][‘dbuser‘] = ‘; $_config[‘db‘][‘1‘][‘dbpw‘] = ‘‘; $_config[‘db‘][‘1‘][‘dbcharset‘] = ‘utf8‘; $_config[‘db‘][‘1‘][‘pconnect‘] = ‘0‘; $_config[‘db‘][‘1‘][‘dbname‘] = ‘‘; $_config[‘db‘][‘1‘][‘tablepre‘] = ‘pre_‘; $_config[‘db‘][‘slave‘] = ‘‘; $_config[‘db‘][‘common‘][‘slave_except_table‘] = ‘‘; #註意:數據庫名字為mycat的邏輯數據庫 # /etc/init.d/httpd restart
這時你在論壇進行瀏覽和發帖操作。再通過9066登陸查看,讀和寫的次數如下。證明讀寫分離成功。
# mysql -h192.168.1.103 -ujiajie1 -pjiajie1 -P9066 mysql> show @@datasource; +----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+ | DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD | +----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+ | dn1 | hostM1 | mysql | 192.168.1.21 | 3306 | W | 0 | 1 | 2000 | 51 | 0 | | | dn1 | hostS1 | mysql | 192.168.1.23 | 3306 | R | 0 | 1 | 2000 | 79 | | 0 | +----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+ 2 rows in set (0.02 sec) mysql> show @@datasource; +----------+--------+-------+--------------+------+ ------+--------+------+------+---------+-----------+------------+ | DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD | +----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+ | dn1 | hostM1 | mysql | 192.168.1.21 | 3306 | W | 0 | 2 | 2000 | 151 | 0 | | | dn1 | hostS1 | mysql | 192.168.1.23 | 3306 | R | 0 | 2 | 2000 | 255 | | 0 | +----------+--------+-------+--------------+-----+------+--------+------+------+---------+----------- +------------+ 2 rows in set (0.01 sec)
本文出自 “dianel簡單不簡單” 博客,請務必保留此出處http://dianel.blog.51cto.com/12170393/1957556
mycat實現MySQL讀寫分離