您好,登錄后才能下訂單哦!
最近主要投入在平安云MySQL DRDS的項(xiàng)目中,本人主要負(fù)責(zé)zookeeper模塊的配置及后臺(tái)腳本的編寫。為了加深對(duì)DRDS整體架構(gòu)的認(rèn)識(shí),我覺(jué)得有必要手工搭建基于Mycat實(shí)現(xiàn)的Mysql分布式數(shù)據(jù)庫(kù)集群,現(xiàn)和大家分享下搭建流程,后續(xù)會(huì)針對(duì)Mycat的各項(xiàng)配置作進(jìn)一步研究,敬請(qǐng)期待。
Mycat及MySQL實(shí)例部署情況:
Mycat:
IP:10.20.8.57,Port:3310/3311
MySQL :
db1-M1,IP:10.20.8.126,Port:3306
db1-M2,IP:10.20.8.126,Port:3307
db2-M1,IP:10.25.80.7,Port:3307
架構(gòu)圖如下:
配置Mycat
server.xml:
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="useSqlStat">1</property>
<property name="useGlobleTableCheck">0</property>
<property name="defaultSqlParser">druidparser</property>
<property name="sequnceHandlerType">2</property>
<property name="processorBufferPoolType">0</property>
<property name="serverPort">3310</property> <!-- mycat的使用端口 -->
<property name="managerPort">3311</property> <!-- mycat的管理端口 -->
<property name="handleDistributedTransactions">0</property>
<property name="useOffHeapForMerge">1</property>
<property name="memoryPageSize">1m</property>
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<property name="systemReserveMemorySize">389m</property>
</system>
<user name="root">
<property name="password">123456</property>
<property name="schemas">db</property>
<property name="readOnly">false</property>
</user>
</mycat:server>
schema.xml:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 數(shù)據(jù)庫(kù)配置,與server.xml中的數(shù)據(jù)庫(kù)對(duì)應(yīng) -->
<schema name="db" checkSQLschema="false" sqlMaxLimit="100">
<table name="t1" dataNode="dn1,dn2" rule="mod-long" /> <!-- 對(duì)2取模,詳見(jiàn)rule.xml -->
</schema>
<!-- 分片配置 -->
<dataNode name="dn1" dataHost="shard1" database="db1" />
<dataNode name="dn2" dataHost="shard2" database="db2" />
<!-- 物理數(shù)據(jù)庫(kù)配置 -->
<dataHost name="shard1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user();</heartbeat>
<writeHost host="db1-M1" url="10.20.8.126:3306" user="root" password="123456">
<readHost host="db1-M2" url="10.20.8.126:3307" user="root" password="123456" />
</writeHost>
<!-- 配置standby writeHost -->
<writeHost host="db1-M2" url="10.20.8.126:3307" user="root" password="123456">
</writeHost>
</dataHost>
<dataHost name="shard2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user();</heartbeat>
<writeHost host="db2-M1" url="10.25.80.7:3307" user="root" password="123456">
</writeHost>
</dataHost>
</mycat:schema>
修改rule.xml中下列配置項(xiàng):
<tableRule name="mod-long">
<rule>
<columns>id</columns> <!-- t1的分片列 -->
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property> <!-- count值與分片個(gè)數(shù)相同 -->
</function>
配置文件中各標(biāo)簽的含義可參考文章:MyCat關(guān)鍵配置說(shuō)明
啟動(dòng)Mycat:
[root@SZB-L0059021 bin]# ./mycat start
Starting Mycat-server...
[root@SZB-L0059021 bin]# ./mycat status
Mycat-server is running (27020).
[root@SZB-L0059021 bin]# mysql -uroot -p123456 -Ddb -h227.0.0.1 -P3310
分庫(kù)分表驗(yàn)證:
mysql> show tables;
+--------------+
| Tables in db |
+--------------+
| t1 |
+--------------+
1 row in set (0.00 sec)
mysql> desc t1;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| db_name | varchar(20) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
mysql> insert into t1(id,db_name) values(1,database());
Query OK, 1 row affected (0.01 sec)
mysql> insert into t1(id,db_name) values(2,database());
Query OK, 1 row affected (0.03 sec)
mysql> select * from t1;
+------+---------+
| id | db_name |
+------+---------+
| 2 | db1 | --id=2,對(duì)2取模為0,所以插入dn1
| 1 | db2 | --id=1,對(duì)2取模為1,所以插入dn2
+------+---------+
2 rows in set (0.01 sec)
上述查詢結(jié)果可知,兩次插入的數(shù)據(jù)分落入了db1、db2上,實(shí)現(xiàn)了分庫(kù)
讀寫分離驗(yàn)證:
mysql> select * from t1;
+------+---------+
| id | db_name |
+------+---------+
| 2 | db1 | --來(lái)自shard1上的db1-M2
| 1 | db2 | --來(lái)自shard2上的db2-M1
+------+---------+
2 rows in set (0.01 sec)
查看日志可知,上述查詢結(jié)果來(lái)自dn1中db1-M2(端口3307)和dn2中的db2-M1:
2018-05-08 15:03:39.385 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.server.NonBlockingSession.execute(NonBlockingSession.java:110)) - ServerConnection [id=1, schema=db, host=127.0.0.1, user=root,txIsolation=3, autocommit=true, schema=db]select * from t1, route={
1 -> dn1{SELECT *
FROM t1
LIMIT 100}
2 -> dn2{SELECT *
FROM t1
LIMIT 100}
}
...
2018-05-08 15:03:39.391 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.backend.mysql.nio.handler.MultiNodeQueryHandler.rowEofResponse(MultiNodeQueryHandler.java:311)) - on row end reseponse MySQLConnection [id=29, lastTime=1525763019368, user=root, schema=db1, old shema=db1, borrowed=true, fromSlaveDB=true, threadId=511, charset=utf8, txIsolation=3, autocommit=true, attachment=dn1{SELECT *
FROM t1
LIMIT 100}, respHandler=io.mycat.backend.mysql.nio.handler.MultiNodeQueryHandler@66328ec4, host=10.20.8.126, port=3307, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]
...
2018-05-08 15:03:39.392 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.backend.mysql.nio.handler.MultiNodeQueryHandler.rowEofResponse(MultiNodeQueryHandler.java:311)) - on row end reseponse MySQLConnection [id=3, lastTime=1525763019387, user=root, schema=db2, old shema=db2, borrowed=true, fromSlaveDB=false, threadId=28, charset=utf8, txIsolation=3, autocommit=true, attachment=dn2{SELECT *
FROM t1
LIMIT 100}, respHandler=io.mycat.backend.mysql.nio.handler.MultiNodeQueryHandler@66328ec4, host=10.25.80.7, port=3307, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]
...
主從切換:
通過(guò)查看mycat/conf目錄下的dnindex.properties文件,可以知道m(xù)ycat正在使用的writeHost,0表示schema.xml中dataHost標(biāo)簽下的第一個(gè)writeHost。
[root@SZB-L0059021 conf]# cat dnindex.properties
#update
#Tue May 08 12:59:24 CST 2018
shard2=0
shard1=0 --此時(shí)狀態(tài)正常,mycat選取每個(gè)dataHost標(biāo)簽中的第一個(gè)writeHost作為寫入入口
切換至10.20.8.126主機(jī),并手動(dòng)停掉db1-M1
10.20.8.126:3306:Master > mysqladmin -uroot -p123456 shutdown
回到10.20.8.57(mycat主機(jī)),再次查看dnindex.properties
[root@SZB-L0059021 conf]# cat dnindex.properties
#update
#Tue May 08 15:12:12 CST 2018
shard2=0
shard1=1 --db1-M1被shutdown后,mycat在shard1上的writeHost切換至db1-M2
切換至10.20.8.57(mycat所在主機(jī)),執(zhí)行下述insert命令
mysql> insert into t1(id,db_name) values(4,database());
Query OK, 1 row affected (0.01 sec)
查看日志可知,Mycat此時(shí)選擇通過(guò)db1-M2(端口3307)寫入數(shù)據(jù):
2018-05-08 15:13:44.987 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.server.NonBlockingSession.releaseConnection(NonBlockingSession.java:341)) - release connection MySQLConnection [id=24, lastTime=1525763624968, user=root, schema=db1, old shema=db1, borrowed=true, fromSlaveDB=false, threadId=506, charset=utf8, txIsolation=3, autocommit=true, attachment=dn1{insert into t1(id,db_name) values(4,database())}, respHandler=SingleNodeHandler [node=dn1{insert into t1(id,db_name) values(4,database())}, packetId=1], host=10.20.8.126, port=3307, statusSync=null, writeQueue=0, modifiedSQLExecuted=true]
由于dataHost中配置了writeType="0",所以即使db1-M1重啟恢復(fù)后,Mycat仍然會(huì)選擇db1-M2作為shard1的
writeHost。
驗(yàn)證:
切換至10.20.8.126主機(jī),并手動(dòng)啟動(dòng)db1-M1
10.20.8.126:3306:Master > mysqld_safe &
在Mycat中插入驗(yàn)證數(shù)據(jù)
mysql> insert into t1(id,db_name) values(6,database());
Query OK, 1 row affected (0.02 sec)
查看日志可知,數(shù)據(jù)仍通過(guò)db1-M2(端口3307)寫入:
2018-05-08 15:16:09.579 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.server.NonBlockingSession.releaseConnection(NonBlockingSession.java:341)) - release connection MySQLConnection [id=32, lastTime=1525763769548, user=root, schema=db1, old shema=db1, borrowed=true, fromSlaveDB=false, threadId=514, charset=utf8, txIsolation=3, autocommit=true, attachment=dn1{insert into t1(id,db_name) values(6,database())}, respHandler=SingleNodeHandler [node=dn1{insert into t1(id,db_name) values(6,database())}, packetId=1], host=10.20.8.126, port=3307, statusSync=null, writeQueue=0, modifiedSQLExecuted=true]
此時(shí)要想讓Mycat在shard1上的writeHost重新變?yōu)閐b1-M1,只需修改dnindex.properties中的shard1=1為shard1=0,并重啟Mycat即可。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。