本文的目的是介绍docker-compose搭建mongoDB副本集的详细情况,特别关注1主+1副+1仲裁的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解docker
本文的目的是介绍docker-compose搭建mongoDB副本集的详细情况,特别关注1主+1副+1仲裁的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解docker-compose搭建mongoDB副本集的机会,同时也不会遗漏关于21.26mongodb 副本集介绍、mongodb 副本集搭建、 21.35mongodb 副本集测试、5步搞定CentOS6.7上MongoDB副本集搭建、CentOS 6.4创建Mongodb副本集、Docker / Podman 建立MongoDB 副本集群的知识。
本文目录一览:- docker-compose搭建mongoDB副本集(1主+1副+1仲裁)(docker搭建mongo集群)
- 21.26mongodb 副本集介绍、mongodb 副本集搭建、 21.35mongodb 副本集测试
- 5步搞定CentOS6.7上MongoDB副本集搭建
- CentOS 6.4创建Mongodb副本集
- Docker / Podman 建立MongoDB 副本集群
docker-compose搭建mongoDB副本集(1主+1副+1仲裁)(docker搭建mongo集群)
一、基本概念
1、副本集:一个副本集就是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成
2、主节点(master):主节点接收所有写入操作。主节点将对其数据集所做的所有更改记录到其 oplog。
3、副节点(secondary):复制主节点的 oplog 并将操作应用到其数据集,如果主节点不可用,一个合格的副节点将被选为新的主节点。
4、仲裁节点(arbiter):负载选举,当主节点不可用,它将从副节点中选一个作为主节点。
二、部署副本集
1、下载monodb镜像,我这里版本为:3.2.11
docker pull registry.cn-hangzhou.aliyuncs.com/boshen-ns/mongodb:3.2.11
docker tag docker pull registry.cn-hangzhou.aliyuncs.com/boshen-ns/mongodb:3.2.11 mongodb:3.2.11
2、创建三个mongodb的数据目录:
mkdir -p /home/mongodb-cluster/data/master
mkdir -p /home/mongodb-cluster/data/secondary
mkdir -p /home/mongodb-cluster/data/arbiter
3、编写docker-compose.yml
version: ''2.1''
services:
master:
image: mongodb:3.2.11
container_name: master
restart: always
ports:
- 27017:27017
volumes:
- ./data/master:/data/db
command: mongod --dbpath /data/db --replSet testSet --oplogSize 128
secondary:
image: mongodb:3.2.11
container_name: secondary
restart: always
ports:
- 27018:27017
volumes:
- ./data/secondary:/data/db
command: mongod --dbpath /data/db --replSet testSet --oplogSize 128
arbiter:
image: mongodb:3.2.11
container_name: arbiter
restart: always
ports:
- 27019:27017
volumes:
- ./data/arbiter:/data/db
command: mongod --replSet testSet --smallfiles --oplogSize 128
4、启动
docker-compse up -d
5、配置副本集
1)进入容器内部:
docker exec -it master mongo
2)在mongo shell里面执行:rs.initiate()
3)继续执行:rs.add(''172.16.1.11:27018'') 表示将secondary添加进副本集
4)继续执行:rs.add(''172.16.1.11:27019'',true) 其中true表示这个节点是仲裁节点
5)查看配置
testSet:PRIMARY> rs.conf()
{
"_id" : "testSet",
"version" : 77284,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "172.16.1.11:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "172.16.1.11:27018",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "172.16.1.11:27019",
"arbiterOnly" : true,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("5c6fb85fb21aeac107319862")
}
}
6)查看状态
testSet:PRIMARY> rs.status()
{
"set" : "testSet",
"date" : ISODate("2019-02-26T02:12:48.124Z"),
"myState" : 1,
"term" : NumberLong(2),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 0,
"name" : "172.16.1.11:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 268,
"optime" : {
"ts" : Timestamp(1551147003, 4),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2019-02-26T02:10:03Z"),
"lastHeartbeat" : ISODate("2019-02-26T02:12:46.189Z"),
"lastHeartbeatRecv" : ISODate("2019-02-26T02:12:46.188Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "172.16.1.11:27018",
"configVersion" : 77284
},
{
"_id" : 1,
"name" : "172.16.1.11:27018",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 938,
"optime" : {
"ts" : Timestamp(1551147003, 4),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2019-02-26T02:10:03Z"),
"electionTime" : Timestamp(1551146242, 1),
"electionDate" : ISODate("2019-02-26T01:57:22Z"),
"configVersion" : 77284,
"self" : true
},
{
"_id" : 2,
"name" : "172.16.1.11:27019",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 270,
"lastHeartbeat" : ISODate("2019-02-26T02:12:46.189Z"),
"lastHeartbeatRecv" : ISODate("2019-02-26T02:12:48.118Z"),
"pingMs" : NumberLong(0),
"configVersion" : 77284
}
],
"ok" : 1
}
如果想要修改副本集的配置,可以采用以下方法:
conf=rs.conf()
conf.members[0].host="172.16.1.11:27017"
rs.reconfig(conf,{"force":true})
三、验证mongdb可用性:
由上测试可知:副节点只能读,不能写
二、windows客户端连接mongodb
1、登录mongo shell,创建一个admin用户
testSet:PRIMARY> db.createUser({user:"admin",pwd:"admin",roles:[{"role":"userAdminAnyDatabase","db":"admin"},{"role":"readWrite","db":"testdb"}]})
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
{
"role" : "readWrite",
"db" : "testdb"
}
]
}
2、安装 robomongo-1.0.0-windows-x86_64-89f24ea.exe
3、填写连接信息
21.26mongodb 副本集介绍、mongodb 副本集搭建、 21.35mongodb 副本集测试
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 这个角色,尤其是数据库坚决不能出现脑裂的状态,脑裂会导致数据会紊乱,数据一旦紊乱恢复就非常麻烦.
变迁图
说明:Primary 宕机后,其中 secondary 就成为一个新的 Primary,另外一个 secondary 依然是 secondary 的角色。对于 MySQL 主从来讲,即使做一主多从,万一 master 宕机后,可以让从成为新的主,但这过程是需要手动的更改的。但是在 MongoDB 副本集架构当中呢,它完全都是自动的,rimary 宕机后,其中 secondary 就成为一个新的 Primary,另外一个 secondary 可以自动识别新的 primary.
mongodb 副本集搭建
准备三台机器: 192.168.193.130 (primary)
192.168.193.131 (secondary)
192.168.193.132 (secondary)
三台机器都需要安装 MongoDB,primary 已安装过,两台 secondary 需要安装,因步骤一样,在此不做演示.
编辑三台机器的配置文件
[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 和内网 IP
#replication: //把#去掉,并增两行
replication:
oplogSizeMB: 20 //前面两个空格
replSetName;aminglinux //定义副本集的名字 前面两个空格
重启 MongoDB 服务:
[root@aminglinux-130 ~]# systemctl restart mongod
启动从主机
[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 和内网 IP
#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
}
5步搞定CentOS6.7上MongoDB副本集搭建
如果只有一个节点或者使用Master-Slave模式,存在主机挂掉后“单点失效”的问题。通过使用Mongo DB副本集,可以提高容错性和可用性~~
Areplica setin MongoDB is a group of
mongod
processes that maintain the same data set. Replica sets provide redundancy and high availability
什么是副本集( Repilca Set )?
副本集在Mongo DB中就是一组mongod维护相同的数据集,副本集提供冗余和高可用~~
一个三个节点的副本集如下图所示:
本篇博文主要给出一个搭建三个节点Mongo DB副本集的示例,只要5个步骤即可~废话不说了,直接来战~~~
第一步 - 准备环境
准备三个虚拟机,其中一个用作Primary,另外两个用作Secondary。如上图展示的那样~
虚拟机信息如下:
Primary -172.xx.xx.107
Secondary -172.xx.xx.105和172.xx.xx.106
本文的虚拟机装的是CentOS 6.7 ~
第二步 - yum安装Mongo
本文使用yum install mongodb-org命令来安装。
如果遇到No package mongodb-org available.的问题,如:
Loaded plugins: fastestmirror Setting up Install Process Loading mirror speeds from cached hostfile No package mongodb-org available. Error: nothing to do
在/etc/yum.repos.d/目录下,创建一个mongodb.repo文件,指定MongoDB资源库即可。
使用vim /etc/yum.repos.d/mongodb.repo命令,创建并打开文件mongodb.repo,
[mongodb-org-3.4] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
然后,重新使用yum install mongodb-org命令安装即可。
第三步 - 配置副本集
使用vim /etc/mongod.conf配置,每一台虚拟机上的Mongod配置文件。
在replication选项中添加oplogSizeMB 和 replSetName两个属性~
replication: oplogSizeMB: 1024 replSetName: wang
配置文件mongod.conf如下所示:
# mongod.conf # for documentation of all options,see: # http://docs.mongodb.org/manual/reference/configuration-options/ # where to write logging data. systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log # Where and how to store data. storage: dbPath: /var/lib/mongo journal: enabled: true # engine: # mmapv1: # wiredTiger: # how the process runs processManagement: fork: true # fork and run in background pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile # network interfaces net: port: 27017 bindIp: 0.0.0.0 # Listen to local interface only,comment to listen on all interfaces. #security: #operationProfiling: replication: oplogSizeMB: 1024 replSetName: wang #sharding: ## Enterprise-Only Options #auditLog: #snmp:
注意:
3台虚拟机,MongoDB配置文件mongod.conf中的replSetName名字要保持一致,
在本例中,replSetName的名字为wang,这个名字可以随便取~~
第四步 - 启动
配置好副本集之后,通过mongod --config /etc/mongod.conf命令启动三个虚拟机中的Mongo服务~,如:
[root@dev04 mongodb]# mongod --config /etc/mongod.conf about to fork child process,waiting until server is ready for connections. forked process: 30799 child process started successfully,parent exiting
因为107端口的虚拟机安装的MongoDB要用作Primary节点,所以,我们可以使用mongo命令来连接~
[root@dev04 mongodb]# mongo MongoDB shell version v3.4.2 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.2 Server has startup warnings: 2017-02-17T09:19:20.240+0800 I STORAGE [initandlisten] 2017-02-17T09:19:20.240+0800 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine 2017-02-17T09:19:20.240+0800 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem 2017-02-17T09:19:20.964+0800 I CONTROL [initandlisten] 2017-02-17T09:19:20.964+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2017-02-17T09:19:20.964+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2017-02-17T09:19:20.964+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user,which is not recommended. 2017-02-17T09:19:20.965+0800 I CONTROL [initandlisten] 2017-02-17T09:19:20.965+0800 I CONTROL [initandlisten] 2017-02-17T09:19:20.965+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2017-02-17T09:19:20.965+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2017-02-17T09:19:20.965+0800 I CONTROL [initandlisten] 2017-02-17T09:19:20.965+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2017-02-17T09:19:20.965+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2017-02-17T09:19:20.965+0800 I CONTROL [initandlisten]
使用use admin,切换到时admin数据库,
> use admin switched to db admin
然后通过config配置设置副本集节点成员~~
config={_id:"wang",members:[{_id:0,host:"172.xxx.xxx.107:27017"},{_id:1,host:"172.xxx.xxx.106:27017"},{_id:2,host:"172.xxx.xxx.105:27017"}]}
注:
_id:"wang",wang是副本集中取得名字。
members中添加每个副本集Mongod的_id和host信息
执行完上述信息,会出现如下信息:
> config={_id:"wang",host:"172.xxx.xxx.105:27017"}]} { "_id" : "wang","members" : [ { "_id" : 0,"host" : "172.xxx.xxx.107:27017" },{ "_id" : 1,"host" : "172.xxx.xxx.106:27017" },{ "_id" : 2,"host" : "172.xxx.xxx.105:27017" } ] } >
然后,执行配置初始化,看到{ "ok" : 1 },则表明初始化成功~
> rs.initiate(config) { "ok" : 1 }
使用rs.status()查看副本节点状态~~
wang:PRIMARY> rs.status() { "set" : "wang","date" : ISODate("2017-02-17T01:30:53.128Z"),"myState" : 1,"term" : NumberLong(1),"heartbeatIntervalMillis" : NumberLong(2000),"optimes" : { "lastCommittedOpTime" : { "ts" : Timestamp(1487295047,1),"t" : NumberLong(1) },"appliedOpTime" : { "ts" : Timestamp(1487295047,"durableOpTime" : { "ts" : Timestamp(1487295047,"t" : NumberLong(1) } },"name" : "172.xxx.xxx.107:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 693,"optime" : { "ts" : Timestamp(1487295047,"t" : NumberLong(1) },"optimeDate" : ISODate("2017-02-17T01:30:47Z"),"infoMessage" : "Could not find member to sync from","electionTime" : Timestamp(1487294966,"electionDate" : ISODate("2017-02-17T01:29:26Z"),"configVersion" : 1,"self" : true },"name" : "172.xxx.xxx.106:27017","state" : 2,"stateStr" : "SECONDARY","uptime" : 96,"optimeDurable" : { "ts" : Timestamp(1487295047,"optimeDurableDate" : ISODate("2017-02-17T01:30:47Z"),"lastHeartbeat" : ISODate("2017-02-17T01:30:52.708Z"),"lastHeartbeatRecv" : ISODate("2017-02-17T01:30:51.674Z"),"pingMs" : NumberLong(0),"syncingTo" : "172.xxx.xxx.107:27017","configVersion" : 1 },"name" : "172.xxx.xxx.105:27017","lastHeartbeatRecv" : ISODate("2017-02-17T01:30:51.745Z"),"syncingTo" : "172.xxx.xxx.106:27017","configVersion" : 1 } ],"ok" : 1 } wang:PRIMARY>
从上图圈出来的信息可以看出,一个Primary 和两个Secondary的副本集已经完成~~~
第五步 - 验证
最后一步就是用来验证了,看看数据能否同步过来~~~
写的操作是在Primary节点上操作的。
在107节点上,创建一个messages的数据库,然后在message Collection中插入两条message。
wang:PRIMARY> show dbs admin 0.000GB local 0.000GB wang:PRIMARY> use messages switched to db messages wang:PRIMARY> db.message.insert({"name":"This is a test message"}) WriteResult({ "nInserted" : 1 }) wang:PRIMARY> show dbs admin 0.000GB local 0.000GB messages 0.000GB wang:PRIMARY> db.message.insert({"name":"This is a test message111"}) WriteResult({ "nInserted" : 1 }) wang:PRIMARY>
通过可视化工具查看,Secondary节点105和106上是否可以同步Primary节点107上messages数据库的信息~~
详细信息如下:
从可视化工具的截图可以看出,两个Secondary节点105和106,与Primary节点107,拥有同样的数据集~~ 至此,Mongo DB副本集的环境搭建完成~~~
CentOS 6.4创建Mongodb副本集
MongoDB是一个开源的non-SQL数据库引擎。 MongoDB是可扩展的,是标准关系数据库管理系统(RDBMS)的替代品。 副本集可以使在节点发生故障时还能提供对您的数据的访问。
安装MongoDB
1.确保在副本集的每个成员设置好hostname
nano /etc/hostname
/etc/hostname:
europa
2.创建一个文件以保存MongoDB存储库的配置信息:
sudo touch /etc/yum.repos.d/mongodb.repo
3.如果运行的是64位系统,请使用以下配置:
[mongodb] name=MongoDB Repository baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/ gpgcheck=0 enabled=1
对于32位系统,请使用以下配置:
[mongodb] name=MongoDB Repository baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/i686/ gpgcheck=0 enabled=1
4.使用如下命令安装MongoDB:
sudo yum install mongo-10gen-server
配置网络
请正确配置网络,否则将无法向副本集添加成员。 本节将详细介绍如何将三(3)个服务器配置为MongoDB副本集。
设置hosts文件
/etc/hosts
192.168.160.1 mongo1
192.168.170.1 mongo2
192.168.180.1 mongo3
使用您自己的IP地址代替上述示例中的地址。 副本集中的成员名称也可以根据你的需要设置名称。
编辑Mongo Conf文件
1.编辑mongod.conf文件以添加IP地址和端口号。
/etc/mongod.conf:
# fork and run in background fork = true bind_ip = 192.168.135.24 port = 27017
输入您在bind ip中服务器的私有IP地址。 如果bind_ip不存在,则需要添加它。 保留默认端口号27017,并取消注释行fork = true。
2.仍然在mongodb.conf文件中滚动到底部并添加副本集信息:
/etc/mongod.conf:
replSet = rs1
在此示例中,副本集为rs1,但是,您可以根据选择更改名称。
副本集
副本集将允许您的数据“复制”或传播到集合中的所有其他节点。 它在系统故障的情况下提供冗余。 建议副本集节点个数为奇数,因为这会使选举更容易。
选举是选择哪个节点成为主节点。 选举在副本集初始化之后和主节点不可用时发生。 主节点是唯一可以接受写操作的节点。 如果主节点不可用,则进行选举选出新的主节点。 选举操作自动进行,无需人工干预。
创建副本集
mongod.conf文件在安装过程中就创建好了。 需要用这个配置文件在副本集的每个节点上启动守护程序。
1.命令如下:
mongod --config /etc/mongod.conf
守护程序启动后,输出如下。
[user@europa mongo]# mongod –config /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 20955
all output going to: /var/log/mongo/mongod.log
child process started successfully, parent exiting
2.仅在副本集的一个节点上启动MongoDB客户端:
mongo --host <mongo0>
3.在MongoDB提示符下,使用命令切换到admin:
use admin
您应该看到消息switched to db admin.
4.运行rs.initiate()命令,该命令将在当前节点中创建副本集。 输出应类似于以下内容:
> rs.initiate() { “info2” : “no configuration explicitly specified — making one”, “me” : “192.168.160.1:27017”, “info” : “Config now saved locally. Should come online in about a minute.”, “ok” : 1
5.要查看当前配置,运行命令:
rs.conf()
输出应类似于以下内容:
rs.conf() { "_id" : "rs1", "version" : 8, "members" : [ { "_id" : 0, "host" : "192.168.160.1:27017" } ] }
6.要将成员添加到副本集,请使用命令:
rs.add("mongo1:27017")
输出:
rs1:PRIMARY> rs.add(“mongo2:27017”)
{ “ok” : 1 }
7.要验证节点是否已正确添加,请再次运行rs.conf()命令。 输出应类似于以下内容:
rs1:PRIMARY> rs.conf() { “_id” : “rs0”, “version” : 8, “members” : [ { “_id” : 0, “host” : “192.168.160.1:27017” }, { “_id” : 1, “host” : “mongo1:27017” }, { “_id” : 2, “host” : “mongo2:27017” } ] }
验证副本集
验证副本集是否正常并且节点都进行正常通信的最佳方法是创建新的测试数据库。 默认情况下,当您连接到MongoDB时,将使用现有的测试数据库。 为了保存新数据库,需要添加数据。 创建和插入数据的过程如下:
1.创建数据库
use <products>
用您喜欢的任何名称替换变量products。
2.添加数据
db.products.insert( {item: "paint", qty: 10 } )
如果您不在副本集的主节点上,您将收到消息not master。 切换到主节点并再次运行命令。 现在使用命令:
show dbs
显示数据库列表。 您的新应该出现在列表中。 连接到副本集的其他节点,查看新创建的数据库是否已复制过去。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
- MongoDB的主从复制及副本集的replSet配置教程
- Mongodb 副本集搭建问题总结及解决办法
- Mongodb3.0.5 副本集搭建及spring和java连接副本集配置详细介绍
- mongodb3.4集群搭建实战之高可用的分片+副本集
- 详解MongoDB中用sharding将副本集分配至服务器集群的方法
- Mongodb副本集和分片示例详解
- MongoDB副本集丢失数据的测试实例教程
- MongoDB 复制(副本集)学习笔记
- mongodb 4.0副本集搭建的全过程
Docker / Podman 建立MongoDB 副本集群
Docker / Podman 建立MongoDB 副本集群
- Docker / Podman 建立MongoDB 副本集群
- 建立生成Docker-compose.yaml脚本
- Docker 下部署:
- 拷贝脚本到要部署的机器上
- 登录目标机器,执行脚本
- 建立相关目录
- 使用docker-compse启动mongo实例
- 进入容器【mongo_replSet0】建立集群
- Podman下部署
Docker / Podman 建立MongoDB 副本集群
本文介绍的MongoDB副本集群建立方法只能在Linux系统上使用,其他类Unix系统不适用于此方法。
建立生成Docker-compose.yaml脚本
建立mongoReplSetBuild.sh如下:
#! /bin/bash
:<<'COMMENT'
本脚本用来生成建立Mongo副本集群的docker-compose.yaml或podman-compose.yaml
许阳
2020年12月17日
COMMENT
# 读取容器类型
read_container_type() {
local dt
echo '请输入容器类型:'
echo '1): Docker'
echo '2): Podman'
echo -n '[Docker]:'
read dt
dt=${dt,,}
if [ -z $dt ]; then
c_type=1
else
case $dt in
docker)
c_type=1
;;
podman)
c_type=2
;;
1)
c_type=1
;;
2)
c_type=2
;;
*)
echo '非法输入!'
exit
esac
fi
}
# 读取生成文件要用的文件名
read_file_name() {
local fn
echo -n '请输入文件名[docker-compose.yaml]:'
read fn
if [ -z $fn ]; then
file_name='docker-compose.yaml'
else
ext=`echo $fn | sed -r "s/.*\.(\w*)$/\1/g"`
ext=${ext^^}
if [[ "$ext" =~ "YAML" ]]; then
fn=`echo $fn | sed -r "s/^(\w*)\.\w*$/\1/g"`
fi
file_name=$fn.yaml
fi
}
# 整数转换
conver_number(){
local num_v
if [ -z "$1" ]; then
return
fi
num_v=`echo $1 | sed -rn "s/^([0-9]+)$/\1/gp"`
if [ -z "$num_v" ]; then
echo '非法的整数输入'
else
num_out=$num_v
return $num_v
fi
}
# 读取要生成的副本个数
read_replSet_number() {
local rn
echo -n '请输入副本个数[3]:'
read rn
conver_number $rn
nn=$num_out
if [ -z "$rn" ]; then
replSetNumber=3
elif [ -z "$nn" ]; then
echo '无效的副本个数'
exit
else
replSetNumber=$rn
fi
}
# 读取根用户名
read_root_username() {
local user_name
echo -n '请输入根用户名[root]:'
read user_name
if [ -z "$user_name" ]; then
v_uname='root'
else
v_uname=$user_name
fi
}
# 读取根用户密码
read_root_password() {
local pass_word
echo -e '请输入根用户密码:\c'
while : ;
do
local char=`
stty cbreak -echo
dd if=/dev/tty bs=1 count=1 2>/dev/null
stty -cbreak echo
`
if [ "$char" = "" ]; then
echo
break
fi
v_password="$v_password$char"
echo -n "*"
done
if [ -z "$v_password" ]; then
echo '非法的密码!'
exit
fi
}
# 读取是否需要选举节点
read_arbiter_flag() {
local arf
echo -n '是否需要选举节点(yes|no)[yes]:'
read arf
if [ -z $arf ]; then
v_arf=1
arf=1
fi
arf=${arf,,}
case $arf in
1)
v_arf=1
;;
0)
v_arf=0
;;
y)
v_arf=1
;;
n)
v_arf=0
;;
yes)
v_arf=1
;;
no)
v_arf=0
;;
*)
echo '非法输入!'
exit
esac
}
# 读取数据持久化文件夹前缀
read_data_db() {
local db_path
echo -n '请输入数据文件夹前缀[/opt/mongo/data/db]:'
read db_path
if [ -z "$db_path" ]; then
dbpath='/opt/mongo/data/db'
else
dbpath=$db_path
fi
}
# 读取设定文件夹
read_config_path() {
local configd
echo -n '请输入设定文件夹[/opt/mongo/mongo_key]:'
read configd
if [ -z "$configd" ]; then
cnfpath='/opt/mongo/mongo_key'
else
cnfpath=$configd
fi
}
# 读取密钥文件名
read_key_file(){
local keyf
echo -n '请输入密钥文件名[mongo.key]:'
read keyf
if [ -z "$keyf" ]; then
keyfile='mongo.key'
else
keyfile=$keyf
fi
}
# 读取最高端口号
read_start_port(){
local finalport
echo -n '请输入最高(起始)端口号[30000]:'
read finalport
conver_number $finalport
local tmp=$num_out
if [ -z "$finalport" ]; then
v_port=30000
else
v_port=$tmp
fi
}
read_port_step(){
local step_v
echo -n '请输入端口步长[1]:'
read step_v
conver_number $step_v
local tmpsv=$num_out
if [ -z "$step_v" ]; then
step_num=1
else
step_num=$tmpsv
fi
}
# 生成yaml文件
write_file(){
local start_p=$v_port
local content=`cat<<EOF
version: "$1"
services:
EOF`
local ct=$3
if [ $v_arf -eq 1 ]; then
ct=$(($ct + 1))
fi
for ((fp=0; fp<$ct; fp++))
do
local pp=$(($start_p - $fp * $step_num))
if [ $v_arf -eq 1 ] && [ $fp -eq $3 ]; then
m=`cat<<EOF
mongo_arbiter:
EOF`
else
m=`cat<<EOF
mongo_repl_$fp:
EOF`
fi
m=`cat<<EOF
$m
image: mongo:latest
EOF`
if [ $v_arf -eq 1 ] && [ $fp -eq $3 ]; then
m=`cat<<EOF
$m
container_name: mongo_arbiter
EOF`
else
m=`cat<<EOF
$m
container_name: mongo_replSet$fp
EOF`
fi
if [ $c_type -eq 1 ]; then
m=`cat<<EOF
$m
restart: unless-stopped
EOF`
fi
m=`cat<<EOF
$m
ports:
- $pp:27017
volumes:
- $dbpath$fp:/data/db
- $cnfpath:/data/configdb
environment:
MONGO_INITDB_ROOT_USERNAME: $v_uname
MONGO_INITDB_ROOT_PASSWORD: $v_password
command: 'mongod --auth --keyFile /data/configdb/$keyfile --dbpath /data/db --bind_ip_all --replSet MongoRS --oplogSize 128'
EOF`
if [ $fp -eq 0 ]; then
content=`cat<<EOF
$content
$m
EOF`
else
content=`cat<<EOF
$content
$m
EOF`
fi
done
cat>$2<<EOF
$content
EOF
}
read_container_type
read_file_name
read_replSet_number
read_arbiter_flag
read_root_username
read_root_password
read_data_db
read_config_path
read_key_file
read_start_port
read_port_step
case $c_type in
1)
cc_v=3.3
;;
2)
cc_v=1.0
;;
esac
write_file $cc_v $file_name $replSetNumber $v_arf
Docker 下部署:
拷贝脚本到要部署的机器上
scp mongoReplSetBuild.sh 目标机器:build.sh
登录目标机器,执行脚本
ssh 目标机器
./build.sh
建立相关目录
mkdir -p /opt/mongo/data/db0
mkdir -p /opt/mongo/data/db1
mkdir -p /opt/mongo/data/db2
mkdir -p /opt/mongo/data/db3
mkdir -p /opt/mongo/mongo_key
cd /opt/mongo/mongo_key
openssl rand -base64 700 > mongo.key
chmod 400 mongo.key
cd ~
使用docker-compse启动mongo实例
docker-compose --file mongo.yaml up -d
进入容器【mongo_replSet0】建立集群
docker exec -ti mongo_replSet0 /bin/bash
mongo
use admin
db.auth('root', passwordPrompt())
rs.initiate({
_id: 'MongoRS',
members: [
{ _id: 0, host: '公网地址:30000', priority: 3 },
{ _id: 1, host: '公网地址:29990', priority: 2 },
{ _id: 2, host: '公网地址:29980', priority: 1 },
{ _id: 3, host: '公网地址:29970', arbiterOnly: true },
]
})
完成
Podman下部署
Podman下部署与Docker类似,只是在执行build.sh时选Podman为容器。然后在启动容器时使用下面的命令:
podman-compose -f mongo.yaml -t identity up -d
其他命令与Docker部署一样
关于docker-compose搭建mongoDB副本集和1主+1副+1仲裁的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于21.26mongodb 副本集介绍、mongodb 副本集搭建、 21.35mongodb 副本集测试、5步搞定CentOS6.7上MongoDB副本集搭建、CentOS 6.4创建Mongodb副本集、Docker / Podman 建立MongoDB 副本集群等相关内容,可以在本站寻找。
本文标签: