日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mongodb 查多个不等于_高可用架构之商城的mongodb设计分析

發(fā)布時間:2024/9/19 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mongodb 查多个不等于_高可用架构之商城的mongodb设计分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一. 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。