<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
資料庫架構演變
剛開始多數專案用單機資料庫就夠了,隨著伺服器流量越來越大,面對的請求也越來越多,我們做了資料庫讀寫分離, 使用多個從庫副本(Slave)負責讀,使用主庫(Master)負責寫,master和slave通過主從複製實現資料同步更新,保持資料一致。slave 從庫可以水平擴充套件,所以更多的讀請求不成問題
但是當用戶量級上升,寫請求越來越多,怎麼保證資料庫的負載足夠?增加一個Master是不能解決問題的, 因為資料要儲存一致性,寫操作需要2個master之間同步,相當於是重複了,而且架構設計更加複雜
這時需要用到分庫分表(sharding),把庫和表存放在不同的MySQL Server上,每臺伺服器可以均衡寫請求的次數
拆分策略
單個庫太大,先考慮是表多還是資料多:
分庫分表的原則應該是先考慮垂直拆分,再考慮水平拆分
分庫分表和讀寫分離可以共同進行
server.xml
<user name="root"> <property name="password">123456</property> <property name="schemas">USERDB1,USERDB2</property> </user>
設定了USERDB1、USERDB2這兩個邏輯庫
schema.xml
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!-- 邏輯資料庫 --> <schema name="USERDB1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1" /> <!-- 兩個邏輯庫對應兩個不同的資料節點 --> <schema name="USERDB2" checkSQLschema="false" sqlMaxLimit="100"dataNode="dn2" /> <!-- 儲存節點 --> <dataNode name="dn1" dataHost="node1" database="mytest1" /> <!-- 兩個資料節點對應兩個不同的物理機器 --> <dataNode name="dn2" dataHost="node2" database="mytest2" /> <!-- USERDB1對應mytest1,USERDB2對應mytest2 --> <!-- 資料庫主機 --> <dataHost name="node1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <writeHost host="192.168.131.129" url="192.168.131.129:3306" user="root" password="123456" /> </dataHost> <dataHost name="node2" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <writeHost host="192.168.0.6" url="192.168.0.6:3306" user="root" password="123456" /> </dataHost> </mycat:schema>
兩個邏輯庫對應兩個不同的資料節點,兩個資料節點對應兩個不同的物理機器
mytest1和mytest2分成了不同機器上的不同的庫,各包含一部分表,它們原來是合在一塊的,在一臺機器上,現在做了垂直的拆分。
使用者端就需要去連線不同的邏輯庫了,根據業務操作不同的邏輯庫
然後設定了兩個寫庫,兩臺機器把庫平分了,分擔了原來單機的壓力。分庫伴隨著分表,從業務上對錶拆分
垂直分表,基於列欄位進行。一般是針對幾百列的這種大表,也避免查詢時,資料量太大造成的“跨頁”問題。
一般是表中的欄位較多,將不常用的, 資料較大,長度較長(比如text型別欄位)的拆分到擴充套件表。存取頻率較高的欄位單獨放在一張表
針對資料量巨大的單張表(比如訂單表),按照某種規則(RANGE、HASH取模等),切分到多張表裡面去。 但是這些表還是在同一個庫中,所以庫級別的資料庫操作還是有IO瓶頸,不建議採用
將單張表的資料切分到多個伺服器上去,每個伺服器具有一部分庫與表,只是表中資料集合不同。 水平分庫分表能夠有效的緩解單機和單庫的效能瓶頸和壓力,突破IO、連線數、硬體資源等的瓶頸
分庫分表可以和主從複製同時進行,但不基於主從複製;讀寫分離才基於主從複製
server.xml
<user name="root"> <property name="password">123456</property> <property name="schemas">USERDB</property> </user>
schema.xml
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!-- 邏輯資料庫 --> <schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100"> <table name="user" dataNode="dn1" /> <!-- 這裡的user和student都是實際存在的物理表名 --> <table name="student" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2" rule="mod-long"/> </schema> <!-- 儲存節點 --> <dataNode name="dn1" dataHost="node1" database="mytest1" /> <dataNode name="dn2" dataHost="node2" database="mytest2" /> <!-- 資料庫主機 --> <dataHost name="node1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <writeHost host="192.168.131.129" url="192.168.131.129:3306" user="root" password="123456" /> </dataHost> <dataHost name="node2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <writeHost host="192.168.0.6" url="192.168.0.6:3306" user="root" password="123456" /> </dataHost> </mycat:schema>
user表示一個普通的表,直接放在資料節點dn1上,放在一臺機器上,這張表不用進行拆分
student表的primaryKey是id,根據id拆分,放在dn1和dn2上,最終這個表要分在兩臺機器上,在物理上分開了,但是在邏輯上還是一個,往哪張表裡增加,在2臺機器上查詢然後如何合併這些操作都是由mycat完成的
拆分的規則是取模(mod - long),每次插入用id模上存在的機器數(2)
此外還需要在rule.xml中設定以下拆分演演算法
找到演演算法mod-long,因為我們將邏輯表student分開對映到兩臺主機上,所以修改資料節點的數量為2
2. 測試水平分表
Linux主機
Windows主機
登入到mycat的8066埠
使用MyCat給user表插入兩條資料
由於schema.xml組態檔中,邏輯表user只在Linux主機的mytest1庫中存在,mycat操作的邏輯表user會影響Linux主機上的物理表,而不會影響Windows主機上的表。我們分別檢視一下Linux和Windows主機的user表:
我們再通過MyCat給student表插入兩條資料
我們知道schema.xml組態檔中,邏輯表student對應兩臺主機上的兩個庫mytest1、mytest2中的兩張表,所以對邏輯表插入的兩條資料,會實際影響到兩張物理表(用id%機器數
,決定插入到哪張物理表)。我們分別檢視一下Linux和Windows主機的student表:
再通過MyCat插入id=3和id=4的資料,應該插入不同主機上的不同物理表
這就相當於把student表進行水平拆分了
通過MyCat查詢的時候只需要正常輸入就行,我們設定的是表拆分後放在這2個資料節點上,MyCat會根據設定在兩個庫上查詢並進行資料合併
到此這篇關於MySQL 分庫分表的專案實踐的文章就介紹到這了,更多相關MySQL 分庫分表內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45