數(shù)據(jù)庫(kù)的寫入量高,是一個(gè)很常見(jiàn)的技術(shù)瓶頸,場(chǎng)景如央視春晚發(fā)紅包,千萬(wàn)級(jí)別的寫入qps。而解決方案有很多,筆者分享一些目前業(yè)界最成熟有效的措施:
一、分表將數(shù)據(jù)分?jǐn)偟蕉鄠€(gè)表上,流量也將分?jǐn)偟蕉鄠€(gè)表上,可以提高數(shù)據(jù)庫(kù)讀寫的吞吐量。
如將一個(gè)表從1個(gè),分解為256個(gè)。
二、緩存我們可以將數(shù)據(jù)庫(kù)中的熱點(diǎn)數(shù)據(jù),寫入緩存中,將讀請(qǐng)求的流量?jī)?yōu)先走緩存,這樣可以分?jǐn)倲?shù)據(jù)庫(kù)的讀壓力。
如使用Redis來(lái)存儲(chǔ)熱點(diǎn)數(shù)據(jù),而使用Canal將MySQL中的熱點(diǎn)數(shù)據(jù)同步到Redis中。
三、異步我們知道,MySQL數(shù)據(jù)庫(kù)日志系統(tǒng),有一個(gè)持久化日志redolog,原理是數(shù)據(jù)庫(kù)為了減少磁盤IO的次數(shù),將要寫入數(shù)據(jù)庫(kù)的數(shù)據(jù)先在內(nèi)存中暫存,后續(xù)再批量寫入磁盤中,這邊是異步的一種案例。
我們的系統(tǒng)設(shè)計(jì),也可以參考這個(gè)模式,將要寫入數(shù)據(jù)庫(kù)中的操作通過(guò)發(fā)送mq暫存到Kafka中,再通過(guò)消費(fèi)mq的方式,將數(shù)據(jù)寫入數(shù)據(jù)庫(kù),從而避免流量過(guò)大,一下子將數(shù)據(jù)庫(kù)打死了。
四、分庫(kù)經(jīng)過(guò)壓測(cè)得知,一個(gè)16核32G內(nèi)存500G硬盤的MySQL,它的寫入極限是5600/s,這是硬件上的極限,從軟件層面已無(wú)法提升。
如使用MyCat就是構(gòu)建數(shù)據(jù)庫(kù)集群,以增加更多的數(shù)據(jù)庫(kù)實(shí)例,從硬件層面上解決問(wèn)題。
五、其他以上是互聯(lián)網(wǎng)大廠最常用的優(yōu)化方案,只要你肯花心思,總有優(yōu)化的空間。