一、问题说明:
最近测试mongo复制集,由于没有机器,所以选择在一台虚拟机上搭建。然后使用mongo-java-driver连接。
①、复制集初始化函数如下:
- > config = {_id: 'shard1', members: [{_id: 0, host: '127.0.0.1:20011'},{_id: 1, host: '127.0.0.1:20012'},{_id: 2, host:'127.0.0.1:20013'}]}
- > rs.initiate(config)
或者你换成localhost,都没有关系。
②、java连接代码如下:
- static Mongo m = null;
- static{
- try {
- List<ServerAddress> list= new ArrayList<ServerAddress>();
- ServerAddress sap0 = new ServerAddress("192.168.132.100",20011);
- ServerAddress sas1 = new ServerAddress("192.168.132.100",20012);
- ServerAddress sas2 = new ServerAddress("192.168.132.100",20013);
- list.add(sap0);
- list.add(sas1);
- list.add(sas2);
- m = new Mongo(list);
- } catch (UnknownHostException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
192.168.132.100是虚拟机的IP,并不是使用本地localhost或者127.0.0.1,因为程序不再虚拟机上么。
报错:
- Exception in thread "main" com.mongodb.MongoException: can't find a master
原因分析:
m = new Mongo(list);
使用此方法:
- public Mongo( List<ServerAddress> replicaSetSeeds , MongoOptions options )
- throws MongoException {
- ....
- _addrs = replicaSetSeeds;
- ....
- _connector = new DBTCPConnector( this , _addrs );
- _connector.start();
- ...
- }
数据库连接是DBTCPConnector的实体类。
- public DBTCPConnector( Mongo m , List<ServerAddress> all )
- throws MongoException {
- _portHolder = new DBPortPool.Holder( m._options );
- _checkAddress( all );
- _allHosts = new ArrayList<ServerAddress>( all );
- _rsStatus = new ReplicaSetStatus( m, _allHosts );
- _createLogger.info( all " -> " getAddress() );
- }
错误报错是找不到主,我们关注ReplicaSetStatus类,继续往下走:
这个类是获取replica set 最新状态的,运行时,后台有一个线程ping服务器,所以这个类的状态都是最新的。他会读取rs的初始化函数,得到host,主从等等状态信息。
初始化函数:
- ReplicaSetStatus( Mongo mongo, List<ServerAddress> initial ){
- _all = Collections.synchronizedList( new ArrayList<Node>() );
- for ( ServerAddress addr : initial ){
- _all.add( new Node( addr ) );
- }
- ...
- _updater = new Updater();
- }
可以看到还有一个Node类,这个类是个内部类,保存address的名称,端口等信息。
Updater即是后台进程,同样是个内部类,继承Thead类:
- class Updater extends Thread {
- Updater(){
- super( "ReplicaSetStatus:Updater" );
- setDaemon( true );
- }
- public void run(){
- while ( ! _closed ){
- try {
- updateAll();
- long now = System.currentTimeMillis();
- if (inetAddrCacheMS > 0 && _nextResolveTime < now) {
- _nextResolveTime = now inetAddrCacheMS;
- for (Node node : _all) {
- node.updateAddr();
- }
- }
- // force check on master
- // otherwise master change may go unnoticed for a while if no write concern
-
_mongo.getConnector().checkMaster(true, false);
- }
- catch ( Exception e ){
- _logger.log( Level.WARNING , "couldn't do update pass" , e );
- }
- try {
- Thread.sleep( updaterIntervalMS );
- }
- catch ( InterruptedException ie ){
- }
- }
- }
- }
当_connector.start();执行时,就会启动这个线程。关注绿色代码部分,updateAll()函数
- synchronized void updateAll(){
- HashSet<Node> seenNodes = new HashSet<Node>();
- for ( int i=0; i<_all.size(); i++ ){
- Node n = _all.get(i);
- n.update(seenNodes);
- }
- ...
- }
n.update(seenNodes),继续。。
- synchronized void update(Set<Node> seenNodes){
- try {
- long start = System.currentTimeMillis();
- CommandResult res = _port.runCommand( _mongo.getDB("admin") , _isMasterCmd );
- ...
- }
可以看到程序会远程执行isMaster命令,得到res
- { "serverUsed" : "192.168.72.128:20011" , "setName" : "rstest" , "ismaster" : false , "secondary" : true , "hosts" : [ "localhost:20011" , "localhost:20013" , "localhost:20012"] , "primary" : "localhost:20012" , "me" : "localhost:20011" , "maxBsonObjectSize" : 16777216 , "ok" : 1.0}
这样的信息,看到了吧,hosts里面显示的是localhost:20011,就是我们在config函数里配置的IP
然后后面的程序会更新Node,将host变为localhost:20011,这样,我们的程序就无法连接了,毕竟不是在本地配置的。
其实这是个特例了,如果你的程序和mongo在一起的话,这样配置也不会出错,如果程序和mongo不在一起,那么你就需要用外部IP配置复制集了。解决办法如下:
- > config = {_id: 'shard1', members: [{_id: 0, host: '192.168.132.100:20011'},{_id: 1, host: '192.168.132.100:20012'},{_id: 2, host:'192.168.132.100:20013'}]}
- > rs.initiate(config)
说实在的,写到这里我写不下去了,因为这个是另外启动的线程,我无法调试出来具体的过程。但是原因却是是这个,大家注意就好了,如果有调试出具体过程的,感谢分享。
相关推荐
在分布式方面,MongoDB支持复制集,这是一种高可用性解决方案,通过复制数据到多个节点确保数据冗余和故障转移。设置复制集涉及配置主节点和从节点,并理解选举过程。另一个重要的分布式特性是分片,它允许你将大型...
3. **分片和复制集**:MongoDB支持水平扩展,通过分片(Sharding)可以在多台机器上分配数据,以提高存储和查询性能。复制集(Replica Set)则提供数据冗余和高可用性,确保在单点故障时数据不丢失。 4. **Java驱动...
- **双台MongoDB**:在高可用性设置中,可以通过提供两个`DBAddress`对象来连接到MongoDB复制集。 ```java DBAddress left = new DBAddress("ip:port/dataBaseName"); DBAddress right = new DBAddress("ip:port...
4. **创建必需的目录**:在每台机器上创建5个目录,分别用于Mongos、Config Server和三个Shard分片: - `/data/mongodb/mongos/log` - `/data/mongodb/config/data` - `/data/mongodb/config/log` - `/data/...
- 分布式架构:MongoDB是分布式的,支持分片(sharding)和复制集(replica sets),能轻松扩展到多台服务器以处理大量数据。 - 自动故障转移:通过复制集实现,当主节点故障时,其他节点会自动晋升为主节点,保证...
2. **安装与配置**:学习在不同的操作系统上安装MongoDB,配置复制集或分片集群以提高可用性和扩展性。 3. **CRUD操作**:掌握基本的创建、读取、更新和删除数据的操作,如`db.collection.insert()`, `db.collection...
复制集允许多个数据库服务器共享相同的数据,这样即使某个节点出现故障,其他节点也能继续提供服务。 在MongoDB中,分析器(Profiler)是一个用于收集数据库操作信息的工具,它可以帮助开发者了解数据库操作的性能...
而分片则是解决大数据存储问题的方法,通过将数据分布在多个机器上,实现水平扩展。 MongoDB还支持多种编程语言的驱动程序,如Python的PyMongo、Java的MongoDB Java Driver等,这使得开发人员能够方便地在各自熟悉...
- **弹性存储**: 数据可以分布在多台服务器上,通过分片技术实现动态负载均衡,提供高可用性和容错能力。 - **强大的查询语言**: MongoDB的查询语言非常强大,支持类似SQL的查询语法,同时提供正则表达式、数组操作...
4. **复制集**:MongoDB提供复制集功能,通过数据复制和故障切换,确保高可用性和数据安全性。 5. **弹性查询**:MongoDB的查询语言非常强大,支持丰富的查询操作,包括字段选择、比较操作、正则表达式匹配等。 6....
2. 分片:用于水平扩展,将数据分布在多个机器上,以处理大量数据和高并发读写请求。 八、聚合框架 MongoDB的聚合框架用于处理数据记录并返回计算结果,类似于SQL的GROUP BY和JOIN操作。聚合管道由多个阶段组成,如...
3. **分片(sharding)**:MongoDB的分片功能允许在多台机器上水平扩展数据存储,以应对大数据量的需求。在2.2.6版本中,分片策略优化,提高了数据分布的均匀性。 4. **查询性能**:MongoDB 2.2.6对查询优化器进行了...
8. **分片**:对于大数据场景,分片可以将数据分布在多台机器上,提升系统性能。学习如何规划和实施分片策略,以及如何管理和监控分片集群。 9. **安全与认证**:MongoDB的安全特性包括用户认证、角色权限、网络...
作为NoSQL数据库的一种,MongoDB与传统的关系型数据库在数据模型和操作方式上有着显著的区别。本指南将深入介绍MongoDB的核心概念、安装过程以及实际应用。 一、MongoDB概述 MongoDB是由10gen公司开发的面向文档的...
2. **分布式架构**:MongoDB支持分片(sharding)和复制集(replica sets),可以轻松地在多台机器上分散数据,实现水平扩展,以应对高并发和大量数据存储的需求。 3. **弹性查询**:MongoDB提供了强大的查询语言,...
MongoDB是一款开源、分布式、高性能的文档型数据库,专为处理大规模数据而设计。它以其灵活性、可扩展性和高可用性在IT行业中受到广泛应用。MongoDB的“软件”指的是其服务器端程序,允许用户存储、查询和管理大量...
### 最新MongoDB实战典藏版知识点概览 ...综上所述,《最新MongoDB实战典藏版》不仅介绍了MongoDB的基础知识,还深入探讨了其在实际项目中的应用技巧和高级管理技术,为读者提供了一本全面的参考指南。
2. 分布式架构:MongoDB支持分片(Sharding)和复制集(Replica Sets),可以轻松地在多台服务器上分配数据,提供水平扩展性和高可用性。分片用于将大型数据集分散到多个服务器,而复制集则确保数据冗余和故障切换。...