千家信息网

mongodb相关(单实例、复制集、分片集)

发表于:2024-10-02 作者:千家信息网编辑
千家信息网最后更新 2024年10月02日,一、mongodb的单实例搭建1、下载包地址1、各个版本的下载地址https://www.mongodb.org/downloads2、本文安装最新版本3.6.5wget https://fastdl
千家信息网最后更新 2024年10月02日mongodb相关(单实例、复制集、分片集)

一、mongodb的单实例搭建

1、下载包地址

1、各个版本的下载地址https://www.mongodb.org/downloads2、本文安装最新版本3.6.5wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.5.tgz

2、安装

1、解压tar xf mongodb-linux-x86_64-3.6.5.tgz  &&  mv mongodb-linux-x86_64-3.6.5  /usr/local/mongodb-3.6.52、创建相关目录mkdir -p /data/mongodb27017/{data,log,conf}3、参数文件配置,vim /data/mongodb27017/conf/mongodb-27017.cnfport=27017bind_ip=192.168.142.48,127.0.0.1dbpath=/data/mongodb27017/datalogpath=/data/mongodb27017/log/mongodb.logpidfilepath=/data/mongodb27017/mongodb.pidlogappend=truefork=trueauth=true

3、启动和关闭

1、启动mongodb/usr/local/mongodb-3.6.5/bin/mongod -f /data/mongodb27017/conf/mongodb-27017.cnf2、客户端命令行首次进入/usr/local/mongodb-3.6.5/bin/mongo --port=270173、创建超管用户db.createUser({user: "admin",pwd: "123456",roles: [ { role: "root", db: "admin" } ]})4、客户端命令行再次进入/usr/local/mongodb-3.6.5/bin/mongo 192.168.142.48:27017/admin -u admin -p123456> db.getCollectionNames()[ "system.users", "system.version" ]5、关闭mongodb/usr/local/mongodb-3.6.5/bin/mongo 192.168.142.48:27017/admin -u admin -p123456> db.shutdownServer()

二、 mongodb的复制集搭建

在单实例的基础上创建复制集(已经配置超管用户)

192.168.142.48:27017192.168.142.48:27018192.168.142.48:27019

1、新增keyfile文件

1、vim keyfile123456all2、设置权限chmod 600 keyfile

2、配置文件,基于单实例的基础上额外增加

# /data/mongodb27017/conf/mongodb-27017.cnfkeyFile=/data/mongodb27017/keyfileoplogSize=1024replSet=rs_one# /data/mongodb27018/conf/mongodb-27018.cnfkeyFile=/data/mongodb27018/keyfileoplogSize=1024replSet=rs_one# /data/mongodb27019/conf/mongodb-27019.cnfkeyFile=/data/mongodb27019/keyfileoplogSize=1024replSet=rs_one

3、启动实例

/usr/local/mongodb-3.6.5/bin/mongod -f /data/mongodb27017/conf/mongodb-27017.cnf/usr/local/mongodb-3.6.5/bin/mongod -f /data/mongodb27018/conf/mongodb-27018.cnf/usr/local/mongodb-3.6.5/bin/mongod -f /data/mongodb27019/conf/mongodb-27019.cnf

4、配置复制集

1、任意一台命令行登录/usr/local/mongodb-3.6.5/bin/mongo 192.168.142.48:27017/admin -u admin -p1234562、配置复制集成员config = {"_id":"rs_one",members:[{"_id":0,host:"192.168.142.48:27017"},{"_id":1,host:"192.168.142.48:27018"},{"_id":2,host:"192.168.142.48:27019",arbiterOnly:true}]}3、初始化复制集rs.initiate(config)4、查看复制集状态rs.conf(),查看副本集的配置rs.status(),查看副本集的状态rs.printSlaveReplicationInfo(),查看各节点同步状态rs.printReplicationInfo(),查看同步事件概况db.isMaster(),查看当前复制集概况

5、复制集的管理

1、添加副本集成员使用rs.add(HOST_NAME:PORT)添加新的副本集机器,例如:rs.add("192.168.142.48:27019")2、删除副本集成员使用rs.remove(HOST_NAME:PORT)删除副本集机器,例如:rs.remove("192.168.142.48:27019")3、副本集参数配置对于复杂的副本集配置,rs.reconfig函数修改比rs.add和rs.remove更有用    var a = rs.config()    rs.reconfig(a)4、解决报错"not master and slaveOk=false"    1).本次生效 rs.slaveOk();    2).永久生效 vim ~/.mongorc.js,增加一行rs.slaveOk(); 这样的话以后每次通过mongo命令进入从库都可以查询了5、对于仲裁节点修改为副本集普通成员    1、删除仲裁节点,rs.remove("192.168.142.48:27019")    2、重新启动仲裁节点所在实例(必须)    3、重新添加成员,rs.add("192.168.142.48:27019")6、手动降级主节点为普通节点PRIMARY> rs.stepDown()

6、复制集选举节点原理
当一个备份节点无法与主节点联通时,他就联系并请求其他成员将自己选举为主节点,其他成员做几项理性的检查

1、自身是否能够与主节点联通2、希望被选举为主节点的备份节点的数据是否是最新3、有没有其他更高优先级的成员可以被选举为主节点

发生主节点选举时,优先级priority最高的备份节点如果数据不是最新,必须使用复制将自己的数据更新为最新或最新之一,才能成为新的主节点

三、 mongodb的分片集搭建

分片集的原理

在复制集搭建的基础上创建分片集

复制集rs_one192.168.142.48:27017192.168.142.48:27018192.168.142.48:27019复制集rs_two192.168.142.49:27017192.168.142.49:27018192.168.142.49:27019复制集rs_three192.168.142.50:27017192.168.142.50:27018192.168.142.50:27019配置服务器config server复制集复制集rs_cfg192.168.142.48:40011192.168.142.48:40012192.168.142.48:40013

1、配置文件

1、rs_one,rs_two,rs_three涉及的实例配置文件需要(在复制集的基础上)额外添加shardsvr=true2、rs_cfg涉及的实例配置文件需要(在复制集的基础上)额外添加configsvr=true3、mongos的配置文件port=20000bind_ip=192.168.142.48,127.0.0.1logpath=/data/mongodb20000/log/mongodb.logpidfilepath=/data/mongodb20000/mongodb.pidkeyFile=/data/mongodb20000/keyfilelogappend=truefork=trueconfigdb=rs_cfg/192.168.142.48:40011,192.168.142.48:40012,192.168.142.48:40013note:其中rs_cfg/192.168.142.48:40011,192.168.142.48:40012,192.168.142.48:40013为config server复制集

2、keyfile文件内容保持一致

复制集rs_one,rs_two,rs_three的keyfile文件内容config server复制集rs_cfg的keyfile文件内容mongos的keyfile文件内容文件内容(可更复杂设置)123456all

3、启动

1、启动复制集rs_one  192.168.142.48rs_two  192.168.142.49rs_three  192.168.142.50分别启动复制集/usr/local/mongodb-3.6.5/bin/mongod -f /data/mongodb27017/conf/mongodb-27017.cnf/usr/local/mongodb-3.6.5/bin/mongod -f /data/mongodb27018/conf/mongodb-27018.cnf/usr/local/mongodb-3.6.5/bin/mongod -f /data/mongodb27019/conf/mongodb-27019.cnf2、启动config server复制集rs_cfgrs_cfg  192.168.142.48/usr/local/mongodb-3.6.5/bin/mongod -f /data/mongodb40011/conf/mongodb-40011.cnf/usr/local/mongodb-3.6.5/bin/mongod -f /data/mongodb40012/conf/mongodb-40012.cnf/usr/local/mongodb-3.6.5/bin/mongod -f /data/mongodb40013/conf/mongodb-40013.cnf3、启动mongos192.168.142.48/usr/local/mongodb-3.6.5/bin/mongos -f /data/mongodb20000/conf/mongodb-20000.cnf

4、配置分片

1、命令行进入mongos/usr/local/mongodb-3.6.5/bin/mongo 192.168.142.48:20000/admin -u admin -p123456note:这里虽然搭建mongos无密码auth认证,但是必须使用密码认证登录才能添加分片,密码和config server保持一致2、将副本集加入集群中sh.addShard("rs_one/192.168.142.48:27017,192.168.142.48:27018,192.168.142.48:27019")sh.addShard("rs_two/192.168.142.49:27017,192.168.142.49:27018,192.168.142.49:27019")sh.addShard("rs_three/192.168.142.50:27017,192.168.142.50:27018,192.168.142.50:27019")3、查看集群状态sh.status()4、配置表的分片策略db.runCommand({enablesharding:"wang"})db.runCommand({shardcollection:"wang.t1",key:{id:1}})5、查看表状态use wangfor(var i=0;i<100000;i++)  db.t1.insert({"id":i,uname:'wdw'+i});db.t1.stats()

5、报错解决,添加addShard冲突

1、报错信息mongos> sh.addShard("rs_one/192.168.142.48:27017,192.168.142.48:27018,192.168.142.48:27019"){    "ok" : 0,    "errmsg" : "E11000 duplicate key error collection: admin.system.version index: _id_ dup key: { : \"shardIdentity\" }",    "code" : 11000,    "codeName" : "DuplicateKey",    ......}2、解决,连接rs_one主节点,删除admin.system.version集合中记录rs_one:PRIMARY> db.system.version.remove({"_id":"shardIdentity"})WriteResult({    "writeError" : {        "code" : 13,        "errmsg" : "not authorized on admin to execute command { delete: \"system.version\", ordered: true, $clusterTime: { clusterTime: Timestamp(1528280178, 1), signature: { hash: BinData(0, 914ECCE14D194F41251247EAB282E1F346D4C7D0), keyId: 6563852648502525972 } }, $db: \"admin\" }"    }})报错由于admin用户的角色是root,不具有修改admin.system.version的权限,添加对应权限db.grantRolesToUser("admin", [ { role: "__system", db: "admin" } ])3、再次删除rs_one:PRIMARY> db.system.version.remove({"_id":"shardIdentity"})WriteResult({    "nRemoved" : 0,    "writeError" : {        "code" : 40070,        "errmsg" : "cannot delete shardIdentity document while in --shardsvr mode"    }})删除时报错,意思是说不能在分片模式下删除这张表中的这条记录,然后我们关闭rs_one,然后以非shardsvr的方式启动,删除这条记录后,再以shardsvr方式启动4、以非shardsvr的方式启动,删除这条记录,再以shardsvr方式启动    1)配置文件注释掉 #shardsvr=true    2)重新启动实例    3)删除system.version对应记录,db.system.version.remove({"_id":"shardIdentity"})    4)配置文件开启 shardsvr=true    5)重新启动实例5、重新addShardongos> sh.addShard("rs_one/192.168.142.48:27017,192.168.142.48:27018,192.168.142.48:27019"){    "shardAdded" : "rs_one",    "ok" : 1,    "$clusterTime" : {        "clusterTime" : Timestamp(1528284663, 7),        "signature" : {            "hash" : BinData(0,"qLejzYtJDR1Bpt84+Hapdi1w1/I="),            "keyId" : NumberLong("6563903792973086740")        }    },    "operationTime" : Timestamp(1528284663, 7)}
0