MySQL 讀寫分離

數(shù)據(jù)庫中間 MyCAT 讀寫分離實現(xiàn)

Mycat 是一個開源的分布式數(shù)據(jù)庫系統(tǒng)笆豁,但是由于真正的數(shù)據(jù)庫需要存儲引擎言缤,而 Mycat 并沒有存 儲引擎璧坟,所以并不是完全意義的分布式數(shù)據(jù)庫系統(tǒng)本冲。 那么 Mycat 是什么?Mycat 是數(shù)據(jù)庫中間件撤缴,就是介于數(shù)據(jù)庫與應(yīng)用之間,進行數(shù)據(jù)處理與交互的中間服 務(wù)叽唱。

封封丷

MyCAT 是使用 JAVA 語言進行編寫開發(fā)屈呕,使用前需要先安裝 JAVA 運行環(huán)境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性,所以要求必須在 JDK7 以上的版本上運行棺亭。

部署環(huán)境

  1. 下載 jdk

    封封丷
shell> wget --no-cookies \
--no-check-certificate \
--header \
"Cookie: oraclelicense=accept-securebackup-cookie" \
http://download.oracle.com/otn-pub/java/jdk/8u181-\
b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-linux-\
x64.tar.gz

// --no-check-certificate 表示不校驗SSL證書虎眨,因為中間的兩個302會訪問https,會涉及到證書的問題镶摘,不校驗?zāi)芸煲稽c嗽桩,影響不大.

  1. 解壓文件
shell> tar -xf jdk-8u181-linux-x64.tar.gz   -C  /usr/local/
shell> ln -s /usr/local/jdk1.8.0_181/ /usr/local/java

  1. 配置環(huán)境變量
shell> vi /etc/profile.d/java.sh
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

注意 CLASSPATH 中有個點 . 不要省略

  1. 使環(huán)境變量生效
// 立刻在當(dāng)前的 shell 會話中生效
shell> source /etc/profile

全部生效需要重啟機器

部署 MyCat

下載
封封丷

根據(jù)瀏覽下下方的提示,下載對應(yīng)的版本

封封丷
shell> wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

解壓
shell> tar -xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
shell> ls /usr/local/mycat/
bin  catlet  conf  lib  logs  version.txt

認識MyCat 中的概念

邏輯架構(gòu)圖

DBA 或者運維人員對數(shù)據(jù)進行分片處理之后凄敢,從原有的一個庫碌冶,被切分為多個分片數(shù)據(jù)庫,所有的分片數(shù)據(jù)庫集 群構(gòu)成了整個完整的數(shù)據(jù)庫存儲涝缝。

封封丷

如上圖所表示扑庞,數(shù)據(jù)被分到多個分片數(shù)據(jù)庫后,應(yīng)用如果需要讀取數(shù)據(jù)拒逮,就要需要處理多個數(shù)據(jù)源的數(shù)據(jù)罐氨。 如果沒有數(shù)據(jù)庫中間件,那么應(yīng)用將直接面對分片集群消恍,數(shù)據(jù)源切換岂昭、事務(wù)處理以现、數(shù)據(jù)聚合都需要應(yīng)用直接處 理狠怨,原本該是專注于業(yè)務(wù)的應(yīng)用,將會花大量的工作來處理分片后的問題邑遏,最重要的是每個應(yīng)用處理將是完全的 重復(fù)造輪子佣赖。 所以有了數(shù)據(jù)庫中間件,應(yīng)用只需要集中與業(yè)務(wù)處理记盒,大量的通用的數(shù)據(jù)聚合憎蛤,事務(wù),數(shù)據(jù)源切換都由中間 件來處理纪吮,中間件的性能與處理能力將直接決定應(yīng)用的讀寫性能俩檬,所以一款好的數(shù)據(jù)庫中間件至關(guān)重要。

邏輯庫(schema)

通常對實際應(yīng)用來說碾盟,并不需要知道中間件的存在棚辽,業(yè)務(wù)開發(fā)人員只需要知道 數(shù)據(jù)庫的概念,所以數(shù)據(jù)庫中間件可以被看做是一個或多個數(shù)據(jù)庫集群構(gòu)成的邏輯庫冰肴。

在云計算時代屈藐,數(shù)據(jù)庫中間件可以以多租戶的形式給一個或多個應(yīng)用提供服務(wù)榔组,每個應(yīng)用訪問的可能是一個 獨立或者是共享的物理庫,常見的如阿里云數(shù)據(jù)庫服務(wù)器 RDS联逻。

封封丷
邏輯表(table)

既然有邏輯庫搓扯,那么就會有邏輯表,分布式數(shù)據(jù)庫中包归,對應(yīng)用來說锨推,讀寫數(shù)據(jù)的表就是邏輯表。邏輯表箫踩,可 以是數(shù)據(jù)切分后爱态,分布在一個或多個分片庫中,也可以不做數(shù)據(jù)切分境钟,不分片锦担,只有一個表構(gòu)成。

分片規(guī)則(rule)

數(shù)據(jù)切分慨削,一個大表被分成若干個分片表洞渔,就需要一定的規(guī)則,這樣按照某種業(yè)務(wù)規(guī)則把數(shù)據(jù)分到 某個分片的規(guī)則就是分片規(guī)則缚态,數(shù)據(jù)切分選擇合適的分片規(guī)則非常重要磁椒,將極大的避免后續(xù)數(shù)據(jù)處理的難度。

配置 MyCat

認識配置文件

MyCAT 目前主要通過配置文件的方式來定義邏輯庫和相關(guān)配置:

  • /usr/local/mycat/conf/server.xml

    定義用戶以及系統(tǒng)相關(guān)變量玫芦,如端口等浆熔。其中用戶信息是前端應(yīng)用程序連接 mycat 的用戶信息。

  • /usr/local/mycat/conf/schema.xml

    定義邏輯庫桥帆,表医增、分片節(jié)點等內(nèi)容。

  • /usr/local/mycat/conf/rule.xml

    中定義分片規(guī)則老虫。

配置 server.xml

以下為代碼片段

下面的用戶和密碼是應(yīng)用程序連接到 MyCat 使用的叶骨,可以自定義配置

而其中的schemas 配置項所對應(yīng)的值是邏輯數(shù)據(jù)庫的名字,也可以自定義祈匙,但是這個名字需要和后面 schema.xml 文件中配置的一致忽刽。

shell> vim server.xml
<user name="mycatdb">
    <property name="password">123456</property>
    <property name="schemas">schema_shark_db</property>

    <!-- 表級 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>

<!--下面是另一個用戶,并且設(shè)置的訪問 TESTED 邏輯數(shù)據(jù)庫的權(quán)限是 只讀
<user name="user">
        <property name="password">user</property>
        <property name="schemas">TESTDB</property>
        <property name="readOnly">true</property>
</user>
-->

==上面的配置中夺欲,假如配置了用戶訪問的邏輯庫跪帝,那么必須在 schema.xml 文件中也配置這個邏輯庫,否則報錯些阅,啟動 mycat 失敗==

配置 schema.xml

以下是配置文件中的每個部分的配置塊兒

邏輯庫和分表設(shè)置

<schema name="schema_shark_db"   // 邏輯庫名稱
        checkSQLschema="false"   // 不檢查
        sqlMaxLimit="100"        // 最大連接數(shù)
        dataNode='dn1'>          // 數(shù)據(jù)節(jié)點名稱
<!--這里定義的是分表的信息-->
</schema>

數(shù)據(jù)節(jié)點

<dataNode name="dn1"              // 此數(shù)據(jù)節(jié)點的名稱
          dataHost="localhost1"   // 主機組
          database="shark_db">    // 真實的數(shù)據(jù)庫名稱
</dataNode>

主機組

<dataHost name="localhost1"
            maxCon="1000" minCon="10"   // 連接
            balance="0"                 // 負載均衡
            writeType="0"               // 寫模式配置
            dbType="mysql" dbDriver="native" // 數(shù)據(jù)庫配置
            switchType="1" slaveThreshold="100">
    <!--這里可以配置關(guān)于這個主機組的成員信息伞剑,和針對這些主機的健康檢查語句-->
</dataHost>

image

健康檢查

<heartbeat>select user()</heartbeat>

讀寫配置

<writeHost host="hostM1" url="172.16.153.10:3306"
               user="root" password="123">
      <!-- can have multi read hosts -->
      <readHost host="hostS2" url="172.16.153.11:3306"
                user="root" password="123" /></writeHost>

以下是組合為完整的配置文件,適用于一主一從的架構(gòu)

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

  <schema name="schema_shark_db" 
          checkSQLschema="false"
          sqlMaxLimit="100" 
          dataNode='dn1'>
    <!--這里定義的是分庫分表的信息-->
  </schema>

  <!--下面是配置讀寫分離的信息-->
  <dataNode name="dn1"
            dataHost="localhost1" database="shark_db">
  </dataNode>

  <dataHost name="localhost1"
            maxCon="1000" minCon="10"
            balance="0" writeType="0"
            dbType="mysql" dbDriver="native"
            switchType="1" slaveThreshold="100">

    <heartbeat>select user()</heartbeat>
    <!-- can have multi write hosts -->
    <writeHost host="hostM1" url="172.16.153.10:3306"
               user="root" password="123">
      <!-- can have multi read hosts -->
      <readHost host="hostS2" url="172.16.153.11:3306"
                user="root" password="123" />
    </writeHost>
  </dataHost>
</mycat:schema>

配置 log4j2.xml
<!--設(shè)置日志級別為 debug , 默認是 info-->
<asyncRoot level="debug" includeLocation="true">

啟動 mycat

shell> /usr/local/mycat/bin/mycat  start

支持一下參數(shù)
start | restart |stop | status

在真實的 master 數(shù)據(jù)庫上給用戶授權(quán)

mysql> grant all on shark_db.* to root@'%' identified by '123';
mysql> flush privileges;

假如你通過遠程連接登錄到 mysql 后扑眉,給用戶進行授權(quán)操作纸泄,提示

mysql> grant all on *.* to root@'172.16.153.%' identified by '123';
ERROR 1045 (28000): Access denied for user ...略...

請檢查Grant_priv 的值是否是 N

mysql> select * from mysql.user where user='root' \G
              ... 略 ...
                  Host: mysql-master1
                  User: root
            Grant_priv: N
            ... 略 ...

解決辦法

嘗試通過本地等錄到 mysql 后赖钞,再進行授權(quán)操作

shell> mysql -uroot -p'123' -hlocalhost
mysql> grant all on *.* to root@'172.16.153.%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

測試

在 mycat 的機器上測試用戶權(quán)限有效性

測試是否能正常登錄上 主服務(wù)器

shell> mysql -uroot -p'123' -h172.16.153.10

繼續(xù)測試是否能登錄上從服務(wù)器

shell> mysql -uroot -p'123' -h172.16.153.11

通過客戶端進行測試是否能登錄到 mycat 上

172.16.153.162 是 mycat 的主機地址

注意端口號是 8066

shell> mysql -umycatdb -p123456 -P8066 -h172.16.153.162
mysql> show databases;
+-----------------+
| DATABASE        |
+-----------------+
| schema_shark_db |
+-----------------+
1 row in set (0.00 sec)

繼續(xù)測試讀寫分離策略

使用 mysql 客戶端工具使用 mycat 的賬戶和密碼登錄 mycat ,
之后執(zhí)行 select 語句。

之后查詢 mycat 主機上 mycat 安裝目錄下的 logs/mycat.log 日志聘裁。

在日志重搜索查詢的語句或者查詢 從庫的 ip 地址雪营,應(yīng)該能搜索到。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衡便,一起剝皮案震驚了整個濱河市献起,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镣陕,老刑警劉巖谴餐,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異呆抑,居然都是意外死亡岂嗓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門鹊碍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厌殉,“玉大人,你說我怎么就攤上這事侈咕」保” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵耀销,是天一觀的道長楼眷。 經(jīng)常有香客問我,道長熊尉,這世上最難降的妖魔是什么罐柳? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮帽揪,結(jié)果婚禮上硝清,老公的妹妹穿的比我還像新娘辅斟。我一直安慰自己转晰,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布士飒。 她就那樣靜靜地躺著查邢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪酵幕。 梳的紋絲不亂的頭發(fā)上扰藕,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音芳撒,去河邊找鬼邓深。 笑死未桥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芥备。 我是一名探鬼主播冬耿,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼萌壳!你這毒婦竟也來了亦镶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤袱瓮,失蹤者是張志新(化名)和其女友劉穎缤骨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尺借,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡绊起,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了燎斩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勒庄。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瘫里,靈堂內(nèi)的尸體忽然破棺而出实蔽,到底是詐尸還是另有隱情,我是刑警寧澤谨读,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布局装,位于F島的核電站,受9級特大地震影響劳殖,放射性物質(zhì)發(fā)生泄漏铐尚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一哆姻、第九天 我趴在偏房一處隱蔽的房頂上張望宣增。 院中可真熱鬧,春花似錦矛缨、人聲如沸爹脾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灵妨。三九已至,卻和暖如春落竹,著一層夾襖步出監(jiān)牢的瞬間泌霍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工述召, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留朱转,地道東北人蟹地。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像藤为,于是被迫代替她去往敵國和親锈津。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容

  • http://www.reibang.com/p/51861107b04a 數(shù)據(jù)庫中間 MyCAT 讀寫分離實現(xiàn)...
    運維開發(fā)_西瓜甜閱讀 6,796評論 0 76
  • 數(shù)據(jù)庫中間 MyCAT 讀寫分離實現(xiàn) 參考資料: https://segmentfault.com/a/11900...
    你笑的那么美丶閱讀 286評論 0 0
  • 為什么需要讀寫分離 至于為什么需要讀寫分離凉蜂,在我之前的文章有介紹過了琼梆,相信看到這篇文章的人也知道為什么需要讀寫分離...
    Raye閱讀 1,356評論 0 6
  • Mycat 實現(xiàn) MySQL 讀寫分離 環(huán)境:CentOS 6.8 實驗拓撲: mycat: 192.168.0....
    C86guli閱讀 9,293評論 1 17
  • 前言 隨著業(yè)務(wù)的不斷擴展,數(shù)據(jù)量的不斷增大,由單臺Mysql作為獨立的數(shù)據(jù)庫是完全不能滿足實際需求的窿吩。讀和寫又存在...
    slicn閱讀 982評論 0 0