久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

學(xué)會(huì)數(shù)據(jù)庫讀寫分離、分表分庫

 feimishiwo 2018-08-06

系統(tǒng)開發(fā)中,,數(shù)據(jù)庫是非常重要的一個(gè)點(diǎn),。除了程序的本身的優(yōu)化,如:SQL語句優(yōu)化,、代碼優(yōu)化,,數(shù)據(jù)庫的處理本身優(yōu)化也是非常重要的。主從,、熱備,、分表分庫等都是系統(tǒng)發(fā)展遲早會(huì)遇到的技術(shù)問題問題。Mycat是一個(gè)廣受好評(píng)的數(shù)據(jù)庫中間件,,已經(jīng)在很多產(chǎn)品上進(jìn)行使用了,。希望通過這篇文章的介紹,能學(xué)會(huì)Mycat的使用,。

安裝

Mycat官網(wǎng):http://www./
可以了解下Mycat的背景和應(yīng)用情況,,這樣使用起來比較有信心。

Mycat下載地址:http://dl./
官網(wǎng)有個(gè)文檔,,屬于詳細(xì)的介紹,,初次入門,看起來比較花時(shí)間,。

下載:
建議大家選擇 1.6-RELEASE 版本,,畢竟是比較穩(wěn)定的版本,。

安裝:
根據(jù)不同的系統(tǒng)選擇不同的版本。包括linux,、windows,、mac,作者考慮還是非常周全的,當(dāng)然,,也有源碼版的,。(ps:源碼版的下載后,只要配置正確,,就可以正常運(yùn)行調(diào)試,,這個(gè)贊一下。)

Mycat的安裝其實(shí)只要解壓下載的目錄就可以了,,非常簡單,。
安裝完成后,目錄如下:

目錄 說明
bin mycat命令,,啟動(dòng),、重啟、停止等
catlet catlet為Mycat的一個(gè)擴(kuò)展功能
conf Mycat 配置信息,重點(diǎn)關(guān)注
lib Mycat引用的jar包,,Mycat是java開發(fā)的
logs 日志文件,,包括Mycat啟動(dòng)的日志和運(yùn)行的日志。

配置

Mycat的配置文件都在conf目錄里面,,這里介紹幾個(gè)常用的文件:

文件 說明
server.xml Mycat的配置文件,,設(shè)置賬號(hào)、參數(shù)等
schema.xml Mycat對(duì)應(yīng)的物理數(shù)據(jù)庫和數(shù)據(jù)庫表的配置
rule.xml Mycat分片(分庫分表)規(guī)則

Mycat的架構(gòu)其實(shí)很好理解,,Mycat是代理,,Mycat后面就是物理數(shù)據(jù)庫。和Web服務(wù)器的Nginx類似,。對(duì)于使用者來說,,訪問的都是Mycat,不會(huì)接觸到后端的數(shù)據(jù)庫,。
我們現(xiàn)在做一個(gè)主從,、讀寫分離,簡單分表的示例,。結(jié)構(gòu)如下圖:

服務(wù)器 IP 說明
Mycat 192.168.0.2 mycat服務(wù)器,,連接數(shù)據(jù)庫時(shí),連接此服務(wù)器
database1 192.168.0.3 物理數(shù)據(jù)庫1,,真正存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)庫
database2 192.168.0.4 物理數(shù)據(jù)庫2,,真正存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)庫

Mycat作為主數(shù)據(jù)庫中間件,肯定是與代碼弱關(guān)聯(lián)的,所以代碼是不用修改的,,使用Mycat后,,連接數(shù)據(jù)庫是不變的,默認(rèn)端口是8066,。連接方式和普通數(shù)據(jù)庫一樣,,如:jdbc:mysql://192.168.0.2:8066/

server.xml

示例

<user name="test">
        <property name="password">test</property>  
        <property name="schemas">lunch</property>  
        <property name="readOnly">false</property>  
        
        <!-- 表級(jí) DML 權(quán)限設(shè)置 -->
        <!--        
        <privileges check="false">
            <schema name="TESTDB" dml="0110" >
                <table name="tb01" dml="0000"></table>
                <table name="tb02" dml="1111"></table>
            </schema>
        </privileges>       
         -->
    </user>

重點(diǎn)關(guān)注下面這段,其他默認(rèn)即可,。

參數(shù) 說明
user 用戶配置節(jié)點(diǎn)
--name 登錄的用戶名,,也就是連接Mycat的用戶名
--password 登錄的密碼,也就是連接Mycat的密碼
--schemas 數(shù)據(jù)庫名,,這里會(huì)和schema.xml中的配置關(guān)聯(lián),,多個(gè)用逗號(hào)分開,例如需要這個(gè)用戶需要管理兩個(gè)數(shù)據(jù)庫db1,db2,,則配置db1,dbs
--privileges 配置用戶針對(duì)表的增刪改查的權(quán)限,,具體見文檔吧

我這里配置了一個(gè)賬號(hào)test 密碼也是test,針對(duì)數(shù)據(jù)庫lunch,讀寫權(quán)限都有,沒有針對(duì)表做任何特殊的權(quán)限,。

schema.xml
schema.xml是最主要的配置項(xiàng),,首先看我的配置文件。

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://cat/">

<!-- 數(shù)據(jù)庫配置,,與server.xml中的數(shù)據(jù)庫對(duì)應(yīng) -->
    <schema name="lunch" checkSQLschema="false" sqlMaxLimit="100">
        <table name="lunchmenu" dataNode="dn1"  />
        <table name="restaurant" dataNode="dn1"  />
        <table name="userlunch" dataNode="dn1"  />
        <table name="users" dataNode="dn1"  />
        <table name="dictionary" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2"  rule="mod-long" />

        
    </schema>

<!-- 分片配置 -->
    <dataNode name="dn1" dataHost="test1" database="lunch" />
    <dataNode name="dn2" dataHost="test2" database="lunch" />

<!-- 物理數(shù)據(jù)庫配置 -->
    <dataHost name="test1" maxCon="1000" minCon="10" balance="0"  writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user();</heartbeat>
        <writeHost host="hostM1" url="192.168.0.2:3306" user="root" password="123456">  
        </writeHost>
    </dataHost>

    <dataHost name="test2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user();</heartbeat>
        <writeHost host="hostS1" url="192.168.0.3:3306" user="root" password="123456">  
        </writeHost>
    </dataHost>

</mycat:schema>
參數(shù) 說明
schema 數(shù)據(jù)庫設(shè)置,,此數(shù)據(jù)庫為邏輯數(shù)據(jù)庫,name與server.xml中schema對(duì)應(yīng)
dataNode 分片信息,,也就是分庫相關(guān)配置
dataHost 物理數(shù)據(jù)庫,真正存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)庫

每個(gè)節(jié)點(diǎn)的屬性逐一說明:

schema:

屬性 說明
name 邏輯數(shù)據(jù)庫名,,與server.xml中的schema對(duì)應(yīng)
checkSQLschema 數(shù)據(jù)庫前綴相關(guān)設(shè)置,,建議看文檔,這里暫時(shí)設(shè)為folse
sqlMaxLimit select 時(shí)默認(rèn)的limit,,避免查詢?nèi)?/td>

table:

屬性 說明
name 表名,,物理數(shù)據(jù)庫中表名
dataNode 表存儲(chǔ)到哪些節(jié)點(diǎn),多個(gè)節(jié)點(diǎn)用逗號(hào)分隔,。節(jié)點(diǎn)為下文dataNode設(shè)置的name
primaryKey 主鍵字段名,,自動(dòng)生成主鍵時(shí)需要設(shè)置
autoIncrement 是否自增
rule 分片規(guī)則名,具體規(guī)則下文rule詳細(xì)介紹

dataNode

屬性 說明
name 節(jié)點(diǎn)名,,與table中dataNode對(duì)應(yīng)
datahost 物理數(shù)據(jù)庫名,,與datahost中name對(duì)應(yīng)
database 物理數(shù)據(jù)庫中數(shù)據(jù)庫名

dataHost

屬性 說明
name 物理數(shù)據(jù)庫名,與dataNode中dataHost對(duì)應(yīng)
balance 均衡負(fù)載的方式
writeType 寫入方式
dbType 數(shù)據(jù)庫類型
heartbeat 心跳檢測(cè)語句,,注意語句結(jié)尾的分號(hào)要加,。

應(yīng)用場(chǎng)景

數(shù)據(jù)庫分表分庫

配置如下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://cat/">

<!-- 數(shù)據(jù)庫配置,與server.xml中的數(shù)據(jù)庫對(duì)應(yīng) -->
    <schema name="lunch" checkSQLschema="false" sqlMaxLimit="100">
        <table name="lunchmenu" dataNode="dn1"  />
        <table name="restaurant" dataNode="dn1"  />
        <table name="userlunch" dataNode="dn1"  />
        <table name="users" dataNode="dn1"  />
        <table name="dictionary" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2"  rule="mod-long" />

        
    </schema>

<!-- 分片配置 -->
    <dataNode name="dn1" dataHost="test1" database="lunch" />
    <dataNode name="dn2" dataHost="test2" database="lunch" />

<!-- 物理數(shù)據(jù)庫配置 -->
    <dataHost name="test1" maxCon="1000" minCon="10" balance="0"  writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user();</heartbeat>
        <writeHost host="hostM1" url="192.168.0.2:3306" user="root" password="123456">  
        </writeHost>
    </dataHost>

    <dataHost name="test2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user();</heartbeat>
        <writeHost host="hostS1" url="192.168.0.3:3306" user="root" password="123456">  
        </writeHost>
    </dataHost>

</mycat:schema>

我在192.168.0.2、192.168.0.3均有數(shù)據(jù)庫lunch,。
lunchmenu,、restaurant、userlunch,、users這些表都只寫入節(jié)點(diǎn)dn1,,也就是192.168.0.2這個(gè)服務(wù),而dictionary寫入了dn1,、dn2兩個(gè)節(jié)點(diǎn),,也就是192.168.0.2、192.168.0.3這兩臺(tái)服務(wù)器,。分片的規(guī)則為:mod-long,。
主要關(guān)注rule屬性,rule屬性的內(nèi)容來源于rule.xml這個(gè)文件,,Mycat支持10種分表分庫的規(guī)則,,基本能滿足你所需要的要求,這個(gè)必須贊一個(gè),,其他數(shù)據(jù)庫中間件好像都沒有這么多,。
table中的rule屬性對(duì)應(yīng)的就是rule.xml文件中tableRule的name,具體有哪些分表和分庫的實(shí)現(xiàn),建議還是看下文檔,。我這里選擇的mod-long就是將數(shù)據(jù)平均拆分,。因?yàn)槲液蠖耸莾膳_(tái)物理庫,所以rule.xml中mod-long對(duì)應(yīng)的function count為2,,見下面部分代碼:

<tableRule name="mod-long">
        <rule>
            <columns>id</columns>
            <algorithm>mod-long</algorithm>
        </rule>
    </tableRule>
    
<function name="mod-long" class="cat.route.function.PartitionByMod">
        <!-- how many data nodes -->
        <property name="count">2</property>
    </function>

數(shù)據(jù)庫讀寫分離

配置如下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://cat/">

<!-- 數(shù)據(jù)庫配置,,與server.xml中的數(shù)據(jù)庫對(duì)應(yīng) -->
    <schema name="lunch" checkSQLschema="false" sqlMaxLimit="100">
        <table name="lunchmenu" dataNode="dn1"  />
        <table name="restaurant" dataNode="dn1"  />
        <table name="userlunch" dataNode="dn1"  />
        <table name="users" dataNode="dn1"  />
        <table name="dictionary" primaryKey="id" autoIncrement="true" dataNode="dn1"  />

        
    </schema>

<!-- 分片配置 -->
    <dataNode name="dn1" dataHost="test1" database="lunch" />


<!-- 物理數(shù)據(jù)庫配置 -->
    <dataHost name="test1" maxCon="1000" minCon="10" balance="1"  writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user();</heartbeat>
        <writeHost host="hostM1" url="192.168.0.2:3306" user="root" password="123456">  
        <readHost host="hostM1" url="192.168.0.3:3306" user="root" password="123456">   
        </readHost>
        </writeHost>
    </dataHost>


</mycat:schema>

這樣的配置與前一個(gè)示例配置改動(dòng)如下:
刪除了table分配的規(guī)則,以及datanode只有一個(gè)
datahost也只有一臺(tái),但是writehost總添加了readhost,balance改為1,,表示讀寫分離,。
以上配置達(dá)到的效果就是102.168.0.2為主庫,192.168.0.3為從庫,。

注意:Mycat主從分離只是在讀的時(shí)候做了處理,,寫入數(shù)據(jù)的時(shí)候,只會(huì)寫入到writehost,,需要通過mycat的主從復(fù)制將數(shù)據(jù)復(fù)制到readhost,,這個(gè)問題當(dāng)時(shí)候我糾結(jié)了好久,數(shù)據(jù)寫入writehost后,,readhost一直沒有數(shù)據(jù),,以為是自己配置的問題,后面才發(fā)現(xiàn)Mycat就沒有實(shí)現(xiàn)主從復(fù)制的功能,,畢竟數(shù)據(jù)庫本身自帶的這個(gè)功能才是最高效穩(wěn)定的,。

至于其他的場(chǎng)景,如同時(shí)主從和分表分庫也是支持的了,只要了解這個(gè)實(shí)現(xiàn)以后再去修改配置,,都是可以實(shí)現(xiàn)的,。而熱備及故障專業(yè)官方推薦使用haproxy配合一起使用,大家可以試試,。

使用

Mycat的啟動(dòng)也很簡單,,啟動(dòng)命令在Bin目錄:

##啟動(dòng)
mycat start

##停止
mycat stop

##重啟
mycat restart

如果在啟動(dòng)時(shí)發(fā)現(xiàn)異常,在logs目錄中查看日志,。

  • wrapper.log 為程序啟動(dòng)的日志,,啟動(dòng)時(shí)的問題看這個(gè)
  • mycat.log 為腳本執(zhí)行時(shí)的日志,SQL腳本執(zhí)行報(bào)錯(cuò)后的具體錯(cuò)誤內(nèi)容,查看這個(gè)文件,。mycat.log是最新的錯(cuò)誤日志,,歷史日志會(huì)根據(jù)時(shí)間生成目錄保存。

mycat啟動(dòng)后,,執(zhí)行命令不成功,,可能實(shí)際上配置有錯(cuò)誤,導(dǎo)致后面的命令沒有很好的執(zhí)行,。

Mycat帶來的最大好處就是使用是完全不用修改原有代碼的,,在mycat通過命令啟動(dòng)后,你只需要將數(shù)據(jù)庫連接切換到Mycat的地址就可以了,。如下面就可以進(jìn)行連接了:

 mysql -h192.168.0.1 -P8806 -uroot -p123456

連接成功后可以執(zhí)行sql腳本了,。
所以,可以直接通過sql管理工具(如:navicat,、datagrip)連接,,執(zhí)行腳本。我一直用datagrip來進(jìn)行日常簡單的管理,,這個(gè)很方便,。

Mycat還有一個(gè)管理的連接,端口號(hào)是9906.

 mysql -h192.168.0.1 -P9906 -uroot -p123456

連接后可以根據(jù)管理命令查看Mycat的運(yùn)行情況,,當(dāng)然,喜歡UI管理方式的人,,可以安裝一個(gè)Mycat-Web來進(jìn)行管理,,有興趣自行搜索。

簡而言之,,開發(fā)中使用Mycat和直接使用Mysql機(jī)會(huì)沒有差別,。

常見問題

使用Mycat后總會(huì)遇到一些坑,我將自己遇到的一些問題在這里列一下,,希望能與大家有共鳴:

  • Mycat是不是配置以后,,就能完全解決分表分庫和讀寫分離問題?
    Mycat配合數(shù)據(jù)庫本身的復(fù)制功能,可以解決讀寫分離的問題,,但是針對(duì)分表分庫的問題,,不是完美的解決?;蛘哒f,,至今為止,業(yè)界沒有完美的解決方案,。
    分表分庫寫入能完美解決,,但是,不能完美解決主要是聯(lián)表查詢的問題,,Mycat支持兩個(gè)表聯(lián)表的查詢,,多余兩個(gè)表的查詢不支持。 其實(shí),,很多數(shù)據(jù)庫中間件關(guān)于分表分庫后查詢的問題,,都是需要自己實(shí)現(xiàn)的,而且節(jié)本都不支持聯(lián)表查詢,,Mycat已經(jīng)算做地非常先進(jìn)了,。
    分表分庫的后聯(lián)表查詢問題,大家通過合理數(shù)據(jù)庫設(shè)計(jì)來避免,。

  • Mycat支持哪些數(shù)據(jù)庫,,其他平臺(tái)如 .net、PHP能用嗎,?
    官方說了,,支持的數(shù)據(jù)庫包括MySQL、SQL Server,、Oracle,、DB2、PostgreSQL 等主流數(shù)據(jù)庫,,很贊,。
    盡量用Mysql,我試過SQL Server,會(huì)有些小問題,,因?yàn)椴糠终Z法有點(diǎn)差異,。

  • Mycat 非JAVA平臺(tái)如 .net、PHP能用嗎,?
    可以用,。這一點(diǎn)MyCat做的也很棒。

參考

《Mycat權(quán)威指南》: http://www./document/Mycat_V1.6.0.pdf
官網(wǎng) :http://www./

如果想熟練使用Mycat,,建議要仔細(xì)看看官方推薦的文檔,,可能需要花點(diǎn)時(shí)間,。本文只是簡單的介紹下Mycat的配置,希望能快速讓大家對(duì)Mycat有個(gè)認(rèn)識(shí),,官方的文檔理解起來也很容易,,只是需要的時(shí)間更多,本文為說明的參數(shù),,請(qǐng)參考官方文檔,。


歡迎大家關(guān)注我的公眾號(hào)交流,、學(xué)習(xí),、第一時(shí)間獲取最新的文章,。
微信號(hào):itmifen

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多