mongo replSet副本集方式配置、.net core使用MongoDB.Driver创建数据库连接池总结

一、mongo replSet副本集方式配置

1、第一个副本集合

logpath=/home/lqq/db/test/logs

dbpath=/home/lqq/db/test

port=27017

fork=true

logappend=false
nojournal=true #默认是写journal日志的,为了效率关闭日志
maxConns=520
# bind_ip=127.0.0.1,192.168.0.4 #允许的地址 为了安全

replSet=rs1

2、第二个副本集

logpath=/home/lqq/db/test/logs

dbpath=/home/lqq/db/test

port=27018

fork=true

logappend=false
nojournal=true #默认是写journal日志的,为了效率关闭日志
maxConns=520
# bind_ip=127.0.0.1,192.168.0.4 #允许的地址 为了安全

replSet=rs1

3、第三个副本集

logpath=/home/lqq/db/test/logs

dbpath=/home/lqq/db/test

port=27019

fork=true

logappend=false
nojournal=true #默认是写journal日志的,为了效率关闭日志
maxConns=520
# bind_ip=127.0.0.1,192.168.0.4 #允许的地址 为了安全

replSet=rs1

三个配置都写在配置文件中,如下是我的配置


然后使用mongod --config D:\tools\learn\mongo replica\mongodb103210109.conf分别启动mongo服务

然后配置副本集初始化文件init.js,使用mongo 127.0.0.1:27017 D:\tools\learn\mongo replica\init.js初始化主从配置集合

rs.initiate({
    _id : "rs1",
    members : [
        {
		//{_id : 0, host : "127.0.0.1:27017","priority" : 6}这种配置,如果MongoClientSettings设置ReplicaSetName,那么数据库连接的读写操作会使用127.0.0.1:27107
        //{_id : 1, host : "10.32.8.53:27018","priority" : 5},
       // {_id : 2, host : "10.32.64.36:27018","priority" : 5}
    ]
})

这里初始化配置很重要,具体不做解释了。这是我刚开始的配置,导致后面摸索了一个下午,发现如果host配置用私网或者127.0.0.1.那么在使用数据库驱动设置ReplicaSetNmae的时候,数据库连接的读写操作会使用配置的ip和端口

如果你要在公网使用驱动请求连接数据库那么就用公网ip,如果是在私网用私网公网都可以,建议用私网。最好不要配置127.0.0.1

还有很重要的一点:如果你用init.js初始化了副本集配置,那么你直接修改init.js配置,然后使用mongo 127.0.0.1:27017 D:\tools\learn\mongo replica\init.js是不能修改初始化配置的,需要在主集配置中使用如下操作配置

cfg=rs.conf()

cfg.members[0].host="11.29.17.14:27017"

rs.reconfig(cfg)

操作成功会输出{ "ok" : 1 }

然后可以使用rs.conf()或者rs.status()查看初始化配置


二、附上mongo数据库连接池的类(.net core和mongo,驱动MongoDB.Driver)

using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Core.Authentication;
using MongoDB.Driver.Core.Configuration;
using System;
using System.Collections.Generic;

namespace WebApplication.api
{
    public class DbPoll
    {
        private static DbPoll _instance = null;
        private  DbPoll()
        {
            InitDbPoll();
        }
        public static DbPoll CreateInstance()
        {
            if (_instance == null)
            {
                _instance = new DbPoll();
            }
            return _instance;
        }

        private MongoClient client;
        private MongoDatabaseBase database;
        private void config(ClusterBuilder cbuilder)
        {
            cbuilder = new ClusterBuilder();
            List<IAuthenticator> list = new List<IAuthenticator>();
            list.Add(new DefaultAuthenticator(new UsernamePasswordCredential("mongodb://11.29.17.141:27017", "root", "root")));
            cbuilder.ConfigureConnection((connectionSettings) =>
            { return new ConnectionSettings(list, new TimeSpan(0, 3, 0), new TimeSpan(1, 0, 0), "search"); });
            cbuilder.ConfigureConnectionPool((connectionPoolSettings) =>
            { return new ConnectionPoolSettings(new TimeSpan(0, 30, 0), 90, 20, 400, new TimeSpan(0, 0, 30)); });
            cbuilder.ConfigureServer((server) => { return new ServerSettings(new TimeSpan(0, 0, 5), new TimeSpan(0, 0, 5)); });
            cbuilder.ConfigureWithConnectionString("mongodb://11.29.17.141:27017");
        }
        public void InitDbPoll()
        {
            List<MongoServerAddress> list = new List<MongoServerAddress>();
            MongoServerAddress primary = new MongoServerAddress("11.29.17.141", 27017);
            list.Add(primary);
            List<MongoCredential> listCredential = new List<MongoCredential>();
            listCredential.Add(MongoCredential.CreateCredential("search", "root", "root"));
            //listCredential.Add(MongoCredential.CreateCredential("myblog", "root", "root"));
            MongoClientSettings mcs = new MongoClientSettings()
            {
                MaxConnectionPoolSize = 500,
                MinConnectionPoolSize = 20,
                WaitQueueSize = 860,
                MaxConnectionIdleTime = new TimeSpan(0, 3, 0),
                WaitQueueTimeout = new TimeSpan(0, 1, 0),
                Servers = list,
                Server = primary,
                ReadPreference = ReadPreference.SecondaryPreferred,
              //  Credentials = listCredential,
               ReplicaSetName ="rs1"
            };
          //  mcs.ClusterConfigurator = (Action<ClusterBuilder>)config;
            //mongoclientsettings.fromurl(new mongourl("mongodb://11.29.17.141:27017"));
            client = new MongoClient(mcs);
            database = (MongoDatabaseBase)client.GetDatabase("search");
        }
        public MongoClient getClient()
        {
            return client;
        }
        public MongoDatabaseBase getMongoDatabaseBase()
        {
            return database;
        }
        public static readonly DbPoll instance = new DbPoll();
    }

    public class Singleton
    {
        private volatile static Singleton _instance = null;
        private static readonly object lockHelper = new object();
        private Singleton() { }
        public static Singleton CreateInstance()
        {
            if (_instance == null)
            {
                lock (lockHelper)
                {
                    if (_instance == null)
                        _instance = new Singleton();
                }
            }
            return _instance;
        }
    }

}

目前测试性能ok,但是使用 mcs.ClusterConfigurator = (Action<ClusterBuilder>)config;配置连接设置没效,所以放弃。欢迎大家指出问题和讨论,我的qq940235644,添加发送“技术讨论”


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值