mongodb 查多个不等于_高可用架构之商城的mongodb设计分析
一. mongodb商品數(shù)據(jù)異構(gòu)和聚合設(shè)計
問題起因
對于商品詳情頁的數(shù)據(jù)來源于如下主要服務(wù):
1、商品基本信息
2、商品圖片服務(wù)
3、促銷服務(wù)
4、庫存狀態(tài)/配送至服務(wù)
5、廣告詞服務(wù)
6、預(yù)售服務(wù)
7、評價服務(wù)
8、試用服務(wù)
9、優(yōu)惠券服務(wù)
10、推薦服務(wù)
11、商品介紹服務(wù)
12、商品分類,商品品類相關(guān)的信息
那么問題來了, 現(xiàn)在要給前端返回商品詳情數(shù)據(jù), 要去這么多地方查嗎?
答案是,不需要的。
因為,我們可以將這些數(shù)據(jù)存在一個mongodb文檔中, 一個商品的商品詳情頁的所有信息只需要一條數(shù)據(jù)就存下來了。雖然mongodb和redis都是利用內(nèi)存加 速,且查詢速度都很快,但還是有一定的區(qū)別。
MongoDB 和redis的區(qū)別:
MongoDB 更類似 MySQL,支持字段索引、where等查詢,其優(yōu)勢在于查詢功能比較強(qiáng)大,擅長查詢 JSON 數(shù)據(jù),且能存儲海量數(shù)據(jù),但是不支持 事務(wù)。
Redis 是一個開源(BSD許可)的,內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)存儲系統(tǒng),支持多種類型的數(shù)據(jù)結(jié)構(gòu),可用作數(shù)據(jù)庫,高速緩存和消息隊列代理。
具體如何設(shè)計呢?
設(shè)計圖:
1. 如上所述,商品詳情頁的相關(guān)數(shù)據(jù)來源于12個不同的地方。當(dāng)這12個地方的相關(guān)數(shù)據(jù)發(fā)生變化時, 我們把數(shù)據(jù)推送到rabbitmq。
2. 數(shù)據(jù)聚合Worker去rabbitmq里面把消息取出來,然后把數(shù)據(jù)存入mongodb。
3. 商品詳情頁數(shù)據(jù)的呈現(xiàn)只需要查詢mongodb數(shù)據(jù)庫中的一條即可。
為什么要數(shù)據(jù)據(jù)異構(gòu)聚合??除了大大幅提升升訪問性性能和簡化訪問過程。。其中還還貫穿了了服務(wù)閉閉環(huán)的的思。
數(shù)據(jù)閉環(huán)
數(shù)據(jù)異構(gòu)系統(tǒng)。比如商品詳情頁的庫存顯示,我們不是去調(diào)用庫存服務(wù)獲取,而是庫存服務(wù)通過rabbitmq同步到商品詳情服務(wù)的mongodb的異構(gòu)數(shù) 據(jù)中。對于這些數(shù)據(jù)我們可以做異構(gòu),異構(gòu)過來我們只依賴于自己不依賴其他人。其他人服務(wù)出問題了,抖動了或者響應(yīng)慢了,對我們是沒有影響的。假設(shè)我們在設(shè)計頁面的時候有很多服務(wù)依賴于別人,出問題之后肯定先找我們。找我們的時候我們又需要去聯(lián)系其他的部門,就會存在溝通的問 題。
.2. mongodb急速查詢附近用戶之設(shè)計
場景:
首先,我們的app能夠獲取買家所在位置的經(jīng)緯度,其次,我們的數(shù)據(jù)庫存了商家店鋪的經(jīng)緯度。
需要實現(xiàn)的需求:現(xiàn)在我們的用戶要在我們商城app上由遠(yuǎn)及近查看他附近的商家。
那么后端要如何計算出該買家附近有哪些商家呢?
方案1:基于MySQL數(shù)據(jù)庫
MySQL的使用非常簡單。對于大部分已經(jīng)使用MySQL的網(wǎng)站來說,使用這種方案沒有任何遷移和部署成本,而在MySQL中查詢“最近的人”也僅需一條SQL即可。
SELECT id, ( 6371 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians ( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM places HAVING distance < 25 ORDER BY distance LIMIT 0 , 100;
注:這條SQL查詢的是在lat,lng這個坐標(biāo)附近的目標(biāo),并且按距離正序排列,SQL中的distance單位為公里,但使用SQL語句進(jìn)行查詢的缺點也顯而易見,每條SQL 的計算量都會非常大,有時候要十幾秒才能出結(jié)果,性能將會是嚴(yán)重的問題。
方案1的結(jié)果:
最近數(shù)據(jù)庫怎么cpu和內(nèi)存老是一不留意就跑滿了,甚至宕機(jī),經(jīng)查明,原來就是這貨的鍋。
方案2:mongodb geo方案
mongodb geo方案:
對于我們的需求,在MongoDB只需一個命令即可得到所需要的結(jié)果:
db.runCommand( { geoNear: "places", near: [ 121.4905, 31.2646 ], num:100 })
查詢結(jié)果默認(rèn)將會由近到遠(yuǎn)排序,而且查詢結(jié)果也包含目標(biāo)點對象、距離目標(biāo)點的距離等信息。
由于geoNear是MongoDB原生支持的查詢函數(shù),所以性能上也做到了高度的優(yōu)化,完全可以應(yīng)付生產(chǎn)環(huán)境的壓力。
3 mongodb(集群+副本集)架構(gòu)
從圖中可以看到有四個組件:route-mongos、config server、shard、secondary。
route-mongos,數(shù)據(jù)庫集群請求的入口,所有的請求都通過mongos進(jìn)行協(xié)調(diào),不需要在應(yīng)用程序添加一個路由選擇器,mongos自己就是一個請求分發(fā)中心,它負(fù)責(zé)把 對應(yīng)的數(shù)據(jù)請求請求轉(zhuǎn)發(fā)到對應(yīng)的shard服務(wù)器上。在生產(chǎn)環(huán)境通常有多mongos作為請求的入口,防止其中一個掛掉所有的mongodb請求都沒有辦法操作。
config server,顧名思義為配置服務(wù)器,存儲所有數(shù)據(jù)庫元信息(路由、分片)的配置。mongos本身沒有物理存儲分片服務(wù)器和數(shù)據(jù)路由信息,只是緩存在內(nèi)存 里,配置服務(wù)器則實際存儲這些數(shù)據(jù)。mongos第一次啟動或者關(guān)掉重啟就會從 config server 加載配置信息,以后如果配置服務(wù)器信息變化會通知到所有的 mongos 更新自己的狀態(tài),這樣 mongos 就能繼續(xù)準(zhǔn)確路由。在生產(chǎn)環(huán)境通常有多個 config server 配置服務(wù)器,因為它存儲了分片路由的元數(shù)據(jù),防止數(shù)據(jù)丟 失!
shard,分片(sharding)是指將數(shù)據(jù)庫拆分,將其分散在不同的機(jī)器上的過程。將數(shù)據(jù)分散到不同的機(jī)器上,不需要功能強(qiáng)大的服務(wù)器就可以存儲更多的數(shù)據(jù)和處 理更大的負(fù)載?;舅枷刖褪菍⒓锨谐尚K,這些塊分散到若干片里,每個片只負(fù)責(zé)總數(shù)據(jù)的一部分,最后通過一個均衡器來對各個分片進(jìn)行均衡(數(shù)據(jù)遷 移)。
secondary,中文翻譯副本集,其實就是shard的備份,防止shard掛掉之后數(shù)據(jù)丟失。復(fù)制提供了數(shù)據(jù)的冗余備份,并在多個服務(wù)器上存儲數(shù)據(jù)副本,提高了數(shù)據(jù) 的可用性, 并可以保證數(shù)據(jù)的安全性。
仲裁者(Arbiter),是復(fù)制集中的一個MongoDB實例,它并不保存數(shù)據(jù)。仲裁節(jié)點使用最小的資源并且不要求硬件設(shè)備,不能將Arbiter部署在同一個數(shù)據(jù)集節(jié)點 中,可以部署在其他應(yīng)用服務(wù)器或者監(jiān)視服務(wù)器中,也可部署在單獨的虛擬機(jī)中。為了確保復(fù)制集中有奇數(shù)的投票成員(包括primary),需要添加仲裁節(jié)點做為 投票,否則primary不能運行時不會自動切換primary。
簡單了解之后,我們可以這樣總結(jié)一下,應(yīng)用請求mongos來操作mongodb的增刪改查,配置服務(wù)器存儲數(shù)據(jù)庫元信息,并且和mongos做同步,數(shù)據(jù)最終存入在 shard(分片)上,為了防止數(shù)據(jù)丟失同步在副本集中存儲了一份,仲裁在數(shù)據(jù)存儲到分片的時候決定存儲到哪個節(jié)點。
總結(jié)
以上是生活随笔為你收集整理的mongodb 查多个不等于_高可用架构之商城的mongodb设计分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么叫俚语(市井俚语什么意思)
- 下一篇: case when嵌套子查询_Oracl