分布式篇-D 分布式數(shù)據(jù)同步
? 作者:田超凡
1 緩存一致性產(chǎn)生背景
答:當需要頻繁訪問數(shù)據(jù)庫的時候,雖然數(shù)據(jù)庫底層基于B+索引檢索數(shù)據(jù),但是仍然會十分消耗磁盤IO資源,導(dǎo)致數(shù)據(jù)庫訪問壓力增加。
此時可以基于緩存設(shè)計來減輕數(shù)據(jù)庫訪問壓力。
2 多級緩存架構(gòu)設(shè)計方案
答:多級緩存架構(gòu)設(shè)計采用的設(shè)計模式是裝飾者模式。
- 首先是JVM內(nèi)置緩存,如ehcache、oscache。數(shù)據(jù)同步可以基于RMI機制(JVM和JVM之間的通訊)實現(xiàn),效率比較低。
- 其次是外置緩存,如redis、memcached等,先查內(nèi)置緩存,內(nèi)置緩存沒有再查外置緩存,外置緩存沒有再查數(shù)據(jù)庫,然后同步數(shù)據(jù)到外置和內(nèi)置緩存中。
3 Mysql與Redis緩存一致性原理
答:
- 基本查詢流程:
首先從redis緩存中查詢數(shù)據(jù),如果能查到就直接返回客戶端,如果不能查到就再到數(shù)據(jù)庫中查詢,把查詢到的數(shù)據(jù)同步到redis緩存中,再返回查詢結(jié)果給客戶端。
- 基本數(shù)據(jù)同步實現(xiàn)原理:
大多數(shù)場景Redis都是作為只讀緩存,當mysql做增量寫操作時,會同步到Redis,此時分以下幾種情況討論:
- Insert db,insert redis 增量同步
- Update db,清除redis緩存,懶加載
- Update db,更新redis緩存,增量同步
- Delete db,? 清除redis緩存,增量同步
4 如果數(shù)據(jù)庫數(shù)據(jù)發(fā)生變化,如何同步給Redis
答:
- 刪除redis緩存,增量同步
- 基于MQ異步同步
- 基于canal異步同步
- 基于canal+MQ異步同步
5 canal數(shù)據(jù)同步實現(xiàn)原理
答:canal主要用途是對mysql增量日志(binlog)解析,提供增量數(shù)據(jù)訂閱和消費。
canal數(shù)據(jù)同步實現(xiàn)原理:
- Canal服務(wù)器端偽裝成mysql從節(jié)點,訂閱mysql主節(jié)點binlog日志
- 當mysql主節(jié)點binlog日志發(fā)生變化的時候,會通知給canal服務(wù)器端
- Canal服務(wù)器端接收到binlog增量數(shù)據(jù)日志,解析并轉(zhuǎn)換成json格式輸出到canal客戶端
- Canal客戶端接收到canal服務(wù)器端傳遞的增量數(shù)據(jù)日志后,異步寫入到redis實現(xiàn)數(shù)據(jù)同步
優(yōu)化建議:可以基于canal+kafka實現(xiàn)高效的異步數(shù)據(jù)同步,canal客戶端接收到canal服務(wù)器端發(fā)送的增量數(shù)據(jù)日志后,異步將增量數(shù)據(jù)消息投遞到kafka服務(wù)器端,再由kafka服務(wù)器端下游消費者訂閱kafka主題,異步獲取增量數(shù)據(jù)并同步到redis,大大提高大數(shù)據(jù)量數(shù)據(jù)同步場景下的數(shù)據(jù)同步效率。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-559821.html文章來源:http://www.zghlxwxcb.cn/news/detail-559821.html
?
到了這里,關(guān)于云事業(yè)群CTO線技術(shù)晉升考核機試題-分布式專題-D 分布式數(shù)據(jù)同步的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!