单点模式的优点是什么?
部署方便,节省资源
但单点模式会有如下问题:
硬盘的存储空间要满了,怎么办?
如何出现网络通信或者是机房电力故障,服务器无法正常提供服务怎么办?
进行备份时,为了保证数据的一致性,要将实例关闭或者上个写锁保证备份有有效怀这时怎么办?
复制集概念
传统主从结构MASTER/SLAVE --> 复制集(mongodb replica sets)
复制集是由一组拥有相同数据集的mongodb实例所组成的集群
两类节点
数据节点:存储数据,可以充当主从节点
投票结点:负责选举,不存储数据,不能充当主从节点
复制集的工作方式:
一、复制集的特点
1).主唯一不固定
数据一致性,主是唯一的,但不固定,没有Mysql那样的双主结构
2).大多数原则
集群存活节点小于等于二分之一时集群不可写,只可读。
是否能选举出新的主节点,是由当前复制集成员存活数量来决定的
3).从库无法写入
Mysql从库的readonly对具有super权限的账户无效
4).自动容灾
复制集不支持只复制指定的库
在3.0以前的版本中,复制集中参与选举的数据节点只能有7个
二、快速搭建复制集
2-1、复制的集的启动
1).配置文件编写
编写三个配置文件,分别为28001.conf,28002.conf,28003.conf。需要注意的是,如果配置文件里的目录没有,需要先创建
|
上面配置参数的详解:
2).启动实例
changwen@ubuntu:~$ ps -ef|grep mongo
root 7051 5546 1 21:48 ? 00:00:03 /usr/local/mongoDB/bin/mongod -f /usr/local/mongoDB/conf/28003.conf
root 7124 5546 0 21:50 ? 00:00:02 /usr/local/mongoDB/bin/mongod -f /usr/local/mongoDB/conf/28001.conf
root 7157 5546 1 21:50 ? 00:00:02 /usr/local/mongoDB/bin/mongod -f /usr/local/mongoDB/conf/28002.conf
changwen 7208 7196 0 21:54 pts/19 00:00:00 grep --color=auto mongo
3).复制集初始化
先连接主节点
# 连接服务器
changwen@ubuntu:~$ sudo /usr/local/mongoDB/bin/mongo 192.168.23.129:28001
# 定义一个对象
> config = {
... _id:"changwen",
... members:[
... {_id:0,host:"192.168.23.129:28001"},
... {_id:1,host:"192.168.23.129:28002"},
... {_id:2,host:"192.168.23.129:28003"}]}
{
"_id" : "changwen",
"members" : [
{
"_id" : 0,
"host" : "192.168.23.128:28001"
},
{
"_id" : 1,
"host" : "192.168.23.128:28002"
},
{
"_id" : 2,
"host" : "192.168.23.128:28003"
}
]
}
> config.members
...
> config.members[2]
{ "_id" : 2, "host" : "192.168.23.128:28003" }
# 修改
> config.members[2]={ "_id" : 2, "host" : "192.168.23.128:28003" ,"arbiterOnly":true}
{ "_id" : 2, "host" : "192.168.23.128:28003", "arbiterOnly" : true }
> rs.initiate(config)
{ "ok" : 1 }
> use changwen
switched to db changwen
changwen:PRIMARY> db.changwen2.insert({"name":"changwen"})
WriteResult({ "nInserted" : 1 })
打开从节点 服务,可以看到主服务器上创建的数据已经存储到从服务器上
# 连接从节点服务
changwen@ubuntu:$ sudo /usr/local/mongoDB/bin/mongo 192.168.23.129:28002
changwen:SECONDARY> show tables
2016-08-28T06:16:49.031-0700 E QUERY [thread1] Error: listCollections failed: { "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 } :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
rs.slaveOk(1)或者ture
changwen:SECONDARY> rs.slaveOk(true)
changwen:SECONDARY> show dbs
changwen 0.000GB
local 0.000GB
changwen:SECONDARY> db.changwen2.find()
{ "_id" : ObjectId("57c2f4a177f0574f2e53ba7d"), "name" : "changwen" }
打开投票结点
changwen@ubuntu:~$ sudo /usr/local/mongoDB/bin/mongo 192.168.23.129:28003
> rs.slaveOk(true)
# 投票结点不存储任何物理数据<pre name="code" class="sql">changwen:ARBITER> show dbs
local 0.000GB
2-2.复制集成员节点
按是否存放数据区分
数据节点:存放数据(实体物理文件*.ns *.0等)的节点,包括主节点,从节点
投票节点:不存放数据仅作选举和充当复制集节点
按功能区分
2-3.复制集配置文件参数
_id | 整数 | _id:0 |
host | 字符串 | host:"192.168.23.129:28001" |
arbiterOnly | 布尔值 | arbiterOnly:true |
priority | 整数 | priority = 0|1 |
hidden | 布尔值 | hidden = true|false, 0|1 |
votes | 整数 | votes = 0|1 |
slaveDelay | 整数 | slaveDelay = 3600 |
buildIndexes | 布尔值 | buildIndexes = true|false, 0|1 |
节点属性
主节点 priority(优先级)至少为1
从节点 priority(优先级)可以为0
延迟节点 priority(优先级)为0并且hidden = true 并且salveDelay = XX(XX表示 延迟时间,用数字)
隐藏节点 priority(优先级)为0并且hidden = true
无索引 priority(优先级)为0并且buildIndexes= true
# 在主节点服务输入
changwen:PRIMARY>rs.stepDown(5)
# 可以看到主节点变成了从节点
changwen:SECONDARY>
#在从节点端口可以看到变成了主节点
# 修改节点优先级
changwen:PRIMARY>config.members[0].priority=1