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=对应的那个数据库的密码
//集群的安全:https://www.cnblogs.com/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();
标签:容器,slave,指数,mongodb,数据库,db,汇总,集群,docker From: https://www.cnblogs.com/jeffreychen/p/18524021