MySQL數據庫運維之讀寫分離03

上篇文章詳細介紹了MySQL中間件MyCat的搭建及讀寫分離操做。在實際場景中,面對大容量的數據,在數據庫層面中一般的解決方案有兩種,第一種是讀寫分離,第二種就是數據庫的分庫和分表了,本篇文章將基於MyCat中間件,詳細介紹一下經過MyCat綜合實現分庫、分表及讀寫分離操做!

1、基礎回顧

上兩篇文章中已經介紹了Mycat的基本使用,但MyCat的核心工做原理有必要此處再強調一下,利於理解後面其餘內容,以下:node

  1. 客戶端鏈接MyCat代理,併發送MySQL的操做語句
  2. MyCat攔截用戶發送的SQL語句
  3. 攔截到SQL語句以後,會經過內部的一系列解析器完成解析,並作一些特定的分析,好比:分片分析、路由分析、讀寫分離分析、緩存分析等
  4. 分析完成以後,根據分析出的結果,好比SQL操做須要路由到哪一個數據庫實例,哪一個數據庫,哪一個表。而後將SQL語句發送到須要路由到的庫或者表
  5. 數據庫實例執行完SQL操做以後,將結果返回到MyCat代理,MyCat代理對結果作一些適當的處理,而後再將結果返回給發送SQL語句的客戶端。至此,一次數據庫操做完成!

2、環境準備

一、數據庫軟件mysql

MySQL5.6.39

二、MyCat中間件sql

Mycat-server-1.6

三、服務器環境數據庫

CenterOS6.9虛擬機五臺

四、服務器劃分vim

  • 192.168.0.4(第一臺主庫mysql-server01)
  • 192.168.0.5(第一臺從庫mysql-server02)
  • 192.168.0.6(MyCat代理服務器mysql-proxy)
  • 192.168.0.7(第二臺主庫mysql-server03)
  • 192.168.0.8(第二臺從庫mysql-server04)

3、分庫分表及讀寫分離配置

一、安裝MySQL數據庫,並配置主從複製,安裝及配置主從同步請參考以前的文章,有詳細講解,此處再也不贅述緩存

  • mysql-server02同步mysql-server01
  • mysql-server04同步mysql-server03

二、配置mysql-proxy,進入到MyCat的安裝目錄,而後修改server.xml服務器

#備份原文件
[root@mysql-proxy ~]# cd /usr/local/mycat/conf/
[root@mysql-proxy conf]# cp server.xml server.xml.bak

添加以下兩個用戶,一個爲只讀用戶,一個爲讀寫用戶:併發

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
        <user name="root">
                <property name="password">123456</property>
                <property name="schemas">test_db</property>
                <!--
                <privileges check="false">
                        <schema name="test_db" dml="0110">
                                <table name="student" dml="0000"></table>
                                <table name="t_user" dml="1111"></table>
                        </schema>
                </privileges>
                -->
        </user>
        <user name="user">
                <property name="password">user</property>
                <property name="schemas">test_db</property>
                <property name="readOnly">false</property>
        </user>
</mycat:server>

三、配置schema.xml配置文件app

#備份原文件
[root@mysql-proxy conf]# cp schema.xml schema.xml.bak
[root@mysql-proxy conf]# vim schema.xml

寫入以下內容:url

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="test_db" checkSQLschema="false" sqlMaxLimit="100">
                <table name="t_user" primaryKey="id" dataNode="wb_node01,wb_node02" rule="sharding-by-mod" />
        </schema>
        <dataNode name="wb_node01" dataHost="wb_host01" database="test_db" />
        <dataNode name="wb_node02" dataHost="wb_host02" database="test_db" />
        <dataHost name="wb_host01" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">
                <heartbeat>show slave status</heartbeat>
                <writeHost host="mysql-server01" url="192.168.0.4:3306" user="root" password="root">
                        <readHost host="mysql-server02" url="192.168.0.5:3306" user="root" password="root" />
                </writeHost>
                <writeHost host="mysql-server02" url="192.168.0.5:3306" user="root" password="root" />
        </dataHost>
        <dataHost name="wb_host02" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
                <heartbeat>show slave status</heartbeat>
                <writeHost host="mysql-server03" url="192.168.0.7:3306" user="root" password="root">
                        <readHost host="mysql-server04" url="192.168.0.8:3306" user="root" password="root" />
                </writeHost>
                <writeHost host="mysql-server04" url="192.168.0.8:3306" user="root" password="root" />
        </dataHost>
</mycat:schema>

部份內容解釋:

  • dataNode節點表示實際的物理節點,此處使用了兩組主從,dataNode中的節點分表表示兩臺從服務器
  • schema節點中的table表示須要拆分的表,rule表示分表策略的名稱,與rule.xml中的tableRule節點中的name屬性對應

四、修改rule.xml,配置分表策略

[root@mysql-proxy conf]# cp rule.xml rule.xml.bak
[root@mysql-proxy conf]# vim rule.xml

配置分表策略,以下是按照主鍵ID取模進行分表:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
        <tableRule name="sharding-by-mod">
                <rule>
                        <columns>id</columns>
                        <algorithm>mod-long</algorithm>
                </rule>
        </tableRule>
        <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
                <!-- 表示數據節點的數量 -->
                <property name="count">2</property>
        </function>
</mycat:rule>

五、啓動mycat服務,並插入兩條數據

[root@mysql-proxy conf]# cd /usr/local/mycat/bin/
[root@mysql-proxy bin]# ./mycat start

使用user用戶鏈接mycat,而後插入兩條數據,以下:

#鏈接mycat服務
[root@mysql-proxy bin]# mysql -uuser -puser -P8066 -h127.0.0.1

#查看數據庫
mysql> show databases;
+----------+
| DATABASE |
+----------+
| test_db  |
+----------+

#在t_user表中插入兩條記錄
mysql> use test_db;
mysql> insert into t_user(id,name,age,address) values(1,"wangbin",24,"Shan'Xi");
mysql> insert into t_user(id,name,age,address) values(2,"binwang",21,"Bei'Jing");

注意:上述插入數據時須要本身提供id,可使用序列的方式或者ID生成器本身生成,此處暫時不介紹,若是不提供ID,會插入失敗。
六、分別登錄mysql-server01和mysql-server03查看插入的數據
登錄mysql-server01,查看以下:

[root@mysql-server01 ~]# mysql -uroot -proot -P3306 -h127.0.0.1 test_db
#查數據
root@127.0.0.1 test_db> select * from t_user;
+----+----------+------+---------+
| id | name     | age  | address |
+----+----------+------+---------+
|  2 | binwang |   21 | BeiJing |
+----+----------+------+---------+
1 row in set (0.00 sec)

登錄mysql-server03,查看以下:

[root@mysql-server03 ~]# mysql -uroot -proot -h127.0.0.1 -P3306 test_db
#查數據
root@127.0.0.1 test_db> select * from t_user;
+----+----------+------+---------+
| id | name     | age  | address |
+----+----------+------+---------+
|  1 | wangbin |   24 | Shan'Xi |
+----+----------+------+---------+
1 row in set (0.00 sec)

從上述結果看到,id=1的數據和id=2的數據分別被分到mysql-server01組合mysql-server03組中。至此,基於MyCat的分庫分表已經配置完成,讀寫分離能夠經過監控MyCat的實時日誌驗證,日誌位置爲:/usr/local/mycat/logs/wrapper.log,能夠自行查看,以前文章介紹過,此處再也不贅述。
七、查看節點當前狀態

[root@mysql-proxy bin]# mysql -uuser -puser -P9066 -h127.0.0.1
mysql> show @@datanode;
+-----------+-------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| NAME      | DATHOST           | INDEX | TYPE  | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME |
+-----------+-------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| wb_node01 | wb_host01/test_db |     0 | mysql |      0 |   10 | 1000 |     140 |          0 |        0 |       0 |            -1 |
| wb_node02 | wb_host02/test_db |     0 | mysql |      0 |   10 | 1000 |     139 |          0 |        0 |       0 |            -1 |
+-----------+-------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+

能夠看到,節點目前都處於存活狀態。

以上內容介紹了使用ID取模的方式藉助MyCat中間件實現數據庫的分庫分表及讀寫分離過程。文章中概念內容介紹的比較少,由於在MyCat的官網上有更詳細的概念描述。若有不明白,可下方評論。歡迎轉發!

後續文章將更新在我的小站上,歡迎查看。

相關文章
相關標籤/搜索