MongoDB 副本集安装

cral 贡献于2012-05-22

作者 james  创建于2012-05-10 07:28:00   修改者Cral  修改于2012-05-10 07:28:00字数7370

文档摘要:新建三个节点目录,用于存节点数据及日志,内网两台实体机,三个mongodb进程,硬盘或机器宕掉,可以真正做到自动切换,自动故障恢复等管理操作。
关键词:

一、 安装MongoDB #安装目录 cd /root/tools #获取安装文件 wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.4.tgz #解压 tar zxvf mongodb-linux-x86_64-2.0.1.tgz #新建分用户,彼此隔离 adduser mongodb sudo su – mongodb 二、 搭建副本集 #新建三个节点目录,用于存节点数据及日志,内网两台实体机,三个mongodb进程,硬盘或机器宕掉,可以真正做到自动切换,自动故障恢复等管理操作。 hosts: 172.16.2.107 mongodb001 172.16.2.108 mongodb002 1、 准备工作 #mongodb001上启两个mongodb进程 mkdir -p ~/data/node1 ~/data/node2 #mongodb002上启一个mongodb进程 mkdir -p ~/data/node1 由于此分区下磁盘容量太小,将data 目录link到/data/mongodb下 ln –s /home/mongodb/data /data/mongodb/data 副本集做权限控制,2.0版本之前不行。此为2.0.4版本 #mongodb001上创建keyfile,给只读权限,内容必须一样。 mkdir -p /data /key echo "this is hd1 key" > /data /key/node1 echo "this is hd1 key" > /data/key/node2 chmod 600 /data /key/ * ##mongodb002上创建keyfile,给只读权限 mkdir -p /data /key echo "this is hd1 key" > /data/key/node1 chmod 600 /data /key/* 2、 创建并初始化副本集 #cd mongodb/bin目录,hd1为副本集标识,mongodb001 、mongodb002为机器名 #--fork是创建后台进程,更多查看./mongod –help #--dbpath指明数据存储路径,--logpath指明log存储路径 #--keyFile 开启副本集的权限控制,--rest开启管理ui, #这三个命令的意思是将三个节点连成一个整体。 ./mongod --keyFile ~/data/key/node1 --rest --dbpath ~/data/node1 --port 27017 --fork --logpath ~/data/node1/mongodb.log --replSet hd1 ./mongod --keyFile ~/data/key/node2 --rest --dbpath ~/data/node2 --port 27027 --fork --logpath ~/data/node2/mongodb.log --replSet hd1 ./mongod --keyFile ~/data/key/node1 --rest --dbpath ~/data/node1 --port 27017 --fork --logpath ~/data/node1/mongodb.log --replSet hd1 #如果启动有问题,连接不上,以下命令修复。原因是由于上次的不正常关闭 ./mongo tech_01:10003/admin ./mongod –-repair --dbpath ~/dbs/node3 --port 10003 #log中显示没有初始化 #replSet info you may need to run replSetInitiate -- rs.initiate() in the shell -- if that is not already done #登录某个节点进行初始化 ./mongo tech_01:10003/admin #初始化,三种方法,第三种方法简单 db.runCommand({"replSetInitiate":{ "_id":"hd1","members":[ {"_id":1,"host":"mongodb001:27017"}, {"_id":2,"host":"mongodb001:27027"}, {"_id":3,"host":"mongodb002:27017"} ]}}) 或者 >cfg={ "_id":"james","members":[ {"_id":1,"host":"tech_01:10001"}, {"_id":2,"host":"tech_01:10002"}, {"_id":3,"host":"tech_01:10003"} ]} #初始化 >rs.initiate(cfg) 或者 >rs.intiate() >rs.conf() >rs.add(“mongodb001:27017”) > rs.add(“mongodb001:27027”) > rs.add(“mongodb002:27017”) #副本集状态 rs.status() #仲裁节点,当master挂掉,为了避免产生投票死局,当从节点是偶数时, #可能需要一个仲裁节点,只当仲裁。内网没有仲裁节点,这一段略过。 db.runCommand({"replSetInitiate":{ "_id":"hd1","members":[ {"_id":1,"host":"mongodb001:27017"}, {"_id":2,"host":"mongodb001:27027"}, {"_id":3,"host":"mongodb002:27017",, arbiterOnly: true } ]}}) 3、 权限控制 因为启动的时候加了keyFile参数,意味着连接操作mongodb都需要用户验证,但是目前mongodb还未添加用户,首先要添加root用户,然后以root用户给其他数据库添加用户。 #连接主库,刚才rs.status()看出哪一台是primary,登录primary >use admin >addUser(“root”,”root”); >addAuth(“root”,”root”); #添加其它用户时,可以指定readonly=true addUser(“hello”,”hello”,true) #查看当前主库 db.$cmd.findOne({ismaster:1}); #查看是否是主库 db.isMaster(); #登录某个节点数据库 ./mongo tech_01:10003/admin #关闭数据库,当然也可以用kill db.shutdownServer(); 三、 测试副本集的failover 1、 命令检测 #先查看当前的主从关系 rs.status() #强制primary和stadard节点角色互换,测试副本集是否成功,30秒内,不会参与选举 rs.stepDown(30); #或,冰冻30秒 rs.freeze(30); #再查看修改过的主从关系 rs.status() 2、 操作检测 基本思路是关闭主节点,看看三个节点的日志mongodb.log,是如何切换主从关系的。rs.status()确定当前的主节点变成哪个了,但启动刚才关闭的节点,rs.status()确定当前的主从情况。以下检测是在其它机器上实验,内网机器未试,供参考。 #rs.status()确定哪个是主节点,关闭它 db.shutdownServer() #查看node2的日志 Thu Apr 19 14:43:33 [conn546] end connection 127.0.0.1:38233 Thu Apr 19 14:43:33 [initandlisten] connection accepted from 127.0.0.1:38239 #548 Thu Apr 19 14:43:41 [conn547] end connection 127.0.0.1:38234 Thu Apr 19 14:43:41 [initandlisten] connection accepted from 127.0.0.1:38241 #549 Thu Apr 19 14:43:58 [conn548] end connection 127.0.0.1:38239 Thu Apr 19 14:43:58 [rsSync] replSet syncThread: 10278 dbclient error communicating with server: tech_01:10003 Thu Apr 19 14:43:59 [rsHealthPoll] DBClientCursor::init call() failed Thu Apr 19 14:43:59 [rsHealthPoll] replSet info tech_01:10003 is down (or slow to respond): DBClientBase::findN: transport error: tech_01:10003 query: { replSetHeartbeat: "james", v: 1, pv: 1, checkEmpty: false, from: "tech_01:10002" } Thu Apr 19 14:43:59 [rsHealthPoll] replSet member tech_01:10003 is now in state DOWN Thu Apr 19 14:43:59 [rsMgr] not electing self, tech_01:10001 would veto Thu Apr 19 14:44:00 [conn549] replSet info voting yea for tech_01:10001 (1) Thu Apr 19 14:44:01 [rsHealthPoll] replSet member tech_01:10001 is now in state PRIMARY Thu Apr 19 14:44:09 [rsSync] replSet syncing to: tech_01:10001 Thu Apr 19 14:44:11 [conn549] end connection 127.0.0.1:38241 Thu Apr 19 14:44:11 [initandlisten] connection accepted from 127.0.0.1:38258 #550 Thu Apr 19 14:44:15 [rsHealthPoll] couldn't connect to tech_01:10003: couldn't connect to server tech_01:10003 Thu Apr 19 14:44:41 [conn550] end connection 127.0.0.1:38258 Thu Apr 19 14:44:41 [initandlisten] connection accepted from 127.0.0.1:38292 #551 Thu Apr 19 14:44:45 [rsHealthPoll] couldn't connect to tech_01:10003: couldn't connect to server tech_01:10003 #查看node1的日志 Thu Apr 19 14:43:58 [rsSync] replSet syncThread: 10278 dbclient error communicating with server: tech_01:10003 Thu Apr 19 14:43:58 [conn549] end connection 127.0.0.1:44163 Thu Apr 19 14:43:59 [rsHealthPoll] DBClientCursor::init call() failed Thu Apr 19 14:43:59 [rsHealthPoll] replSet info tech_01:10003 is down (or slow to respond): DBClientBase::findN: transport error: tech_01:10003 query: { replSetHeartbeat: "james", v: 1, pv: 1, checkEmpty: false, from: "tech_01:10001" } Thu Apr 19 14:43:59 [rsHealthPoll] replSet member tech_01:10003 is now in state DOWN Thu Apr 19 14:44:00 [rsMgr] replSet info electSelf 1 Thu Apr 19 14:44:00 [rsMgr] replSet PRIMARY Thu Apr 19 14:44:09 [initandlisten] connection accepted from 127.0.0.1:44179 #551 Thu Apr 19 14:44:10 [slaveTracking] build index local.slaves { _id: 1 } Thu Apr 19 14:44:10 [slaveTracking] build index done 0 records 0 secs Thu Apr 19 14:44:11 [rsHealthPoll] couldn't connect to tech_01:10003: couldn't connect to server tech_01:10003 Thu Apr 19 14:44:15 [conn550] end connection 127.0.0.1:44168 Thu Apr 19 14:44:15 [initandlisten] connection accepted from 127.0.0.1:44188 #552 node2 选择了node1做为主节点,node1选择了自己,这样node1就成为新的primary,前后应该是平滑过度的。 #(1)再启node3,node3沦为 secondry ./mongod --dbpath ~/dbs/node3 --port 10003 --fork --logpath ~/dbs/node3/mongodb.log --replSet james/tech_01:10001,james/tech_01:10002 #(2)或者先启动节点,再加入 ./mongod --dbpath ~/dbs/node3 --port 10003 --fork --logpath ~/dbs/node3/mongodb.log #(2)登入主节点 ./mongo tech_01:10001/admin rs.add("tech_01:10002"); #查看主从信息 rs.status() 四、 副本集的读写分离 只有一个primary在工作,其它都充当从的角色,只负责备份和同步数据。那么,是否可以利用这几个从的节点来做只读服务呢,答案是肯定的。 1、 命令方式 #allow this connection to read from the nonmaster member of a replica pair >db.getMongo().setSlaveOk() 2、 程序设定 #java api #管理 #查看oplog状态 db.printReplicationInfo() #查看oplogsize使用情况 ,一般默认就行。 use local db.oplog.rs.stats() 五、 备份与恢复 1、 备份策略 (1) Fsync, write lock, and backup the slave. #为数据库写数据加锁 db.runCommand({fsync:1,lock:1}) #查看当前锁状态 db.currentOp() #备份slave的数据 #解锁 use admin db.$cmd.sys.unlock.findOne() (2) Shut it down, backup, and restart. 这个方法比较暴力,不解释 (3) Dump from the slave. #使用mongodump命令 2、 恢复策略 (1) 从备份中恢复 #使用mongorestore ,先drop要恢复的集合或数据库,再restore (2) 新增一个节点时,需要同步的数据太大 #先将副本集的slave备份copy到新实例,启动新实例,再加入副本集 #没必要增大oplog (3) 导入csv #例 ./mongoimport --port 27017 -d james_mongodb -c doc --type csv --headerline --file t_wiki_doc_text2.csv 六、 监控管理 1. 监控界面 默认界面的端口是mongodb进程启动端口+1000,即http://172.16.2.107:28017,因为开启了keyfile权限验证,用户是root 副本集监控是否正常。 http://172.16.2.107:28017/_replSet 监控up那一栏,如果有0,表示某个进程down了。因为启用了权限控制,URL监控要输入用户密码。 2. 管理命令 >rs.status() //查看副本集的状态 >db.stats() //查看某个DB的状态 >db.printReplicationInfo() >show dbs >show collections > db.serverStatus() //admin用户下执行 其它mongodb自带监控命令 3. 监控命令 4. 开启profiler #记录slowquery,默认是0,不打印;1是只打印slowquery;2是全打印 >db.getProfilingLevel() //当前级别 > db.getProfilingStatus() //详细信息 > db.setProfilingLevel(1,100) log存储在db.system.profile集合中 =============================================================================== #实用命令 #MongoDB的命令帮助系统 >help #DB操作帮助 >db.help() #某个集合的命令帮助 >db.mycoll.help() 附: ===============================================================================客户端工具 mongodbvue 注册表中查找B1159E65-821C3-21C5-CE21-34A484D54444中的子项4FF78130 ,删除其下的三个子项即可。 之后MongoVUE又重置到15天的情况了。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档