1. 程式人生 > >mycat實現MySQL讀寫分離

mycat實現MySQL讀寫分離

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]
/* */%‘ IDENTIFIED BY ‘dianel‘; Query OK, 0 rows affected (0.15 sec)mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000012 | 6045464 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)

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讀寫分離