1. 主+从+仲裁架构,写主从 ip port,用逗号隔开
2. 主+从+从架构,写主从从 ip port,用逗号隔开
3. instance 为mongoDB 实例名
image.png
image.png
对副本集mongoDB命令行登陆的2种方式:
方式一:如果要做数据变更操作,需要提前找到谁是主节点,再登陆主节点
mongo --host 192.168.1.101 --port 27018 -u "user" -p "passwd" --authenticationDatabase admin
方式二:通过mongo连接字符串登陆,会自动登陆主节点
- 登录,不指定库,走admin库认证
mongo "mongodb://${user}:${paswd}@192.168.1.101:27018,192.168.1.102:27018/?replicaSet=${instance}&authSource=admin"
- 登录,指定库名,走admin认证
mongo "mongodb://${user}:${paswd}@192.168.1.101:27018,192.168.1.102:27018/${db_name}?replicaSet=${instance}&authSource=admin"
- 登录,指定库名,并且在指定库名做认证
mongo "mongodb://${user}:${paswd}@192.168.1.101:27018,192.168.1.102:27018/${db_name}?replicaSet=${instance}&authSource=${db_name}"
注:replicaSet 为 mongoDB的实例名
mongo shell 的连接字符串跟应用客户端的连接字符串还有点不一样:
mongo shell 连接副本集,必须指定replicaSet名称,库名指定是可选的,可指定,可不指定;
应用(如java应用)中jdbc连接mongoDB的字符串中一定要指定库名,如果是replicaSet只需要填写所有主从的地址,而不是填写replicaSet名称
如果登陆是从节点,那么无法做数据变更操作,因为mongoDB默认只有主节点是可写:
mongo --host 192.168.1.102 --port 27018 -u "user" -p "passwd" --authenticationDatabase admin
> rs.slaveOk()
注意:对于从mongo shell登陆从节点,需要先执行 rs.slaveOk() 后才能执行相关查询操作,对客户端应用则没有这个限制,默认可以读从,可以实现读写分离。
当客户端连接副本集时,如果以primary地址连接实例,当发生上述情况时,P节点降级为Secondary节点,客户端将无法继续执行写操作。
为了解决这一问题,连接线上数据时,最好是使用副本集方式连接副本集。
image.png image.png image.png image.png应用客户端通过连接mongos到分片
mongodb://${user}:${passwd}@192.168.1.101:12345,192.168.1.102:12345192.168.1.103:12345/${db_name}&authSource=${db_name}
用 mongo shell 连接分片1
mongodb://172.17.0.8:27018,172.17.0.11:27018,172.17.0.12:27018/test?replicaSet=rs_shardsvr0&authSource=${db_name}
用mongo shell 连接分片2
mongodb://172.17.0.13:27018172.17.0.14:27018,172.17.0.15:27018/test?replicaSet=rs_shardsvr1&authSource=${db_name}
用mongo shell,登陆mongos
mongo --host xx.xx.xx.xx --port=12345 --username='user' --password='passwd' --authenticationDatabase=admin
使用分片集群时你需要知道:
-
用户访问 mongos 跟访问单个 mongod 类似
-
所有 mongos 是对等关系,用户访问分片集群可通过任意一个或多个mongos
-
mongos 本身是无状态的,可任意扩展,集群的服务能力为『Shard服务能力之和』与『mongos服务能力之和』的最小值。
-
访问分片集群时,最好将应用负载均匀的分散到多个 mongos 上
通过上述方式连接分片集群时,客户端会自动将请求分散到多个mongos 上,以实现负载均衡;同时,当URI 里 mongos 数量在2个及以上时,当有mongos故障时,客户端能自动进行 failover,将请求都分散到状态正常的 mongos 上。
当 mongos 数量很多时,还可以按应用来将 mongos 进行分组,比如有2个应用A、B、有4个mongos,可以让应用A 访问 mongos 1-2(URI里只指定mongos 1-2 的地址), 应用B 来访问 mongos 3-4(URI里只指定mongos 3-4 的地址),根据这种方法来实现应用间的访问隔离(应用访问的mongos彼此隔离,但后端 Shard 仍然是共享的)。
网友评论