1. 程式人生 > >mycat學習-2 數據庫的讀寫分離

mycat學習-2 數據庫的讀寫分離

ati info writing lang datadir bsp sts 加班 最終

1.讀寫分離

  讀和寫的操作分開對應到不同的數據庫服務器,可以有效的緩解數據庫亞麗,減輕IO壓力

  主提供寫,從提供讀,當主進行寫操作的時候數據同步到從數據庫,這樣才能有效保證主從數據庫數據的完整性。

2.環境搭建

此處不講解linux環境,本次在windows環境利用zip的方式配置的主從數據庫

mysql官網下載zip文件並解壓

安裝mysql3和mysql4、mysql5: 解壓mysql壓縮包並修改my-default.ini為my.ini 並在[mysqld]下設置datadir和basedir以及port

[mysqld]
basedir=D:/software/mysql/mysql4
datadir=D:/software/mysql/mysql4/data
port=3309

安裝mysql : D:\software\mysql\mysql4\bin>mysqld install MySQL4 --defaults-file="D:\software\mysql\mysql4\my.ini"

D:\software\mysql\mysql4\bin>net start mysql4

D:\software\mysql\mysql4\bin>mysql -uroot -p -P3309

mysql3同上述安裝步驟一致

3.mycat實現讀寫分離配置

1>server.xml文件配置

------------------------------------------------------------------------------------------------------------

啟動成功的server.xml文件的內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License. - You
may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
- - Unless required by applicable law or agreed to in writing, software -


distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
License for the specific language governing permissions and - limitations
under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="useSqlStat">0</property> <!-- 1為開啟實時統計、0為關閉 -->
<property name="useGlobleTableCheck">0</property> <!-- 1為開啟全加班一致性檢測、0為關閉 -->

<property name="sequnceHandlerType">2</property>
<!-- <property name="useCompression">1</property>--> <!--1為開啟mysql壓縮協議-->
<!-- <property name="fakeMySQLVersion">5.6.20</property>--> <!--設置模擬的MySQL版本號-->
<!-- <property name="processorBufferChunk">40960</property> -->
<!--
<property name="processors">1</property>
<property name="processorExecutor">32</property>
-->
<!--默認為type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
<property name="processorBufferPoolType">0</property>
<!--默認是65535 64K 用於sql解析時最大文本長度 -->
<!--<property name="maxStringLiteralLength">65535</property>-->
<!--<property name="sequnceHandlerType">0</property>-->
<!--<property name="backSocketNoDelay">1</property>-->
<!--<property name="frontSocketNoDelay">1</property>-->
<!--<property name="processorExecutor">16</property>-->
<!--
<property name="serverPort">8066</property> <property name="managerPort">9066</property>
<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
<!--分布式事務開關,0為不過濾分布式事務,1為過濾分布式事務(如果分布式事務內只涉及全局表,則不過濾),2為不過濾分布式事務,但是記錄分布式事務日誌-->
<property name="handleDistributedTransactions">0</property>

<!--
off heap for merge/order/group/limit 1開啟 0關閉
-->
<property name="useOffHeapForMerge">1</property>

<!--
單位為m
-->
<property name="memoryPageSize">1m</property>

<!--
單位為k
-->
<property name="spillsFileBufferSize">1k</property>

<property name="useStreamOutput">0</property>

<!--
單位為m
-->
<property name="systemReserveMemorySize">384m</property>


<!--是否采用zookeeper協調切換 -->
<property name="useZKSwitch">true</property>


</system>

<!-- 全局SQL防火墻設置 -->
<!--
<firewall>
<whitehost>
<host host="127.0.0.1" user="mycat"/>
<host host="127.0.0.2" user="mycat"/>
</whitehost>
<blacklist check="false">
</blacklist>
</firewall>
-->

<user name="mycat2">
<property name="password">123456</property>
<property name="schemas">mycatdb2</property>

<!-- 表級 DML 權限設置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>

<user name="user">
<property name="password">user</property>
<property name="schemas">mycatdb2</property>
<property name="readOnly">true</property>
</user>

</mycat:server>

------------------------------------------------------------------------------------------------------------

<!-- 全局SQL防火墻設置whitehost是白名單配置,blacklist是黑名單配置 -->
<!--
<firewall>
<whitehost>
<host host="127.0.0.1" user="mycat"/>
<host host="127.0.0.2" user="mycat"/>
</whitehost>
<blacklist check="false">
</blacklist>
</firewall>
-->

<user name="mycat">--更改mycat的用戶名
<property name="password">123456</property>

<!-- mycat的邏輯數據庫,邏輯數據庫是虛擬的數據庫不是真實存在的,但是可以對應真實的數據庫 -->
<property name="schemas">mycatdatabase</property>

<!-- 表級 DML 權限設置 --> 0是沒有增刪改查的權限 1是有的
<!--
<privileges check="false">
<schema name="mycatdatabase" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>

<user name="user">
<property name="password">user</property>
<property name="schemas">mycatdatabase</property>
<property name="readOnly">true</property>--只讀的普通的查詢用戶
</user>

2>schema.xml文件-這個是配置的關鍵點

schema 用於配置邏輯數據庫<只讀寫分離不用分庫分表 那麽不用配置table>

schema.xml文件的內容如下:

----------------------------------------------------------------------------------------------------

啟動成功的mycat對應的schema.xml文件內容如下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--
schema用戶配置邏輯數據庫 只做讀寫分離不做分庫分表,schema中不需要配置表;給schema標簽加上屬性datanode配置datanode的名字(name)
最終的配置如下:
-->
<schema name="mycatdb2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"></schema>
<!--
配置datanode,datanode定義了mycat中的數據節點<定義真實的物理數據庫>,也就是我們通常說的數據分片,一個datanode
標簽就是一個獨立的數據分片,通俗理解,一個分片就是一個物理數據庫database就是
實際的數據庫名稱;
<dataNode name="dn1" dataHost="localhost1" database="test01" />
配置說明:
name:定義數據節點的名稱,這個名稱需要是唯一的,這個名稱在schema裏面會使用到;
dataHost:用於定義該分片屬於哪個數據庫實例的,屬性值是引用dataHost標簽上定義的name屬性
database:用於對應真實的數據庫名,必須是真實存在的;
最終配置如下:
-->
<dataNode name="dn2" dataHost="localhost" database="test"></dataNode>
<!--
配置dataHost 定義具體的數據庫實例、讀寫分離配置和心跳語句
<dataHost name="localhost1" 名稱上面使用
maxCon="1000" 最大連接數
minCon="1"
balance="1" 負載均衡(改成1代表開啟讀寫分離模式)目前的取值有4種:
0:不開啟讀寫分離機制,所有讀操作都發送到當前可用的writeHost上
1:全部的readHost與stand by writeHost<既是主又是從以下是3307和3308>參與select語句的負載均衡,簡單的說就是當雙主雙從模式(M1->S1,M2->S2,並且M1與M2互為主備)正常情況下,當M1是寫的時候,M2,S1,S2都參與
2:所有讀操作都隨機的在writeHost、readHost上分發
3:所有讀請求隨機的分發到writeHost對應的readHost執行,writeHost不負擔讀壓力
推薦balance設置為1
dbType="mysql" 數據庫類型
dbDriver="native" 數據庫驅動 native代表本地驅動
switchType="1" 故障切換
-1表示不自動切換
1默認值 自動切換 心跳語句為 select user() 使用的比較多
2基於mysql主從同步的狀態決定是否切換 心跳語句為 show slave status
3基於mysql galary cluster模式的切換機制(適合集群) 心跳語句 show status like ‘wsrep%‘
通常使用1自動切換,因為雙主雙從的模式2 3 比較復雜不適用
slaveThreshold="100"> 讀寫分離從服務器的最大個數

<heartbeat>select user()</heartbeat>心跳語句 mycat每隔一段時間會給mysql發送一條命令 檢測mysql是否有響應 是否正常
writeHost 配置寫數據庫(主庫),有幾個主庫就配置幾個writeHost
<writeHost host="hostM3307" url="localhost:3307" user="root" password="111111">
配置讀數據庫(從庫)
<readHost host="hosts3308" url="localhost:3308" user="root" password="111111">
<readHost host="hosts3309" url="localhost:3309" user="root" password="111111">
</writeHost>
<writeHost host="hostM3308" url="localhost:3308" user="root" password="111111">
配置讀數據庫(從庫)
<readHost host="hosts3307" url="localhost:3307" user="root" password="111111">
<readHost host="hosts3310" url="localhost:3310" user="root" password="111111">
</writeHost>
</dataHost>
-->
<dataHost name="localhost"
maxCon="1000"
minCon="1"
balance="1"
dbType="mysql"
dbDriver="native"
switchType="1"
slaveThreshold="100">

<heartbeat>select user()</heartbeat>
<!--配置寫數據庫(主庫),有幾個主庫就配置幾個writeHost -->
<writeHost host="hostM3308" url="localhost:3308" user="root" password="">
<!--配置讀數據庫(從庫)-->
<readHost host="hosts3309" url="localhost:3309" user="root" password=""/>

<readHost host="hosts3310" url="localhost:3310" user="root" password=""/>
</writeHost>
</dataHost>
</mycat:schema>

----------------------------------------------------------------------------------------------------

一主兩從的配置

技術分享圖片

雙主雙從的配置:

技術分享圖片

3.mycat讀寫分離測試驗證:

將配置文件覆蓋,windows環境下 cmd到mycat的bin目錄,我的文件目錄是D:\software\Mycat\mycat2\bin

輸入命令 startup_nowrap.bat 啟動mycat,代表啟動成功

技術分享圖片

在mysql的目錄下:利用mysql的命令登錄mycat 用戶名和密碼是配置到mycat的server.xml文件中的

D:\software\mysql\mysql5\bin>mysql -umycat2 -p -P8066 -h127.0.0.1

在mycat重啟之後,輸入上述命令登錄mycat成功後,查看虛擬的數據庫,可以看到有mycatdb,這個是schema.xml文件中配置的schema標簽的name屬性對應的值

技術分享圖片

通過navicate連接 localhost:3308和localhost:3309 localhost:3310 然後分別在各自的test庫中創建相同的表student表:

mysql3<3308>中的數據是

技術分享圖片

mysql4<3309>中的數據是

技術分享圖片

mysql5<3310>中的數據是

技術分享圖片

mysql> select * from student;發現查出來的數都是從庫 3309和3310的

技術分享圖片

驗證主庫的功能: id=3是從庫但是主庫不存在的,0 rows不受影響,所以刪除沒成功

技術分享圖片

技術分享圖片

發現id=2的是刪除成功了;

mycat學習-2 數據庫的讀寫分離