mongodb指數匯總
mongodb安裝:
安裝mongodb:https://blog.csdn.net/zerochia/article/details/90767583 【社區版下載地址:https://www.mongodb.com/try/download/community】
安裝mongodb compress(GUI,界面操作,可以連本地mongodb,也可以連遠程服務器上的mongodb):https://www.mongodb.com/try/download/compass
...詳見:E:\滬江個人資料完整板\node學習\mongodb數據庫
Mongodb高并發如何優化:
//數據庫數據導出
如果是容器內導出,需要先進入容器:docker exec -it 6f5212068289 /bin/bash
mongoexport -d 數據庫名 -c 集合名 -o 導出的文件路徑【例如e:\DingData.json】
最后把導出的文件從容器中拷貝出來
//數據數據如何導入
然后使用cp命令將主機文件拷貝到docker容器中
docker cp b.json 6f5212068289:/
然后進入容器
docker exec -it 6f5212068289 /bin/bash
然后執行導入命令
mongoimport -h 127.0.0.1 -d DB_NAME -c COLLECTION_NAME b.json -u=對應的那個數據庫的帳號 -p=對應的那個數據庫的密碼
//集群的安全:http://www.rzrgm.cn/hahaha111122222/p/13965196.html
1.集群之間用加密文件進行通訊
2.外部進入數據庫,通過帳號密碼進行安全保證
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
創建副本集步驟:
1.在yml文件所在目錄的dbconfig文件夾下,執行openssl rand -base64 1024 > mongodb.key 創建加密文件:如果沒安裝openssl,執行sudo apt-get install openssl和sudo apt-get install libssl-dev【libssl-dev是openssl的常用庫】
2.chmod 600 mongodb.key修改文件為所擁有的用戶才有讀寫權限
3.docker-compose -f docker-compose.rel.yaml up -d : 執行docker-compose up -d 來執行那個yml文件,里面已經配置好了數據庫副本集的其他配置【執行自定義文件用 docker-compose -f docker-compose.rel.yaml up -d 】
注意,這里的dbconfig是自己在提前創建好的,里面有各個集群的conf配置文件,配置文件里面已經把各個集群的密碼認證文件mongodb.key的路徑配置好了,但配置文件的設置,需要在docker容器啟動后,去容器里面設置
如果出錯了一直restart,可以執行: docker logs -f 容器名稱 來查看錯誤原因
4.把集群密碼認證文件mongodb.key和各個數據庫集群的.conf文件拷貝進入各個副本集【每個副本都要拷貝】,它們都在dbconfig文件夾下,所以只要拷貝整個文件夾即可:
//拷貝key到數據庫的容器內:可以先docker exec -it db-master ls查看下到底里面有沒有 dbconfig文件
docker cp dbconfig db-master:/ 【最后的:/表示把文件放到根目錄】
docker cp dbconfig db-slave:/
docker cp dbconfig db-arbiter:/
5.進入每一個db容器,設置它們的conf文件
docker exec -it db-master mongod --config ./dbconfig/master.conf
docker exec -it db-slave mongod --config ./dbconfig/slave.conf
docker exec -it db-arbiter mongod --config ./dbconfig/arbiter.conf
4.執行docker exec -it db-master mongo admin :進入mongo主數據庫
5.初始化集群:rs.initiate({_id:"mongoset",members:[{_id:0,host:"43.143.25.248:27017"},{_id:1,host:"43.143.25.248:27018"},{_id:2,host:"43.143.25.248:27019",arbiterOnly:true}]})
這里要特別注意,host的ip一定要添加在.conf文件里面的bindIp屬性里面,否則數據庫是不會陌生的ip允許訪問的,
還有最重要的一點就是,雖然各個mongo的docker容器的27017默認端口被映射到了服務器的27017,27018,27019等端口,但是這個只是服務器內部的端口訪問,這些端口對外網還是不開啟的,這就造成了很嚴重的一點
就是如果服務器不開啟27017,27018,27019等端口,那么rs.initiate()執行的時候,訪問這些端口會被拒絕,集群初始化就會失敗
最最關鍵的一點,在web程序中設置數據庫集群的訪問連接的時候【在config.js文件中的db字段中設置,線上環境是db.prod】,要用把三個數據庫程序的服務名稱來代替服務器的url,
這樣web程序【node后臺】在接受用戶操作的時候,會通過config.js中對應的集群url來執行數據庫操作,這個時候只要任意一個數據庫程序服務【database,arbiter,slave】中數據變化,都會同步到其他數據庫服務程序
database,arbiter,slave作為集群中的三個數據庫服務,里面各自設置了對應的volume數據卷綁定,分別對應master-data,arbiter-data,slave-data這三個volume數據卷
6.開啟備機可讀:rs.secondaryOk();然后查看集群狀態:rs.status(),數據庫集群到這里基本就配置好了,接下來就是給數據庫創建管理員
//7.增加database這個服務,也就是db-master這個容器的數據庫的優先級:
//config = rs.conf()
//config.members[0].priority=2
//rs.reconfig(config)
//rs.conf() //這個表示查看新配置
8.繼續設置密碼不需要這個auth驗證;//執行db.auth("jeffreychen","out103496"),來鑒權,否則無法創建管理員,對應的帳號密碼在yml文件中,進入那個數據庫的容器,就用對應的那個數據庫容器的帳號密碼
9.創建數據庫管理員賬號,主節點創建管理員,其他副本集數據庫會自動同步:
db.createUser({
user: 'adsf',
pwd: 'fdsf',
roles: [{
role: 'clusterAdmin',//超級管理員權限,除了local和config倉庫,對其他任何倉庫都有查看的權限【沒有修改其他倉庫的權限】,當前的admin數據庫有admin權限
db: 'admin'
},{
role: 'readAnyDatabase',
db: 'admin'
},{
role : 'readWrite',
db : 'config'
},{
role : 'readWrite',
db : 'local'
}]
})
10.執行use gpclubs 切換到gpclubs倉庫,,因為每個倉庫的管理員,都需要先切換到該倉庫,然后才能創建,在其他倉庫設置另外一個數據庫的管理員是無效的
11.添加gpclubs數據庫的管理員
db.createUser({
user: 'dddd',
pwd: 'dddd',
roles: [{
role: 'readWrite',
db: 'gpclubs'
}]
})
9.全部完成以后退出,到了這里,集群和node都已經開啟了,查看線上站點是否正常;然后關閉其中的某個數據庫容器,比如關閉db-master容器,執行docker exec -it “容器名稱” ,
并用rs.status()查看“從數據庫:”是否變成“主數據庫”【一個primary類型的數據庫被關閉,另一個secondary類型的數據庫變成primary類型】,同時再看線上是否因為關閉了一個數據庫而導致數據庫訪問出問題
自測證明:只要存在任意2個數據庫正常,數據庫操作就能正常運行;少于2個就不能正常運行;三個數據庫關閉任意一個都不影響運行,如果是primary類型被關閉,自動給會有其他的頂替它成為primary
//如果副本創建失敗,如何清空重新來
1.docker-compose down先關閉容器
2.docker ps -a查看所有容器
3.docker stop 容器名稱 ,停止那些以為在運行而刪除失敗的容器
4.docker rm 容器名稱,以為之前一步已經停止了容器,這里就可以直接刪除了
5.docker volume rm 數據卷,刪除沒有必要的數據卷,如果都不需要,可以直接執行docker volume prune來全部刪除沒有掛載容器的數據卷
//一般數據迭代,只需要發布前后端代碼,不需要動數據庫,所以只需要關閉和刪除web容器,然后再重新啟動web容器即可,如果刪除了其他容器,那么容器里面的數據庫設置都會被刪除,包括集群設置也會沒有,又得重新設置集群,創建管理員
所以版本迭代,只需要
1.docker stop web
2.docker rm web
3.docker-compose up -d
!!!!!!!!!!!!!!!
詳細交互流程如下:
1.用戶發起操作,瀏覽器發送請求數據
2.用戶瀏覽器向對應的服務器發起請求
3.linux服務器開啟的端口是80端口,接收到了用戶瀏覽器發起的請求
4.linux服務器已經啟動了gp-web這個容器【注意gp-web是容器名稱,而web是服務名稱,docker內的容器之間,通過服務名稱來相互通信,但是服務名稱和容器名稱是不同的】,gp-web這個容器就是一個node程序,也就是網站的node服務器
5.gp-web這個容器就是node服務器,node服務器接收到瀏覽器請求的數據,通過里面的路由等一系列處理,最終到了node程序和數據庫服務交互的節點
6.node程序里面根據config.js里面的數據庫請求的url,向數據庫【集群】發送請求,
一般是“數據庫集群”,所以url需要是一個數據庫集群的url,例如 mongodb://gp:Z103496out@database:27017,database:27018,database:27019/gpclubs?retryWrites=false&replicaSet=mongoset
注意這里不能把第二個database改成slave,把第三個database改成arbiter,這樣會造成集群url失效,最終導致添加評論的時候失效【因為評論要用到事務,而mongo的事務依賴于集群,一旦集群的url錯了,就全錯了】
這里特別要注意的是,url里面的前綴不是數據庫的ip地址,而是docker程序里面的服務名稱【不是容器名稱,千萬別搞錯,不是db-slave,而是slave】
7.每個數據庫服務【例如db-slave】都已在之前通過docker exec -it db-slave mongod --config ./dbconfig/slave.conf這種配置文件綁定命令,設置好了數據庫服務的各種配置【數據放哪里,log放哪里,安全性配置等】
而且多個數據庫服務之前已經通過rs.initiate({_id:"mongoset",members:[{_id:0,host:"43.143.25.248:27017"},{_id:1,host:"43.143.25.248:27018"},{_id:2,host:"43.143.25.248:27019",arbiterOnly:true}]})設置好了集群,
之前也已經用db.createUser創建好了數據庫管理員帳號,所以node程序的數據請求一過來,結果上面第6步的url連接到副本集,會自動通過副本集內部一些列的操作,把數據同步到三個“數據庫服務器”程序,也就是三個容器,分別是db-master-slave,db-arbiter
8.數據庫內容同步到三個容器以后,接下來就是容器內部各自的事情了,因為每個容器都設置了對應的volume,
例如容器設置了target: /data/db ,數據在容器里面的保存位置,以容器的根目錄為根目錄,所以首先數據是放到容器下的/data/db文件夾里面,
而容器設置了source: slave-data ,所以容器還會把/data/db下的數據同步到slave-data這個數據卷,slave-data這個數據卷是由docker統一自己管理的,只需要知道它放在本地的/var/snap/docker/common/var-lib-docker/volumes/下面即可,
里面的文件夾名稱是按照slave-data以及其他參數來自動設定文件夾名稱的,最終的路徑是/var/snap/docker/common/var-lib-docker/volumes/koa-node_slave-data/_data,
其中koa-node_slave-data/_data:koa-node是文件夾根目錄,slave-data是數據卷名稱,按照“根目錄文件夾名稱_數據卷名稱/_data”來產生本地數據保存路徑
!!!!!!!!!!!!!!!
window下遠程連接數據庫:
打開window下的mongodb compass軟件,輸入config.js文件里面的線上數據庫url即可,例如mongodb://賬號:密碼@43.143.25.248:27017,43.143.25.248:27018,43.143.25.248:27019/gpclubs?retryWrites=false&replicaSet=mongoset
特別注意,我的mongo集群的bindip設置設置了所有ip都可以訪問,所以只要知道數據庫的帳號密碼,就可以直接在任何機子上訪問數據庫,這個是不安全了,因為我自己住的地方的ip是動態的,所以不能限制訪問數據庫的ip,不然自己也沒法訪問
但是如果真的是線上站點,那么必須給數據庫的訪問地址綁定ip,只能特定的ip才能訪問
mongo數據庫命令:
3、查詢數據庫
show dbs
或
show databases
4、創建數據庫
use dbName
查看表
show tables;
5、插入數據
db.<tableName>.insert();
如:db.members.insert({name:"Michael",age:18,...});
6、查詢
db.<tableName>.find();
7、修改
如:db.members.update({name:"Michael"},{$set:{age:20}});
8、刪除表中的數據
如:db.members.remove({name:"Michael"});
刪除全部:db.members.remove({});
9、刪除表
db.members.drop();
10、刪除數據庫
db.dropDatabase();

浙公網安備 33010602011771號