mongo 读写分离 写关注

 

mongodb连接五大要素:账号、密码、ip、端口、用户所在数据库:

 

mysql连接四大要素:账号、密码、ip、端口:

 

mongodb安装完后默认是不开启auth模块的,普通用户和超级管理员均不通过认证就可操作。当然裸奔有风险,安全起见还是开启auth模块。业务测试库通常是这样运行的。
首先需要了解下面几点:
1、mongodb是没有默认管理员账号,所以要先添加管理员账号,然后开启权限认证。
2、切换到admin数据库,添加的账号才是管理员账号。
3、用户只能在用户所在数据库登录,包括管理员账号。通常都要加上“--authenticationDatabase db_name”,管理员,通常是创建在admin数据库上面的。
4、管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。这一点比较怪。
 
MongoDB将所有角色信息存储在admin数据库的admin.system.roles集合中
 
内置角色只能控制User在DB级别上执行的操作,管理员可以创建自定义角色,控制用户在集合级别(Collection-Level)上执行的操作,即,控制User在当前DB的特定集合上执行特定的操作。

 

 

mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]

 

 

 

 mongodb副本集连接或分片集群的mongos

./mongo   "mongodb://user:password@ip1:port1,ip2:port2/database_name?maxPoolSize=15&replicaSet=rep_name&authSource=admin"

 

权限在某个指定库:

/home/work/mongodb/3.6.17/bin/mongo  --authenticationDatabase db_name   --host 10.10.10.100 --port 27017 --username apple --password 123456

 

权限在admin:

/home/work/mongodb/3.6.17/bin/mongo  --authenticationDatabase admin   --host 10.10.10.10 --port 27017 --username apple --password 123456

 

 

MongoDB如何实现读写分离
MongoDB复制集(Replica Set)通过存储多份数据副本来保证数据的高可靠,通过自动的主备切换机制来保证服务的高可用。但需要注意的时,连接副本集的姿势如果不对,服务高可用将不复存在。

使用前须知
MongoDB复制集里Primary节点是不固定的。当遇到复制集轮转升级、Primary宕机、网络分区等场景时,复制集可能会选举出一个新的Primary,而原来的Primary则会降级为Secondary,即发生主备切换。总而言之,MongoDB复制集里Primary节点是不固定的。

当连接复制集时,如果直接指定Primary的地址来连接,当时可能可以正确读写数据,但一旦复制集发生主备切换,您连接的Primary会降级为Secondary,您将无法继续执行写操作,这将严重影响到您的线上服务。所以生产环境千万不要直连Primary,那么到底该如何连接复制集?
正确连接复制集
要正确连接复制集,您需要先了解下MongoDB的Connection String URI,所有官方的driver都支持以Connection String的方式来连接MongoDB。

Connection String包含以下内容:

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

说明:

mongodb:// 前缀:代表这是一个Connection String。

username:password@:如果启用了鉴权,需要指定用户密码。

hostX:portX:复制集成员的ip:port信息,多个成员以逗号分割。

/database:鉴权时,用户帐号所属的数据库。

?options:指定额外的连接选项。

实现读写分离:在options里添加readPreference=secondaryPreferred读请求优先到Secondary节点,从而实现读写分离的功能。更多读选项请参考Read preferences。

限制连接数:在options里添加maxPoolSize=xx即可将客户端连接池限制在xx以内。

设置数据写入到大多数节点后返回客户端确认:在options里添加w= majority即可保证写请求成功写入大多数节点才向客户端确认,更多写选项参考Write Concern。

以连接AliCloudDB for MongoDB为例,当您购买阿里云MongoDB复制集时,会得到复制集的名称以及复制集成员的地址信息。如下图所示:

连接信息

为了方便用户使用,MongoDB管理控制台上也生成了连接复制集的Connection String及通过Mongo Shell连接到命令。如下图所示:

连接信息

例如通过Java来连接AliCloudDB for MongoDB:

MongoClientURI connectionString = new MongoClientURI("mongodb://root:@dds-*****.mongodb.rds.aliyuncs.com:3717,.aliyuncs.com:3717/admin?replicaSet=mgset-677201"); // ****替换为root密码
MongoClient client = new MongoClient(connectionString);
MongoDatabase database = client.getDatabase("mydb");
MongoCollection collection = database.getCollection("mycoll");
通过正确的Connection String来连接MongoDB复制集,客户端会自动检测复制集的主备关系,当主备关系发生变化时,自动将写切换到新的主上,以保证服务的高可用

 

 

"mongodb://username:password@dns1:port1,dns2:port2,dns3:port3/database_name?authSource=admin&replicaSet=xxx&maxPoolSize=20&readPreference=secondaryPreferred"

"mongodb://username:password@dns1:port1,dns2:port2,dns3:port3/database_name?authSource=admin&replicaSet=xxx&maxPoolSize=20"



不指定数据库:

"mongodb://username:password@dns1:port1,dns2:port2,dns3:port3/?authSource=admin&replicaSet=xxx&maxPoolSize=20"




选项解读:

01、读取操作功能选项:readPreference

 

 

02、副本集架构选项:replicaSet

mongodb://username:passowrd@example1.com:28008,example2.com:28008,example3.com:28008/?replicaSet=apple&w=majority&wtimeoutMS=2000

 




03、连接池选项:

  • maxPoolSize,连接池中的最大连接数。默认值为100
  • minPoolSize,连接池中的最小连接数。默认值为0。并非所有驱动程序都支持。
  • maxIdleTimeMS,连接可以在池中保持空闲(直到被删除和关闭)的最大毫秒数。并非所有驱动程序都支持此选项。
  • waitQueueTimeoutMS,线程可以 await 连接可用的最长时间(以毫秒为单位)。并非所有驱动程序都支持此选项。


04、写关注选项:

  • w:1,是 MongoDB 的默认写关注点。
  • w:0,不要求确认写入操作。但是w:0可能会将有关套接字异常和网络错误的信息返回给应用程序。
  • w:2,表示需要主库和其中一台从库确认写入。
  • w:3,表示需要主库和其中两从库确认写入。
  • w:majority,表示多数确认写入,如果是3个实例的副本集,则主库和其中一台从库确认写入;如果是5个实例的副本集,则需要主库和其中两台从库确认写入。
  • wtimeoutMS=2000,该选项通常与w选项配合在一起。
  • 您既可以在连接字符串中也可以在insertupdate之类的方法中指定写关注点。如果在两个地方都指定了写关注点,则 method 参数将覆盖连接字符串设置。


05、用户凭据选项:authSource

  • 通常都是将用户和角色创建在admin数据库中,因此该选项通常是:authSource=admin

 

 

 

 连接串不要忘记写上副本集名称,否则出现连接到从库问题

# MongoDB URI配置 重要,添加了用户名和密码验证
spring.data.mongodb.uri
="mongodb://root:123456@192.168.68.138:27017,192.168.68.137:27017,192.168.68.139:27017/apple?slaveOk=true&replicaSet=imac&write=2&readPreference=secondaryPreferred&connectTimeoutMS=300000"

#每个主机的连接数 spring.data.mongodb.connections-per-host=50

#线程队列数,它以上面connectionsPerHost值相乘的结果就是线程队列最大值 spring.data.mongodb.threads-allowed-to-block-for-connection-multiplier=50
spring.data.mongodb.connect-timeout=5000
spring.data.mongodb.socket-timeout=3000
spring.data.mongodb.max-wait-time=1500
#控制是否在一个连接时,系统会自动重试 spring.data.mongodb.auto-connect-retry=true
spring.data.mongodb.socket
-keep-alive=true

 

 

###### 

 

###########################

posted @ 2020-09-16 11:29  igoodful  阅读(355)  评论(0编辑  收藏  举报