MongoDB的数据复制分片

一:MongoDB的简介:

    MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。而且可以很容易的和JSON类的数据结合,他不支持事务,但支持自动分片功能,这对大数据的分布式存储有着十分重要的作用。

二:MongoDB的索引类型:

    单字段索引:

    组合索引(多字段索引):对多个key做索引

    多键索引:对key和value中的key做索引

    空间索引:基于位置做索引

    文本索引:全文搜索

    hash索引:仅支持精确值查找

    稀疏索引(sparse):不为每一个值做索引,一般得是顺序排放才可以做稀疏索引

三:MongoDB的复制功能:

    MongoDB有两种复制类型:Master/Slave主从和replica set副本集复制,但是由于MongoDB的特性,主从复制架构已经基本放弃,比较常见的就是副本集复制方式

    replica set的工作特性:

    1,复制集可以实现自动转移 heartbeat超时,自动失效转移(通过选举方式实现)

    2,至少有3个节点,且奇数个节点,可以使用arbiter来参与选举

    复制集中的特殊类型的节点分类:

    0优先级的节点:冷备节点,不会被选举成为主节点,但可以参与选举

    被隐藏的从节点:首先是一个0优先级的从节点,拥有选举权,不会被客户端直接访问到

    延迟复制的从节点:是一个0优先级的从节点,不能被选为主节点,且复制时间落后与主节点一个固定的时长。

    arbiter:仲裁者,没有数据,不可能成为主节点。 

实验内容:

一,实现MongoDB数据的复制

实验模型:

MongoDB的数据复制分片

实验环境:

node1:172.16.18.1 MongoDB  centos6.5

node2:172.16.18.2 MongoDB  centos6.5

node3:172.16.18.3 MongoDB  centos6.5

实验内容:

首先要确定各节点的时间一致

1.1 MongoDB安装:分别在node1,node2,node3节点安装一下三个包

mogodb安装需要:一下三个包

    mongodb-org-shell-2.6.4-1.x86_64.rpm

    mongodb-org-tools-2.6.4-1.x86_64.rpm

    mongodb-org-server-2.6.4-1.x86_64.rpm

编辑服务器的配置文件,/etc/mongod.conf

logpath=/var/log/mongodb/mongod.log            #日志的路径
logappend=true                                                #开启日志
fork=true                                                           
#port=27017                                                    #默认监听的端口
#dbpath=/var/lib/mongo                                  #默认的数据路径
dbpath=/mongodb/data                                    #自定义的数据路径
pidfilepath=/var/run/mongodb/mongod.pid
#bind_ip=127.0.0.1                                          #定义绑定IP,也就是监听那些IP可来链接服务器,注销是允许所有。
httpinterface=true                                              #开放web页面,
rest=true
replSet=testset
replIndexPrefetch=_id_only

配置好后将配置分别发送到其他两个节点,并创建数据目录,修改权限

mkdir /mongodb/data/ -pv  
chown -R mongod.mongod /mongodb/

全部启动:可能启动会比较慢,那是因为要初始化数据

1.2链接到数据库

[root@node2 ~]# mongo   
MongoDB shell version: 2.6.4   
connecting to: test   
> rs.status()   
{   
"startupStatus" : 3,   
"info" : "run rs.initiate(...) if not yet done for the set",   
"ok" : 0,   
"errmsg" : "can't get local.system.replset config from self or any seed (EMPTYCONFIG)" 
}

 

使用rs.status()查看状态,有3个节点,但是都没有初始化配置。需要运行rs.initiate()

 

1.3运行rs.initiate()

 

可以看到添加了一个节点node2,也就是自己,且是primary节点。以及所有的状态

 

1.4添加其他两个节点

有没有发现新加的这两个节点状态不对?没有关系,可能是还没有同步过来,稍等在刷新试试

"stateStr" : "SECONDARY",

"stateStr" : "SECONDARY",

再刷新时添加的两个节点都成为了secondary。

1.5我们在主节点来创建一些数据

1.6如果主节点离线,从节点会自动选出主节点

testset:PRIMARY> rs.stepDown()
2014-10-12T17:00:12.869+0800 DBClientCursor::init call() failed
2014-10-12T17:00:12.896+0800 Error: error doing query: failed at src/mongo/shell/query.js:81
2014-10-12T17:00:12.914+0800 trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2014-10-12T17:00:12.945+0800 reconnect 127.0.0.1:27017 (127.0.0.1) ok
testset:SECONDARY>

可以看到主节点的primary变成了secondary

其他两个节点中的一个变为主节点,这就是自动转移

副本集的重新选举的条件有:心态信息,优先级,optime,网络连接等

1.7还可以修改优先级来实现主从切换

1.8,如何要设定仲裁节点

rs.addArb(hostportstr)表示将一个节点加进来时就是仲裁节点。

我们移除当前的node3节点

删除/mongodb/data下的数据,重新初始化,

相关推荐