spring mongodb 复制集配置(实现读写分离)
注:mongodb当前版本是3.4.3
spring连接mongodb复制集的字符串格式:
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节点。
mongodb数据库配置:
![](https://images2015.cnblogs.com/blog/1159951/201705/1159951-20170509175005613-1601990918.png)
spring配置mongo数据源:
![](https://images2015.cnblogs.com/blog/1159951/201705/1159951-20170509175006394-967155886.png)
实体类,通过注解@Document(collection = "user")指定collection名称:
![](https://images2015.cnblogs.com/blog/1159951/201705/1159951-20170509175007207-1859160802.png)
执行插入数据的测试用例:
![](https://images2015.cnblogs.com/blog/1159951/201705/1159951-20170509175007832-285573723.png)
控制台显示成功连接复制集,192.168.168.129:27017为Primary,192.168.168.130:27017和192.168.168.131:27017为Secondary:
执行insert操作时,连接的是主复制集:
![](https://images2015.cnblogs.com/blog/1159951/201705/1159951-20170509175009738-958962550.png)
从数据库查看主复制集信息:
![](https://images2015.cnblogs.com/blog/1159951/201705/1159951-20170509175011691-2144441502.png)
同时可以看见一下两个从复制集已自动完成数据备份:
![](https://images2015.cnblogs.com/blog/1159951/201705/1159951-20170509175012644-1034549425.png)
![](https://images2015.cnblogs.com/blog/1159951/201705/1159951-20170509175013441-1746695624.png)
执行读数据的测试用例:
![](https://images2015.cnblogs.com/blog/1159951/201705/1159951-20170509175013832-1576415216.png)
执行读操作时,连接的是从复制集:
![](https://images2015.cnblogs.com/blog/1159951/201705/1159951-20170509175014363-1672101103.png)
模拟主复制集宕机:
![](https://images2015.cnblogs.com/blog/1159951/201705/1159951-20170509175015426-684610365.png)
通过rs.status()可以看到从复制集192.168.168.130:27017变成了主复制集:
![](https://images2015.cnblogs.com/blog/1159951/201705/1159951-20170509175016222-1527085809.png)
再次执行插入数据的测试用例,这时候就可以看到执行插入操作时,连接的是新的主复制集192.168.168.130
![](https://images2015.cnblogs.com/blog/1159951/201705/1159951-20170509175016988-1799862057.png)
数据库数据变化:
![](https://images2015.cnblogs.com/blog/1159951/201705/1159951-20170509175017488-1715128709.png)
![](https://images2015.cnblogs.com/blog/1159951/201705/1159951-20170509175017988-718498127.png)
读写分离详细说明:
mongodb复制集对读写分离的支持是通过Read Preferences特性进行支持的,这个特性非常复杂和灵活。
应用程序驱动通过read reference来设定如何对复制集进行读写操作,默认客户端驱动所有的读操作都是直接访问primary节点的,从而保证了数据的严格一致性。
支持五种 read preference模式:
1.primary:主节点,默认模式,读操作只在主节点,如果主节点不可用,报错或者抛出异常。
2.primaryPreferred:首选主节点,大多情况下读操作在主节点,如果主节点不可用,如故障转移,读操作在从节点。
3.secondary:从节点,读操作只在从节点,如果从节点不可用,报错或者抛出异常。
4.secondaryPreferred:首选从节点,大多情况下读操作在从节点,特殊情况(如单主节点架构)读操作在主节点。
5.nearest:最邻近节点,读操作在最邻近的成员,可能是主节点或者从节点,关于最邻近的成员请参考。
注意:2.2版本之前的mongodb对Read Preference支持还不完全。
参看地址:http://www.mongoing.com/archives/2642