1.分庫分表(解決單表數據量過大的問題)java
2.獨寫分離(解決單個數據庫訪問量大,壓力大的問題)mysql
將一個數據量大的表數據分放在不一樣的數據節點上,這種模式就稱爲分庫分表。linux
在分庫分表中,全部的數據節點都是平等的,沒有主從關係。redis
需求:使用兩個mysql服務器,經過mycat添加數據,實現一條數據在mysql01,一條數據在mysql02上sql
使用規則:mod-long數據庫
mycat是使用java編寫的,所以須要先配置jdk環境,在安裝mycatvim
1.官網下載mycatxxx.tar.gz服務器
2.xftp上傳到linux中的apps目錄中oracle
3.解壓壓縮包app
tar -zxvf Mycatxxx.tar.gz
4.配置環境變量(與配置jdk環境變量相同)
vim /etc/profile #編輯mycat環境變量 export MYCAT_HOME=/home/apps/mycat export PATH=$PATH:$MYCAT_HOME/bin
至此,mycat安裝完成。可是要使用mycat的分庫分表還須要配置幾個文件:
進入mycat目錄下的conf目錄:
1.修改server.xml文件:
2.修改schemas.xml文件:
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!-- schema:至關於mysql中的數據庫 name:這個數據庫的名字 checkSQLschema:檢查sql語句是否錯誤,默認爲false,不須要爲true,交給mysql來檢查就能夠了 sqlMaxLimit:最大執行sql語句數量,能夠一次性執行的sql語句數量 --> <schema name="TEACH" checkSQLschema="false" sqlMaxLimit="100"> <!-- 至關於數據庫中的表,這個表並非真實存在的,而是經過mysql映射過來的,所以mysql中必定要存在與這個表的名字相同的表,這樣才能映射進來 dataNode:數據節點,上一篇分析HDFS時,已經講過數據節點的概念,就是mysql數據庫,節點之間以,分隔 rule:規則,使用mycat實現分庫分表有十大規則,也就是說怎樣實現分片,是把天天的數據都分一個片,仍是按照編號範圍,每100條數據分一塊... 等等,具體十大分片規則,能夠單獨去看,這裏使用mod-long,輪詢的方式,第一條存mysql1,第2條存mysql2 --> <table name="student" dataNode="dn1,dn2" rule="mod-long" /> </schema> <!--數據節點:就是數據庫服務器節點 name:節點的名字,與上面相對應,上面有幾個,下面就要有幾個 dataHost:數據節點地址,與下面的dataHost標籤的名字向對應 database:真實的數據庫名, mycat中的TEACH數據庫是虛擬的,它裏面的表都是經過真實的數據庫中的表映射進來的,這裏指的是mysql中的真實的數據庫 --> <dataNode name="dn1" dataHost="localhost1" database="teach" /> <dataNode name="dn2" dataHost="localhost2" database="teach" /> <!--dataHost:真實的數據庫的節點地址信息 name:給該節點起名字,經過dataNode引用該節點 maxCon:最大鏈接數 minCon:嘴小鏈接數 balance:負載均衡(在獨寫分離中講解,這裏用不到) writeType:寫入方式(讀寫分離的配置,這裏用不到,下一篇講) dbType:數據庫類型,是mysql仍是oracle,redis...等等,原本mycat是隻支持mysql的,可是發展到如今支持多種數據庫 dbDriver:數據庫驅動(使用本地驅動->mycat提供的驅動) switchType:切換方式,讀寫分離中講 slaveThreshold:主從複製延時(讀寫分離的屬性,下篇講)--> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <!--heartbeat:心跳,mycat一直檢測mysql的user表(心跳),當接收不到心跳時,就會認爲這臺mysql宕機了,就不會在對該節點作增刪改查等操做--> <heartbeat>select user()</heartbeat> <!--writeHost:寫節點,當獨立存在時,則該節點又讀又寫,當與readHost同時存在時,則表示只寫,不進行讀操做 host屬性只是標識了該臺數據庫的操做的內容,能夠隨意定義,不能重複 --> <writeHost host="write1" url="192.168.226.159:3306" user="root" password="123456"/> </dataHost> <dataHost name="localhost2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="write2" url="192.168.226.160:3306" user="root" password="123456"/> </dataHost> </mycat:schema>
3修改rule.xml
由於本次只使用了mod-long規則,其餘的沒有使用,這裏count表示數據庫的dataNode節點總數
配置完畢,啓動mycat,由於配置了環境變量,能夠在任意地方執行命令:
mycat console
而後使用mysql鏈接mycat,此時若是真實的mysql數據中沒有數據庫及表時,沒法映射,所以mycat中的表會顯示不存在,須要在真實的mysql數據庫上建立表,而後經過mycat添加數據,能夠看到一條數據存入mysql1,一條數據存入mysql2的情形。