MongoDB——读写分离,简单的主从集群搭建

1,读优化模式设置    

        此次逻辑上采用的是secondaryPreferred模式

primary

默认,只从主节点读取数据;

primaryPreferred

在主节点不可用时,从副节点读取数据;

secondary

所有的读操作,从副节点读取数据;

secondaryPreferred

在副节点不可用时,从主节点读取数据;

nearest

从网络延迟最小的节点获取数据该模式不关注成员的类型,不管是primary还是secondary成员。

2, 集群搭建方式

        此次采用主从备份(Master - Slave)模式;实现向主节点写入数据,从节点从主节点复制数据,在从节点读取数据的效果。

主从备份(Master - Slave)模式,或者叫主从复制模式。

副本集(Replica Set)模式

分片(Sharding)模式

3,搭建集群

       3,1参考文章

             

windows下MongoDB搭建集群:https://blog.csdn.net/u014467089/article/details/94435154

老师发在群里的资料与操作记录

       3,2代码
             
              1,启动mongodb

                指定特定的mongodb可执行文件

                指定port,指定数据存储路径

                指定路径存储路径

                指定副本集名称

E:\MongoDB\Server\MongoDBCOPY\MongoDB1\bin\mongod -port 27017 -dbpath "E:\MongoDB\Server\MongoDBCOPY\MongoDB1\db" -logpath "E:\MongoDB\Server\MongoDBCOPY\MongoDB1\log\mongo.log" -replSet rs0

E:\MongoDB\Server\MongoDBCOPY\MongoDB2\bin\mongod -port 27018 -dbpath "E:\MongoDB\Server\MongoDBCOPY\MongoDB2\db" -logpath "E:\MongoDB\Server\MongoDBCOPY\MongoDB2\log\mongo.log" -replSet rs0

E:\MongoDB\Server\MongoDBCOPY\MongoDB3\bin\mongod -port 27019 -dbpath "E:\MongoDB\Server\MongoDBCOPY\MongoDB3\db" -logpath "E:\MongoDB\Server\MongoDBCOPY\MongoDB3\log\mongo.log" -replSet rs0

              2,配置集群
                     2,1连接服务

                                初次配置仅需连接一台就可以了

E:\MongoDB\Server\MongoDBCOPY\MongoDB1\bin\mongo --host 127.0.0.1 --port 27017

E:\MongoDB\Server\MongoDBCOPY\MongoDB2\bin\mongo --host 127.0.0.1 --port 27018

E:\MongoDB\Server\MongoDBCOPY\MongoDB3\bin\mongo --host 127.0.0.1 --port 27019

                                                

                     2,2初始化集群

                                priority设置权重,权重更大的优先被选举做主节点

                            use admin

                            config = {_id:"rs0",members:[

                                             {_id:0,host:"localhost:27017","priority":3},

                                             {_id:1,host:"localhost:27018","priority":2},

                                             {_id:2,host:"localhost:27019","priority":1}]}

                            rs.initiate(config)

                     2,3查看配置情况

                            集群状态

                            rs.status()

                            副本集配置对象内容

                            rs.conf()

4,java连接集群初步测试

        1,导入依赖     
<dependencies>
    <!-- MongoDB Java Driver -->
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongo-java-driver</artifactId>
        <version>3.12.11</version>
    </dependency>
</dependencies>
         2,测试代码 
import com.mongodb.MongoClient;
import com.mongodb.MongoException;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

import static com.mongodb.client.model.Filters.eq;

public class MongoDBExample {
    public static void main(String[] args) {
        try {
            // 连接主节点并写入数据
            MongoClient primaryClient = new MongoClient("localhost", 27017);
            MongoDatabase database = primaryClient.getDatabase("mydb");
            MongoCollection<Document> collection = database.getCollection("mycollection");

            Document document = new Document("name", "John Doe")
                    .append("age", 30)
                    .append("email", "johndoe@example.com");

            collection.insertOne(document);
            System.out.println("Data written successfully to the primary node.");

            // 连接主节点并读取数据
            Document result = collection.find(eq("name", "John Doe")).first();
            System.out.println("Data read from the primary node:");
            System.out.println(result.toJson());

            // 连接从节点并读取数据
            MongoClient secondaryClient = new MongoClient("localhost", 27018); // 或者连接到localhost:27019
            MongoDatabase secondaryDatabase = secondaryClient.getDatabase("mydb");
            MongoCollection<Document> secondaryCollection = secondaryDatabase.getCollection("mycollection");

            Document secondaryResult = secondaryCollection.find(eq("name", "John Doe")).first();
            System.out.println("Data read from the secondary node:");
            System.out.println(secondaryResult.toJson());

            // 连接从节点并尝试写入数据(将会失败)
            Document newDocument = new Document("name", "Jane Smith")
                    .append("age", 25)
                    .append("email", "janesmith@example.com");

            try {
                secondaryCollection.insertOne(newDocument);
                System.out.println("Data written successfully to the secondary node.");
            } catch (MongoException e) {
                System.out.println("Failed to write data to the secondary node: " + e.getMessage());
            }

            // 关闭连接
            primaryClient.close();
            secondaryClient.close();
        } catch (Exception e) {
            System.err.println(e.getClass().getName() + ": " + e.getMessage());
        }
    }
}
3,结果

        主节点写入数据(成功)
            
        主节点读取数据(成功)
        
        从节点读取数据(成功)
        
        从节点写入数据(失败)

5,总结

        在这里通过对不同的端口分别进行读写操作,实现了在不同的mongo进程中对集群进行读写操作的分离。

        过程中也发现来一个比较有意思的问题,在我的上一篇博客中:Windows 11 下环境变量名与文件名的优先级-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/YuKinGGG/article/details/135049582?spm=1001.2014.3001.5501

  • 28
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MongoDB中,可以通过配置副本集来实现单机的读写分离。副本集是由多个MongoDB节点组成的,其中包括一个主节点(Primary)和多个从节点(Secondary)。主节点负责处理所有的写操作,并将写操作的结果复制给从节点。从节点只负责处理读操作,并且从主节点复制数据以保持与主节点的数据同步。 要实现MongoDB的单机读写分离,可以按照以下步骤进行配置: 1. 配置主节点和从节点:在配置文件中设置`replSet`参数为副本集的名称(例如`MongoXset`),并为每个节点设置唯一的`port`和`bindIp`。 2. 启动MongoDB节点:按照配置文件中的设置分别启动主节点和从节点。 3. 初始化副本集:在主节点上运行`rs.initiate()`命令来初始化副本集。 4. 添加从节点:在主节点上运行`rs.add()`命令,将从节点添加到副本集中。 5. 验证副本集状态:在主节点上运行`rs.status()`命令,确保所有节点都已成功加入副本集并处于正常状态。 6. 进行读写操作:现在,可以使用主节点进行写操作,使用从节点进行读操作。通过在应用程序中指定不同的连接地址,即可实现读写分离。 需要注意的是,副本集的读写分离是通过应用程序进行实现的,而不是MongoDB本身。应用程序需要根据业务需求,选择合适的节点来处理读写操作。此外,副本集的读写分离并不能提升整体的性能,只是在分布式环境下提供了一种高可用和负载均衡的解决方案。 来源:使用Mongodb实现读写分离和集群部署 https://www.cnblogs.com/duanxz/p/9737342.html 来源:在三台centos虚拟机上安装mongoDB并配置副本集 https://www.jianshu.com/p/bd8d5c2b5b19 来源:Mongodb集群与分片集群概念和实践 https://blog.csdn.net/qq_35246620/article/details/80204712

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值