MongoDB集群搭建与java代码操作MongoDB示例

MongoDB集群搭建与java代码操作MongoDB示例

MongoDB集群搭建过程

1. MongoDB Replica set集群搭建准备(主从仲裁)

2. 集群搭建(1主,1从,1仲裁)

  • 根据操作系统解压相应的安装包
  • 准备目录
    1. mkdir ~/primary //存放主节点目录
    2. mkdir ~/secondary //存放从节点目录
    3. mkdir ~/arbiter //存放仲裁者节点目录
    4. mkdir ~/primary/data //存放主节点数据目录
    5. mkdir ~/primary/keyFile //存放节点间鉴权文件目录
    6. mkdir ~/primary/log //存放主节点日志文件目录
    7. mkdir ~/primary/pid //存放主节点pid文件目录
    8. vi ~/primary/log/mongo.log //保存主节点日志的文件
    9. vi ~/primary/pid/mongo.pid //保存主节点pid的文件
    10. vi ~/primary/keyFile/key.key //保存节点间认证秘钥的文件
    11. vi ~/primary/mongo.conf //保存主节点配置信息的文件
    12. 注: 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. 配置集群

  1. 屏蔽认证(注释掉security的配置)启动集群(mongod -f ~/primary/mongo.conf )

  2. 连接客户端(mongo --port=port),进入mongo shell端

  3. 配置节点角色

    1. 在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节点将成为仲裁者节点

  4. rs.initiate(cfg);启用配置

6. 设置用户

  1. 连接主节点,进入mongo shell端

  2. 创建用户 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");
			
		}
	
	}

猜你喜欢

转载自blog.csdn.net/weixin_42440086/article/details/83416594