`
thrillerzw
  • 浏览: 143741 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mongodb

 
阅读更多

 

一 副本集:

     

实现集群搭建,冗余备份,故障自动切换,读写分离,java访问集群。

 

 1 搭建

 

a.conf:

dbpath=/opt/data/mongo100a

port=1111

bind_ip=192.168.1.100

replSet=child/192.168.1.100:2222

 

# /opt/mongo/mongo100a/bin/mongod --config /opt/mongo/replset/a.conf

 

dbpath=/opt/data/mongo100b

port=2222

bind_ip=192.168.1.100

replSet=child/192.168.1.100:3333

 

 

# /opt/mongo/mongo100b/bin/mongod --config /opt/mongo/replset/b.conf

 

dbpath=/opt/data/mongo100c

port=3333

bind_ip=192.168.1.100

replSet=child/192.168.1.100:1111

# /opt/mongo/mongo100c/bin/mongod --config /opt/mongo/replset/c.conf 

 

 

# /opt/mongo/mongo100a/bin/mongo 192.168.1.100:1111 

# /opt/mongo/mongo100b/bin/mongo 192.168.1.100:2222 

# /opt/mongo/mongo100c/bin/mongo 192.168.1.100:3333 

 

 

任意一台,初始化副本集  

[root@Master ~]# /opt/mongo/mongo100b/bin/mongo 192.168.1.100:2222

use admin

db.runCommand({"replSetReconfig" : {   

    "_id" : "child",   

    "members" : [   

    {   

    "_id" : 1,   

    "host" : "192.168.1.100:1111"  

    },   

    {   

    "_id" : 2,   

    "host" : "192.168.1.100:2222"  

    },   

    {   

    "_id" : 3,   

    "host" : "192.168.1.100:3333"  

    }   

    ]}})  

    

    local.oplog.r

 

初始化完,选出活跃点,不再有连接不上同伴的提示。如下:

Sun Sep 22 05:48:21.340 [rsStart] trying to contact 192.168.1.100:2222

Sun Sep 22 05:48:21.342 [rsStart] couldn't connect to 192.168.1.100:2222: couldn't connect to server 192.168.1.100:2222

Sun Sep 22 05:48:21.344 [rsStart] replSet info Couldn't load config yet. Sleeping 20sec and will try again.

 

初始化后显示Sun Sep 22 04:36:27.135 [initandlisten] connection accepted from 192.168.1.100:33909 #13 (2 connections now open)

 

查看状态:

child:SECONDARY> rs.status()

{

        "set" : "child",

        "date" : ISODate("2013-09-21T20:40:12Z"),

        "myState" : 2,

        "syncingTo" : "192.168.1.100:2222",

        "members" : [

                {

                        "_id" : 1,

                        "name" : "192.168.1.100:1111",

                        "health" : 1,

                        "state" : 2,

                        "stateStr" : "SECONDARY",

                        "uptime" : 373,

                        "optime" : Timestamp(1379795635, 1),

                        "optimeDate" : ISODate("2013-09-21T20:33:55Z"),

                        "lastHeartbeat" : ISODate("2013-09-21T20:40:12Z"),

                        "lastHeartbeatRecv" : ISODate("2013-09-21T20:40:11Z"),

                        "pingMs" : 0,

                        "syncingTo" : "192.168.1.100:2222"

                },

                {

                        "_id" : 2,

                        "name" : "192.168.1.100:2222",

                        "health" : 1,

                        "state" : 1,

                        "stateStr" : "PRIMARY",

                        "uptime" : 373,

                        "optime" : Timestamp(1379795635, 1),

                        "optimeDate" : ISODate("2013-09-21T20:33:55Z"),

                        "lastHeartbeat" : ISODate("2013-09-21T20:40:12Z"),

                        "lastHeartbeatRecv" : ISODate("2013-09-21T20:40:12Z"),

                        "pingMs" : 1

                },

                {

                        "_id" : 3,

                        "name" : "192.168.1.100:3333",

                        "health" : 1,

                        "state" : 2,

                        "stateStr" : "SECONDARY",

                        "uptime" : 1277,

                        "optime" : Timestamp(1379795635, 1),

                        "optimeDate" : ISODate("2013-09-21T20:33:55Z"),

                        "self" : true

                }

        ],

        "ok" : 1

}

 

child:PRIMARY> use testdb

switched to db testdb

child:PRIMARY> db.testdb.insert({name:"thrillerzw",age:27})

 

 

child:SECONDARY> show dbs;

local   0.09375GB

testdb 0.0625GB

child:SECONDARY> use testdb

switched to db testdb

child:SECONDARY> db.testcol.find()

error: { "$err" : "not master and slaveOk=false", "code" : 13435 }

 

 

 

重新配置报错:

"errmsg" : "local.oplog.rs is not empty on the initiating member.  cannot initiate."

 db.runCommand({replSetReconfig: config}); 

{

        "startupStatus" : 1,

        "ok" : 0,

        "errmsg" : "loading local.system.replset config (LOADINGCONFIG)"

}

 

解决: Reconfigure the replicaset with the new configuration

> rs.config()

{

        "_id" : "child",

        "version" : 1,

        "members" : [

                {

                        "_id" : 1,

                        "host" : "192.168.1.100:1111"

                },

                {

                        "_id" : 2,

                        "host" : "192.168.1.100:2222"

                },

                {

                        "_id" : 3,

                        "host" : "192.168.1.100:3333"

                }

        ]

}

>  var cfg = rs.config()

>  cfg.members = [   

...     {   

...     "_id" : 1,   

...     "host" : "192.168.1.100:1111"  

...     },   

...     {   

...     "_id" : 2,   

...     "host" : "192.168.1.100:2222"  

...     },   

    {   

...     {   

...     "_id" : 3,   

...     "host" : "192.168.1.100:3333"  

...     }   

...     ]

[

        {

                "_id" : 1,

                "host" : "192.168.1.100:1111"

        },

        {

                "_id" : 2,

                "host" : "192.168.1.100:2222"

        },

        {

                "_id" : 3,

                "host" : "192.168.1.100:3333"

        }

]

>  rs.reconfig(cfg , {force : true})

{

        "msg" : "will try this config momentarily, try running rs.conf() again in a few seconds",

        "ok" : 1

}

> rs.conf()

{

        "_id" : "child",

        "version" : 96789,

        "members" : [

                {

                        "_id" : 1,

                        "host" : "192.168.1.100:1111"

                },

                {

                        "_id" : 2,

                        "host" : "192.168.1.100:2222"

                },

                {

                        "_id" : 3,

                        "host" : "192.168.1.100:3333"

                }

        ]

}

rs.status()查看正确,重连mongo shell就好了,不用重启mongod。

 

只剩一个节点活着:Exception in thread "main" com.mongodb.MongoException: can't find a master

 

child:SECONDARY> db.getMongo().setSlaveOk()   设置以后所有从库都可读。


添加一台服务器:
# /opt/mongo/mongo101a/bin/mongod --config /opt/mongo/replset/a.conf

在活跃节点上执行
child:PRIMARY> rs.add("192.168.1.101:1111")
{ "ok" : 1 }

如果要删除某一个节点可以执行rs.remove(“主机名:端口号”)

PRIMARY修改优先级:
cfg = rs.conf()
cfg.members[3].priority = 0
rs.reconfig(cfg)

2 java 调用

 

package mongo;

import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import com.mongodb.MongoOptions;
import com.mongodb.ReadPreference;
import com.mongodb.ReplicaSetStatus;
import com.mongodb.ServerAddress;

/**
 * MongoDB 连接器
 * 
 * @author thrillerzw
 */
public class MongoConn {

	private static Mongo[] mongos = new Mongo[10];

	private static short mongoCount = 0;

	private static DB db = null;
	static Mongo m;  
	static Mongo mread;  
    
    static {   
        List<ServerAddress> addresslist = new ArrayList<ServerAddress>();   
        try {   
            addresslist.add(new ServerAddress("192.168.1.100:1111"));   
            addresslist.add(new ServerAddress("192.168.1.100:2222"));   
        } catch (UnknownHostException e) {   
            System.err.println("address check error.");   
            System.exit(-1);   
        }   
           
        List<ServerAddress> readAddresslist = new ArrayList<ServerAddress>();   
        try {   
        	readAddresslist.add(new ServerAddress("192.168.1.101:1111"));   
        	readAddresslist.add(new ServerAddress("192.168.1.100:3333"));   
        } catch (UnknownHostException e) {   
            System.err.println("address check error.");   
            System.exit(-1);   
        }   
        
        MongoOptions options = new MongoOptions();   
        options.autoConnectRetry = true;   
        options.connectionsPerHost = 20;   
        options.connectTimeout = 6000;   
        options.maxAutoConnectRetryTime = 12000;   
        options.maxWaitTime = 12000;   
        options.socketKeepAlive = true;   
        options.socketTimeout = 2000;   
           
        try {   
            m = new Mongo(addresslist, options);   
            mread=new Mongo(readAddresslist,options);
        } catch (MongoException e) {   
            System.err.println("mongo create error.");   
            System.exit(-1);   
        }   
    }  
	public final static Mongo getMongo() {
		return m;
	}

	public final static DB getDB(String dbName) {
		Mongo mongo = getMongo();
		if (db == null && mongo != null) {
			try {
				db = mongo.getDB(dbName);
			}
			catch (Exception e) {
				e.printStackTrace();
			}
		}
		return db;
	}
	
	public static void main(String[] args) {
		 Mongo mongo= getMongo() ;
		 ReplicaSetStatus replicaSetStatus=mongo.getReplicaSetStatus();
		 ReadPreference readPreference =mongo.getReadPreference();
		DB readDb = mread.getDB("testdb");
		DB db=getDB("testdb");
		DBCollection  dBCollection =db.getCollection("testcol");
		DBCursor  dBCursor =dBCollection.find();
		while(dBCursor.hasNext()){
			 DBObject  dBObject=dBCursor.next();
			 System.out.println(dBObject.get("name")+" "+dBObject.get("age"));
		}
		System.out.println("----------");
		DBCollection  rdBCollection =db.getCollection("testcol");
		DBCursor  rdBCursor =dBCollection.find();
		while(rdBCursor.hasNext()){
			 DBObject  dBObject=rdBCursor.next();
			 System.out.println(dBObject.get("name")+" "+dBObject.get("age"));
		}
		try {
			Mongo m2 = new Mongo("192.168.1.100:3333");
			DB db2=m2.getDB("testdb");
			db2.slaveOk();
			DBCollection c2=db2.getCollection("testcol");
			DBCursor  dBCursor2 =c2.find();
			//Exception in thread "main" com.mongodb.MongoException: not talking to master and retries used up
			//加db2.slaveOk();解决。
			while(dBCursor2.hasNext()){
				 DBObject  dBObject=dBCursor2.next();
				 System.out.println(dBObject.get("name")+" "+dBObject.get("age"));
			}
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}

}

 

 

 

三:乱七八糟

 

可变列,灵活。
bson格式跟json相同,数据类型多。
shell封装了js引擎,可以用for(var i=0...)在 shell批量插入。
强硬的更新会替换掉老的文档,想要的是局部更新。
remove不会删除索引且效率低,用db.集合名.drop()更好。
saveOrUpdate: update({查询器},{修改器},true);
批量更新$set update({查询器},{修改器},false,true);
addToSet 和each判断式批量导入。
不支持多表关联查询,嵌套查询。单表可以使用正则查询,比sql强大。
查询符在对象内部,更新符在对象外部。
$size只能等于,不能用其它比较运算符,如大于,小于。可以给表加数组的大小字段,注意更新。
[root@Slave1 bin]# ./mongo 127.0.0.1:27017/admin
show dbs;
use testdb;
db.thrillerzw.insert({name:"testName2"});
db.thrillerzw.findOne();
db.thrillerzw.find();

 

db.thrillerzw.help();

 

 

 

分享到:
评论
1 楼 guoyangjie 2014-09-09  
rs.reconfig(config, {force: true})这个问题描述的不够精确,此外在这里贴出该问题的源:http://stackoverflow.com/questions/10953752/how-to-modify-replica-set-config

相关推荐

    Linux安装mongodb客户端

    sudo vim /etc/yum.repos.d/mongodb-org-4.2.repo 写入: [mongodb-org-4.2] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/ gpgcheck=1 enabled=1 gpg...

    mongodb-测试数据

    MongoDB是一种流行的开源、分布式文档数据库,常被用于构建高性能、可扩展的应用程序。这个“mongodb-测试数据”压缩包显然包含了一些用于测试MongoDB功能的样例数据集,特别是针对增、删、改、查(CRUD)操作的学习...

    linux安装mongodb教程

    /usr/local/mongodb/mongodb-linux-2.0.7/bin/mongod --dbpath=/usr/local/mongodb/data/db --logpath=/usr/local/mongodb/mongodb-linux-2.0.7/logs/mongodb.log --logappend --port=27017 --fork 知识点 6:配置...

    spring-data使用mongodbTemplate对MongoDB进行读写操作

    Spring Data MongoDB是一个强大的Java库,它为开发人员提供了一种简单的方式来访问和操作MongoDB数据库。这个库是Spring Data框架的一部分,旨在简化数据访问层的实现,尤其在使用NoSQL数据库如MongoDB时。MongoDB...

    MongoDB实验 - .docx

    MongoDB 实验报告 本实验报告旨在详细介绍 MongoDB 的安装、配置和基本操作步骤,本报告基于 CentOS 7 系统,通过一步一步的截图和文字说明,帮助读者快速掌握 MongoDB 的使用。 一、安装 MongoDB 首先,我们需要...

    MongoDB之conf配置文件详解

    MongoDB之conf配置文件详解 MongoDB的配置文件是服务器的核心组件之一,它控制着MongoDB服务器的各种设置和行为。在本文中,我们将详细介绍MongoDB的配置文件的各个部分,并解释每个设置的作用和意义。 一、数据库...

    mongodb c#驱动最新驱动mongodb.driver.dll 版本2.12.0-beta1

    MongoDB 是一个流行的开源、基于分布式文件存储的数据库系统,主要设计用于处理大量数据的分布式环境。C# 驱动是 MongoDB 提供的一种客户端库,允许 .NET 开发者与 MongoDB 数据库进行交互。标题提到的是 MongoDB 的...

    mongodb.dll 下载.zip

    MongoDB是一个开源、分布式、高性能的NoSQL数据库,以其灵活性、可扩展性和高可用性而闻名。`mongodb.dll`是MongoDB数据库系统在Windows平台上运行所必需的一个动态链接库(DLL)文件,它包含了MongoDB客户端和...

    geoserver发布mongodb矢量数据地图服务.docx

    Geoserver发布MongoDB矢量数据地图服务 Geoserver是一款功能强大且开源的地理信息系统(GIS)服务器,能够实现空间数据的存储、处理和发布。MongoDB是一款NoSQL数据库,能够存储大量的矢量数据。本文将介绍如何使用...

    MongoDB应用设计模式

    资源名称:MongoDB应用设计模式内容简介:无论是在构建社交媒体网站,还是在开发一个仅在内部使用的企业应用程序,《MongoDB应用设计模式》展示了MongoDB需要解决的商业问题之间的连接。你将学到如何把MongoDB设计...

    MongoDB(mongodb-org-server_5.0.4_amd64.deb)

    MongoDB Community Server(mongodb-org-server_5.0.4_amd64.deb)适用于适用于Debian10 MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是...

    MongoDB4.2.21 Linux版本安装包

    MongoDB是一款高性能、无模式的分布式文档型数据库,被广泛应用于大数据分析、内容管理系统、物联网(IoT)、实时应用程序和地理位置数据存储等场景。在Linux环境下安装MongoDB 4.2.21版本,是许多系统管理员和开发者...

    MongoDB Community(mongodb-linux-aarch64-ubuntu1804-5.0.8.tgz)

    MongoDB Community Server(mongodb-linux-aarch64-ubuntu1804-5.0.8.tgz)适用于Ubuntu 18.04 Arm芯片, MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决...

    mongodb数据库jar包

    MongoDB是一个流行的开源、分布式文档型数据库,设计用于处理大量数据并提供高可用性和高性能。在Java应用程序中,为了与MongoDB进行交互,我们需要使用Java MongoDB驱动程序。这个压缩包包含的就是Java连接MongoDB...

    MongoDB(mongodb-src-r5.0.4.tar.gz)

    MongoDB Community Server(mongodb-src-r5.0.4.tar.gz)源代码 MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非...

    MongoDB c#驱动 dll

    MongoDB是一种流行的开源、分布式文档型数据库,以其灵活性、高性能和可伸缩性而闻名。在C#开发环境中,MongoDB提供了专门的C#驱动程序,使得开发者能够方便地与MongoDB进行交互。本篇文章将深入探讨MongoDB的C#驱动...

    Mongodb for Ubuntu 18.04 ARM 64

    MongoDB 是一个流行的开源文档型数据库,被广泛用于存储、管理和检索非结构化或半结构化数据。在本文中,我们将深入探讨如何在基于ARM架构的Ubuntu 18.04系统上安装和使用MongoDB。 一、ARM架构与Ubuntu 18.04 ARM...

    MongoDB Days 2015 深圳 PPT 共享

    MongoDB是一种分布式文档数据库,以其灵活性、高性能和可伸缩性而闻名,尤其适用于处理大量半结构化和非结构化数据。MongoDB Day 2015 深圳活动显然是一个专门针对MongoDB技术的研讨会或会议,旨在深入探讨和分享...

    mongodb Windows7 64位

    MongoDB是一款开源、高性能、无模式的文档型数据库,它在现代应用程序开发中扮演着重要的角色,特别是在处理大量非结构化数据时。针对"mongodb Windows7 64位"这个主题,我们将深入探讨MongoDB在Windows 7 64位操作...

    mongodb-4.0.4_windows

    MongoDB 是一个高性能、分布式、开源的文档型数据库系统,被广泛应用于Web应用程序、移动应用后端、大数据分析以及物联网(IoT)等场景。它以其灵活的数据模型、高可用性和可扩展性著称,是NoSQL数据库领域的代表之一...

Global site tag (gtag.js) - Google Analytics