设为首页 收藏本站
查看: 1045|回复: 0

[经验分享] Mongodb安装配置、主从同步

[复制链接]

尚未签到

发表于 2018-10-28 06:17:01 | 显示全部楼层 |阅读模式
Mongodb安装配置

  1. 下载
  mkdir /usr/local/src/mongodb
  cd /usr/local/src/mongodb
  wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.4.tgz
2.解压

  tar zxvf mongodb-linux-x86_64-2.0.4.tgz
  mv mongodb-linux-x86_64-2.0.4  /usr/local/mongodb
  3.运行
  需要创建一个存放数据的目录(默认是/data/db/),创建目录并启动:
  mkdir -p /data/db/
  /usr/local/mongodb/bin/mongod -logpath=/data/db/mongodb.log --fork
  如果想使用自己指定的目录来存储数据,加上--dbpath选项:
  /usr/local/mongodb/bin/mongod --dbpath /path/to/data/dir
  4、登录客户端
  默认链接的是test数据库
  [root@localhost mongodb]# /usr/local/mongodb/bin/mongo
  5.通过28017端口查看mongodb状态
  http://192.168.0.102:28017/
mongodb管理工具RockMongo

  参考网站:http://code.google.com/p/rock-php/wiki/rock_mongo_zh
  1.       下载安装包
  wget http://rock-php.googlecode.com/files/rockmongo-v1.1.0.zip
  2.       解压到你的网站目录下
  mkdir /data/sites/xizi.com/rockmongo
  mv rockmongo-v1.1.0.zip /data/sites/xizi.com/rockmongo/
  unzip rockmongo-v1.1.0.zip
  3.用编辑器打开config.php (v1.0.5版本以前是index.php),修改host, port, admins等参数
  在浏览器中访问index.php,比如说:http://192.168.0.102/rockmongo/index.php
  提示错误:
  To make things right, you must install php_mongo module. Here for installation documents on PHP.net.
  解决方法:
  wget --no-check-certificate https://github.com/mongodb/mongo-php-driver/tarball/master/mongodb-mongo-php-driver-1.2.10-130-g2ca8000.tar.gz
  tar zxvf mongodb-mongo-php-driver-1.2.10-130-g2ca8000.tar.gz
  cd mongodb-mongo-php-driver-2ca8000/
  /usr/local/php5.2.14/bin/phpize
  ./configure --with-php-config=/usr/local/php5.2.14/bin/php-config
  make install
  修改php.ini文件,添加扩展
  extension=mongo.so
  4. http://192.168.0.102/rockmongo/index.php
  使用用户名和密码登录,默认为"admin"和"admin"
  开始玩转MongoDB!
  5.为了方便可以修改rockmongo/config.php中的ip地址
  $MONGO["servers"][$i]["mongo_name"] = "192.168.0.102";//mongo server name
  $MONGO["servers"][$i]["mongo_host"] = "192.168.0.102";//mongo host
  Mongodb权限管理
  mongod没有加--auth的情况下(如果加了,你添加权限的话 会出现下面的情况)。
  > use admin
  switched to db admin
  > db.addUser('root','root')
  Fri Jul 22 14:31:13 uncaught exception: error {
  "$err" : "unauthorized db:admin lock type:-1 client:127.0.0.1",
  "code" : 10057
  }
  >
  所以我们添加用户时必须先在没有加--auth的时候添加个super  admin
  服务起来后,进入./mongo。
  [root@:/usr/local/mongodb/bin]#./mongo
  MongoDB shell version: 1.8.2
  connecting to: test
  > use admin
  switched to db admin
  > db.adduser('root','root')
  Fri Jul 22 14:34:24 TypeError: db.adduser is not a function (shell):1
  > db.addUser('root','root')
  {
  "_id" : ObjectId("4e2914a585178da4e03a16c3"),
  "user" : "root",
  "readOnly" : false,
  "pwd" : "75692b1d11c072c6c79332e248c4f699"
  }
  >
  这样就说明 已经成功建立了,然后我们试一下权限。
  > show collections
  system.indexes
  system.users
  在没有加--auth的情况下 可以正常访问admin默认的两个表,就算在admin表添加了用户一样不需验证。
  > db.system.users.find()
  { "_id" : ObjectId("4e2914a585178da4e03a16c3"), "user" : "root", "readOnly" : false, "pwd" : "75692b1d11c072c6c79332e248c4f699" }>
  已经成功建立。
  下面把服务加上--auth的选项,再进入./mongo。
  MongoDB shell version: 1.8.2
  connecting to: test
  > use admin
  switched to db admin
  > show collections
  Fri Jul 22 14:38:49 uncaught exception: error: {
  "$err" : "unauthorized db:admin lock type:-1 client:127.0.0.1",
  "code" : 10057
  }
  >
  可以看出已经没有访问权限了。
  我们就用自己的密钥登录下:
  > db.auth('root','root')
  1
  返回1说明验证成功!
  再show collections下就成功了。
  .....
  我们登录其它表试试:
  [root@:/usr/local/mongodb/bin]#./mongo
  MongoDB shell version: 1.8.2
  connecting to: test
  > use test
  switched to db test
  > show collections
  Fri Jul 22 14:40:47 uncaught exception: error: {
  "$err" : "unauthorized db:test lock type:-1 client:127.0.0.1",
  "code" : 10057
  }
  也需要验证,试试super admin登录:
  [root@:/usr/local/mongodb/bin]#./mongo
  MongoDB shell version: 1.8.2
  connecting to: test
  > use test
  switched to db test
  > show collections
  Fri Jul 22 14:40:47 uncaught exception: error: {
  "$err" : "unauthorized db:test lock type:-1 client:127.0.0.1",
  "code" : 10057
  }
  > db.auth('root','root')
  0
  返回0验证失败。
  好吧,不绕圈子,其实super admin必须从admin那么登录 然后 再use其它表才可以
  > use admin
  > use admin
  switched to db admin
  > db.auth('root','root')
  1
  > use test
  switched to db test
  > show collections
  >
  如果想单独访问一个表,用独立的用户名,就需要在那个表里面建相应的user。
  [root@:/usr/local/mongodb/bin]#./mongo
  MongoDB shell version: 1.8.2
  connecting to: test
  > use admin
  switched to db admin
  > db.auth('root','root')
  1
  > use test
  switched to db test
  > db.addUser('test','test')
  {
  "user" : "test",
  "readOnly" : false,
  "pwd" : "a6de521abefc2fed4f5876855a3484f5"
  }
  >
  当然必须有相关权限才可以建立。
  再登录看看:
  [root@:/usr/local/mongodb/bin]#./mongo
  MongoDB shell version: 1.8.2
  connecting to: test
  > show collections
  Fri Jul 22 14:45:08 uncaught exception: error: {
  "$err" : "unauthorized db:test lock type:-1 client:127.0.0.1",
  "code" : 10057
  }
  > db.auth('test','test')
  1
  > show collections
  system.indexes
  system.users
  >
  加了用户认证之后,需要修改rockmongo/config.php,否则反而无法登录。
  //$MONGO["servers"][$i]["mongo_auth"] = false;//enable mongo authentication?
  $MONGO["servers"][$i]["mongo_auth"] = true;//enable mongo authentication?
  登录其他mongodb服务器
  登录其他mongodb服务器:
  /usr/local/mongodb/bin/mongo --host 192.168.0.102 admin -u root –p
  要指定登录admin数据库,否则无法通过验证。
  /usr/local/mongodb/bin/mongo admin -u root –p
  或者我们可以这样登录
  /usr/local/mongodb/bin/mongo
  然后use admin
  db.auth('root','password')
  这样才能操作数据库
Mongodb备份和主从同步

  (1)首先我们备份好数据库
  /usr/local/mongodb/bin/mongodump -uroot -p -d xz_ad -o /data/backup/database/
  /usr/local/mongodb/bin/mongodump -uroot -p -o /data/backup/database/
  (2)主从带认证:
  主服务器和从服务器必须开启安全认证:--auth, 主服务器和从服务器的admin数据库中必须有全局用户, 然后主服务器的local数据库和从服务器的local数据均有名为repl且密码相同的用户名。
  注:local:本地数据库 这个数据库不会同步,主要存放同步的信息。在MongoDB2.0.2版本测试时,从服务器的admin数据库中没有全局用户时也能进行复制(Deven:我们就是采用这个方式,从服务器admin数据库没有建立用户),尽管admin中无用户,客户端连接此服务器不进行验证(即--auth参数失效),但从服务器的--auth必须指定。既然启用了--auth,就应该在从服务器的admin中增加一个用户。
  (3)主服务器设置
  /usr/local/mongodb/bin/mongo admin -uroot -p
  >use admin
  >db.addUser('root','root')
  >use local
  >db.addUser('repl','repl')
  > use admin;
  switched to db admin
  > db.shutdownServer()
  然后重新启动mongodb,具体参数可以用/usr/local/mongodb/bin/mongod –h查看:
/usr/local/mongodb/bin/mongod -logpath=/data/db/mongodb.log --logappend --master --oplogSize 1024 --fork --auth

(4)从服务器设置,有2种方案。

  方案1,启动时直接指定为从数据库(线上按照方案1实施):
/usr/local/mongodb/bin/mongod -logpath=/data/db/mongodb.log --logappend --slave --source 192.168.0.102:27017 --autoresync --slavedelay 1 --fork --auth

  提示错误:
  Fri Jul 20 10:41:31 [replslave] replauthenticate: no user in local.system.users to use for authentication
  repl:
  Fri Jul 20 10:41:31 [replslave] repl: sleep 3 sec before next pass
  因为这个时候admin并没有同步过来,所以可以不用验证权限。
  /usr/local/mongodb/bin/mongo
  >use local
  >db.addUser('repl', 'repl')
  过几分钟之后数据就会自动同步过来了,包括admin数据库,重新登录就会发现权限验证已经生效。
  方案2:
  先初始mongodb
  /usr/local/mongodb/bin/mongod -logpath=/data/db/mongodb.log --logappend --fork
  建立同步账号和admin账号
/usr/local/mongodb/bin/mongo

>use local

>db.addUser('repl', 'repl')

> use admin

switched to db admin

> db.addUser('root','root')

> db.shutdownServer();

  然后重新启动mongodb就行了
/usr/local/mongodb/bin/mongod -logpath=/data/db/mongodb.log --logappend --slave --source 192.168.0.102:27017 --autoresync --slavedelay 1 --fork --auth

(5)查看数据是否全部同步过来了

  在主服务器上看数据集大小
  > db.ad_click.count()
  1279390
  在从服务器也查看数据集大小
  > db.ad_click.count()
  1279390
  多观察几次,如果值都一样,证明数据已经正常同步。
  (6)测试更新数据是否会同步(如果是线上服务器可以跳过)
  在主服务器:
  >use plus
  >db.blog.insert({"b":"b"});
  >db.blog.find()
  在从服务器上查看是否同步过去了
  >use plus
  >db.blog.find()
  同样在主服务器删除数据,看从服务器是否同步
  > db.blog.remove();
  > db.blog.drop();
  (7)查看同步情况状态
  > db.printReplicationInfo();
  this is a slave, printing slave replication info.
  source:   192.168.0.102:27017
  syncedTo: Fri Jul 20 2012 10:45:37 GMT+0800 (CST)
  = 10 secs ago (0hrs)
  0hrs好像是同步延时多少,不确定。
(8)如果发现主从不同步,从上手动同步:

  use admin;
  db.runCommand ( { "resync": 1 } )
/usr/local/mongodb/bin/mongod -logpath=/data/db/mongodb.log --logappend --master --oplogSize 1024 --fork --auth

/usr/local/mongodb/bin/mongod -logpath=/data/db/mongodb.log --logappend --slave --source 192.168.0.102:27017 --autoresync --slavedelay 1 --fork --auth

主从不带认证同步步骤

  (1)主服务器设置
/usr/local/mongodb/bin/mongod -logpath=/data/db/mongodb.log --logappend --master --oplogSize 1024 --fork

(2)从服务器设置

/usr/local/mongodb/bin/mongod -logpath=/data/db/mongodb.log --logappend --slave --source 192.168.0.102:27017 --autoresync --slavedelay 1 --fork


  这样主从就会自动同步了。
  遇到的错误:
  1.[root@centos-5 db]# /usr/local/mongodb/bin/mongo
  MongoDB shell version: 2.0.4
  connecting to: test
  Wed Jul 18 11:36:51 Error: couldn't connect to server 127.0.0.1 shell/mongo.js:84
  exception: connect failed
  原因:mongodb不正常关闭造成的mongodb被锁定,这算是一个Mongod 启动的一个常见错误,非法关闭的时候,lock 文件没有干掉,第二次启动的时候检查到有lock 文件的时候,就报这个错误了。
  正确关闭mongod 的方法:进入mongo shell
  use admin
  db.shutdownServer()
  也可以按照文档粗暴的杀掉它,它内部应该有KILL信号处理程序。killall mongod
  请不要 kill -9 ,会造成文件数据混乱丢失 repair 也无力回天。
  解决方法:
  (1)进入 mongod 上一次启动的时候指定的 data 目录  删除掉该文件:
  rm /data/db/mongo.lock
  (2)再执行:
  ./mongod  --repair
  (3)重新启动mongodb:
  2. Logstream::get called in uninitialized state
  Thu Jul 19 14:16:34 ERROR: Client::~Client _context should be null but is not; client:replslave
  将从服务器数据目录清空然后再启动就行了
  rm -rf /daba/db/*
  3.在虚拟机测试时,启动主从之后无法同步。
  是因为刚开始主从服务器相差很远,两台服务器的时间要调为一致,最好设定定时同步时间。
  4.执行db.runCommand({"fsync":1,"lock":1})之后,竟然无法登录mongodb了,不知道哪里出问题了
备注:

  这里在简单的介绍一下Master Slave/ Replica Sets 备份机制,这两种模式都是基于主服务器的oplog 来实现所有从服务器的同步。
  
oplog记录了增删改操作的记录信息(不包含查询的操作),但是oplog有大小限制,当超过指定大小,oplog会清空之前的记录,重新开始记录。(太坑爹了!!!)
  
Master Slave 方式 主服备器会产生 oplog.$main 的日志集合
  
Replica Sets  方式 所有服务器都会产生oplog.rs 日志集合
  
两种机制下,所有从服务器都会去轮询主服务器oplog日志,若主服务器的日志较新,就会同步这些新的操作记录。但是这里有个很重要的问题,从服务器由于网络阻塞,死机等原因无法极时同步主服务器oplog记录:
  
一种情况: 主服务器oplog不断刷新,这样从服务器永远无法追上主服务器。
  
另外一种情况:刚好主服务器oplog超出大小,清空了之前的oplog,这样从服务器就与主服务器数据就可能会不一致了,这第二种情况,我是推断的,没有证实。
  
另外要说明一下Replica Sets 备份的缺点,当主服务器发生故障时,一台从服务器被投票选为了主服务器,但是这台从服务的oplog 如果晚于之前的主服务器oplog的话,那之前的主服务器恢复后,会回滚自己的oplog操作和新的主服务器oplog保持一致。由于这个过程是自动切换 的,所以在无形之中就导致了部分数据丢失。
  编写备份脚本
  #!/bin/bash
  # Power by xizi
  # Edit by deven
  # Make Day:2012-07-20
  # Update Day:2012-07-20
  #######################  Set var
  today=$(date +"%Y%m%d")
  old7day=$(date -d "7 days ago" +"%Y%m%d")
  #######################  Copy Database
  cd /data/backup/database/
  /usr/local/mongodb/bin/mongodump -uroot -ppassword -o /data/backup/database/
  zip -rP 888888 /data/backup/database/xz_ad_db_${today}.zip xz_ad
  zip -rP 888888 /data/backup/database/admin_db_${today}.zip admin
  rm -rf /data/backup/database/xz_ad
  rm -rf /data/backup/database/admin
  Mongod文档操作命令
  插入文档:
  db.blog.insert({"id":1,"sex":"m"})
  文档替换:
  db.blog.insert({"name":"deven","friends":32,"enemies":2})
  var deven=db.blog.findOne({"name":"deven"});
  deven.relationships={"friends":deven.friends,"enemies":deven.enemies};
  deven.username=deven.name
  delete deven.friends;
  delete deven.enemies;
  db.blog.update({"name":"deven"},deven)
  db.blog.insert({"url":"www.xizi.com","pv": 50})
  db.blog.update({"url":"www.xizi.com"},{"$inc":{"pv":1}})
  db.blog.find()
  “$set”修改器
  db.blog.update({"_id" : ObjectId("4f94d7f61c187e4c476fd62a")},{"$set":{"bd":"1980"}})
  db.blog.update({"id":1},{"$set":{"bd":"1985"}})
  db.blog.update({"id":1},{"$set":{"sex":["g","b"]}})
  增加或者减少:
  db.blog.insert({"game":"pinball","user":"deven"})
  db.blog.update({"game":"pinball","user":"deven"},{"$inc":{"score":100}})
  db.blog.update({"game":"pinball","user":"deven"},{"$inc":{"score":10000}})
  upsert
  db.blog.update({"url":"/blog"},{"$inc":{"visits":1}},true)
  查找特定条件:
  db.blog.find({"user":"deven"})
  指定返回键:
  db.blog.find({},{"game":1})
  查找pv小于等于62的文档
  db.blog.find({"pv":{"$lte":62}})
  游标:
  for(i=0;i

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-627240-1-1.html 上篇帖子: mongodb 数据库操作 下篇帖子: mongodb启动参数解释
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表