網(wǎng)上有很多關于pos機按鍵分離,數(shù)據(jù)庫主從復制的知識,也有很多人為大家解答關于pos機按鍵分離的問題,今天pos機之家(www.rcqwhg.com)為大家整理了關于這方面的知識,讓我們一起來看下吧!
本文目錄一覽:
1、pos機按鍵分離
pos機按鍵分離
隨著互聯(lián)網(wǎng)應用的廣泛普及,海量數(shù)據(jù)的存儲和訪問成為了系統(tǒng)設計的瓶頸問題。對于一個大型的互聯(lián)網(wǎng)應用,每天幾十億的PV無疑對數(shù)據(jù)庫造成了相當高的負載。對于系統(tǒng)的穩(wěn)定性和擴展性造成了極大的問題。通過數(shù)據(jù)切分來提高網(wǎng)站性能,橫向擴展數(shù)據(jù)層已經(jīng)成為架構研發(fā)人員首選的方式。
mysql主從復制原理
主要涉及三個線程:binlog 線程、I/O 線程和 SQL 線程。
binlog 線程 :負責將主服務器上的數(shù)據(jù)更改寫入二進制日志(Binary log)中。I/O 線程 :負責從主服務器上讀取二進制日志,并寫入從服務器的中繼日志(Relay log)。SQL 線程 :負責讀取中繼日志,解析出主服務器已經(jīng)執(zhí)行的數(shù)據(jù)更改并在從服務器中重放(Replay)。這張圖就很清晰表達出流程
1:主庫db的更新事件(update、insert、delete)被寫到binlog
2:從庫發(fā)起連接,連接到主庫3:此時主庫創(chuàng)建一個binlog dump thread線程,把binlog的內容發(fā)送到從庫
4:從庫啟動之后,創(chuàng)建一個I/O線程,讀取主庫傳過來的binlog內容并寫入到relay log
5:還會創(chuàng)建一個SQL線程,從relay log里面讀取內容,從Exec_Master_Log_Pos位置開始執(zhí)行讀取到的更新事件,將更新內容寫入到slave的db.
主從同步復制模式:
讀寫分離:
MYSQL讀寫分離的原理其實就是讓Master數(shù)據(jù)庫處理事務性增、刪除、修改、更新操作(CREATE、INSERT、UPDATE、DELETE),而讓Slave數(shù)據(jù)庫處理SELECT操作,MYSQL讀寫分離前提是基于MYSQL主從復制,這樣可以保證在Master上修改數(shù)據(jù),Slave同步之后,WEB應用可以讀取到Slave端的數(shù)據(jù)。
數(shù)據(jù)庫分區(qū):
分區(qū)并不是生成新的數(shù)據(jù)表,而是將表的數(shù)據(jù)均衡分攤到不同的硬盤,系統(tǒng)或是不同服務器存儲介子中,實際上還是一張表。另外,分區(qū)可以做到將表的數(shù)據(jù)均衡到不同的地方,提高數(shù)據(jù)檢索的效率,降低數(shù)據(jù)庫的頻繁IO壓力值,分區(qū)的優(yōu)點如下:
1、相對于單個文件系統(tǒng)或是硬盤,分區(qū)可以存儲更多的數(shù)據(jù);
2、數(shù)據(jù)管理比較方便,比如要清理或廢棄某年的數(shù)據(jù),就可以直接刪除該日期的分區(qū)數(shù)據(jù)即可;
3、精準定位分區(qū)查詢數(shù)據(jù),不需要全表掃描查詢,大大提高數(shù)據(jù)檢索效率;
4、可跨多個分區(qū)磁盤查詢,來提高查詢的吞吐量;
5、在涉及聚合函數(shù)查詢時,可以很容易進行數(shù)據(jù)的合并;
1、水平分區(qū)
這種形式分區(qū)是對表的行進行分區(qū),通過這樣的方式不同分組里面的物理列分割的數(shù)據(jù)集得以組合,從而進行個體分割(單分區(qū))或集體分割(1個或多個分區(qū))。所有在表中定義的列在每個數(shù)據(jù)集中都能找到,所以表的特性依然得以保持。
2、垂直分區(qū)
這種分區(qū)方式一般來說是通過對表的垂直劃分來減少目標表的寬度,使某些特定的列被劃分到特定的分區(qū),每個分區(qū)都包含了其中的列所對應的行。
什么時候考慮使用分區(qū)?
一張表的查詢速度已經(jīng)慢到影響使用的時候。sql經(jīng)過優(yōu)化數(shù)據(jù)量大表中的數(shù)據(jù)是分段的對數(shù)據(jù)的操作往往只涉及一部分數(shù)據(jù),而不是所有的數(shù)據(jù)分庫分表:
分庫分表的原因:
1、隨著單庫中的數(shù)據(jù)量越來越大,相應的,查詢所需要的時間也越來越多,相當于數(shù)據(jù)的處理遇到了瓶頸2、單庫發(fā)生意外的時候,需要修復的是所有的數(shù)據(jù),而多庫中的一個庫發(fā)生意外的時候,只需要修復一個庫(當然,也可以用物理分區(qū)的方式處理這種問題)
什么時候考慮使用分庫?
單臺DB的存儲空間不夠隨著查詢量的增加單臺數(shù)據(jù)庫服務器已經(jīng)沒辦法支撐分庫解決的問題:
其主要目的是為突破單節(jié)點數(shù)據(jù)庫服務器的 I/O 能力限制,解決數(shù)據(jù)庫擴展性問題。
垂直拆分
將系統(tǒng)中不存在關聯(lián)關系或者需要join的表可以放在不同的數(shù)據(jù)庫不同的服務器中。
按照業(yè)務垂直劃分。比如:可以按照業(yè)務分為資金、會員、訂單三個數(shù)據(jù)庫。
需要解決的問題:跨數(shù)據(jù)庫的事務、jion查詢等問題。
水平拆分
例如,大部分的站點。數(shù)據(jù)都是和用戶有關,那么可以根據(jù)用戶,將數(shù)據(jù)按照用戶水平拆分。
按照規(guī)則劃分,一般水平分庫是在垂直分庫之后的。比如每天處理的訂單數(shù)量是海量的,可以按照一定的規(guī)則水平劃分。需要解決的問題:數(shù)據(jù)路由、組裝。
什么時候考慮分表?
一張表的查詢速度已經(jīng)慢到影響使用的時候。sql經(jīng)過優(yōu)化數(shù)據(jù)量大當頻繁插入或者聯(lián)合查詢時,速度變慢分表解決的問題
分表后,單表的并發(fā)能力提高了,磁盤I/O性能也提高了,寫操作效率提高了
查詢一次的時間短了數(shù)據(jù)分布在不同的文件,磁盤I/O性能提高讀寫鎖影響的數(shù)據(jù)量變小插入數(shù)據(jù)庫需要重新建立索引的數(shù)據(jù)減少垂直分表
水平分表
存儲演變:
單庫單表
單庫單表是最常見的數(shù)據(jù)庫設計,例如,有一張用戶(user)表放在數(shù)據(jù)庫db中,所有的用戶都可以在db庫中的user表中查到。
單庫多表
隨著用戶數(shù)量的增加,user表的數(shù)據(jù)量會越來越大,當數(shù)據(jù)量達到一定程度的時候對user表的查詢會漸漸的變慢,從而影響整個DB的性能。如果使用mysql, 還有一個更嚴重的問題是,當需要添加一列的時候,mysql會鎖表,期間所有的讀寫操作只能等待。
可以通過某種方式將user進行水平的切分,產(chǎn)生兩個表結構完全一樣的user_0000,user_0001等表,user_0000 + user_0001 + …的數(shù)據(jù)剛好是一份完整的數(shù)據(jù)。
多庫多表
隨著數(shù)據(jù)量增加也許單臺DB的存儲空間不夠,隨著查詢量的增加單臺數(shù)據(jù)庫服務器已經(jīng)沒辦法支撐。這個時候可以再對數(shù)據(jù)庫進行水平拆分。
數(shù)據(jù)庫額外小知識:
MySQL 使用自增ID主鍵和UUID 作為主鍵的優(yōu)劣比較詳細過程(從百萬到千萬表記錄測試)
(1)單實例或者單節(jié)點組:
經(jīng)過500W、1000W的單機表測試,自增ID相對UUID來說,自增ID主鍵性能高于UUID,磁盤存儲費用比UUID節(jié)省一半的錢。所以在單實例上或者單節(jié)點組上,使用自增ID作為首選主鍵。
(2)分布式架構場景:
20個節(jié)點組下的小型規(guī)模的分布式場景,為了快速實現(xiàn)部署,可以采用多花存儲費用、犧牲部分性能而使用UUID主鍵快速部署;
20到200個節(jié)點組的中等規(guī)模的分布式場景,可以采用自增ID+步長的較快速方案。
200以上節(jié)點組的大數(shù)據(jù)下的分布式場景,可以借鑒類似twitter雪花算法構造的全局自增ID作為主鍵。
數(shù)據(jù)庫分庫分表,何時分?怎樣分?
一. 數(shù)據(jù)切分關系型數(shù)據(jù)庫本身比較容易成為系統(tǒng)瓶頸,單機存儲容量、連接數(shù)、處理能力都有限。當單表的數(shù)據(jù)量達到1000W或100G以后,由于查詢維 度較多,即使添加從庫、優(yōu)化索引,做很多操作時性能仍下降嚴重。此時就要考慮對其進行切分了,切分的目的就在于減少數(shù)據(jù)庫的負擔,縮短查詢時間。
數(shù)據(jù)庫分布式核心內容無非就是數(shù)據(jù)切分(Sharding),以及切分后對數(shù)據(jù)的定位、整合。數(shù)據(jù)切分就是將數(shù)據(jù)分散存儲到多個數(shù)據(jù)庫中,使得單一數(shù)據(jù)庫中的數(shù)據(jù)量變小,通過擴充主機的數(shù)量緩解單一數(shù)據(jù)庫的性能問題,從而達到提升數(shù)據(jù)庫操作性能的目的。數(shù)據(jù)切分根據(jù)其切分類型,可以分為兩種方式:垂直(縱向)切分和水平(橫向)切分
什么是垂直(縱向)切分?垂直切分常見有垂直分庫和垂直分表兩種。
垂直分庫就是根據(jù)業(yè)務耦合性,將關聯(lián)度低的不同表存儲在不同的數(shù)據(jù)庫。做法與大系統(tǒng)拆分為多個小系統(tǒng)類似,按業(yè)務分類進行獨立劃分。與"微服務治理"的做法相似,每個微服務使用單獨的一個數(shù)據(jù)庫。如圖:
垂直分表是基于數(shù)據(jù)庫中的"列"進行,某個表字段較多,可以新建一張擴展表,將不經(jīng)常用或字段長度較大的字段拆分出去到擴展表中。在字段很多的情況下(例 如一個大表有100多個字段),通過"大表拆小表",更便于開發(fā)與維護,也能避免跨頁問題,MySQL底層是通過數(shù)據(jù)頁存儲的,一條記錄占用空間過大會導 致跨頁,造成額外的性能開銷。另外數(shù)據(jù)庫以行為單位將數(shù)據(jù)加載到內存中,這樣表中字段長度較短且訪問頻率較高,內存能加載更多的數(shù)據(jù),命中率更高,減少了 磁盤IO,從而提升了數(shù)據(jù)庫性能。
垂直切分的優(yōu)點:
解決業(yè)務系統(tǒng)層面的耦合,業(yè)務清晰與微服務的治理類似,也能對不同業(yè)務的數(shù)據(jù)進行分級管理、維護、監(jiān)控、擴展等高并發(fā)場景下,垂直切分一定程度的提升IO、數(shù)據(jù)庫連接數(shù)、單機硬件資源的瓶頸缺點:
部分表無法join,只能通過接口聚合方式解決,提升了開發(fā)的復雜度分布式事務處理復雜依然存在單表數(shù)據(jù)量過大的問題(需要水平切分)什么是水平(橫向)切分?當一個應用難以再細粒度的垂直切分,或切分后數(shù)據(jù)量行數(shù)巨大,存在單庫讀寫、存儲性能瓶頸,這時候就需要進行水平切分了。
水平切分分為庫內分表和分庫分表,是根據(jù)表內數(shù)據(jù)內在的邏輯關系,將同一個表按不同的條件分散到多個數(shù)據(jù)庫或多個表中,每個表中只包含一部分數(shù)據(jù),從而使得單個表的數(shù)據(jù)量變小,達到分布式的效果。如圖所示:
庫內分表只解決了單一表數(shù)據(jù)量過大的問題,但沒有將表分布到不同機器的庫上,因此對于減輕MySQL數(shù)據(jù)庫的壓力來說,幫助不是很大,大家還是競爭同一個物理機的CPU、內存、網(wǎng)絡IO,最好通過分庫分表來解決。
水平切分的優(yōu)點:
不存在單庫數(shù)據(jù)量過大、高并發(fā)的性能瓶頸,提升系統(tǒng)穩(wěn)定性和負載能力應用端改造較小,不需要拆分業(yè)務模塊缺點:
跨分片的事務一致性難以保證跨庫的join關聯(lián)查詢性能較差數(shù)據(jù)多次擴展難度和維護量極大水平切分后同一張表會出現(xiàn)在多個數(shù)據(jù)庫/表中,每個庫/表的內容不同。
什么時候考慮切分1、能不切分盡量不要切分
并不是所有表都需要進行切分,主要還是看數(shù)據(jù)的增長速度。切分后會在某種程度上提升業(yè)務的復雜度,數(shù)據(jù)庫除了承載數(shù)據(jù)的存儲和查詢外,協(xié)助業(yè)務更好的實現(xiàn)需求也是其重要工作之一。
不到萬不得已不用輕易使用分庫分表這個大招,避免"過度設計"和"過早優(yōu)化"。分庫分表之前,不要為分而分,先盡力去做力所能及的事情,例如:升級硬件、升級網(wǎng)絡、讀寫分離、索引優(yōu)化等等。當數(shù)據(jù)量達到單表的瓶頸時候,再考慮分庫分表。
2、數(shù)據(jù)量過大,正常運維影響業(yè)務訪問
這里說的運維,指:
1)對數(shù)據(jù)庫備份,如果單表太大,備份時需要大量的磁盤IO和網(wǎng)絡IO。例如1T的數(shù)據(jù),網(wǎng)絡傳輸占50MB時候,需要20000秒才能傳輸完畢,整個過程的風險都是比較高的
2)對一個很大的表進行DDL修改時,MySQL會鎖住全表,這個時間會很長,這段時間業(yè)務不能訪問此表,影響很大。如果使用pt- online-schema-change,使用過程中會創(chuàng)建觸發(fā)器和影子表,也需要很長的時間。在此操作過程中,都算為風險時間。將數(shù)據(jù)表拆分,總量減 少,有助于降低這個風險。
3)大表會經(jīng)常訪問與更新,就更有可能出現(xiàn)鎖等待。將數(shù)據(jù)切分,用空間換時間,變相降低訪問壓力
3、隨著業(yè)務發(fā)展,需要對某些字段垂直拆分
4、數(shù)據(jù)量快速增長
隨著業(yè)務的快速發(fā)展,單表中的數(shù)據(jù)量會持續(xù)增長,當性能接近瓶頸時,就需要考慮水平切分,做分庫分表了。此時一定要選擇合適的切分規(guī)則,提前預估好數(shù)據(jù)容量
5、安全性和可用性
雞蛋不要放在一個籃子里。在業(yè)務層面上垂直切分,將不相關的業(yè)務的數(shù)據(jù)庫分隔,因為每個業(yè)務的數(shù)據(jù)量、訪問量都不同,不能因為一個業(yè)務把數(shù) 據(jù)庫搞掛而牽連到其他業(yè)務。利用水平切分,當一個數(shù)據(jù)庫出現(xiàn)問題時,不會影響到100%的用戶,每個庫只承擔業(yè)務的一部分數(shù)據(jù),這樣整體的可用性就能提 高。
案例分析1、用戶中心業(yè)務場景
用戶中心是一個非常常見的業(yè)務,主要提供用戶注冊、登錄、查詢/修改等功能,其核心表為:
任何脫離業(yè)務的架構設計都是耍流氓,在進行分庫分表前,需要對業(yè)務場景需求進行梳理:
用戶側:前臺訪問,訪問量較大,需要保證高可用和高一致性。主要有兩類需求:用戶登錄:通過login_name/phone/email查詢用戶信息,1%請求屬于這種類型用戶信息查詢:登錄之后,通過uid來查詢用戶信息,99%請求屬這種類型運營側:后臺訪問,支持運營需求,按照年齡、性別、登陸時間、注冊時間等進行分頁的查詢。是內部系統(tǒng),訪問量較低,對可用性、一致性的要求不高。2、水平切分方法
當數(shù)據(jù)量越來越大時,需要對數(shù)據(jù)庫進行水平切分,上文描述的切分方法有"根據(jù)數(shù)值范圍"和"根據(jù)數(shù)值取模"。
"根據(jù)數(shù)值范圍":以主鍵uid為劃分依據(jù),按uid的范圍將數(shù)據(jù)水平切分到多個數(shù)據(jù)庫上。例如:user-db1存儲uid范圍為0~1000w的數(shù)據(jù),user-db2存儲uid范圍為1000w~2000wuid數(shù)據(jù)。
優(yōu)點是:擴容簡單,如果容量不夠,只要增加新db即可。不足是:請求量不均勻,一般新注冊的用戶活躍度會比較高,所以新的user-db2會比user-db1負載高,導致服務器利用率不平衡"根據(jù)數(shù)值取模":也是以主鍵uid為劃分依據(jù),按uid取模的值將數(shù)據(jù)水平切分到多個數(shù)據(jù)庫上。例如:user-db1存儲uid取模得1的數(shù)據(jù),user-db2存儲uid取模得0的uid數(shù)據(jù)。
優(yōu)點是:數(shù)據(jù)量和請求量分布均均勻不足是:擴容麻煩,當容量不夠時,新增加db,需要rehash。需要考慮對數(shù)據(jù)進行平滑的遷移。3、非uid的查詢方法
水平切分后,對于按uid查詢的需求能很好的滿足,可以直接路由到具體數(shù)據(jù)庫。而按非uid的查詢,例如login_name,就不知道具體該訪問哪個庫了,此時需要遍歷所有庫,性能會降低很多。
對于用戶側,可以采用"建立非uid屬性到uid的映射關系"的方案;對于運營側,可以采用"前臺與后臺分離"的方案。
3.1、建立非uid屬性到uid的映射關系
1)映射關系
例如:login_name不能直接定位到數(shù)據(jù)庫,可以建立login_name→uid的映射關系,用索引表或緩存來存儲。當訪問login_name時,先通過映射表查詢出login_name對應的uid,再通過uid定位到具體的庫。
映射表只有兩列,可以承載很多數(shù)據(jù),當數(shù)據(jù)量過大時,也可以對映射表再做水平切分。這類kv格式的索引結構,可以很好的使用cache來優(yōu)化查詢性能,而且映射關系不會頻繁變更,緩存命中率會很高。
3.2、前臺與后臺分離
對于用戶側,主要需求是以單行查詢?yōu)橹鳎枰ogin_name/phone/email到uid的映射關系,可以解決這些字段的查詢問題。
而對于運營側,很多批量分頁且條件多樣的查詢,這類查詢計算量大,返回數(shù)據(jù)量大,對數(shù)據(jù)庫的性能消耗較高。此時,如果和用戶側公用同一批服務或數(shù)據(jù)庫,可能因為后臺的少量請求,占用大量數(shù)據(jù)庫資源,而導致用戶側訪問性能降低或超時。
這類業(yè)務最好采用"前臺與后臺分離"的方案,運營側后臺業(yè)務抽取獨立的service和db,解決和前臺業(yè)務系統(tǒng)的耦合。由于運營側對可用 性、一致性的要求不高,可以不訪問實時庫,而是通過binlog異步同步數(shù)據(jù)到運營庫進行訪問。在數(shù)據(jù)量很大的情況下,還可以使用ES搜索引擎或Hive 來滿足后臺復雜的查詢方式。
常用的支持分庫分表中間件:sharding-jdbc(當當)TSharding(蘑菇街)Atlas(奇虎360)Cobar(阿里巴巴)MyCAT(基于Cobar)Oceanus(58同城)Vitess(谷歌)以上就是關于pos機按鍵分離,數(shù)據(jù)庫主從復制的知識,后面我們會繼續(xù)為大家整理關于pos機按鍵分離的知識,希望能夠幫助到大家!