mongodb的“副本集”集群方式介绍
Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。有且只会有一个主节点。最多只能使用一个仲裁节点。
默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力。
当客户端进行数据查询时,请求自动转到备节点上。这个设置叫做RPM(Read Preference Modes),同时Java客户端提供了简单的配置方式,可以不必直接对数据库进行操作。
仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。当节点数为奇数时,若主节点失效,选举算法能很好的选举出下一个主节点,当节点数为偶数时,节点算法可能失效(一般节点投票给A,另一半给B),此时就需要启用仲裁节点执行仲裁,选举主节点。
如何配置集群
第一步:通过配置启动多个mongodb
- 下载mongodb
- 编写配置文件mongodb.conf,配置文件参数:http://www.cnblogs.com/skyblue/p/5522710.html。
- 若要配置集群,必须配置配置文件中的参数replSet,replSet:使用此设置来配置复制副本集,指定一个副本集名称作为参数,所有主机都必须有相同的名称作为同一个副本集。
- 进入下载文件的bin目录
- 通过配置文件启动mongodb:./mongod -f(–config) mongodb.conf
第二部:将启动了的mongodb建立集群关系
1.任意选择一个mongodb并通过命令进入:./mongo IP地址:端口号
2.构造集群参数
var cfg=
{
"_id":"testrs",//与replSet相同,表示集群签名
"members":[//集群成员
{
"_id":0,//ID不同即可
"host":"10.10.148.130:27017",//成员地址:IP:端口
"priority":2//优先级:数字越大,优先级越高,用于确定主节点,优先级为0不可能成为主节点。
},
{
"_id":1,
"host":"10.10.148.131:27017",
"priority":1
},
{
"_id":2,
"host":"10.10.148.132:27017",
"arbiterOnly":true//仲裁节点,当有此参数时,表示此节点为仲裁节点。
}
]
}
3.执行集群参数,使集群生效:rs.initiate(cfg)
4.主从配置成功后,主节点提示符会显示:PRIMARY,从节点提示符会显示:SECONDARY,仲裁节点提示符会显示:ARBITER。
5.可以使用命令db.isMaster()查看主从节点情况。
6.从节点默认是不可以执行读写的,若想要执行读,可以设置命令db.setSlaveOk(),但此命令是针对连接的,不是针对数据库的,不同的连接需要重新设置此命令。
7.关闭副本集命令:replicaSet.stopSet()
第三步:动态添加或删除节点
- 初始化集群,必须使用两个以上的节点。
- 当集群初始化完成后,只有主节点能够动态添加或删除节点。
- 进入主节点后可以使用,添加节点命令:rs.add(“IP地址:端口号”),删除节点命令:rs.remove(“IP地址:端口号”),添加仲裁节点命令:rs.add(“IP地址:端口号”)。
- 可以使用rs.config()命令查看集群当前使用的配置信息,每次修改version会加1。
- 可以使用 var config=rs.config();然后通过JS的方式修改config值,然后通过rs.reconfig(config);进行集群配置修改
其他信息
隐藏成员
- 优先级为0,且menber属性下制定属性hidden:true的节点才能被隐藏。
- 客户端不会向隐藏成员发送请求,隐藏成员也不会成为复制源。
- rs.isMaster()无法查看隐藏成员,rs.status()和rs.config()能够查看隐藏成员。
延迟备份节点
延迟备份节点的数据会比主节点延迟指定时间,单位是秒。若主数据库遭受毁灭性破坏,可以用此延迟备份节点进行数据还原。
优先级为0,且menber属性下制定属性slaveDelay:时间的节点才能被设置为备份节点。
java客户端支持集群与故障转移
MongoClient mongoClient = new MongoClient(
Arrays.asList(new ServerAddress("127.0.0.1", 27018),
new ServerAddress("127.0.0.1", 27019),
new ServerAddress("127.0.0.1", 27020)));
MongoDatabase hyq = mongoClient.getDatabase("hyq");
MongoIterable<String> names = hyq.listCollectionNames();
MongoCursor<String> nameIterator = names.iterator();
while (nameIterator.hasNext()) {
String name = nameIterator.next();
System.out.println(name);
}
以上是mongodb-java-driver的使用,当我关闭主服务器时,mongodb集群自动将某个备库选举为主库,此时代码依旧可以运行,且会提示某个机器拒绝连接。说明此客户端支持集群与故障转移。