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博客https://blog.csdn.net/YuKinGGG/article/details/135049582?spm=1001.2014.3001.5501