MySQL 讀寫分離

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

Mycat 是一個開源的分布式數(shù)據(jù)庫系統(tǒng)疫稿,但是由于真正的數(shù)據(jù)庫需要存儲引擎燎悍,而 Mycat 并沒有存 儲引擎,所以并不是完全意義的分布式數(shù)據(jù)庫系統(tǒng)蔫浆。 那么 Mycat 是什么梗肝?Mycat 是數(shù)據(jù)庫中間件,就是介于數(shù)據(jù)庫與應用之間航背,進行數(shù)據(jù)處理與交互的中間服 務喉悴。

image

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

部署環(huán)境

  1. 下載 jdk

    image
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最盅,會涉及到證書的問題突雪,不校驗能快一點,影響不大.

  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)境變量生效
// 立刻在當前的 shell 會話中生效
shell> source /etc/profile

全部生效需要重啟機器

部署 MyCat

下載
image

根據(jù)瀏覽下下方的提示涡贱,下載對應的版本

image
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ù)庫存儲督函。

image

如上圖所表示,數(shù)據(jù)被分到多個分片數(shù)據(jù)庫后激挪,應用如果需要讀取數(shù)據(jù)辰狡,就要需要處理多個數(shù)據(jù)源的數(shù)據(jù)。 如果沒有數(shù)據(jù)庫中間件垄分,那么應用將直接面對分片集群宛篇,數(shù)據(jù)源切換、事務處理薄湿、數(shù)據(jù)聚合都需要應用直接處 理叫倍,原本該是專注于業(yè)務的應用,將會花大量的工作來處理分片后的問題豺瘤,最重要的是每個應用處理將是完全的 重復造輪子吆倦。 所以有了數(shù)據(jù)庫中間件,應用只需要集中與業(yè)務處理坐求,大量的通用的數(shù)據(jù)聚合蚕泽,事務,數(shù)據(jù)源切換都由中間 件來處理桥嗤,中間件的性能與處理能力將直接決定應用的讀寫性能赛糟,所以一款好的數(shù)據(jù)庫中間件至關(guān)重要派任。

邏輯庫(schema)

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

在云計算時代司倚,數(shù)據(jù)庫中間件可以以多租戶的形式給一個或多個應用提供服務,每個應用訪問的可能是一個 獨立或者是共享的物理庫篓像,常見的如阿里云數(shù)據(jù)庫服務器 RDS动知。

image
邏輯表(table)

既然有邏輯庫,那么就會有邏輯表员辩,分布式數(shù)據(jù)庫中盒粮,對應用來說,讀寫數(shù)據(jù)的表就是邏輯表奠滑。邏輯表丹皱,可 以是數(shù)據(jù)切分后,分布在一個或多個分片庫中宋税,也可以不做數(shù)據(jù)切分摊崭,不分片,只有一個表構(gòu)成杰赛。

分片規(guī)則(rule)

數(shù)據(jù)切分呢簸,一個大表被分成若干個分片表,就需要一定的規(guī)則乏屯,這樣按照某種業(yè)務規(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)變量蛤迎,如端口等。其中用戶信息是前端應用程序連接 mycat 的用戶信息伞芹。

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

    定義邏輯庫忘苛,表、分片節(jié)點等內(nèi)容唱较。

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

    中定義分片規(guī)則扎唾。

配置 server.xml

以下為代碼片段

下面的用戶和密碼是應用程序連接到 MyCat 使用的,可以自定義配置

而其中的schemas 配置項所對應的值是邏輯數(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)限設置 -->
    <!--
    <privileges check="false">
        <schema name="TESTDB" dml="0110" >
            <table name="tb01" dml="0000"></table>
            <table name="tb02" dml="1111"></table>
        </schema>
    </privileges>
    -->
</user>

<!--下面是另一個用戶汉形,并且設置的訪問 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

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

邏輯庫和分表設置

<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
<!--設置日志級別為 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)限有效性

測試是否能正常登錄上 主服務器

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

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

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 地址,應該能搜索到

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嫉柴,一起剝皮案震驚了整個濱河市厌杜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌计螺,老刑警劉巖夯尽,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異危尿,居然都是意外死亡呐萌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門谊娇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肺孤,“玉大人,你說我怎么就攤上這事济欢≡拢” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵法褥,是天一觀的道長茫叭。 經(jīng)常有香客問我,道長半等,這世上最難降的妖魔是什么揍愁? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮杀饵,結(jié)果婚禮上莽囤,老公的妹妹穿的比我還像新娘。我一直安慰自己切距,他們只是感情好朽缎,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般话肖。 火紅的嫁衣襯著肌膚如雪北秽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天最筒,我揣著相機與錄音贺氓,去河邊找鬼。 笑死床蜘,一個胖子當著我的面吹牛掠归,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悄泥,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肤粱!你這毒婦竟也來了弹囚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤领曼,失蹤者是張志新(化名)和其女友劉穎鸥鹉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庶骄,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡毁渗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了单刁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灸异。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖羔飞,靈堂內(nèi)的尸體忽然破棺而出肺樟,到底是詐尸還是另有隱情,我是刑警寧澤逻淌,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布么伯,位于F島的核電站,受9級特大地震影響卡儒,放射性物質(zhì)發(fā)生泄漏田柔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一骨望、第九天 我趴在偏房一處隱蔽的房頂上張望硬爆。 院中可真熱鬧,春花似錦锦募、人聲如沸摆屯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虐骑。三九已至准验,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間廷没,已是汗流浹背糊饱。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留颠黎,地道東北人另锋。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像狭归,于是被迫代替她去往敵國和親夭坪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

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

  • http://www.reibang.com/p/51861107b04a 數(shù)據(jù)庫中間 MyCAT 讀寫分離實現(xiàn)...
    運維開發(fā)_西瓜甜閱讀 6,807評論 0 76
  • 數(shù)據(jù)庫中間 MyCAT 讀寫分離實現(xiàn) Mycat 是一個開源的分布式數(shù)據(jù)庫系統(tǒng)过椎,但是由于真正的數(shù)據(jù)庫需要存儲引擎室梅,...
    Lengfin閱讀 283評論 0 0
  • 數(shù)據(jù)庫中間 MyCAT 讀寫分離實現(xiàn) 參考資料: https://segmentfault.com/a/11900...
    你笑的那么美丶閱讀 286評論 0 0
  • 為什么需要讀寫分離 至于為什么需要讀寫分離,在我之前的文章有介紹過了疚宇,相信看到這篇文章的人也知道為什么需要讀寫分離...
    Raye閱讀 1,361評論 0 6
  • Mycat 實現(xiàn) MySQL 讀寫分離 環(huán)境:CentOS 6.8 實驗拓撲: mycat: 192.168.0....
    C86guli閱讀 9,295評論 1 17