mongodb副本集介绍、mongodb副本集搭建、 mongodb副本集测试

mongodb副本集介绍

  • MongoDB早期版本使用master-slave,一主一从和MySQL主从基本是一致的,但salve在此架构中为只读,当主库宕机后,从库不能自动切换为主.
  • 目前已经淘汰master-salve模式,改成副本集,副本集架构也是为了实现MongoDB的高可用,这种模式下有一个主(primary),和多个从(secondary)只读,支持他们设置权重,当主宕机后,权重最高的从切换为主.
  • 在此架构中还能够创建一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据.
  • 在此架构中读写数据都是在主上,要想实现负载均衡的目的须要手动指定读库的目标server.

MongoDB副本集架构图

原理很简单一个primary,secondary至少是一个,也能够是多个secondary,除了多个secondary以外,还能够加一个Arbiter,Arbiter叫作仲裁,当Primary宕机后,Arbiter能够很准确的告知Primary宕掉了,但可能Primary认为本身没有宕掉,这样的话就会出现脑裂,为了防止脑裂就增长了Arbiter这个角色,尤为是数据库坚定不能出现脑裂的状态,脑裂会致使数据会紊乱,数据一旦紊乱恢复就很是麻烦.linux

变迁图

说明:Primary宕机后,其中secondary就成为一个新的Primary,另一个secondary依然是secondary的角色. 对于MySQL主历来讲,即便作一主多从,万一master宕机后,可让从成为新的主,但这过程是须要手动的更改的. 可是在MongoDB副本集架构当中呢,它彻底都是自动的,rimary宕机后,其中secondary就成为一个新的Primary,另一个secondary能够自动识别新的primary.mongodb

mongodb副本集搭建

准备三台机器: 192.168.193.130 (primary)
                      192.168.193.131 (secondary)                    
                      192.168.193.132 (secondary)
三台机器都须要安装MongoDB,primary已安装过,两台secondary须要安装,因步骤同样,在此不作演示.shell

编辑三台机器的配置文件

[root@aminglinux-130 ~]# vim /etc/mongod.conf数据库

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1,192.168.193.130  # Listen to local interface only, comment to listen on all interfaces.
"/etc/mongod.conf" 44L, 784C

说明:作副本集bindIp 要监听本机IP和内网IPvim

#replication:                 //把#去掉,并增两行
replication:
  oplogSizeMB: 20              //前面两个空格
  replSetName;aminglinux       //定义副本集的名字 前面两个空格

重启MongoDB服务:bash

[root@aminglinux-130 ~]# systemctl restart mongod架构

启动从主机app

[root@aminglinux-131 ~]# vim /etc/mongod.conf
 负载均衡

net:
  port: 27017
  bindIp: 127.0.0.1,192.168.193.131  # Listen to local interface only, comment to listen on all interfaces.

说明:作副本集bindIp 要监听本机IP和内网IPspa

#replication:    //把#去掉,并增两行

replication:
  oplogSizeMB: 20            
  replSetName: aminglinux      //定义副本集的名字

重启MongoDB服务:

[root@aminglinux-131 ~]# systemctl restart mongod
 

[root@aminglinux-131 ~]# ps aux |grep mongod
mongod     3111  2.2  3.9 1018232 39316 ?       Sl   16:23   0:21 /usr/bin/mongod -f /etc/mongod.conf
root       3282  0.0  0.0 112704   660 pts/0    R+   16:39   0:00 grep --color=auto mongod

启动从主机

[root@aminglinux-132 ~]# vim /etc/mongod.conf

#replication:    //把#去掉,并增两行

replication:
  oplogSizeMB: 20            
  replSetName: aminglinux      //定义副本集的名字

[root@aminglinux-132 ~]# systemctl restart mongod
 

[root@aminglinux-132 ~]# ps aux |grep mongod
mongod     3246 60.0  3.7 1018232 37532 ?       Sl   16:44   0:42 /usr/bin/mongod -f /etc/mongod.conf
root       3292  0.0  0.0 112720   980 pts/0    R+   16:45   0:00 grep --color=auto mongod

链接MongoDB --Primary机器

[root@aming-130 ~]# mongo
MongoDB shell version v3.4.9
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.9
Server has startup warnings: 
2017-10-20T17:18:53.740+0800 I CONTROL  [initandlisten] 
2017-10-20T17:18:53.740+0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-10-20T17:18:53.740+0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2017-10-20T17:18:53.740+0800 I CONTROL  [initandlisten] 
2017-10-20T17:18:53.740+0800 I CONTROL  [initandlisten] 
2017-10-20T17:18:53.740+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2017-10-20T17:18:53.740+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-10-20T17:18:53.740+0800 I CONTROL  [initandlisten] 
2017-10-20T17:18:53.740+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2017-10-20T17:18:53.740+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-10-20T17:18:53.740+0800 I CONTROL  [initandlisten]

置副本集

说明:在哪台机器上执行这一步,那么哪台机器就会成为primary

>  config={_id:"aminglinux",members:[{_id:0,host:"192.168.193.130:27017"},{_id:1,host:"192.168.193.131:27017"},{_id:2,host:"192.168.193.132:27017"}]}
{
	"_id" : "aminglinux",
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.193.130:27017"
		},
		{
			"_id" : 1,
			"host" : "192.168.193.131:27017"
		},
		{
			"_id" : 2,
			"host" : "192.168.193.132:27017"
		}
	]
}
> 
config={_id:"aminglinux" --> aminglinux(副本集的名字)
members --> 指定成员

rs.initiate(config) -->初始化 

> rs.initiate()?
{ "ok" : 1 }

rs.status() -->查看副本集状态

说明:能够看到192.168.193.130 显示:"stateStr" : "PRIMARY"
          192.168.193.131和192.168.193.132 分别显示: "stateStr" : "SECONDARY"

aminglinux:OTHER> rs.status()
{
	"set" : "aminglinux",
	"date" : ISODate("2019-05-14T10:54:40.893Z"),
	"myState" : 1,
	"term" : NumberLong(1),
	"syncingTo" : "",
	"syncSourceHost" : "",
	"syncSourceId" : -1,
	"heartbeatIntervalMillis" : NumberLong(2000),
	"optimes" : {
		"lastCommittedOpTime" : {
			"ts" : Timestamp(1557831277, 1),
			"t" : NumberLong(1)
		},
		"appliedOpTime" : {
			"ts" : Timestamp(1557831277, 1),
			"t" : NumberLong(1)
		},
		"durableOpTime" : {
			"ts" : Timestamp(1557831277, 1),
			"t" : NumberLong(1)
		}
	},
	"members" : [
		{
			"_id" : 0,
			"name" : "192.168.193.130:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 319,
			"optime" : {
				"ts" : Timestamp(1557831277, 1),
				"t" : NumberLong(1)
			},
			"optimeDate" : ISODate("2019-05-14T10:54:37Z"),
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "could not find member to sync from",
			"electionTime" : Timestamp(1557831175, 2),
			"electionDate" : ISODate("2019-05-14T10:52:55Z"),
			"configVersion" : 1,
			"self" : true,
			"lastHeartbeatMessage" : ""
		}
	],
	"ok" : 1
}
annalinux:PRIMARY> rs.status()
{
	"set" : "annalinux",
	"date" : ISODate("2019-05-14T11:05:12.553Z"),
	"myState" : 1,
	"term" : NumberLong(1),
	"syncingTo" : "",
	"syncSourceHost" : "",
	"syncSourceId" : -1,
	"heartbeatIntervalMillis" : NumberLong(2000),
	"optimes" : {
		"lastCommittedOpTime" : {
			"ts" : Timestamp(1557831909, 1),
			"t" : NumberLong(1)
		},
		"appliedOpTime" : {
			"ts" : Timestamp(1557831909, 1),
			"t" : NumberLong(1)
		},
		"durableOpTime" : {
			"ts" : Timestamp(1557831909, 1),
			"t" : NumberLong(1)
		}
	},
	"members" : [
		{
			"_id" : 0,
			"name" : "192.168.193.131:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 953,
			"optime" : {
				"ts" : Timestamp(1557831909, 1),
				"t" : NumberLong(1)
			},
			"optimeDate" : ISODate("2019-05-14T11:05:09Z"),
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"electionTime" : Timestamp(1557831527, 2),
			"electionDate" : ISODate("2019-05-14T10:58:47Z"),
			"configVersion" : 1,
			"self" : true,
			"lastHeartbeatMessage" : ""
		}
	],
	"ok" : 1
}
annalinux:OTHER> rs.status()
{
	"set" : "annalinux",
	"date" : ISODate("2019-05-14T11:06:48.154Z"),
	"myState" : 1,
	"term" : NumberLong(1),
	"syncingTo" : "",
	"syncSourceHost" : "",
	"syncSourceId" : -1,
	"heartbeatIntervalMillis" : NumberLong(2000),
	"optimes" : {
		"lastCommittedOpTime" : {
			"ts" : Timestamp(1557832006, 1),
			"t" : NumberLong(1)
		},
		"appliedOpTime" : {
			"ts" : Timestamp(1557832006, 1),
			"t" : NumberLong(1)
		},
		"durableOpTime" : {
			"ts" : Timestamp(1557832006, 1),
			"t" : NumberLong(1)
		}
	},
	"members" : [
		{
			"_id" : 0,
			"name" : "192.168.193.132:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 654,
			"optime" : {
				"ts" : Timestamp(1557832006, 1),
				"t" : NumberLong(1)
			},
			"optimeDate" : ISODate("2019-05-14T11:06:46Z"),
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "could not find member to sync from",
			"electionTime" : Timestamp(1557832004, 2),
			"electionDate" : ISODate("2019-05-14T11:06:44Z"),
			"configVersion" : 1,
			"self" : true,
			"lastHeartbeatMessage" : ""
		}
	],
	"ok" : 1
}