mongoDB基礎入門
介紹
mongoDB是一個存儲文檔
的非關係型數據庫
- mongoDB的結構:
- 數據庫: 包含集合
- 集合: 存儲文檔
- 文檔: json格式
一條命令在docker容器中運行mongoDB
docker run --name mymongo -v /mongo/data:/data/db -d mongo:4
docker ps #查看容器狀態
docker logs mymongo #查看日誌
mongoExpress 的使用
基於網絡的mongoDB數據庫管理頁面
docker pull mongo-express
docker run --link mymongo:mongo -p 8081:8081 mongo-express
瀏覽器訪問http://ip:8081 即可
mongo Shell客戶端
是一個用來操作mongoDB的javascript客戶端界面
運行mongo shell
docker exec -it mymongo mongo
> exit #退出mongoshell進程
mongoDB複製集
數據複製
帶來的好處
- 高可用性
- 安全性
- 分流與分工
複製集
mongodb集羣
-
不同節點有不同的分工
- 主節點: 處理寫請求
- 副節點: 從主節點複製和更新數據,和主節點數據保持一致;處理讀請求
-
複製集節點
- 每個節點都會想其他節點按照一定頻率發送心跳請求
- 每隔2s發送一次,超過10s則請求超時
- 每個複製集節點最多有50個節點(因爲心跳請求的數量是有限的,會影響機器的性能)
- 複製集選舉
- 複製集節點上有term的計數器,每次選舉會將term+1
- 如果主節點下線或者故障,剩餘的副節點會因爲心跳不通而開始選舉
- 各節點優先級的不同會使其成爲新主節點的可能性
- 候選節點會發起選舉,先給自己投一票,然後更新計數器
- 對比數據和先主節點的數據同步程度,高的會優先選擇
- 候選節點得票數超過一半,會優先被選舉成新的主節點
複製集的候選節點發起選舉,每個節點投票給比自己更同步的節點
得到超過半數選票的候選節點會當選爲主節點
複製集中最多可以有7個投票節點
- 觸發選舉的事件
- 主節點和副節點之間的心跳超時
- 複製集初始化
- 新節點加入複製集
投票機
- 也是一個副節點
- 不會從主節點同步數據
- 不可能被選舉爲主節點
- 可以參與投票,但不能給自己投票
初始同步
- 主節點上的所有信息拷貝到副節點
同步寫庫記錄
- 性能比較差,會出現block的情況
- local.oplog.rs(主副節點是同步的)
- 寫庫記錄中的每條記錄都可以被重複使用
- 多個線程分批次使用日誌記錄
- 寫庫日誌的大小和文檔的大小不一定成正比
複製集的搭建
- 使用docker的方式
### 前期準備
~]# docker network create mynetwork
~]# docker network ls
~]# docker run --net mynetwork --name mongo1 -v /mymongo/data1:/data/db -p 27017:27017 -d mongo:4 --replSet myset --port 27017
~]# docker run --net mynetwork --name mongo2 -v /mymongo/data2:/data/db -p 27018:27018 -d mongo:4 --replSet myset --port 27018
~]# docker run --net mynetwork --name mongo3 -v /mymongo/data3:/data/db -p 27019:27019 -d mongo:4 --replSet myset --port 27019
### 創建複製集
~]# docker exec -it mongo1 mongo
> rs.initiate(
{
_id: "myset",
members: [
{ _id: 0, host: "mongo1:27017" },
{ _id: 1, host: "mongo2:27018" },
{ _id: 2, host: "mongo3:27019" }
]
}
)
> rs.status()