上篇文章詳細介紹了MySQL中間件MyCat的搭建及讀寫分離操做。在實際場景中,面對大容量的數據,在數據庫層面中一般的解決方案有兩種,第一種是讀寫分離,第二種就是數據庫的分庫和分表了,本篇文章將基於MyCat中間件,詳細介紹一下經過MyCat綜合實現分庫、分表及讀寫分離操做!
上兩篇文章中已經介紹了Mycat的基本使用,但MyCat的核心工做原理有必要此處再強調一下,利於理解後面其餘內容,以下:node
一、數據庫軟件mysql
MySQL5.6.39
二、MyCat中間件sql
Mycat-server-1.6
三、服務器環境數據庫
CenterOS6.9虛擬機五臺
四、服務器劃分vim
一、安裝MySQL數據庫,並配置主從複製,安裝及配置主從同步請參考以前的文章,有詳細講解,此處再也不贅述緩存
二、配置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>
部份內容解釋:
四、修改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的官網上有更詳細的概念描述。若有不明白,可下方評論。歡迎轉發!
後續文章將更新在我的小站上,歡迎查看。