<span>mongo 读写分离 写关注</span>
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
- primary(默认),只在主库上读数据。
- primaryPreferred,优先去主库读数据。
- secondary,只在从库上读数据。
- secondaryPreferred,优先去从库读数据。
- nearest,最近节点读取数据。
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选项配合在一起。
- 您既可以在连接字符串中也可以在
insert
或update
之类的方法中指定写关注点。如果在两个地方都指定了写关注点,则 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
######
###########################