MongoDB和Java(6):Spring Data整合MongoDB副本集、分片集群
最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装、客户端操作、安全认证、副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很大。特此记录,以备查看。
文章目录:
MongoDB和Java(1):Linux下的MongoDB安装
MongoDB和Java(2):普通用户启动mongod进程
MongoDB和Java(4):Spring Data整合MongoDB(XML配置)
MongoDB和Java(5):Spring Data整合MongoDB(注解配置)
MongoDB和Java(6):Spring Data整合MongoDB副本集、分片集群
本文记录如何整合Spring data和MongoDB副本集、分片集群。
Java客户端这边的开发环境和《MongoDB和Java(5):Spring Data整合MongoDB(注解配置)》是一样的,实体类、数据层接口、测试类代码都不需要太多的改动,主要需要改的就是mongo的连接属性文件、MongoClient的创建方式。
源代码下载
MongoDB和Java学习代码.zip
1、副本集环境
主:10.10.13.195:27017
从:10.10.13.195:27018, 10.10.13.195:27019
副本集搭建请参考
生产环境部署MongoDB副本集(带keyfile安全认证以及用户权限)
下面我们就简单介绍一下Spring data整合副本集
2、修改连接属性文件
首先修改mongodb.properties
# 副本集环境
mongo.rs=10.10.13.195:27017,10.10.13.195:27018,10.10.13.195:27019 # 单机环境
mongo.host=10.10.13.195
mongo.port=27017 # 数据库和验证信息
mongo.dbname=test
mongo.username=xugf
mongo.password=123456 mongo.connectionsPerHost=8
mongo.minConnectionsPerHost=3
mongo.threadsAllowedToBlockForConnectionMultiplier=4
mongo.connectTimeout=1000
mongo.maxWaitTime=1500
mongo.socketKeepAlive=true
mongo.socketTimeout=1500
增加的内容
# 副本集环境
mongo.rs=10.10.13.195:27017,10.10.13.195:27018,10.10.13.195:27019
3、修改MongoConfiguration配置类
首先修改MongoProperties类,主要是添加获取List<ServerAddress>的方法,在此只写了与副本集环境相关的代码片段:
@Component
@PropertySource(value = "classpath:mongodb.properties")
public class MongoProperties { @Value("${mongo.rs}")
private String rs; private List<ServerAddress> rsServers = new ArrayList<ServerAddress>(); public String getRs() {
return rs;
} public void setRs(String rs) {
this.rs = rs;
} public List<ServerAddress> getRsServers() {
try {
if (rs != null && rs.trim().length() > 0) {
String[] hosts = rs.split(",");
for (String host : hosts) {
String[] ipAndPort = host.split(":");
if (ipAndPort.length == 0) {
continue;
}
if (ipAndPort.length == 1) {
rsServers.add(new ServerAddress(ipAndPort[0], 27017));
} else {
rsServers.add(new ServerAddress(ipAndPort[0], Integer
.parseInt(ipAndPort[1])));
}
}
} else {
rsServers.add(new ServerAddress("localhost", 27017));
return rsServers;
}
} catch (UnknownHostException e) {
}
return rsServers;
}
}
然后修改MongoConfiguration的mongoClient方法,不再使用host + port方式创建MongoClient,而是传入一个List<ServerAddress>,MongoClient会去判断这是一个副本集环境
public MongoClient mongoClient() throws Exception {
List<MongoCredential> credentialsList = new ArrayList<MongoCredential>();
credentialsList.add(MongoCredential.createScramSha1Credential(
mongoProperties.getUsername(), mongoProperties.getDbname(),
mongoProperties.getPassword().toCharArray()));
Builder builder = MongoClientOptions.builder();
builder.connectionsPerHost(mongoProperties.getConnectionsPerHost());
builder.threadsAllowedToBlockForConnectionMultiplier(mongoProperties
.getThreadsAllowedToBlockForConnectionMultiplier());
builder.connectTimeout(mongoProperties.getConnectTimeout());
builder.maxWaitTime(mongoProperties.getMaxWaitTime());
builder.socketKeepAlive(mongoProperties.isSocketKeepAlive());
builder.socketTimeout(mongoProperties.getSocketTimeout());
builder.minConnectionsPerHost(mongoProperties
.getMinConnectionsPerHost());
// 获取副本集服务器集合
List<ServerAddress> rsServers = mongoProperties.getRsServers();
System.out.println("Rs Servers: " + rsServers);
return new MongoClient(rsServers, credentialsList, builder.build());
}
第21行:使用MongoProperties获取服务器地址的列表
第25行:使用public MongoClient(List<ServerAddress> seeds, List<MongoCredential> credentialsList, MongoClientOptions options)构造方法创建MongoClient对象
做了以上改动之后,我们就可以测试了,很简单。
4、分片集群整合
软件系统环境
| MongoDB版本 | mongodb-linux-x86_64-rhel62-4.0.2 |
| 服务器操作系统 | CentOS 6.5 |
| 服务器IP | 10.10.13.195 |
端口分配
| 27016 | Mongos服务器 |
| 27020 | 副本集sh1,分片1的节点 |
| 27021 | 副本集sh1,分片1的节点 |
| 27022 | 副本集sh1,分片1的节点 |
| 27023 | 副本集configSet,配置服务器 |
| 27024 | 副本集configSet,配置服务器 |
| 27025 | 副本集configSet,配置服务器 |
| 27026 | 副本集sh2,分片2的节点 |
| 27027 | 副本集sh2,分片2的节点 |
| 27028 | 副本集sh2,分片2的节点 |
分片集群搭建请参考
Spring Data整合分片集群的方式更加简单,只需要修改连接属性文件即可,配置如下:
# 分布式集群环境
mongo.rs=10.10.13.195:27016 # 数据库和验证信息
mongo.dbname=test
mongo.username=xugf
mongo.password=123456 mongo.connectionsPerHost=8
mongo.minConnectionsPerHost=3
mongo.threadsAllowedToBlockForConnectionMultiplier=4
mongo.connectTimeout=1000
mongo.maxWaitTime=1500
mongo.socketKeepAlive=true
mongo.socketTimeout=1500
第二行,只需要去连接mongos服务就可以。
其余的都不需要修改,前提是程序操作的实体类在mogos中存在且已经配置了分片键。
5、参考资料
生产环境部署MongoDB副本集(带keyfile安全认证以及用户权限)
MongoDB和Java(6):Spring Data整合MongoDB副本集、分片集群的更多相关文章
- MongoDB和Java(5):Spring Data整合MongoDB(注解配置)
最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...
- MongoDB和Java(4):Spring Data整合MongoDB(XML配置)
最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...
- MongoDB和Java(7):MongoDB用户管理
最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...
- spring MVC 整合mongodb
Spring Mongodb 目录 1 SPRING整合MONGODB 1 1.1 环境准备 1 1.2 包依赖 1 1.3 配置 2 2 案列 5 2.1 SPRING MVC整合MONGODB代码 ...
- 使用 Spring Data 进行 MongoDB 4.0 事务处理
使用 Spring Data 进行 MongoDB 4.0 事务处理 原文链接:http://spring.io/blog/2018/06/28/hands-on-mongodb-4-0-transa ...
- JAVA 处理 Spring data mongodb 时区问题
Spring data mongodb 查询出结果的时候会自动 + 8小时,所以我们看起来结果是对的 但是我们查询的时候,并不会自动 + 8小时,需要自己处理 解决方法 1 @JsonFormat ...
- spring+springMVC 整合 MongoDB 实现注册登录
发现一入手 MongoDB,便无法脱离,简要说一下,MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 也是在 Nosql 中我最喜欢的一种 ...
- 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南
1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...
- Spring boot整合Mongodb
最近的项目用了Mongodb,网上的用法大多都是七零八落的没有一个统一性,自己大概整理了下,项目中的相关配置就不叙述了,由于spring boot的快捷开发方式,所以spring boot项目中要使用 ...
随机推荐
- WINDOWS 命令行调用SAS代码 并指定输出路径 示例
ECHO "设置SAS.EXE 路径" SET PATH=D:\Program Files\SASHome\SASFoundation\9.4\SAS.EXE echo " ...
- Matlab Script to pre-process UAV123 tracking dataset
Matlab Script to pre-process UAV123 tracking dataset 2019-11-08 09:43:11 Official project page: http ...
- 配置Zuul代理下游的认证
配置Zuul代理下游的认证 您可以通过proxy.auth.*设置控制@EnableZuulProxy下游的授权行为.例: application.yml proxy: auth: routes: c ...
- TortoiseGit用户名密码的更换方法介绍
http://www.downza.cn/xy/53171.html 有时候因实际需求要更换TortoiseGit用户名密码,怎么办呢?下文就是TortoiseGit用户名密码的更换方法介绍,一起看看 ...
- A Full Hardware Guide to Deep Learning深度学习电脑配置
https://study.163.com/provider/400000000398149/index.htm?share=2&shareId=400000000398149( 欢迎关注博 ...
- java中HashSet对象内的元素的hashCode值不能变化
因为不管是HashMap(或HashTable,还是HashSet),key值是以hashCode值存进去的,加入key值变了,将无法从集合内删除对象,导致内存溢出.
- SVN 从主干合并到分支库
主干库:平时开发用的库, 分支库:中途需要进行上生产环境的库 分支库的版本从主干库拉过去就行 红色的为分支库. 创建的速度很快. 1.创建好后,在主干库添加一个文件. 2.然后分支库进行合并,这里用e ...
- shell基础知识5-函数
函数的定义 function fname(){ } 或者 function_name(){ } 对于简单的函数,甚至可以是这样做 fname() { statement; } 函数调用 直接写函数名即 ...
- C++17新特性optional和string_view
1. optional的作用 类模板 std::optional 管理一个可选的容纳值,即可以存在也可以不存在的值. 一种常见的 optional 使用情况是一个可能失败的函数的返回值.与其他手段,如 ...
- OKEx交易所交易记录日期时间转毫秒级时间戳
本文介绍如何将OKEx交易所成交记录数据中的日期时间转毫秒级时间戳. 作者:比特量化 1. OKEx交易记录格式 [ { "time":"2019-09-14T10:29 ...