近年来,随着大数据越来越火,非关系型数据库的重要性被越来越多的人所认知,越来越多的开发者逐渐加入到NoSQL的阵营中。我们知道NoSQL是Not Only SQL的意思,既然如此,很多关系型数据库所支持的特性在非关系型数据中也是同样适用,比如复制集。
MongoDB是支持数据复制的,它在复制集方面的优势与其他数据复制集一样,它通过将数据部署在多个不同的服务器上,防止因单机故障而造成数据的丢失,借助数据冗余来提高数据的可靠性和安全性。而且还可以通过复制技术构建分布式数据库,提高系统的访问性能和安全性。
MongoDB的复制集模式是主从复制。在所有的数据库服务的机器中,只有一台机器担当Primary角色,其余的机器均是Secondaries。担当Primary角色的机器接收所有来自客户端的写(Write)操作请求,并完成该操作,从而保证了数据的一致性。担当Primary角色的机器还能够把来自客户端的读(Read)操作分配给其他机器(Secondaries),减轻主数据库服务器的压力。
那么MongoDB是如何完成各机器上数据的复制的呢?
原来,MongoDB的Primary数据库在每次对数据进行update操作时,都会将这些操作记录在oplog日志文件里。Secondaries数据库通过异步操作读取日志中的记录并在本地执行,生成数据来与Primary保持数据一致。
当Primary数据库不可用时,复制集会从Secondaries中选择一个机器作为Primary机器。默认情况下,客户端都是从Primary机器读取数据,但是客户端也可以指定从哪台副本上读取数据。
我们也可以配置一台仲裁机,仲裁并不管理复制集,它也不能成为Primary,它只是决定哪些副本集有权成为Primary。