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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

京东面试官:呦,你对中间件 Mycat了解的还挺深~

發布時間:2023/12/4 编程问答 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 京东面试官:呦,你对中间件 Mycat了解的还挺深~ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.數據切分概念

數據的切分[(Sharding)]根據其切分規則的類型,可以分為兩種切分模式。一種是按照不同的表(或者Schema)來切分到不同的數據庫(主機))之上,這種切可以稱之為數據的垂直(縱向)切分;另外一則是根據表中的數據的邏輯關系,將同一個表中的數據按照某種條件拆分到多臺數據庫(主機)上面,這種切分稱之為數據的水平([橫向])切分。 垂直切分的最大特點就是規則簡單,實施也更為方便,尤其適合各業務之間的耦合度非常低,相互影響很小,業務邏輯非常清晰的系統。在這種系統中,可以很容易做到將不同業務模塊所使用的表分拆到不同的數據庫中。根據不同的表來進行拆分,對應用程序的影響也更小,拆分規則也會比較簡單清晰。 水平切分于垂直切分相比,相對來說稍微復雜一些。因為要將同一個表中的不同數據拆分到不同的數據庫中,對于應用程序來說,拆分規則本身就較根據表名來拆分更為復雜,后期的數據維護也會更為復雜一些。

垂直切分

一個數據庫由很多表的構成,每個表對應著不同的業務,垂直切分是指按照業務將表進行分類,分布到
不同 的數據庫上面,這樣也就將數據或者說壓力分擔到不同的庫上面,如下圖:


一般來講業務存在著復雜 join 的場景是難以切分的,往往業務獨立的易于切分。如何切分,切分到何種程度是考驗技術架構的一個難題。 下面來分析下垂直切分的優缺點:

優點:

  • 拆分后業務清晰,拆分規則明確。
  • 系統之間整合或擴展容易。
  • 數據維護簡單。

缺點:

  • 部分業務表無法 join,只能通過接口方式解決,提高了系統復雜度。
  • 受每種業務不同的限制存在單庫性能瓶頸,不易數據擴展跟性能提高。
  • 事務處理復雜。 由于垂直切分是按照業務的分類將表分散到不同的庫,所以有些業務表會過于龐大,存在單庫讀寫與存儲瓶頸,所以就需要水平拆分來做解決。

水平切分

相對于垂直拆分,水平拆分不是將表做分類,而是按照某個字段的某種規則來分散到多個庫之中,每個表中包含一部分數據。簡單來說,我們可以將數據的水平切分理解為是按照數據行的切分,就是將表中的某些行切分到一個數據庫,而另外的某些行又切分到其他的數據庫中,如圖:


拆分數據就需要定義分片規則。關系型數據庫是行列的二維模型,拆分的第一原則是找到拆分維度。幾種典型的分片規則包括: ? 按照用戶 ID 求模,將數據分散到不同的數據庫,具有相同數據用戶的數據都被分散到一個庫中。 ? 按照日期,將不同月甚至日的數據分散到不同的庫中。 ? 按照某個特定的字段求摸,或者根據特定范圍段分散到不同的庫中。


優點:

  • 拆分規則抽象好,join 操作基本可以數據庫做。
  • 不存在單庫大數據,高并發的性能瓶頸。
  • 應用端改造較少。
  • 提高了系統的穩定性跟負載能力。

缺點:

  • 拆分規則難以抽象。
  • 分片事務一致性難以解決。
  • 數據多次擴展難度跟維護量極大。
  • 跨庫 join 性能較差。

垂直切分和水平切分都有缺點,但共同的缺點有:

  • 引入分布式事務的問題。
  • 跨節點 Join 的問題。
  • 跨節點合并排序分頁問題。
  • 多數據源管理問題。

針對數據源管理,目前主要有兩種思路:

  • A. 客戶端模式,在每個應用程序模塊中配置管理自己需要的一個(或者多個)數據源,直接訪問各個數據 庫,在模塊內完成數據的整合;

  • B. 通過中間代理層來統一管理所有的數據源,后端數據庫集群對前端應用程序透明;

集中式代理 proxy mycat

嵌入應用去中心化架構 sharding-jdbc

基于主機進程的去中心化架構 sharding-sidecar service mesh

數據切分原則

第一原則:能不切分盡量不要切分。

第二原則:如果要切分一定要選擇合適的切分規則,提前規劃好。

第三原則:數據切分盡量通過數據冗余或表分組來降低跨庫 Join 的可能。

第四原則:由于數據庫中間件對數據 Join 實現的優劣難以把握,而且實現高性能難度極大,業務讀取盡量 少使用多表 Join。

2.什么是Mycat

定義

  • 一個徹底開源的,面向企業應用開發的大數據庫集群
  • 支持事務、ACID、可以替代MySQL的加強版數據庫
  • 一個可以視為MySQL集群的企業級數據庫,用來替代昂貴的Oracle集群
  • 一個融合內存緩存技術、NoSQL技術、HDFS大數據的新型SQL Server
  • 結合傳統數據庫和新型分布式數據倉庫的新一代企業級數據庫產品
  • 一個新穎的數據庫中間件產品


跨分片數據合并

應用場景

Mycat 發展到現在,適用的場景已經很豐富,而且不斷有新用戶給出新的創新性的方案,以下是幾個典
型的 應用場景:

單純的讀寫分離,此時配置最為簡單,支持讀寫分離,主從切換
分表分庫,對于超過 1000 萬的表進行分片,最大支持 1000 億的單表分片
多租戶應用,每個應用一個庫,但應用程序只連接 Mycat,從而不改造程序本身,實現多租戶化
報表系統,借助于 Mycat的分表能力,處理大規模報表的統計
替代 Hbase,分析大數據

作為海量數據實時查詢的一種簡單有效方案,比如 100 億條頻繁查詢的記錄需要在 3 秒內查詢出來結果, 除了基于主鍵的查詢,還可能存在范圍查詢或其他屬性查詢,此時 Mycat 可能是最簡單有效的選擇

3.Mycat中的核心概念及配置

核心概念

數據庫中間件
Mycat 是數據庫中間件,就是介于數據庫與應用之間,進行數據處理與交互的中間服務。

邏輯庫(schema)

通常對實際應用來說,并不需要知道中間件的存在,業務開發人員只需要知道數據庫的概念,所以
數據庫中間件可以被看做是一個或多個數據庫集群構成的邏輯庫

邏輯表(table)

邏輯表,可以是數據切分后,分布在一個或多個分片庫中,也可以不做數據切分,不分片,只有一
個表構成。

分片表 分片表,是指那些原有的很大數據的表,需要切分到多個數據庫的表,這樣,每個分
片都有一部分數據,所有分片構成了完整的數據。 例如在 mycat 配置中的 t_node 就屬于分
片表,數據按照規則被分到 dn1,dn2 兩個分片節點(dataNode) 上。

非分片表

一個數據庫中并不是所有的表都很大,某些表是可以不用進行切分的,非分片是相對分片表
來說的,就是那些不需要進行數據切分的表。
如下配置中 t_node,只存在于分片節點(dataNode)dn1 上。


分片節點(dataNode)

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

分片規則(rule)

一個大表被分成若干個分片表,就需要一定的規則,這樣按照某種業務規則把數據分到 某個分片
的規則就是分片規則,數據切分選擇合適的分片規則非常重要,將極大的避免后續數據處理的難
度。

全局序列號(sequence)

數據切分后,原有的關系數據庫中的主鍵約束在分布式條件下將無法使用,因此需要引入外部機制
保證數據 唯一性標識,這種保證全局性的數據唯一標識的機制就是全局序列號(sequence)。

安裝與配置

基于源碼

  • MyCAT-Server 源碼下載 MyCAT-Server 倉庫地址

  • 源碼調試與配置 MyCAT 目前主要通過配置文件的方式來定義邏輯庫和相關配置: ?MYCAT_HOME/conf/schema.xml 中定義邏輯庫,表、分片節點等內容.

  • ?MYCAT_HOME/conf/rule.xml 中定義分片規則.

  • ? MYCAT_HOME/conf/server.xml 中定義用戶以及系統相關變量,如端口等.

  • 源碼運行 MyCAT 入口程序是 org.opencloudb.MycatStartup.java ,需要設置MYCAT_HOME 目
    錄,為你工程當前所在目錄(src/main) , 設置完 MYCAT 主目錄后即可正常運行 MyCAT 服務。
    ](https://jq.qq.com/?_wv=1027&k=0IsBuUb0)
    linux安裝

下載

wget http://dl.mycat.io/1.6.7.3/20190927161129/Mycat-server-1.6.7.3-release- 20190927161129-linux.tar.gz #解壓進入mycat目錄 #啟動mycat ./bin/mycat start #停止 ./bin/mycat stop #重啟服務 ./bin/mycat restart #查看啟動狀態 ./bin/mycat status

conf 目錄下存放配置文件,server.xml 是 Mycat 服務器參數調整和用戶授權的配置文件,schema.xml 是邏 輯庫定義和表以及分片定義的配置文件,rule.xml 是分片規則的配置文件,分片規則的具體一些參數信息單獨存 放為文件

4. MyCat配置

  • bin 啟動目錄
  • conf 配置目錄存放配置文件:
  • server.xml:是Mycat服務器參數調整和用戶授權的配置文件。
  • schema.xml:是邏輯庫定義和表以及分片定義的配置文件。
  • rule.xml: 是分片規則的配置文件,分片規則的具體一些參數信息單獨存放為文件,也在這個目錄
    下,配置文件修改需要重啟MyCAT。
  • log4j.xml: 日志存放在logs/log中,每天一個文件,日志的配置是在conf/log4j.xml中,根據
    自己的需要可以調整輸出級別為debug debug級別下,會輸出更多的信
    息,方便排查問題。
  • autopartition-long.txt,partition-hash-int.txt,sequence_conf.properties,
  • sequence_db_conf.properties 分片相關的id分片規則配置文件
  • lib MyCAT自身的jar包或依賴的jar包的存放目錄。
  • logs MyCAT日志的存放目錄。日志存放在logs/log中,每天一個文件

下面圖片描述了Mycat最重要的3大配置文件:

配置Mycat環境參數

<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://org.opencloudb/"><system><property name="defaultSqlParser">druidparser</property></system> </mycat:server>

如例子中配置的所有的Mycat參數變量都是配置在server.xml 文件中,system標簽下配置所有的參數,如果需要配置某個變量添加相應的配置即可,例如添加啟動端口8066,默認為8066:

<property name="serverPort">8066</property>

其他所有變量類似。

配置Mycat邏輯庫與用戶

<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://org.opencloudb/"> <user name="mycat"> <property name="password">mycat</property> <property name="schemas">TESTDB</property> </user> </mycat:server>

如例子中配置的所有的Mycat連接的用戶與邏輯庫映射都是配置在server.xml 文件中,user標簽下配置所有的參數,例如例子中配置了一個mycat用戶供應用連接到mycat,同時mycat 在schema.xml中配置后了一個邏輯庫TESTDB,配置好邏輯庫與用戶的映射關系。【參考文獻】

配置邏輯庫(schema)

Mycat作為一個中間件,實現mysql協議,那么對前端應用連接來說就是一個數據庫,也就有數據庫的配置,mycat的數據庫配置是在schema.xml中配置,配置好后映射到server.xml里面的用戶就可以了。

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://org.opencloudb/"><schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"><table name="t_user" dataNode="dn1,dn2" rule="sharding-by-mod2"/><table name="ht_jy_login_log" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-date_jylog"/></schema><dataNode name="dn1" dataHost="localhost1" database="mycat_node1"/><dataNode name="dn2" dataHost="localhost1" database="mycat_node2"/><dataHost name="localhost1" writeType="0" switchType="1" slaveThreshold="100" balance="1" dbType="mysql" maxCon="10" minCon="1" dbDriver="native"><heartbeat>show status like 'wsrep%'</heartbeat><writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root" ></writeHost> </dataHost> </mycat:schema >

上面例子配置了一個邏輯庫TESTDB,同時配置了t_user,ht_jy_login_log兩個分片表。

邏輯表配置

<table name="t_user" dataNode="dn1,dn2" rule="sharding-by-mod2"/>

table 標簽 是邏輯表的配置 其中
name代表表名,
dataNode代表表對應的分片,
Mycat默認采用分庫方式,也就是一個表映射到不同的庫上,
rule代表表要采用的數據切分方式,名稱對應到rule.xml中的對應配置,如果要分片必須配置。

配置分片(dataNode)

<dataNode name="dn1" dataHost="localhost1" database="mycat_node1"/><dataNode name="dn2" dataHost="localhost1" database="mycat_node2"/>

表切分后需要配置映射到哪幾個數據庫中,Mycat的分片實際上就是庫的別名,例如上面例子配置了兩個分片dn1,dn2 分別對應到物理機映射dataHost localhost1 的兩個庫上。

配置物理庫分片映射(dataHost)

<dataHost name="localhost1" writeType="0" switchType="1" slaveThreshold="100" balance="1" dbType="mysql" maxCon="10" minCon="1" dbDriver="native"><heartbeat>show status like 'wsrep%'</heartbeat><writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root" ></writeHost> </dataHost>

Mycat作為數據庫代理需要邏輯庫,邏輯用戶,表切分后需要配置分片,分片也就需要映射到真實的物理主機上,至于是映射到一臺還是一臺的多個實例上,Mycat并不關心,只需要配置好映射即可,例如例子中:
配置了一個名為localhost1的物理主機(dataHost)映射。

heartbeat 標簽代表Mycat需要對物理庫心跳檢測的語句,正常情況下生產案例可能配置主從,或者多寫 或者單庫,無論哪種情況Mycat都需要維持到數據庫的數據源連接,因此需要定時檢查后端連接可以性,心跳語句就是來作為心跳檢測。

writeHost 此標簽代表 一個邏輯主機(dataHost)對應的后端的物理主機映射,例如例子中寫庫hostM1 映射到127.0.0.1:3306。如果后端需要做讀寫分離或者多寫 或者主從則通過配置 多個writeHost 或者readHost即可。

dataHost 標簽中的 writeType balance 等標簽則是不同的策略,具體參考指南。

表切分規則配置

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:rule SYSTEM "rule.dtd"> <mycat:rule xmlns:mycat="http://org.opencloudb/"><tableRule name="sharding-by-hour"><rule><columns>createTime</columns><algorithm>sharding-by-hour</algorithm></rule></tableRule><function name="sharding-by-hour" class="org.opencloudb.route.function.LatestMonthPartion"><property name="splitOneDay">24</property></function> </mycat:rule >

數據切分中作為表切分規則中最重要的配置,表的切分方式決定了數據切分后的性能好壞,因此也是最重要的配置。

如上面例子配置了一個切分規則,名為sharding-by-hour 對應的切分方式(function )是按日期切
分,該配置中:

tableRule

name 為schema.xml 中table 標簽中對應的 rule=“sharding-by-hour” ,也就是配置表的分片規則,columns 是表的切分字段: createTime 創建日期。algorithm 是規則對應的切分規則:映射到function 的name。

function

function 配置是分片規則的配置。

name 為切分規則的名稱,名字任意取,但是需要與tableRule 中匹配。

class 是切分規則對應的切分類,寫死,需要哪種規則則配置哪種,例如本例子是按小時分片:org.opencloudb.route.function.LatestMonthPartion

property 標簽是切分規則對應的不同屬性,不同的切分規則配置不同。【參考文獻】

5.Mycat讀寫分離實戰

Mysql同步原理

Mysql同步方案


docker配置

# masterdocker run --name mysql_master -v /root/mysql-cluster/master/:/etc/mysql/conf.d/ -e MYSQL_ROOT_PASSWORD=root -p 3316:3306 -d mysql:5.7 # slave1 docker run --name mysql_slave1 -v /root/mysql-cluster/slave1/:/etc/mysql/conf.d/ -e MYSQL_ROOT_PASSWORD=root -p 3326:3306 -d mysql:5.7 # slave2 docker run --name mysql_slave2 -v /root/mysql-cluster/slave2/:/etc/mysql/conf.d/ -e MYSQL_ROOT_PASSWORD=root -p 3336:3306 -d mysql:5.7

讀寫分離配置
配置 mysql 端主從的數據自動同步,mycat 不負責任何的數據同步問題
配置schema.xml

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" > <heartbeat>show slave status</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="localhost:3306" user="root" password="123456"> <!-- can have multi read hosts --> <readHost host="hostS1" url="localhost2:3306" user="root" password="123456" weight="1" /> </writeHost> </dataHost>強制走從: /*!mycat:db_type=slave*/ select * from travelrecord 強制走寫: /*!mycat:db_type=master*/ select * from travelrecord

6.Mycat 全局序列號

本地文件方式
配置schema.xml

<table name="travelrecord" dataNode="dn1" autoIncrement="true" primaryKey="id" />

編輯 server.xml

修改主鍵生成策略 <property name="sequnceHandlerType">0</property>

編輯sequence_conf.properties

#TRAVELRECORD 是表名稱 #HISIDS 表示歷史分段(一般無特殊需要則可以不配置) #MINID 最小id #MAXID 最大id #CURID 當前id TRAVELRECORD.HISIDS= TRAVELRECORD.MINID=10001 TRAVELRECORD.MAXID=20000 TRAVELRECORD.CURID=10000

本地時間戳方式
ID= 64 位二進制 (42(毫秒)+5(機器 ID)+5(業務編碼)+12(重復累加)
配置schema.xml

配置server.xml <property name="sequnceHandlerType">2</property>

在 mycat 下配置:sequence_time_conf.properties

WORKID=0-31 #任意整數 DATAACENTERID=0-31 #任意整數

多個個 mycat 節點下每個 mycat 配置的 WORKID,DATAACENTERID 不同,組成唯一標識,總共支持32*32=1024 種組合。

多個個 mycat 節點下每個 mycat 配置的 WORKID,DATAACENTERID 不同,組成唯一標識,總共支持32*32=1024 種組合。

最后,祝大家早日學有所成,拿到滿意offer

總結

以上是生活随笔為你收集整理的京东面试官:呦,你对中间件 Mycat了解的还挺深~的全部內容,希望文章能夠幫你解決所遇到的問題。

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