一、Mongdb3.0安装
官网下载最新稳定版本的mongodb软体
https://www.mongodb.org/downloads
解压软体
[root@test-weidangkou service]# tar zxvf mongodb-linux-x86_64-rhel62-3.0.3.tgz mongodb-linux-x86_64-rhel62-3.0.3/README mongodb-linux-x86_64-rhel62-3.0.3/THIRD-PARTY-NOTICES mongodb-linux-x86_64-rhel62-3.0.3/GNU-AGPL-3.0 mongodb-linux-x86_64-rhel62-3.0.3/bin/mongodump mongodb-linux-x86_64-rhel62-3.0.3/bin/mongorestore mongodb-linux-x86_64-rhel62-3.0.3/bin/mongoexport mongodb-linux-x86_64-rhel62-3.0.3/bin/mongoimport mongodb-linux-x86_64-rhel62-3.0.3/bin/mongostat mongodb-linux-x86_64-rhel62-3.0.3/bin/mongotop mongodb-linux-x86_64-rhel62-3.0.3/bin/bsondump mongodb-linux-x86_64-rhel62-3.0.3/bin/mongofiles mongodb-linux-x86_64-rhel62-3.0.3/bin/mongooplog mongodb-linux-x86_64-rhel62-3.0.3/bin/mongoperf mongodb-linux-x86_64-rhel62-3.0.3/bin/mongod mongodb-linux-x86_64-rhel62-3.0.3/bin/mongos mongodb-linux-x86_64-rhel62-3.0.3/bin/mongo
创建mongdb数据存放路径及日志存放路径
[root@test-weidangkou service]# mkdir -p /date/{mongodbdata,mongodb_logs}
建立mongod账号,授权数据目录
[root@test-weidangkou date]# useradd mongod [root@test-weidangkou date]# chown -R mongod.mongod /date/mongodbdata/
创建mongod.conf配置文件,只需要以下几个选项即可
[root@test-weidangkou date]#cat /etc/mongod.conf dbpath = /data/mongodata #mongodb数据存放路径 logpath = /data/mongodb_logs/mongodb.log #mongodb日志存放路径 httpinterface = true #mongodb管理端口默认+1000:280 fork = true #后台启动
二、启动Mongodb初始化数据
(1)第一种直接在命令行中指定路径和日志
/usr/local/service/mongodb-linux-x86_64-rhel62-3.0.3/bin/mongod --dbpath=/date/mongodbdate/ --logpath=/date/mongodb_logs/mongodb.log --fork about to fork child process, waiting until server is ready for connections. forked process: 5238 child process started successfully, parent exiting 端口已经起来了: [root@test-weidangkou mongodb_logs]# lsof -i :27017 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mongod 5238 root 6u IPv4 41939 0t0 TCP *:27017 (LISTEN) 初始化由于要同步数据,建立本地的一些数据文件。会启动比较慢。
(2)第二种方式启动:通过加载配置文件启动(推荐)
[root@test-weidangkou mongodbdate]# /usr/local/service/mongodb-linux-x86_64-rhel62-3.0.3/bin/mongod -f /etc/mongod.conf about to fork child process, waiting until server is ready for connections. forked process: 5382 child process started successfully, parent exiting
进入终端查看数据库
[root@test-weidangkou mongodb_logs]# /usr/local/service/mongodb-linux-x86_64-rhel62-3.0.3/bin/mongo MongoDB shell version: 3.0.3 connecting to: test 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: 2015-06-30T17:37:53.882+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended. 2015-06-30T17:37:53.882+0800 I CONTROL [initandlisten] 2015-06-30T17:37:53.905+0800 I CONTROL [initandlisten] 2015-06-30T17:37:53.905+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2015-06-30T17:37:53.905+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2015-06-30T17:37:53.905+0800 I CONTROL [initandlisten] 2015-06-30T17:37:53.905+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2015-06-30T17:37:53.906+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2015-06-30T17:37:53.906+0800 I CONTROL [initandlisten] > show dbs; local 0.078GB
启动报错会出现以下:
[root@test-weidangkou mongodbdate]# /usr/local/service/mongodb-linux-x86_64-rhel62-3.0.3/bin/mongod -f /etc/mongod.conf about to fork child process, waiting until server is ready for connections. forked process: 5298
检查原因:
第一:由于之前没有正常的退出Mongodb服务,需要删除mongod.lock文件,再次启动恢复正常。
第二:配置文件有问题,需要检查配置文件是否有特殊字符,导致无法解析
三、mongodb副本集配置
配置mongodb的副本集务必要做好以下几点:
1、各个节点能够正常访问mongodb的socket端口,iptables要放行
2、SELINUX必须要关闭掉,以免禁止端口复制
3、各个服务器节点要做好解析/etc/hosts
4、由于副本集是通过Heartbeat心跳线连接到,务必同步好各个节点的时间
小注:本人由于之前没有注意到这些,被坑了好久。哈哈!!!
mongodb复制过程及概念
(1)主节点将数据修改操作保存至oplog,oplog:大小固定的文件,存储在local数据库
(2)初始同步(inital sync)
节点没有任何数据
节点丢失副本复制历史
:克隆所有的数据库
:应用数据集的所有改变:复制oplog并应用于本地
:为所有collection的构建索引
(3)回滚后追赶(post-rollback catch-up)
(4)切分块迁移(shareding chunk migrations)
local:存放了副本集的所有元素和oplog;用于存储oplog的是一个名为oplog.rs的collection;
oplog.rs的大小依赖于OS及文件系统;但可以自定义其大小oplogsize
1、环境配置
192.168.254.7 samba
192.168.254.229 git
192.168.254.9 weidangkou
3t台机器的配置文件修改vim /etc/mongodb.conf,增加两个选项
replIndexPrefetch = _id_only #索引的ID号复制 replSet = 9tong1 #副本集设置成9tong1
为了测试证明复制的数据,可以先在主节点上导入点数据,测试环境的数据如下:
[root@samba mongodata]# ls 9tong.0 9tong.1 9tong.2 9tongAPI.0 9tongAPI.1 9tongAPI.ns 9tong.ns base.0 base.1 base.ns journal local.0 local.ns mongod.lock storage.bson
2、初始化
> show dbs; 2015-07-01T11:38:18.324+0800 E QUERY Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" } at Error (<anonymous>) at Mongo.getDBs (src/mongo/shell/mongo.js:47:15) at shellHelper.show (src/mongo/shell/utils.js:630:33) at shellHelper (src/mongo/shell/utils.js:524:36) at (shellhelp2):1:1 at src/mongo/shell/mongo.js:47 配置好副本集选项启动后,不能直接查看dbs的情况,因为目前还没有初始化不是primary > rs.initiate() { "info2" : "no configuration explicitly specified -- making one", "me" : "samba:27017", "ok" : 1 } 9tong1:OTHER> 9tong1:PRIMARY> 初始化后会直接变成9tong1:PRIMARY的标识,可以查看数据库的容量信息 9tong1:PRIMARY> show dbs; 9tong 0.453GB 9tongAPI 0.203GB base 0.203GB local 2.077GB
3、添加副本节点
9tong1:PRIMARY> rs.add rs.add( rs.addArb( 9tong1:PRIMARY> rs.add("192.168.254.9") #默认端口不需要加端口号码 9tong1:PRIMARY> rs.add("192.168.254.9") { "ok" : 1 } 9tong1:PRIMARY> rs.status() { "set" : "9tong1", "date" : ISODate("2015-07-01T04:04:51.535Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "samba:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 1645, "optime" : Timestamp(1435723485, 1), "optimeDate" : ISODate("2015-07-01T04:04:45Z"), "electionTime" : Timestamp(1435722018, 2), "electionDate" : ISODate("2015-07-01T03:40:18Z"), "configVersion" : 2, "self" : true }, { "_id" : 1, "name" : "192.168.254.9:27017", "health" : 1, "state" : 5, "stateStr" : "STARTUP2", "uptime" : 6, "optime" : Timestamp(0, 0), "optimeDate" : ISODate("1970-01-01T00:00:00Z"), "lastHeartbeat" : ISODate("2015-07-01T04:04:51.261Z"), "lastHeartbeatRecv" : ISODate("2015-07-01T04:04:51.300Z"), "pingMs" : 2, "syncingTo" : "samba:27017", "configVersion" : 2 } ], "ok" : 1 StateStr:STARTUPU2是复制数据追赶主节点的状态模式。 数据同步好后会变成SECONDARY { "_id" : 1, "name" : "192.168.254.9:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 63, "optime" : Timestamp(1435723485, 1), "optimeDate" : ISODate("2015-07-01T04:04:45Z"), "lastHeartbeat" : ISODate("2015-07-01T04:05:47.313Z"), "lastHeartbeatRecv" : ISODate("2015-07-01T04:05:47.344Z"), "pingMs" : 1, "configVersion" : 2 } ], "ok" : 1 也可以通过rs.conf()查看各个节点状态 9tong1:PRIMARY> rs.conf() { "_id" : "9tong1", "version" : 2, "members" : [ { "_id" : 0, "host" : "samba:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 }, { "_id" : 1, "host" : "192.168.254.9:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatTimeoutSecs" : 10, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 } } } 9tong1:PRIMARY> use 9tong; switched to db 9tong 9tong1:PRIMARY> db.user_contacts.find().count(); 171639 从节点上查看 9tong1:SECONDARY> show dbs; 9tong 0.203GB 9tongAPI 0.078GB base 0.078GB local 6.075GB test 0.078GB 9tong1:SECONDARY> use 9tong; switched to db 9tong 9tong1:SECONDARY> db.user_contacts.find().count(); 171639 以上证明数据已经同步过来,状态变成SECONDARY 查看OPOLOG状态 9tong1:PRIMARY> db.printReplicationInfo() configured oplog size: 1962.66015625MB log length start to end: 3053secs (0.85hrs) oplog first event time: Wed Jul 01 2015 11:40:18 GMT+0800 (CST) #第一次更新时间 oplog last event time: Wed Jul 01 2015 12:31:11 GMT+0800 (CST) #最后一次更新时间 now: Wed Jul 01 2015 13:30:25 GMT+0800 (CST) #现在时间 9tong1:SECONDARY> db.printReplicationInfo() configured oplog size: 4469.238250732422MB log length start to end: 1586secs (0.44hrs) oplog first event time: Wed Jul 01 2015 12:04:45 GMT+0800 (CST) oplog last event time: Wed Jul 01 2015 12:31:11 GMT+0800 (CST) #与主节点最近一次时间一 样说明数据同步完成了。 now: Wed Jul 01 2015 13:31:01 GMT+0800 (CST)
4、连接到从节点192.168.254.9查看状态
[root@weidangkou data]# /usr/local/service/mongodb-linux-x86_64-rhel62-3.0.3/bin/mongo MongoDB shell version: 3.0.3 connecting to: test Server has startup warnings: 2015-07-01T12:00:01.448+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended. 2015-07-01T12:00:01.448+0800 I CONTROL [initandlisten] 2015-07-01T12:00:01.449+0800 I CONTROL [initandlisten] 2015-07-01T12:00:01.449+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2015-07-01T12:00:01.449+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2015-07-01T12:00:01.449+0800 I CONTROL [initandlisten] 2015-07-01T12:00:01.449+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2015-07-01T12:00:01.449+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2015-07-01T12:00:01.449+0800 I CONTROL [initandlisten] 9tong1:SECONDARY> 已经变成副本集的SECONDARY状态。 查看数据库容量信息,会出现以下错误。 9tong1:SECONDARY> show dbs; 2015-07-01T12:14:14.768+0800 E QUERY Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" } at Error (<anonymous>) at Mongo.getDBs (src/mongo/shell/mongo.js:47:15) at shellHelper.show (src/mongo/shell/utils.js:630:33) at shellHelper (src/mongo/shell/utils.js:524:36) at (shellhelp2):1:1 at src/mongo/shell/mongo.js:47 因为此时该节点不属于主节点,也没有默认为从节点。需要运行如下这个命令: 9tong1:SECONDARY> rs.slaveOk() 9tong1:SECONDARY> show dbs; 9tong 0.203GB 9tongAPI 0.078GB base 0.078GB local 6.075GB 也可以通过rs.isMaster()查看是否自己属于主节点 9tong1:SECONDARY> rs.isMaster() { "setName" : "9tong1", "setVersion" : 2, "ismaster" : false, "secondary" : true, "hosts" : [ "samba:27017", "192.168.254.9:27017" ], "primary" : "samba:27017", "me" : "192.168.254.9:27017", "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2015-07-01T04:23:34.493Z"), "maxWireVersion" : 3, "minWireVersion" : 0, "ok" : 1 }
5、添加192.168.254.229成为仲裁节点。仲裁节点只有投票选举权,没有数据复制功能。
9tong1:PRIMARY> rs.addArb("192.168.254.229") { "ok" : 1 } 9tong1:PRIMARY> rs.status() { "set" : "9tong1", "date" : ISODate("2015-07-01T04:27:36.132Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "samba:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 3010, "optime" : Timestamp(1435724813, 1), "optimeDate" : ISODate("2015-07-01T04:26:53Z"), "electionTime" : Timestamp(1435722018, 2), "electionDate" : ISODate("2015-07-01T03:40:18Z"), "configVersion" : 3, "self" : true }, { "_id" : 1, "name" : "192.168.254.9:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 1370, "optime" : Timestamp(1435724813, 1), "optimeDate" : ISODate("2015-07-01T04:26:53Z"), "lastHeartbeat" : ISODate("2015-07-01T04:27:35.993Z"), "lastHeartbeatRecv" : ISODate("2015-07-01T04:27:34.470Z"), "pingMs" : 0, "syncingTo" : "samba:27017", "configVersion" : 3 }, { "_id" : 2, "name" : "192.168.254.229:27017", "health" : 1, "state" : 7, "stateStr" : "ARBITER", "uptime" : 42, "lastHeartbeat" : ISODate("2015-07-01T04:27:35.987Z"), "lastHeartbeatRecv" : ISODate("2015-07-01T04:27:35.986Z"), "pingMs" : 0, "configVersion" : 3 } ], "ok" : 1 }
6、测试主节点写数据,查看从节点是否有
主节点: 9tong1:PRIMARY> db.classes.insert({class: "ONE",nostu :40}) WriteResult({ "nInserted" : 1 }) 9tong1:PRIMARY> show collections; classes system.indexes 从节点查看: 9tong1:SECONDARY> db.classes.findOne() { "_id" : ObjectId("55936d0f24c674b1e83360d6"), "class" : "ONE", "nostu" : 40 } 注意,从节点没有写权限,插入数据后会报错 9tong1:SECONDARY> db.classes.insert({class: "TOW",nostu :50}) WriteResult({ "writeError" : { "code" : undefined, "errmsg" : "not master" } })
7、主从切换测试
要点:副本集的重新选举的影响条件:
心跳信息,heartbeat会每隔几秒检查连接状态信息
优先级,默认都是1,值越高优先级越高。值为0的节点是不能成为主节点的,也不能触发选举。
optime:主节点必须optime更新的时间要快于从节点是最新的,如果这个值小于线上的其他机器, 是不肯能成为主节点的。
网络连接票数超过法定票数一半
网络分区:票数选举
选举机制:
触发选举的事件
新副本集初始化时
从节点联系不到主节点时
主节点“下台”时
收到setpDown()命令时
某从节点有更高的优先级且已经满足其他所有条件
主节点无法联系到副本集的“多数方”
(1)关闭192.168.254.7-SAMBA,主节点的MongoDB服务
rs.status() { "set" : "9tong1", "date" : ISODate("2015-07-01T05:36:43.453Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "samba:27017", "health" : 0, "state" : 8, "stateStr" : "(not reachable/healthy)", "uptime" : 0, "optime" : Timestamp(0, 0), "optimeDate" : ISODate("1970-01-01T00:00:00Z"), "lastHeartbeat" : ISODate("2015-07-01T05:36:42.029Z"), "lastHeartbeatRecv" : ISODate("2015-07-01T05:36:14.991Z"), "pingMs" : 0, "lastHeartbeatMessage" : "Failed attempt to connect to samba:27017; couldn't connect to server samba:27017 (192.168.254.7), connection attempt failed", "configVersion" : -1 }, { "_id" : 1, "name" : "192.168.254.9:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 5916, "optime" : Timestamp(1435725071, 2), "optimeDate" : ISODate("2015-07-01T04:31:11Z"), "electionTime" : Timestamp(1435728977, 1), "electionDate" : ISODate("2015-07-01T05:36:17Z"), "configVersion" : 3, "self" : true }, { "_id" : 2, "name" : "192.168.254.229:27017", "health" : 1, "state" : 7, "stateStr" : "ARBITER", "uptime" : 4188, "lastHeartbeat" : ISODate("2015-07-01T05:36:43.328Z"), "lastHeartbeatRecv" : ISODate("2015-07-01T05:36:42.799Z"), "pingMs" : 0, "configVersion" : 3 } ], "ok" : 1 }
停止后,10秒左右的时间,明显的看到原来是主节点的SAMBA,监控状态变为0,1表示正常,原先192.168.254.9从SECONDARY变成了PRIMARY。
(2)更改192.168.254.9的优先级。使它变为高优先级成为主节点
9tong1:PRIMARY> cfg=rs.conf() #保存当前状态 { "_id" : "9tong1", "version" : 3, "members" : [ { "_id" : 0, "host" : "samba:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 }, { "_id" : 1, "host" : "192.168.254.9:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 }, { "_id" : 2, "host" : "192.168.254.229:27017", "arbiterOnly" : true, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatTimeoutSecs" : 10, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 } } } 9tong1:PRIMARY> cfg.members[1].priority=2 #更改ID号为1的优先级。 2 9tong1:PRIMARY> rs.reconfig(cfg) #使配置生效 { "ok" : 1 } 9tong1:PRIMARY> 9tong1:PRIMARY> 2015-07-01T14:01:15.000+0800 I NETWORK DBClientCursor::init call() failed 2015-07-01T14:01:15.002+0800 I NETWORK trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed 2015-07-01T14:01:15.002+0800 I NETWORK reconnect 127.0.0.1:27017 (127.0.0.1) ok 9tong1:SECONDARY> 9tong1:SECONDARY> 可以看到原来主节点SAMBA,自动降级为SECONDARY,从节点自动升级到PRIMARY [root@weidangkou data]# /usr/local/service/mongodb-linux-x86_64-rhel62-3.0.3/bin/mongo MongoDB shell version: 3.0.3 connecting to: test Server has startup warnings: 2015-07-01T12:00:01.448+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended. 2015-07-01T12:00:01.448+0800 I CONTROL [initandlisten] 2015-07-01T12:00:01.449+0800 I CONTROL [initandlisten] 2015-07-01T12:00:01.449+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2015-07-01T12:00:01.449+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2015-07-01T12:00:01.449+0800 I CONTROL [initandlisten] 2015-07-01T12:00:01.449+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2015-07-01T12:00:01.449+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2015-07-01T12:00:01.449+0800 I CONTROL [initandlisten] 9tong1:PRIMARY>