日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

开源数据库中间件-MyCa初探与分片实践

發(fā)布時間:2023/12/10 数据库 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开源数据库中间件-MyCa初探与分片实践 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  • 如今隨著互聯(lián)網(wǎng)的發(fā)展,數(shù)據(jù)的量級也是撐指數(shù)的增長,從GB到TB到PB。對數(shù)據(jù)的各種操作也是愈加的困難,傳統(tǒng)的關系性數(shù)據(jù)庫已經(jīng)無法滿足快速查詢與插入數(shù)據(jù)的需求。這個時候NoSQL的出現(xiàn)暫時解決了這一危機。它通過降低數(shù)據(jù)的安全性,減少對事務的支持,減少對復雜查詢的支持,來獲取性能上的提升。

  • 但是,在有些場合NoSQL一些折衷是無法滿足使用場景的,就比如有些使用場景是絕對要有事務與安全指標的。這個時候NoSQL肯定是無法滿足的,所以還是需要使用關系性數(shù)據(jù)庫。如果使用關系型數(shù)據(jù)庫解決海量存儲的問題呢?此時就需要做數(shù)據(jù)庫集群,為了提高查詢性能將一個數(shù)據(jù)庫的數(shù)據(jù)分散到不同的數(shù)據(jù)庫中存儲。

MyCat簡介

  • Mycat 背后是阿里曾經(jīng)開源的知名產(chǎn)品——Cobar。Cobar 的核心功能和優(yōu)勢是 MySQL 數(shù)據(jù)庫分片,此產(chǎn)品曾經(jīng)廣為流傳,據(jù)說最早的發(fā)起者對 Mysql 很精通,后來從阿里跳槽了,阿里隨后開源的 Cobar,并維持到 2013 年年初,然后,就沒有然后了。

  • Cobar 的思路和實現(xiàn)路徑的確不錯。基于 Java 開發(fā)的,實現(xiàn)了 MySQL 公開的二進制傳輸協(xié)議,巧妙地將自己偽裝成一個 MySQL Server,目前市面上絕大多數(shù)MySQL客戶端工具和應用都能兼容。比自己實現(xiàn)一個新的數(shù)據(jù)庫協(xié)議要明智的多,因為生態(tài)環(huán)境在哪里擺著。

  • Mycat 是基于 cobar 演變而來,對 cobar 的代碼進行了徹底的重構,使用 NIO 重構了網(wǎng)絡模塊,并且優(yōu)化了 Buffer 內核,增強了聚合,Join 等基本特性,同時兼容絕大多數(shù)數(shù)據(jù)庫成為通用的數(shù)據(jù)庫中間件。

  • 簡單的說,MyCAT就是:一個新穎的數(shù)據(jù)庫中間件產(chǎn)品支持mysql集群,或者mariadb?cluster,提供高可用性數(shù)據(jù)分片集群。你可以像使用mysql一樣使用mycat。對于開發(fā)人員來說根本感覺不到mycat的存在。

MyCat支持的數(shù)據(jù)庫:

MyCat下載及安裝

MySQL安裝與啟動

JDK:要求jdk必須是1.7及以上版本
MySQL:推薦mysql是5.5以上版本
MySQL安裝與啟動步驟如下:( 步驟1-5省略 )

  • 將MySQL的服務端和客戶端安裝包(RPM)上傳到服務器
  • 2. 查詢之前是否安裝過MySQL
    rpm -qa|grep -i mysql
    3. 卸載舊版本MySQL
    rpm -e --nodeps? 軟件名稱
    4. 安裝服務端
    rpm -ivh?MySQL-server-5.5.49-1.linux2.6.i386.rpm
    5. 安裝客戶端
    rpm -ivh?MySQL-client-5.5.49-1.linux2.6.i386.rpm
    6. 啟動MySQL服務
    service mysql start
    7. 登錄MySQL
    mysql -u root
    8. 設置遠程登錄權限
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION;
    在本地SQLyog 連接遠程MySQL進行測試

    MyCat安裝及啟動

    MyCat的官方網(wǎng)站: www.mycat.org.cn
    下載地址: github.com/MyCATApache…

  • 將Mycat-server-1.4-release-20151019230038-linux.tar.gz上傳至服務器
  • 將壓縮包解壓縮。建議將mycat放到/usr/local/mycat目錄下
  • tar -xzvf Mycat-server-1.4-release-20151019230038-linux.tar.gz mv mycat /usr/local 復制代碼
  • 進入mycat目錄的bin目錄,啟動: ./mycat start 停止:./mycat stop
  • mycat 支持的命令{ console | start | stop | restart | status | dump }
    Mycat的默認端口號為:8066

    MyCat分片

    什么是分片

    簡單來說,就是指通過某種特定的條件,將我們存放在同一個數(shù)據(jù)庫中的數(shù)據(jù)分散存放到多個數(shù)據(jù)庫(主機)上面,以達到分散單臺設備負載的效果。

    數(shù)據(jù)的切分(Sharding)根據(jù)其切分規(guī)則的類型,可以分為兩種切分模式。

  • 一種是按照不同的表(或者Schema)來切分到不同的數(shù)據(jù)庫(主機)之上,這種切分可以稱之為數(shù)據(jù)的垂直(縱向)切分
  • 2. 另外一種則是根據(jù)表中的數(shù)據(jù)的邏輯關系,將同一個表中的數(shù)據(jù)按照某種條件拆分到多臺數(shù)據(jù)庫(主機)上面,這種切分稱之為數(shù)據(jù)的水平(橫向)切分。

    MyCat分片策略:

    分片相關的概念

    邏輯庫(schema) :

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

    邏輯表(table):

    • 既然有邏輯庫,那么就會有邏輯表,分布式數(shù)據(jù)庫中,對應用來說,讀寫數(shù)據(jù)的表就是邏輯表。邏輯表,可以是數(shù)據(jù)切分后,分布在一個或多個分片庫中,也可以不做數(shù)據(jù)切分,不分片,只有一個表構成。

    分片表:

    • 是指那些原有的很大數(shù)據(jù)的表,需要切分到多個數(shù)據(jù)庫的表,這樣,每個分片都有一部分數(shù)據(jù),所有分片構成了完整的數(shù)據(jù)。 總而言之就是需要進行分片的表。

    非分片表:

    • 一個數(shù)據(jù)庫中并不是所有的表都很大,某些表是可以不用進行切分的,非分片是相對分片表來說的,就是那些不需要進行數(shù)據(jù)切分的表。

    分片節(jié)點(dataNode)

    • 數(shù)據(jù)切分后,一個大表被分到不同的分片數(shù)據(jù)庫上面,每個表分片所在的數(shù)據(jù)庫就是分片節(jié)點(dataNode)。

    節(jié)點主機(dataHost)

    • 數(shù)據(jù)切分后,每個分片節(jié)點(dataNode)不一定都會獨占一臺機器,同一機器上面可以有多個分片數(shù)據(jù)庫,這樣一個或多個分片節(jié)點(dataNode)所在的機器就是節(jié)點主機(dataHost),為了規(guī)避單節(jié)點主機并發(fā)數(shù)限制,盡量將讀寫壓力高的分片節(jié)點(dataNode)均衡的放在不同的節(jié)點主機(dataHost)。

    分片規(guī)則(rule)

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

    MyCat分片配置

  • 配置schema.xml
    • schema.xml作為MyCat中重要的配置文件之一,管理著MyCat的邏輯庫、邏輯表以及對應的分片規(guī)則、DataNode以及DataSource。弄懂這些配置,是正確使用MyCat的前提。這里就一層層對該文件進行解析。
    • schema 標簽用于定義MyCat實例中的邏輯庫
    • Table 標簽定義了MyCat中的邏輯表 rule用于指定分片規(guī)則,auto-sharding-long的分片規(guī)則是按ID值的范圍進行分片 1-5000000 為第1片 5000001-10000000 為第2片.... 具體設置我們會在第5小節(jié)中講解。
    • dataNode 標簽定義了MyCat中的數(shù)據(jù)節(jié)點,也就是我們通常說所的數(shù)據(jù)分片。
    • dataHost標簽在mycat邏輯庫中也是作為最底層的標簽存在,直接定義了具體的數(shù)據(jù)庫實例、讀寫分離配置和心跳語句。
    • 在服務器上創(chuàng)建3個數(shù)據(jù)庫,分別是db1 db2 db3
    • 修改schema.xml如下:<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://org.opencloudb/"><schema name="PINYOUGOUDB" checkSQLschema="false" sqlMaxLimit="100"><table name="tb_test" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /></schema><dataNode name="dn1" dataHost="localhost1" database="db1" /><dataNode name="dn2" dataHost="localhost1" database="db2" /><dataNode name="dn3" dataHost="localhost1" database="db3" /><dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="hostM1" url="192.168.25.142:3306" user="root"password="123456"></writeHost></dataHost> </mycat:schema> 復制代碼
  • 配置 server.xml
    • server.xml幾乎保存了所有mycat需要的系統(tǒng)配置信息。最常用的是在此配置用戶名、密碼及權限。在system中添加UTF-8字符集設置,否則存儲中文會出現(xiàn)問號
      <property name="charset">utf8</property>
    • 修改user的設置 , 我們這里為 PINYOUGOUDB設置了兩個用戶<user name="test"><property name="password">test</property><property name="schemas">PINYOUGOUDB</property></user><user name="root"><property name="password">123456</property><property name="schemas">PINYOUGOUDB</property></user> 復制代碼
  • MyCat分片測試

    進入mycat ,執(zhí)行下列語句創(chuàng)建一個表:

    CREATE TABLE tb_test (id BIGINT(20) NOT NULL,title VARCHAR(100) NOT NULL ,PRIMARY KEY (id) ) ENGINE=INNODB DEFAULT CHARSET=utf8 復制代碼

    創(chuàng)建后你會發(fā)現(xiàn),MyCat會自動將你的表轉換為大寫,這一點與Oracle有些類似。

    我們再查看MySQL的3個庫,發(fā)現(xiàn)表都自動創(chuàng)建好啦。好神奇。
    接下來是插入表數(shù)據(jù),注意,在寫INSERT語句時一定要寫把字段列表寫出來,否則會出現(xiàn)下列錯誤提示:
    錯誤代碼: 1064 partition table, insert must provide ColumnList
    我們試著插入一些數(shù)據(jù):

    INSERT INTO TB_TEST(ID,TITLE) VALUES(1,'goods1'); INSERT INTO TB_TEST(ID,TITLE) VALUES(2,'goods2'); INSERT INTO TB_TEST(ID,TITLE) VALUES(3,'goods3'); 復制代碼

    我們會發(fā)現(xiàn)這些數(shù)據(jù)被寫入到第一個節(jié)點中了,那什么時候數(shù)據(jù)會寫到第二個節(jié)點中呢? 我們插入下面的數(shù)據(jù)就可以插入第二個節(jié)點了
    INSERT INTO TB_TEST(ID,TITLE) VALUES(5000001,'goods5000001');

    因為我們采用的分片規(guī)則是每節(jié)點存儲500萬條數(shù)據(jù),所以當ID大于5000000則會存儲到第二個節(jié)點上。 目前只設置了兩個節(jié)點,如果數(shù)據(jù)大于1000萬條,會怎么樣呢?執(zhí)行下列語句測試一下 INSERT INTO TB_TEST(ID,TITLE) VALUES(10000001,'goods10000001');

    MyCat分片規(guī)則

    rule.xml用于定義分片規(guī)則 ,我們這里講解兩種最常見的分片規(guī)則

  • 按主鍵范圍分片rang-long,在配置文件中我們找到 <tableRule name="auto-sharding-long"><rule><columns>id</columns><algorithm>rang-long</algorithm></rule></tableRule> 復制代碼
    • tableRule 是定義具體某個表或某一類表的分片規(guī)則名稱,columns用于定義分片的列,algorithm代表算法名稱, 我們接著找rang-long的定義
    <function name="rang-long"class="org.opencloudb.route.function.AutoPartitionByLong"><property name="mapFile">autopartition-long.txt</property> </function> 復制代碼
    • Function用于定義算法 mapFile 用于定義算法需要的數(shù)據(jù),我們打開autopartition-long.txt
    # range start-end ,data node index # K=1000,M=10000. 0-500M=0 500M-1000M=1 1000M-1500M=2 復制代碼
  • 一致性哈希murmur
    • 當我們需要將數(shù)據(jù)平均分在幾個分區(qū)中,需要使用一致性hash規(guī)則, 我們找到function的name為murmur 的定義,將count屬性改為3,因為我要將數(shù)據(jù)分成3片
    <function name="murmur"class="org.opencloudb.route.function.PartitionByMurmurHash"><property name="seed">0</property> <!-- 默認是0 --><property name="count">3</property> <!-- 要分片的數(shù)據(jù)庫節(jié)點數(shù)量,必須指定,否則沒法分片 --><!-- 一個實際的數(shù)據(jù)庫節(jié)點被映射為這么多虛擬節(jié)點,默認是160倍,也就是虛擬節(jié)點數(shù)是物理節(jié)點數(shù)的160倍 --><property name="virtualBucketTimes">160</property><!-- <property name="weightMapFile">weightMapFile</property> 節(jié)點的權重,沒有指定權重的節(jié)點默認是1。以properties文件的格式填寫,以從0開始到count-1的整數(shù)值也就是節(jié)點索引為key,以節(jié)點權重值為值。所有權重值必須是正整數(shù),否則以1代替 --><!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 用于測試時觀察各物理節(jié)點與虛擬節(jié)點的分布情況,如果指定了這個屬性,會把虛擬節(jié)點的murmur hash值與物理節(jié)點的映射按行輸出到這個文件,沒有默認值,如果不指定,就不會輸出任何東西--> </function> 復制代碼
    • 我們再配置文件中可以找到表規(guī)則定義
    <tableRule name="sharding-by-murmur"><rule><columns>id</columns><algorithm>murmur</algorithm></rule> </tableRule> 復制代碼
    • 但是這個規(guī)則指定的列是id ,如果我們的表主鍵不是id ,而是order_id ,那么我們應該重新定義一個tableRule:
    <tableRule name="sharding-by-murmur-order"><rule><columns>order_id</columns><algorithm>murmur</algorithm></rule> </tableRule> 復制代碼
    • 在schema.xml中配置邏輯表時,指定規(guī)則為sharding-by-murmur-order <table name="tb_order" dataNode="dn1,dn2,dn3" rule="sharding-by-murmur-order" />
      我們測試一下,創(chuàng)建訂單表 ,并插入數(shù)據(jù),測試分片效果。

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

    數(shù)據(jù)庫讀寫分離對于大型系統(tǒng)或者訪問量很高的互聯(lián)網(wǎng)應用來說,是必不可少的一個重要功能。對于MySQL來說,標準的讀寫分離是主從模式,一個寫節(jié)點Master后面跟著多個讀節(jié)點,讀節(jié)點的數(shù)量取決于系統(tǒng)的壓力,通常是1-3個讀節(jié)點的配置
  • Mycat讀寫分離和自動切換機制,需要mysql的主從復制機制配合。

    擴展思考

  • 連表查詢怎么做
  • 分片策略是每個表需要配嗎?如果不配置的話會怎么樣?
  • 分片策略有哪些,都應對什么場景比較多
  • 支持事務嗎?怎么支持的?
  • 查詢夸庫時, 返回的結果集是怎么樣的?效率怎么樣呢?
  • 不同的分片策略下,實例擴展怎么操作
  • 缺點是怎么樣的
  • 總結

    以上是生活随笔為你收集整理的开源数据库中间件-MyCa初探与分片实践的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。