1.rpm包安装mongodb3.4.6 下载地址:https://repo.mongodb.org/yum/redhat/7/mongodb-org/3.4/x86_64/RPMS/ rpm -ivh mongodb-org-shell-3.4.6-1.el7.x86_64.rpm rpm -ivh mongodb-org-tools-3.4.6-1.el7.x86_64.rpm rpm -ivh mongodb-org-server-3.4.6-1.el7.x86_64.rpm rpm -ivh mongodb-org-3.4.6-1.el7.x86_64.rpm 2.启动mongodb,设置开机自启动 [root@node1 mongodb]# systemctl start mongod [root@node1 mongodb]# systemctl enable mongod 通过启动MongoDB的服务mongod运行起来之后可以通过netstat查看服务端口(mongodb运行在TCP的27017端口上) [root@node1 mongodb]# netstat -tanlp |grep mongod tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 63532/mongod 3.MongoDB的文件和目录说明 # 配置文件; /etc/mongod.conf # 日志文件; /var/log/mongodb/mongod.log # PID文件; /var/run/mongodb/mongod.pid # 数据目录; /var/lib/mongo # 配置文件; /etc/mongod.conf MongoDB工具集 MongoDB在bin目录下提供了一系列有用的工具,这些工具提供了MongoDB在运维管理上的方便,mongodb 3.0官方使用GO语言全部重写了这些工具。 Bsondump – 将bson格式的文件转储为json格式的数据。 Mongo – 客户端命令行工具,其实也是一个javascript解释器,支持js语法。 Mongod – 数据库服务器端,每个实例启动一个进程,可以fork为后台运行。 Mongodump/mongorestore – 数据库备份和恢复工具。 Mongoexport/mongoimport – 数据导出和导入工具。 Mongofiles – GridFS管理工具,可实现二进制文件的存储。 Mongos – 分片路由,如果是用来sharding功能,则应用程序连接的是mongos而不是mongod。 Mongostat – 实例统计信息。 Mongotop – 数据库磁盘I/O实时分析工具。 Mongooplog – 日志分析工具。 Mongoopperf – 性能测试工具。 MongoDB后台管理 Shell 当MongoDB安装好并启动之后,如果你需要进入MongoDB后台管理,你需要先打开mongodb装目录的下的bin目录,然后执行mongo命令文件。MongoDB Shell是MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境。 当你进入mongoDB后台后,它默认会链接到 test 文档(数据库): [root@node1 mongodb]# mongo MongoDB shell version v3.4.6 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.6 Welcome to the MongoDB shell. For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user Server has startup warnings: 2018-06-08T22:05:22.147+0800 I CONTROL [initandlisten] 2018-06-08T22:05:22.147+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2018-06-08T22:05:22.147+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2018-06-08T22:05:22.147+0800 I CONTROL [initandlisten] 2018-06-08T22:05:22.169+0800 I CONTROL [initandlisten] 2018-06-08T22:05:22.169+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2018-06-08T22:05:22.169+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2018-06-08T22:05:22.169+0800 I CONTROL [initandlisten] > > 上面通过mongo客户端进入到了mongodb shell交互式接口,但是会有两个警告信息,警告信息是关于Linux中hugepage的。 MongoDB警告信息就是要求关闭hugepage,Oracle也要求关闭,HDFS会因为这个性能严重受影响。就是允许hugepage可以动态分配,而不是系统启动时预先分配,看上去对内存消耗很大的服务都不喜欢它 以下操作是临时关闭hugepage开机自动分配: [root@node1 mongodb]# echo "never" > /sys/kernel/mm/transparent_hugepage/enabled [root@node1 mongodb]# echo "never" > /sys/kernel/mm/transparent_hugepage/defrag 4.开始配置集群环境 master node1: 10.11.0.210 slave01 node2: 10.11.0.212 slave02 node5: 10.11.0.215 # 配置文件(三台主机保持一致) [root@node1 data]# cat /etc/mongod.conf systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log storage: dbPath: /var/lib/mongo journal: enabled: true processManagement: fork: true # fork and run in background pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile # 监听ip和端口 net: port: 27017 bindIp: 0.0.0.0 # http的访问接口,可以通过http://ip:28017访问 http: RESTInterfaceEnabled: true replication: oplogSizeMB: 1024 # 集群名称 replSetName: wanxin 配置文件修改的时候一定要注意空格,两个空格,类似jinja的语法 一定要注意空格,NND害S人,wx是我随便取的名字。 然后关机克隆三份虚拟文件,也就是在做三台机器出来。 # 集群配置 [root@node1 mongodb]# mongo MongoDB shell version v3.4.6 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.6 > config = {_id:"wanxin", members:[{_id:0, host:"10.11.0.210:27017"},{_id:1, host:"10.11.0.212:27017"},{_id:2, host:"10.11.0.215:27017"}]} { "_id" : "wanxin", "members" : [ { "_id" : 0, "host" : "10.11.0.210:27017" }, { "_id" : 1, "host" : "10.11.0.212:27017" }, { "_id" : 2, "host" : "10.11.0.215:27017" } ] } # 初始化集群配置 > rs.initiate(config) { "ok" : 1 } wanxin:SECONDARY> wanxin:PRIMARY> wanxin:PRIMARY> # 查看集群状态 wanxin:PRIMARY> rs.status() { "set" : "wanxin", "date" : ISODate("2018-06-11T07:34:53.872Z"), "myState" : 1, "term" : NumberLong(1), "heartbeatIntervalMillis" : NumberLong(2000), "optimes" : { "lastCommittedOpTime" : { "ts" : Timestamp(1528702485, 1), "t" : NumberLong(1) }, "appliedOpTime" : { "ts" : Timestamp(1528702485, 1), "t" : NumberLong(1) }, "durableOpTime" : { "ts" : Timestamp(1528702485, 1), "t" : NumberLong(1) } }, "members" : [ { "_id" : 0, "name" : "10.11.0.210:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 813, "optime" : { "ts" : Timestamp(1528702485, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-06-11T07:34:45Z"), "electionTime" : Timestamp(1528702353, 1), "electionDate" : ISODate("2018-06-11T07:32:33Z"), "configVersion" : 1, "self" : true }, { "_id" : 1, "name" : "10.11.0.212:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 150, "optime" : { "ts" : Timestamp(1528702485, 1), "t" : NumberLong(1) }, "optimeDurable" : { "ts" : Timestamp(1528702485, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-06-11T07:34:45Z"), "optimeDurableDate" : ISODate("2018-06-11T07:34:45Z"), "lastHeartbeat" : ISODate("2018-06-11T07:34:52.013Z"), "lastHeartbeatRecv" : ISODate("2018-06-11T07:34:52.376Z"), "pingMs" : NumberLong(0), "syncingTo" : "10.11.0.215:27017", "configVersion" : 1 }, { "_id" : 2, "name" : "10.11.0.215:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 150, "optime" : { "ts" : Timestamp(1528702485, 1), "t" : NumberLong(1) }, "optimeDurable" : { "ts" : Timestamp(1528702485, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-06-11T07:34:45Z"), "optimeDurableDate" : ISODate("2018-06-11T07:34:45Z"), "lastHeartbeat" : ISODate("2018-06-11T07:34:52.013Z"), "lastHeartbeatRecv" : ISODate("2018-06-11T07:34:52.356Z"), "pingMs" : NumberLong(0), "syncingTo" : "10.11.0.210:27017", "configVersion" : 1 } ], "ok" : 1 } 主节点中有一些数据,不会自动同步到slave节点,在slave节点查询报错: wanxin:SECONDARY> db.students.find() Error: error: { "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435, "codeName" : "NotMasterNoSlaveOk" } wanxin:SECONDARY> # 解决 wanxin:SECONDARY> rs.slaveOk();