• 技术文章 >数据库 >MongoDB

    mongodb副本集如何读写分离?

    yangyang2020-05-23 13:35:51原创3157

    首先我们先来搭建一个副本集(因为没有那么多服务器机器,这里采用在一台机器上,使用不同的端口号模拟不同的机器上的Mongodb实例)。

    第一步:我们在本机的1111、2222和3333三个端口上启动三个不同的Mongodb实例;

    mongod --port 1111 --dbpath F:/mongodb1/data/db --logpath F:/mongodb1/data/log/mongodb.log --replSet test --logappend
    mongod --port 2222 --dbpath F:/mongodb2/data/db --logpath F:/mongodb2/data/log/mongodb.log --replSet test --logappend
    mongod --port 3333 --dbpath F:/mongodb3/data/db --logpath F:/mongodb3/data/log/mongodb.log --replSet test --logappend

    在这里我们启动了三个Mongodb实例,并指定了相应的数据目录和日志目录,需要说明的是,这里需要使用--replSet说明该Mongodb实例是副本集中的节点,而该副本集的名称是test。

    第二步:登录到一个实例上,编写指令,将三个不同的Mongodb实例结合在一起形成一个完整的副本集;

    config_test={"_id":"test",members:[
        {_id:0,host:"127.0.0.1:1111"},
        {_id:1,host:"127.0.0.1:2222"},
        {_id:2,host:"127.0.0.1:3333"},
    ]};

    第三步:通过执行下面的命令初始化副本集。

    rs.initiate(config_test);

    这里使用上面的配置初始化Mongodb副本集。

    通过上面的三步,便可以简单的搭建起一个由三个Mongodb实例构成的名称为test的副本集了。如果想查看副本集的状态,可以使用rs.status()命令来进行查看。

    副本集读写分离结构如下图所示:

    为了在副本集上实现读写分离,我们需要实现以下两步:

    (1)在副本节点上设置setSlaveOk;

    (2)代码层面,在读操作过程中设置从副本节点读取数据,如下所示:

    <span style="font-family:KaiTi_GB2312;font-size:18px;">public class TestMongoDBReplSet { 
    	public static void main(String[] args)  {
    		try { 
    			List<ServerAddress> addresses = new ArrayList<ServerAddress>();  
                ServerAddress address1 = new ServerAddress("127.0.0.1" , 1111); 
    			ServerAddress address2 = new ServerAddress("127.0.0.1" , 2222); 
    			ServerAddress address3 = new ServerAddress("127.0.0.1" , 3333); 
    			addresses.add(address1);  
                addresses.add(address2); 
    			addresses.add(address3); 
    			MongoClient client = new MongoClient(addresses); 
    			DB db = client.getDB( "test"); 
    			DBCollection coll = db.getCollection( "test"); 
    			
    			BasicDBObject object = new BasicDBObject();  
                object.append( "key1", "value1" ); 
    			ReadPreference preference = ReadPreference.secondary();  
    			DBObject dbObject = coll.findOne(object, null , preference);  
    			System. out .println(dbObject);  
    		} catch (Exception e) { 
    			e.printStackTrace();  
            } 
    	} 
    } </span>

    读参数除了secondary以外,还有其他几个参数可以使用,他们的含义分别如下所示:

    primary:默认参数,只从主节点上进行读取操作;

    primaryPreferred:大部分从主节点上读取数据,只有主节点不可用时从secondary节点读取数据。

    secondary:只从secondary节点上进行读取操作,存在的问题是secondary节点的数据会比primary节点数据“旧”。

    secondaryPreferred:优先从secondary节点进行读取操作,secondary节点不可用时从主节点读取数据;

    nearest:不管是主节点、secondary节点,从网络延迟最低的节点上读取数据。

    更多mongodb相关文章请关注python自学网

    专题推荐:mongodb
    上一篇:mongodb服务在哪里启动? 下一篇:mongodb慢查询是什么?

    相关文章推荐

    • mongodb怎么查看有多少数据文件?• mongodb查询以什么开头的?

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网