spring boot mongo (复本集群)读写分离
基于mongo 4.2.7
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
application.yml
配置文件
spring:
data:
mongodb:
uri: mongodb://admin:admin@192.168.1.15:37017,192.168.1.15:37018,192.168.1.15:37019/test?
slaveOk=true&replicaSet=rs&readPreference=secondaryPreferred
&connectTimeoutMS=300000&maxPoolSize=100&minPoolSize=2&maxIdleTimeMS=60000
# authentication-database: admin
# database: mybatis
# host: localhost
# password: admin
# port: 27017
# username: admin
logging:
level:
org.springframework.data.mongodb.core: debug
mongo读写分离的重点在于设置readPreference=secondaryPreferred
结果
看mongo的输出日志,可以发现写的是primary库,读的是secondary库
复制集的读写设置
-
Read Preference
默认情况下,复制集的所有读请求都发到Primary,Driver可通过设置Read Preference来将读请求路由到其他的节点。
- primary:默认规则,所有读请求发到Primary。
- primaryPreferred:Primary优先,如果Primary不可达,请求Secondary。
- secondary:所有的读请求都发到Secondary。
- secondaryPreferred:Secondary优先,当所有Secondary不可达时,请求Primary。
- nearest:读请求发送到最近的可达节点上(通过
ping
探测得出最近的节点)
-
Write Concern
默认情况下,Primary完成写操作即返回,Driver可通过配置Write Concern来设置写成功的规则,详情请参见
如下的write concern规则设置写必须在大多数节点上成功,超时时间为5秒
db.products.insert(
{ item: "envelopes", qty : 100, type: "Clasp" },
{ writeConcern: { w: majority, wtimeout: 5000 } }
)
参考阿里云 复本集原理