分散式資料庫對比評測(Es,mongodb,redis)基礎知識篇
前言
我建議大家看下這個,否則後面你不知道我在說什麼。
1.ES資料庫相關概念
啥是Es,說白了就是支援文件搜尋的分散式資料庫,專門方便搜尋的,GITHUB京東現在都在用。
1.ES的資料庫存放在哪裡?
一開始安裝的時候有個配置檔案elasticsearch.conf,裡面會讓你設定data的存放位置,我一般是放在ES資料夾下的data資料夾內。ES的邏輯是大部分的資料都存放在硬碟內,但是會把一些索引什麼的放在記憶體內,方便檢索。
2.ES為什麼會佔用很多記憶體?可否優化
主要是java佔用了記憶體,這是ES必須要java環境所導致的,在jvm.conf可以對java記憶體佔用做個限制,不過我一般都是預設,預設基本就夠了。一般是
3.ES支援多檢索麼?
支援,肯定支援,還支援漢字,英文,數字搜尋,我搜monlog中存在“disk”這個欄位的文件時,瞬時就搜出來了,快的飛起。
4.ES有無配套的python庫?是否好用?
有個同名的庫elasticsearch,我認為很好用了,我把它的大部分功能都封裝成介面了,在測試指令碼資料夾下。
5.ES的基本術語?
索引:相當於DB的database
Type:相當於DB的table
Index:有相似特徵的documents集合
Source:想當於DB的資訊
主分片:每個文件都儲存在一個主要分片上。當你索引一個文件時,索引首先生成在主分片上,然後才到主分片的所有副本上。預設情況下,索引有5
副本分片:每個主分片可以有零個或多個副本。副本是主分片的一個拷貝,有兩個作用:
1、故障轉移:如果主分片有問題,副本分片可以提升為主分片;
2、提高效能:獲取和搜尋請求可以處理主分片或副本分片。
6.ES和ETCD有哪些不一樣?
1.ES支援更多的儲存格式
2.ES檢索資料很快
3.ES更多的就是作為日誌系統使用,契合需求
4.ES資料會落盤,不會佔用過多記憶體。
7.ES可否支援多節點和可擴容?
多節點肯定支援,在你安裝的時候conf檔案配置就會讓你填寫節點名還有節點內ip。
擴容:一般是水平擴容,同叢集中節點之間可以擴容縮容。只需要在引數上配置新增的hosts
8.如果宕機,怎麼保障資料的安全不丟失?
分兩種情況:
第一種就是三個機器,掛了主節點,或者是掛了其中一個,這種情況,在安裝設定時有個引數,master.node,這個意思是允許這個節點被設定為主節點,如果主節點掛掉,其他的節點會被重新選舉為主節點。繼續接力。
第二種,全部掛掉,這時候所有的機器都掛了,你根本就沒辦法,解決了問題,開機,ES會自動的尋找備份節點/檔案恢復資料,在找到備份之後,ES會在不影響系統的情況下恢復資料,同時繼續接力。
2.Redis相關概念
1.Redis的資料放在哪?
Redis一般都是將資料直接放到記憶體裡,當然,你可以設定一個閥值,到了界限儲存到硬碟。
2.為什麼Redis這麼快?
放在記憶體裡,資料檔案小,基本就是實時的,肯定快啊。
3.Redis的弊端在哪?
成也記憶體,敗也記憶體,如果資料量大,記憶體佔用的也就越多,持久化也就越麻煩。
擴容麻煩的不行。
網路不好,萬一備份失敗,所有資料就GG了。
持久化的操作阻塞主執行緒
持久化方案弊端明顯
4.如何保持資料的持久化?
兩種方法:
設定閥值,定時儲存。
設定key過期時間,不過我想日誌檔案還是不要這麼操作了吧。
5.如果宕機,資料怎麼儲存?
RDB方式(預設),當符合一定條件時Redis會自動將記憶體中的所有資料進行快照並存儲在硬碟上。
進行快照的條件可以由使用者在配置檔案中自定義,
由兩個引數構成:時間和改動的鍵的個數。當在指定的時間內被更改的鍵的個數大於指定的數值時就會進行快照。RDB是redis預設採用的持久化方式。
6.Redis的基本術語
Redis集合:你可以想象成(“key”,”value”)
Redis支援的5種資料型別:String, hash, list, set, zset
Redis持久化:RDB
Redis資料存在記憶體中。
Redis一般應用在快取中。
7.為什麼選redis?
速度快,讀取快,反正就是快。
分散式,可擴縮,支援的資料量中規中矩。
8.對可擴容的支援如何?
Redis使用了一致性哈稀進行分片,那麼不同的key分佈到不同的Redis-Server上,當我們需要擴容時,需要增加機器到分片列表中。
這時候會使得同樣的key算出來落到跟原來不同的機器上,這樣如果要取某一個值,會出現取不到的情況,之前的快取相當於全部失效。對於擴容問題,Redis的作者提出了一種名為Pre-Sharding的方式。即事先部署足夠多的Redis服務。
3.Mongodb相關概念
1.mongodb基本術語
sql術語/概念 |
MongoDB術語/概念 |
解釋/說明 |
database |
database |
資料庫 |
table |
collection |
資料庫表/集合 |
row |
document |
資料記錄行/文件 |
column |
field |
資料欄位/域 |
index |
index |
索引 |
table joins |
|
表連線,MongoDB不支援 |
primary key |
primary key |
主鍵,MongoDB自動將_id欄位設定為主鍵 |
2.mongodb和我們的系統能否契合
契合,因為mongodb本身自己支援分散式,並且支援多種儲存形式,所以和我們本身存的資料比較契合。而且mongodb比較好搭建,不像redis還要編譯,ES需要java。開箱即用,只是要配conf檔案。
3.mongodb的缺點
l 不支援事務操作
l 佔用空間過大
l MongoDB沒有如MySQL那樣成熟的維護工具
l 無法進行關聯表查詢,不適用於關係多的資料
l 複雜聚合操作通過mapreduce建立,速度慢
| 模式自由, 自由靈活的檔案儲存格式帶來的資料錯誤
4.宕機了怎麼辦?
1、Mongos節點宕機
一個Mongos程序應該執行在每一個應用程式伺服器上,這個伺服器應該獨佔這個Mongos程序,並且通過它與分片叢集來通訊。
Mongos程序不是持久化的,相反,它們在啟動的時候從Config Server上收集所有必須的配置資訊。
這表明,任何一個應用程式伺服器節點故障,對作為一個整體的分片叢集來講並沒有什麼影響,所有別的應用程式伺服器將依然是繼續正常工作。
在這種情況下,恢復是一個相當簡單的事情,我們只需要去啟動一個新的應用程式伺服器和一個新的Mongos程序即可。
2、分片中的某一個Mongod節點宕機
每一個分片由n個伺服器構成,這n個伺服器被配置為一個複製集(replica set)。如果在複製集中的任何一個節點宕機,在這個分片上讀與寫操作任然是允許的。
更加重要的是,宕機伺服器上的資料都不會丟失,因為複製機制存在一個選項,那就是強制複製寫操作到分片的其它節點上再返回,這與在Dynamo上設定write=2類似。
3、分片中的所有Mongod節點宕機
如果一個分片中的全部節點(replicas)都宕機了,在該分片內的資料將不能被訪問。然而,操作任然是繼續進行,只不過是由別的分片分擔。看文件就可以弄清楚為什麼這樣。
如果分片被配置為一個複製集(Replicas set),至少一個成員應該在另外一個數據中心,那樣的話,整個分片都宕機幾乎是不可能的。為了有更大的冗餘度,推薦這樣進行配置。
5.資料持久化的支援如何?
mongodb預設每隔100毫秒或者寫入資料達到若干兆位元組後,便會將這些操作寫入到日誌。即mongodb不會在每次寫入的時候都寫入到日誌,而是會成批量的提交更改。因此,在預設設定情況下,mongodb不會丟失超過100毫秒的資料。
因此,在Mongodb中存在丟失資料的可能。
我這裡的建議是雙備份,一份定時備份,一份日誌檔案備份。
6.可擴容的支援如何?
比較麻煩,mongodb建叢集是這三個資料庫中最麻煩的。
你需要一臺主節點,一臺備份節點,還有個特奇葩的仲裁節點,這個節點不存任何東西,只是作為主節點掛掉之後,選舉其他節點的功能。
7.mongodb和其他兩個比怎麼樣?
除了搭建叢集麻煩一些,其他的要比redis好多了,但是檢索功能又比不上ES,匯入速度比ES快。解壓即用那種,用起來比較方便。