MongoDB集群搭建与java代码操作MongoDB示例
MongoDB集群搭建过程
1. MongoDB Replica set集群搭建准备(主从仲裁)
- 介质(根据操作系统下载相应版本):https://www.mongodb.com/download-center/v2/community
- 集群配置手册(官方):https://docs.mongodb.com/manual/reference/configuration-options/
2. 集群搭建(1主,1从,1仲裁)
- 根据操作系统解压相应的安装包
- 准备目录
mkdir ~/primary //存放主节点目录
mkdir ~/secondary //存放从节点目录
mkdir ~/arbiter //存放仲裁者节点目录
mkdir ~/primary/data //存放主节点数据目录
mkdir ~/primary/keyFile //存放节点间鉴权文件目录
mkdir ~/primary/log //存放主节点日志文件目录
mkdir ~/primary/pid //存放主节点pid文件目录
vi ~/primary/log/mongo.log //保存主节点日志的文件
vi ~/primary/pid/mongo.pid //保存主节点pid的文件
vi ~/primary/keyFile/key.key //保存节点间认证秘钥的文件
vi ~/primary/mongo.conf //保存主节点配置信息的文件
注: 4-11步骤需要在 /secondary和~/arbiter建立相同的目录文件
3. 配置内部认证秘钥
在所有角色的keyFile目录下的key.key的文件中写入相同的秘钥, 该文件需要设置600权限, 该文件在所有节点下应保证完全一致
4. 配置启动配置信息
vim ~/primary/mongo.conf
vim ~/secondary /mongo.conf
vim ~/arbiter /mongo.conf
以上三个文件中配置以下信息
security:
authorization: enabled #开启验证
keyFile: "E:/tools/mongoDB-win/mongodb-win32-x86_64-2008plus-ssl-4.0.3/primary/keyFile/key.txt" #指定秘钥文件
storage:
dbPath: "E:/tools/mongoDB-win/mongodb-win32-x86_64-2008plus-ssl-4.0.3/primary/data" #指定存储目录
directoryPerDB: true #开启按库分目录
systemLog:
destination: file
path: "E:/tools/mongoDB-win/mongodb-win32-x86_64-2008plus-ssl-4.0.3/primary/log/mongo.log" #指定log文件
logAppend: true #追加的方式记录日志
processManagement:
pidFilePath: "E:/tools/mongoDB-win/mongodb-win32-x86_64-2008plus-ssl-4.0.3/primary/pid/mongo.pid" #指定pid文件
replication:
replSetName: "testdb" #指定集群名称
oplogSizeMB: 100 #指定日志大小
net:
bindIp: 0.0.0.0 #指定允许访问的ip, 如果想要允许所有ip可访问, 此项要配置成0.0.0.0, 如果不配则默认只可以被127.0.0.1访问
port: 8081 #指定端口
5. 配置集群
-
屏蔽认证(注释掉security的配置)启动集群(mongod -f ~/primary/mongo.conf )
-
连接客户端(mongo --port=port),进入mongo shell端
-
配置节点角色
-
在mongo shell中执行:
cfg={ _id:"testdb", members:[ {_id:0,host:'127.0.0.1:8081',priority:2}, {_id:1,host:'127.0.0.1:8082',priority:1}, {_id:2,host:'127.0.0.1:8083',arbiterOnly:true}] };
注:_id:“testdb”,要与配置文件中的replSetName一致,priority高的将成为主节点,arbiterOnly:true节点将成为仲裁者节点
-
-
rs.initiate(cfg);启用配置
6. 设置用户
-
连接主节点,进入mongo shell端
-
创建用户
db.createUser({user:"yourAccount", pwd:"yourPassword",roles:[{role:"userAdminAnyDatabases", db:"admin"}]})
注:role:“userAdminAnyDatabases”,角色需要配置mongoDB中已经存在的角色,db:"admin"角色所属数据库(角色是随数据库走的)
注:集群模式必须在主节点创建角色, 主节点创建的角色将被同步到集群各节点
7. 放开认证屏蔽,重启集群
java使用MongoDB集群Demo
1. maven依赖
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.8.0</version>
</dependency>
2. 配置文件
#用户名
userName=mongo
#密码
pwd=mongo
#数据库名
adminDb=test
#数据库名
dbname=test
#集群host个数(除仲裁节点)
len=2
#host地址
host1=192.168.8.1:27017
host2=192.168.8.2:27017
#每台主机最大连接数
connectionsPerHost=50
#线程队列数
threads=10
#是否需要身份验证 1要 0不要
authentication=1
#最大等待时间
maxWaitTime=300000
#socket超时时间
socketTimeout=100000
#连接超时时间
connectTimeout=25000
3. java 代码
public class MongoDBUtil {
private static MongoClient mg;
private static MongoDatabase mongoDatabase;
static{
ResourceBundle mongoProperties = ResourceBundle.getBundle("mongo"); // 配置文件
String connectionsPerHost = mongoProperties.getString("connectionsPerHost"); // 连接池数量
String maxWaitTime = mongoProperties.getString("maxWaitTime"); // 最大等待时间
String socketTimeout = mongoProperties.getString("socketTimeout"); // scoket超时时间
String connectTimeout = mongoProperties.getString("connectTimeout"); // 连接超时时间
MongoClientOptions options = MongoClientOptions.builder()
.connectionsPerHost(Integer.parseInt(connectionsPerHost))
.maxWaitTime(Integer.parseInt(maxWaitTime))
.socketTimeout(Integer.parseInt(socketTimeout))
.connectTimeout(Integer.parseInt(connectTimeout)).build();
String hostLen = mongoProperties.getString("len");
List<ServerAddress> hosts = new ArrayList<ServerAddress>(); // 所有主机
for (int i = 1; i <= Integer.parseInt(hostLen); i++) {
String host = mongoProperties.getString("host" + i);
hosts.add(new ServerAddress(host));
System.out.println("host是:::"+host);
}
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
if (mongoProperties.getString("authentication").equals("1")) {
MongoCredential credential = MongoCredential.createCredential(
mongoProperties.getString("userName"), mongoProperties
.getString("adminDb"),
mongoProperties.getString("pwd").toCharArray()); // 需要验证
credentials.add(credential);
}
mg = new MongoClient(hosts, credentials, options);
mongoDatabase = mg.getDatabase(mongoProperties.getString("dbname"));
}
public static MongoDatabase getMongoDatabase() {
return mongoDatabase;
}
public static void setMongoDatabase(MongoDatabase mongoDatabase) {
MongoDBUtil.mongoDatabase = mongoDatabase;
}
/**
* 插入文档数据
* @param mongoCollection
* @param params
*/
public static boolean insertDoucument(final MongoCollection<Document> mongoCollection, Document document){
boolean result =false;
if(null == mongoCollection) {
return false;
}
try {
mongoCollection.insertOne(document);
result =true;
}catch (Exception e){
e.printStackTrace();
}
return result;
}
/**
* 根据字段精确查询
* @param
*/
public static FindIterable<Document> selectDocument(@SuppressWarnings("rawtypes") MongoCollection mongoCollection, String filed, String value){
if(mongoCollection == null ){
return null;
}
@SuppressWarnings("unchecked")
FindIterable<Document> documents = mongoCollection.find(new Document(filed,value));
return documents;
}
/**
*
* Copyright(c) 2018, fapiao.gov.cn. All rights reserved .
* Author: liuyang
* Created: 2018年10月19日
* Description
* 删除document
*/
public static boolean deleteDocument(MongoCollection mongoCollection, String filed, String value){
boolean result =false;
try{
DeleteResult dd=mongoCollection.deleteOne(new Document(filed,value));
int count = (int) dd.getDeletedCount();
if(count==1){
result=true;
}
}catch(Exception e){
System.out.println("mongoDb删除失败");
}
return result;
}
}
public class TestMongoDB {
static MongoDatabase mongoDatabase = MongoDBUtil.getMongoDatabase();
public static void main(String[] args) {
delete();
}
public static void add() {
System.out.println("dddddddddddddd");
MongoCollection<Document> collection = mongoDatabase.getCollection("test");
Document document = new Document();
document.append("rowKey", "a93da192-0d89-4823-b8cb-e791679209qw-1540453023072");
document.append("pic", 111111111);
MongoDBUtil.insertDoucument(collection, document);
}
public static void get() {
System.out.println("ggggggggggggg");
MongoCollection<Document> collection = mongoDatabase.getCollection("test");
Document documentMessage = new Document("rowKey", "a93da192-0d89-4823-b8cb-e791679209qw-1540453023072");
FindIterable<Document> documents = collection.find(documentMessage);
for (Document documentT : documents) {
Integer picCode = (Integer) documentT.get("pic");
System.out.println(picCode);
}
}
public static void delete() {
System.out.println("ddddddddddddd");
MongoCollection<Document> collection = mongoDatabase.getCollection("test");
MongoDBUtil.deleteDocument(collection, "rowKey", "a93da192-0d89-4823-b8cb-e791679209qw-1540453023072");
}
}