mongo复本集docker部署 mongo 复制集_复制集

单点模式的优点是什么?
  部署方便,节省资源
但单点模式会有如下问题:
  硬盘的存储空间要满了,怎么办?
  如何出现网络通信或者是机房电力故障,服务器无法正常提供服务怎么办?
  进行备份时,为了保证数据的一致性,要将实例关闭或者上个写锁保证备份有有效怀这时怎么办?

复制集概念
  传统主从结构MASTER/SLAVE --> 复制集(mongodb replica sets)
  复制集是由一组拥有相同数据集的mongodb实例所组成的集群

两类节点
  数据节点:存储数据,可以充当主从节点
  投票结点:负责选举,不存储数据,不能充当主从节点

复制集的工作方式:

mongo复本集docker部署 mongo 复制集_mongo复本集docker部署_02

一、复制集的特点

1).主唯一不固定
  数据一致性,主是唯一的,但不固定,没有Mysql那样的双主结构
2).大多数原则
  集群存活节点小于等于二分之一时集群不可写,只可读。
  是否能选举出新的主节点,是由当前复制集成员存活数量来决定的
3).从库无法写入
  Mysql从库的readonly对具有super权限的账户无效
4).自动容灾
  复制集不支持只复制指定的库
  在3.0以前的版本中,复制集中参与选举的数据节点只能有7个

二、快速搭建复制集

2-1、复制的集的启动

1).配置文件编写
    编写三个配置文件,分别为28001.conf,28002.conf,28003.conf。需要注意的是,如果配置文件里的目录没有,需要先创建

bind_ip=192.168.23.129
 port = 28001
 dbpath = /usr/local/mongoDB/data/db/28001
 logpath = /usr/local/mongoDB/logs/28001.log
 logappend=true
 pidfilepath=/usr/local/mongoDB/data/db/28001/28001.pid
 fork =true
 oplogSize=1024MB
 verbose = vvvvv
 replSet = changwen

上面配置参数的详解:



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等)的节点,包括主节点,从节点

  投票节点:不存放数据仅作选举和充当复制集节点


按功能区分

mongo复本集docker部署 mongo 复制集_mongodb_03

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