1. 程式人生 > >Mysql叢集和一主多從的方案實現(二)

Mysql叢集和一主多從的方案實現(二)

4、改進方式三:MyCat資料庫中介軟體

在上文中我們介紹了MySQL讀寫分離叢集的持續優化方式。按照這樣的方式,叢集中負責讀寫分離的MySQL節點基本上能夠分別實現真對上層業務系統訪問的透明化。這樣的MySQL叢集方式已經可以承載讀者遇到的大部分業務系統的結構化資料規模,但整個叢集方案還有一些明顯的問題:首先就是業務開發人員始終還是需要分配一定的精力去分別管理讀操作會話和寫操作會話的資料庫連線;其次這個叢集方案主要解決的是單張資料表資料量不大條件下的MySQL讀寫效能(千萬級資料,還有一個前提是資料表本身擁有符合業務要求的索引結構且資料節點的效能配置合理),如果資料庫中單張資料表的規模達到了億級(甚至以上),那麼查詢壓力集中在一個讀節點上也不會再有助於查詢效能提升。

所以在必要的情況下,我們還需要繼續對上文給出的MySQL叢集方案進行改進,讓其能夠適應更龐大的結構化資料規模。具體的思路就是在保持讀寫分離方案的基礎上,對業務系統中結構化資料量達到或者超過億級規模的若干張業務表進行拆分工作。本篇文章向讀者介紹一個由國人開發並完全免費釋出的資料庫中介軟體,MyCat。它不但可以作為之前介紹的讀寫分離方案的替換方案,更重要的是它還能獨立建立和管理資料表的拆分工作。

在實際執行的業務系統中,如果其承載的結構化資料量超過了億級,那麼最可能的情況是資料庫中某一張或者某幾張資料表的承載規模超過億級,其它大多數資料表的資料量並不會太大。所以實際工作中架構師和DBA只需要針對這幾張資料表和直接關聯的資料表設計資料拆分方案

4-1、MyCat基本概念

MyCat是一款資料庫中介軟體,它基於阿里的一款資料庫中介軟體Cobar而研發。“資料庫中介軟體”這在整個專題的文章中都是一個新詞語,但從“中介軟體”這個關鍵詞來看我們至少可以知道:MyCat並不真正處理資料庫操作而是作為一箇中間層存在於業務系統和真實的資料儲存系統之間。

這裡寫圖片描述

上圖來源於MyCat官網(http://www.mycat.org.cn/)。是的,MyCat資料庫中漸漸最關鍵的一個動詞是“攔截”,它攔截了使用者傳送過來的 SQL 語句,對 SQL 語句做一些特定的分析:如分片分析、路由分析、讀寫分離分析、快取分析等,然後將此 SQL 發往後端的真實資料庫,並將返回的結果做適當的處理,最終再返回給使用者。MyCat資料庫中介軟體不只可以作為MySQL(MariaDB)的最佳搭配,還可以提供對ORACLE、DB2、SQL Server、MongoDB的支援

。只不過MyCat對這幾個關係型資料庫的支援是基於JDBC規範,將它們模擬為MySQL,而對MongoDB的支援(Version 1.3+的版本支援)是封裝了 MongoDB API 基於JDBC的實現。MyCat最關鍵的功能特性還包括:

  • 支援單純的讀寫分離:只需要進行最簡單的配置過程,就可以讓MyCat對下層資料儲存叢集提供讀寫分離功能的支援,並且提供資料寫操作節點的主從切換操作。

  • 支援資料表的拆分功能,包括指定資料表的縱向拆分和橫向拆分(又稱為垂直拆分和水平拆分)。並且這個拆分過程和拆分後的維護過程對上層開發人員完全透明。

  • 多租戶功能:同一個應用的,連線同一個MyCat資料庫中介軟體,如果採用不同的連線使用者將會由MyCat將實際操作路由到不同的物理節點上,從而實現多租戶功能。

在正式介紹MyCat使用之前,為了便於讀者能夠更好的理解後續的技術方案,需要首先向讀者介紹一些和下文示例有關的MyCat基礎定義。如果讀者需要深入瞭解MyCat的工作原理和技術實現,可以到其官網上下載更多資料。

這裡寫圖片描述

資料的拆分方式一般分為兩種:橫向(水平)和縱向(垂直)。縱向(垂直)拆分方式從技術層面上來說相對簡單且便於維護,其基本原理是將原本存在於同一個資料庫中的屬於不同業務模組的資料表分別拆分到不同的資料庫中進行儲存(這些資料庫可能在同一作業系統上也可能不在同一作業系統上,可能在同一個資料庫叢集上也可能不在同一個資料庫叢集上)。縱向(垂直)拆分其操作目標是資料表,要完成這樣的拆分動作,技術團隊至少應該保證這些業務模組存在極少的耦合度。橫向(水平)拆分是指為了限制/減少將某張資料表中的資料規模,按照某種規則將這張資料表拆分成欄位相同的多張資料表,並存儲到不同的資料庫中(這些資料庫一般不在同一個作業系統上)。 橫向(水平)拆分操作目標是資料表中的資料,其目的是在結構化資料達到一定規模時(達到千萬級別),將針對資料表的某一次操作請求的壓力分配到若干個服務節點上。可見真正能夠進一步解決關係型資料庫效能問題的辦法,還需要對資料表進行橫向(水平)拆分,而MyCat的資料組織結構主要就是為了支援資料表的橫向(水平)拆分。

  • 邏輯庫(schema):前文中已經提到,MyCat資料庫中介軟體雖然本身不儲存任何資料,也不存在任何的資料表結構,更沒有任何資料庫檔案。但是為了描述底層真實資料的協調結構,MyCat資料庫中介軟體存在一些邏輯概念,首先最頂層的邏輯結構就是邏輯庫。連線使用MyCat資料庫中介軟體的上層業務系統,實際上並不知道最底層真實資料的組織結構,對於它來說MyCat就是它使用的一個邏輯庫。

  • 邏輯表(table)和邏輯節點/分片節點(dataNode):邏輯庫中包含多個邏輯表,所謂邏輯表同樣沒有真實資料,只是為了方便描述底層真實資料的協調結構和向上層使用者遮蔽訪問細節。邏輯表對應的邏輯儲存位置稱為邏輯節點/分片節點,邏輯表和邏輯節點/分片節點是進行資料表橫向(水平)拆分的關鍵,這是因為邏輯表不但可以指定自身的邏輯處理規則,還可以根據邏輯表和邏輯節點/分片節點的對應關係確定資料分發方式。

  • 節點主機(dataHost):邏輯節點最終要對應物理性質的配置,在MyCat中稱為節點主機。一個邏輯節點需要對應一個節點主機。在節點主機下技術人員可以設定物理節點,在上圖中MyCat節點主機dataHost2下設定了三個MySQL物理節點。通過節點主機配置的功能,技術人員還可以分別設定了這些物理節點的讀操作特性和寫操作特性。是的,這是MyCat支援讀寫分離功能的關鍵配置。

4-2、使用MyCat完成讀寫分離

作為快速上手也為了繼續優化之前文章中介紹的MySQL讀寫分離方案,本小節我們首先通過MyCat配置一個最簡的、單純的讀寫分離叢集。配置過程的是指也很簡單:不需要對邏輯表進行分片,也就是說只需要配置一個分片表和分片節點;只使用讀寫分離功能,也就是說只需要在這唯一的一個分片節點配置讀節點和寫節點以及節點健康的檢查策略

這裡寫圖片描述

您可以在MyCat官網上下載MyCat的Linux版本,在本文發表時MyCat穩定版本為V 1.6.1。MyCat資料庫中介軟體的工作目錄下的conf資料夾中存放著所有需要的配置檔案,其中有幾個配置檔案比較重要,它們是:schema.xml、rule.xml和server.xml。rule.xml描述了邏輯表和邏輯節點/分片節點的關聯規則,也即是資料的分片規則;server.xml描述了MyCat服務的訪問規則和使用者授權規則。最重要的是schema.xml檔案,其中描述了上文中我們提到的幾個關鍵概念,邏輯庫、邏輯表、分片節點和節點主機。一般來說我們要實現單純的讀寫分離叢集,只需要對schema.xml檔案進行更改:

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!-- 首先是邏輯庫的定義,邏輯庫名叫做qiangSchema。其中定義了兩個邏輯表 -->
    <schema name="qiangSchema" checkSQLschema="false" sqlMaxLimit="100">
        <!-- 
        邏輯表要和物理表的名字一樣,大小寫也最好一樣。關於type屬性的定義後文會詳細描述 
        兩張邏輯表都對應一個邏輯節點/分片節點——dn1。也就是說兩張邏輯表都不做水平拆分
        -->
        <table name="myuser" primaryKey="Id" type="global" dataNode="dn1" />
        <table name="t_user" primaryKey="uid" type="global" dataNode="dn1" />
    </schema>
    <!-- 邏輯節點/分片節點的定義,注意其使用的節點主機定義 -->
    <dataNode name="dn1" dataHost="dataHost" database="qiang" />
    <!-- 節點主機中包括兩個物理節點,其中一個是讀節點另一個是寫節點 -->
    <dataHost name="dataHost" maxCon="1000" minCon="10" balance="1" writeType="0"
        dbType="mysql" dbDriver="native" switchType="2">
        <heartbeat>select user()</heartbeat>
        <!-- MyCat支援一個節點主機下定義多個讀節點和多個寫節點 -->
        <writeHost host="hostM1" url="192.168.61.140:3306" user="root" password="123456">
            <!-- can have multi read hosts -->
            <readHost host="hostS1" url="192.168.61.141:3306" user="root" password="123456"/>
        </writeHost>
    </dataHost>
</mycat:schema>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

這裡要注意一個關鍵點,請在由Linux For MyCat控制的各個MySQL節點上設定“lower_case_table_names = 1”,否則使用MyCat的時候會提示找不到表的錯誤。以上程式碼段落示意了MyCat中實現的最簡單的讀寫分離叢集最關鍵的配置資訊,這裡對配置資訊進行一些必要的說明(部分說明直接摘自MyCat官方文件):

  • schema:checkSQLschema:當該值設定為 true 時,如果我們執行語句“select * from qiangSchema.travelrecord;”則 MyCat 會把語句修改為“select * from travelrecord;”。即把表示 schema 的字元去掉,避免傳送到後端資料庫執行時報“(ERROR 1146 (42S02): Table‘qiangSchema.travelrecord’ doesn’t exist)”。

  • schema:sqlMaxLimit:當該值設定為某個數值時。每條執行的 SQL 語句,如果沒有加上 limit 語句,MyCat 也會自動的加上所對應的值(適用於MySQL資料庫)。

  • table:primaryKey:該邏輯表對應真實表的主鍵。

  • table:type:該屬性定義了邏輯表的型別,目前邏輯表只有“全域性表”(global)和”普通表”兩種型別。如果是普通表,則不需要設定這個type屬性。那麼什麼叫做全域性表呢?資料庫拆分的關鍵在於被拆分的資料表和關聯表之間的join操作符,Mycat 中通過資料冗餘來解決這類表間的join操作問題,即所有的分片都有一份資料的拷貝,這樣的資料表定義為全域性表。在資料庫中存在的字典性質的的資料表或者變化率趨於0的資料表都應設定為全域性表。

  • dataHost:maxCon和dataHost:minCon:分別指定每個讀寫例項連線池的最大連線數和最小連線數。也就是說,標籤內巢狀的 writeHost、readHost 標籤都會使用這個屬性的值來例項化出連線池的最大連線數。

  • dataHost:balance:這個設定很關鍵,涉及到節點主機中各個物理節點的讀負載模式問題。設定值為0, 不開啟讀寫分離機制,所有讀操作都發送到當前可用的writeHost上;設定值為1,全部的readHost與stand by writeHost參與 select 語句的負載均衡;設定為2時,所有讀操作都隨機的在 writeHost、readhost 上分發;設定為3時,所有讀請求隨機的分發到 wiriterHost 對應的 readhost 執行,writerHost不負擔讀壓力。注意只在 MyCat Version 1.4及以後的版本才支援值為3的設定。

  • dataHost:writeType:該屬性涉及節點主機中個物理節點的寫負載模式問題。MyCat目前支援最好或者說推薦的設定值就是0。當writeType屬性設定為0時,所有寫操作傳送到配置的第一個writeHost,如果第一個writeHost掛了,則切到還生存的第二個writeHost。重新啟動後已切換後的為準,切換記錄在配置檔案dnindex.properties中。

  • dataHost:dbType和dataHost:dbDriver:dbType屬性指定後端連線的資料庫型別,目前支援二進位制的 mysql 協議,還有其他使用 JDBC 連線的資料庫。目前dbType屬性可指定的值包括:mysql、maridb、oracle、mongodb、postgresql。dbDriver屬性則可以給定連線指定資料庫所使用的驅動型別,如果是連線mysql和maridb,則該屬性可以設定為native(原生的mysql網路連線協議),否則請指定資料庫對應的JDBC驅動實現(需要將符合JDBC 4標準的驅動JAR包放到MyCat安裝路徑下的lib目錄中)。

  • dataHost:switchType:該屬性描述多個writeHost的切換機制,值為1時表示自動切換;值為2時,表示基於 MySQL 主從同步的狀態決定是否切換;值為3時,表示基於MySQL galary cluster 的切換機制。

配置完成schema.xml檔案並且儲存後,就可以用過“mycat console”命令啟動了。“mycat console”命令可以用於測試配置效果使用,因為這樣的啟動方式MyCat將會把日誌直接輸出到螢幕上。

# mycat console
Running Mycat-server...
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
jvm 1    | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
jvm 1    |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
jvm 1    |
jvm 1    | 2016-11-10 00:03:25,369 [INFO ][WrapperSimpleAppMain] total resouces of dataHost dataHost is :2  (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:100)
......
jvm 1    | 2016-11-10 00:03:26,874 [INFO ][WrapperSimpleAppMain] ===============================================  (io.mycat.MycatServer:MycatServer.java:266)
jvm 1    | 2016-11-10 00:03:26,874 [INFO ][WrapperSimpleAppMain] MyCat is ready to startup ...  (io.mycat.MycatServer:MycatServer.java:267)
jvm 1    | 2016-11-10 00:03:26,874 [INFO ][WrapperSimpleAppMain] Startup processors ...,total processors:2,aio thread pool size:4
jvm 1    |  each process allocated socket buffer pool  bytes ,a page size:2097152  a page's chunk number(PageSize/ChunkSize) is:512  buffer page's number is:40  (io.mycat.MycatServer:MycatServer.java:279)
......
jvm 1    | 2016-11-10 00:03:28,396 [INFO ][WrapperSimpleAppMain] using nio network handler   (io.mycat.MycatServer:MycatServer.java:381)
jvm 1    | 2016-11-10 00:03:28,513 [INFO ][WrapperSimpleAppMain] $_MyCatManager is started and listening on 9066  (io.mycat.MycatServer:MycatServer.java:397)
jvm 1    | 2016-11-10 00:03:28,515 [INFO ][WrapperSimpleAppMain] $_MyCatServer is started and listening on 8066  (io.mycat.MycatServer:MycatServer.java:401)
jvm 1    | 2016-11-10 00:03:28,515 [INFO ][WrapperSimpleAppMain] ===============================================  (io.mycat.MycatServer:MycatServer.java:403)
jvm 1    | 2016-11-10 00:03:28,515 [INFO ][WrapperSimpleAppMain] Initialize dataHost ...  (io.mycat.MycatServer:MycatServer.java:407)
......
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

可以看到MyCat啟動成功了,接下來就可以使用mysql的客戶端進行連線並測試讀寫操作執行了。

// 連線到mycat,mycat的埠為8066
# mysql -h 192.168.61.144 -P 8066 -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.29-mycat-1.6-RELEASE-20161028204710 MyCat Server (OpenCloundDB)
......

// 接下來執行一個insert語句:
> insert into myuser(Id,user_name,usersex,user_number) values (24,'user24',0,'242424');

// 從讀節點查詢剛才插入的資料
> select * from myuser;
+----+-----------+---------+-------------+
| Id | user_name | usersex | user_number |
+----+-----------+---------+-------------+
|  1 | 使用者1      |       1 |       11111 |
| 22 | 使用者22     |       0 |      220220 |
| 23 | 使用者23     |       1 |      232323 |
| 24 | user24    |       0 |      242424 |
+----+-----------+---------+-------------+
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

需要注意MyCat並不負責節點主機中設定的寫節點和讀節點間的資料同步過程,所以您還是需要使用MySQL Replicaion機制完成讀寫節點的同步工作。另外注意,某些MySQL第三方客戶端由於不支援NIO方式,所以連線MyCat還有一些問題,例如MySQL-Front。接下來的文章我們來實際搭建一個MyCat對資料庫叢集橫向拆分和縱向拆分的支援。

請註明來源:http://blog.csdn.net/yinwenjie(未經允許嚴禁用於商業用途!)

相關推薦

Mysql叢集之後如何分庫分表的方案實現

4-3、使用MyCat配置橫向拆分 之前文章中我們介紹瞭如何使用MyCat進行讀寫分離,類似的關係型資料庫的讀寫分離儲存方案可以在保持上層業務系統透明度的基礎上滿足70%業務系統的資料承載規模要求和效能要求。比起單純使用LVS + Replicaion的讀寫分離方案而言最大的優勢在於更能增加對上層業務系

Mysql叢集方案實現

4、改進方式三:MyCat資料庫中介軟體 在上文中我們介紹了MySQL讀寫分離叢集的持續優化方式。按照這樣的方式,叢集中負責讀寫分離的MySQL節點基本上能夠分別實現真對上層業務系統訪問的透明化。這樣的MySQL叢集方式已經可以承載讀者遇到的大部分業務系統的結構化資料規模,但整個叢集方案還有一些明顯的問

Centos7配置mysql主從:

表結構 .cn single 讀取 entos body 分享 posit bin-log mysql主從復制原理1.首先master將數據更新記錄到二進制binlog文件2.slave通過I/O線程向master請求binlog日誌文件指定位置之後的內容3.master接

Redis叢集搭建()

本文主要介紹一種通過Jedis&Sentinel實現Redis叢集高可用方案,該方案需要使用Jedis2.2.2及以上版本,Redis2.8及以上版本。 一、安裝redis 目的:搭建一

cool-2018-03-10-windows下實現mysql5.6讀寫分離、主從複製

mysql壓縮包移步下載:mysql5.6--主從資料庫的安裝第一步:複製mysql到自定義目錄中,我現在放的是 E:\cool\mysql,資料庫叫3380第二步: 刪除3380\logs目錄下的所有日誌檔案第三步驟: 刪除3380\datas所有的log檔案(注意不是所有

使用spring實現讀寫分離mysql主從複製五:實現

很多實際使用場景下都是採用“一主多從”的架構的,使用輪詢演算法實現,目前只需要修改DynamicDataSource即可。   1.1. 實現 import java.lang.reflect.Field; import java.util.ArrayList; impo

MySQL 5.6 的 半同步複製搭建已糾正

# The following options will be passed to all MySQL clients [client] #password       = your_password port            = 3306 socket          = /tmp/my

MySQL主從MySQL proxy Lua讀寫分離設置,同步配置,分庫分表方案

否則 count user username 2個 ons 基礎 zxvf 路徑 Mysql Proxy Lua讀寫分離設置一.讀寫分離說明讀寫分離(Read/Write Splitting),基本的原理是讓主數據庫處理事務性增、改、刪操作(INSERT、UPDATE、DE

Mysql DBA 高級運維學習筆記-宕機庫切換繼續庫同步過程

復制 導入數據 之間 pro vim 庫服務器 chan mas 優點 1.主庫master 宕機 登錄從庫show processlist\G 看兩個線程的更新狀態 mysql> show processlist\G ************************

Mysql讀寫分離配置簡記

近期開發的系統中使用MySql作為資料庫,由於資料涉及到Money,所以不得不慎重。同時,使用者對最大訪問量也提出了要求。為了避免Mysql成為效能瓶頸並具備很好的容錯能力,特此實現主從熱備和讀寫分離。在此簡做紀要,以備日後所用! 一、配置主從 條件:兩臺PC,IP分別為1

Mysql復制數據

sock 是否 art str cor term 數據庫 啟動 ado 應用場景:外部僅僅訪問主數據庫(Mysql_Master),多個從數據庫(Mysql_Slave)做數據庫熱備份。一旦主數據庫宕機,從服務器負責處理數據實驗拓補圖: 實驗環

搭建MySQL————VMware Workstation 虛擬機nat網絡配置

VMware Workstation 虛擬機 虛擬網絡 nat連接 運行 VMware Workstation Pro 在桌面找到該圖標,雙擊運行即可,如果沒有安裝請下載安裝。流程編輯 ==》虛擬網絡編輯器 ==》 VMnet0 如果沒有 添加網絡 最後設置完後,點擊確定即可。 配置虛

MySQL

MySQL主192.168.65.128上配置/etc/my.cnf[root@localhost ~]# /etc/init.d/mysqld restart Shutting down MySQL.. SUCCESS! Starting MySQL.. SUCCESS!備份數據從1、192.168.65.

CentOS6.5配置MYSQL詳解

ali ati In restart 配置文件 left 主庫 vim 數據庫 一、環境 1 操作系統 :CentOS 6.5 2 數據庫版本:MySQL 5.6.27 3 主機A:192.168.1.1 (Master) 4 從機B:192.168.1.2 (

mysql 配置說明

背景 mysql 一主多從的場景是經常見的,具體的業務場景裡我們一般讀的壓力遠遠是大於寫的壓力,master我們可以用來做寫操作,slave用來做讀操作、備份,可以做到資料庫的負載均衡。 同步複製過程說明  (1) master將改變記錄到二進位制日誌(binary log)中(這些記

關於RS485RS422匯流排,回覆訊號被拉低收不到反饋資料的問題。

晶片:MAX13487EESA(RS485) 這裡這個三個電阻不接。AK管不接也行。 如果你發現你在總線上掛接兩個以上的RS485模組,發現匯流排電壓和只接一個時波形幅度降低了,就是上面電阻和下面傳送時傳送使能腳用錯了。 晶片:SP3070EEN(RS422

MySql例項配置及環境搭建

主從複製原理 當 master 主伺服器上的資料發生改變時,則將其改變寫入二進位制日誌檔案中 salve 從伺服器會在一定時間間隔內對 master 主伺服器上的二進位制日誌進行探測,探測其是 否發生過改變 如果探測到 master 主伺服器的二進位制日誌發生了改變,則開始一個

redis高可用叢集搭建

Redis 一主兩從高可用環境搭建 Redis 支援 Master-Slave(主從)模式,Redis Server 可以設定為另一個 Redis Server 的主機(從機),從機定期從主機拿資料。特殊的,一個從機同樣可以設定為一個 Redis Server

Redis叢集——配置

在上一篇部落格中,討論瞭如何在Spring Boot中使用Redis實現快取。 但是資料庫顯然單點是不夠的,那麼如何用redis資料庫做快取叢集呢?我們今天就來研究一下。 Redis 支援 Master-Slave(主從)模式,Redis Server 可以設定為另一個

運維筆記36 mysql模型原始主從複製,基於GTID主從複製

概述: mysql的主從複製是十分經典的一個應用,但是主從之間總會有資料一致性(data consistency )的問題,一般情況從庫會落後主庫幾個小時,而且在傳統一主多從(mysql5.6之前)的模型中當master down掉後,我們不只是需要將一個sl