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