> 文档中心 > MongoDB+Docker+Linux实现副本集集群搭建

MongoDB+Docker+Linux实现副本集集群搭建

目录

  • 1、副本
  • 2、集群搭建
    • 2.1、副本集创建-配置
    • 2.2、副本集创建-启动
    • 2.3、配置用户验证(非必要)
      • 2.3.1、Docker实现
      • 2.3.2、Linux实现
      • 2.3.3、创建用户操作命令
    • 2.4、副本集创建-初始化
    • 2.5、新增从节点与仲裁节点
    • 2.6、从节点-读取配置
  • 3、主节点选举规则
  • 4、Compass和SpringBoot连接
        • 4.1、Compass
        • 4.2、SpringBoot连接

1、副本集

是一组维护相同数据集的mongod服务,也可以理解为主从集群,副本集可提供冗余和高可用性,是所有生产部署的基础。

副本集有两种类型三种角色:

类型:

  • 主节点(Primary)类型:数据操作的主要连接点,可读写。
  • 从节点(Secondaries)类型:数据冗余备份节点,可以读或选举。

角色:

  • 主要成员(Primary):主要接收所有写操作,就是主节点。
  • 副本成员(Replicate):从主节点备份数据,可以读操作==[需配置]==,不能写操作。是默认的一种从节点类型。
  • 仲裁者(Arbiter):不保留任何数据的副本,只具有投票选举作用。
    在这里插入图片描述

2、集群搭建

集群搭建只是需要三个mongoDB服务:一主一从一仲裁,端口分别为:27017、27018、27019,本次集群搭建在同一台机器上完成,通过配置不同端口实现不同的节点。

在搭建集群环境前,可以参考《Linux搭建MonggoDB环境》或者《Docker搭建MonggoDB环境》实现单机环境搭建

本次集群搭建已Docker实现为主,同时会给你linux实现集群的解决方案。

2.1、副本集创建-配置

1、创建文件
/opt/mongodb/replica目录分别创建270172701827019三个文件夹,表示存放三个mongodb服务的数据。

mkdir -p /opt/mongodb/replica/27017[8|9]/datamkdir -p /opt/mongodb/replica/27017[8|9]/logmkdir -p /opt/mongodb/replica/27017[8|9]/conf

2、创建配置文件
分别在270172701827019三个文件夹中的conf下创建mongodb.conf配置文件

vim /opt/mongodb/replica/27017[8|9]/conf/mongodb.conf

不管是通过linux源码创建还是通过docker创建,配置内容都一致,如果是linux采用yml格式,docker采用key=vlaue格式
三类节点创建方式的与普通的单机环境一致,如果都在一台服务器上则设置不同的端口,并且要求副本集的名称一样,配置内容如下:

Docker配置:
配置时注意logpath、dbpath填写与服务对应的关系,比如操作的文件夹为27018,那么logpath、dbpath中的参数就要为27018

#端口port=27017#数据库文件存放目录dbpath=/opt/mongodb/replica/27017[8|9]/data#日志文件存放路径logpath=/opt/mongodb/replica/27017[8|9]/log/mongodb.log#使用追加方式写日志logappend=true#以守护线程的方式运行,创建服务器进程fork=true#最大同时连接数maxConns=100#不启用验证#noauth=true#每次写入会记录一条操作日志journal=true#存储引擎有mmapv1、wiredTiger、mongorocksstorageEngine=wiredTiger#访问IPbind_ip=0.0.0.0# 副本集名称replSet=test

Linux配置:
配置时注意systemLog.path、dbPath、prot填写与服务对应的关系,比如操作的文件夹为27018,那么path、dbPath、prot中的参数就要为27018

systemLog: #MongoDB发送所有日志输出的目标指定为文件 destination: file  #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径    path: "/opt/mongodb/replica/27017[8|9]/log/mongodb.log" #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。 logAppend: truestorag #mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。  dbPath: "/opt/mongodb/replica/27017[8|9]/data" journal:    #启用或禁用持久性日志以确保数据文件保持有效和可恢复。    enabled: true processManagement: #启用在后台运行mongos或mongod进程的守护进程模式。 fork: truenet: #服务实例绑定的IP,默认是localhost,多个ip逗号分割 bindIp: 0.0.0.0   #绑定的端口,默认是27017 port: 27017[8|9]security: #用户验证 authorization: enabled# 副本集名称replication:   replSetName: test

2.2、副本集创建-启动

docker方式:
通过不同的容器名称,映射不同的端口和挂载不同的目录,分别启动三个mongodb实例

docker run -d -p 27017[8|9]:27017 \-v /opt/mongodb/replica/27017[8|9]/data:/data/db \-v /opt/mongodb/replica/27017[8|9]/conf:/data/conf \-v /opt/mongodb/replica/27017[8|9]/datalog:/data/log \--name mongodb-27017[8|9]  mongo:4.4.12 \--replSet "test"

其中--replSet表示副本的名称,相同的名称组副本集

在这里插入图片描述

linux方式:
将下载的源码,拷贝到服务器的/opt目录下,并且进行解压,将解压后的内容拷贝到/opt/mongodb目录下,具体可以参考《Linux搭建MonggoDB环境》

cd /opt/mongodb/bin./mongod --config ../replica/27017[8|9]/conf/mongodb.conf 

2.3、配置用户验证(非必要)

如果在连接时,要开启用户验证,需要修改配置文件,并且创建用户数据。

2.3.1、Docker实现

修改mongodb.conf追加以下内容:

#用户验证auth=true

进入容器:

docker exec -it mongodb-27017[8|9] mongo admin

执行创建命令:
参考下方的《2.3.3、创建用户操作命令》

重启容器:

docker restart mongodb-27017[8|9]

2.3.2、Linux实现

修改mongodb.conf追加以下内容:

security: #用户验证 authorization: enabled

执行创建命令:
参考下方的《2.3.3、创建用户操作命令》

重启服务:

cd /opt/mongodb/bin# 关闭./mongod --shutdown --config ../replica/27017[8|9]/conf/mongodb.conf # 启动./mongod --config ../replica/27017[8|9]/conf/mongodb.conf 

2.3.3、创建用户操作命令

创建用户操作命令不区分Linux还是Docker,命令如下:

#创建管理员用户db.createUser({user:"root",pwd:"123456",roles:["root","readWrite"]});#创建普通用户-读写权限,readWrite:读写,read:只读,库管理员:userAdminAnyDatabasedb.createUser({user:"test",pwd:"123456",roles:["readWrite"]})#查看用户show users#验证用户密码,返回1,则表示成功db.auth("root","123456")#修改用户密码db.updateUser("root",{pwd:"new_pwd"})#删除用户db.dropUser("root")#为非admin数据库,设置用户,role为对应角色,db为所属数据库名称[该库可以事先不存在]db.createUser({user: "test", pwd: "123456", roles: [{ role: "readWrite", db: "test" }]})

2.4、副本集创建-初始化

1、初始化主节点

docker方式连接

docker exec -it mongodb-27017 mongo

linux方式连接

cd /opt/mongodb/bin./mongo --host=127.0.0.1 --port=27017

初始化操作:
不区分docker和linux环境

# 初始化#_id为副本集名称,对应--replSet后的名称#27017为主节点,27018为从节点,27019为仲裁节点,可以配置多个从节点和仲裁节点config={_id:"test",    members:[ {_id:0,host:"111.229.160.175:27017",priority:3},  {_id:1,host:"111.229.160.175:27018",priority:2}, {_id:2,host:"111.229.160.175:27019",arbiterOnly:true}]    }rs.initiate(config)

在这里插入图片描述
查看状态:

通过rs.status()可以看到每个节点的角色情况

rs.status()

在这里插入图片描述

2.5、新增从节点与仲裁节点

从节点:

添加:rs.add(ip:port)

删除:rs.remove(host)

rs.add("ip:port")

仲裁节点:
rs.addArb(ip:port)

rs.addArb("ip:port")

注意:可以添加多个副节点,只需要执行多次rs.add方法即可,每次指定不同的mongodb服务。

副本集状态查看:

rs.status()

2.6、从节点-读取配置

进入从节点:

#docker方式docker exec -it mongodb-27018 mongo#linux方式cd /opt/mongodb/bin./mongo --host=127.0.0.1 --port=27018

配置读取权限:

rs.secondaryOk()

3、主节点选举规则

MongoDB在副本集中,会自动进行主节点的选举,主节点选举的触发条件:

  • 1) 主节点故障
  • 2) 主节点网络不可达(默认心跳信息为10秒)
  • 3) 人工干预(rs.stepDown(600))

选举规则是根据票数来决定谁获胜:

  • 票数最高,且获得了“大多数”成员的投票支持的节点获胜。
    “大多数”的定义为:假设复制集内投票成员数量为N,则大多数为 N/2 + 1,当副本集的数量小于3时,将无法选举出Primary,此时mongodb只能处于只读状态。

  • 若票数相同,数据新的节点获胜。
    数据的新旧是通过操作日志oplog来对比的。

影响选择因素:
在获得票数的时候,优先级(priority)参数影响重大,会获取额外票数。优先级取值为0-1000,相当于可额外增加0-1000的票数,优先级的值越大,就越可能获得多数成员的投票数,默认情况下,优先级的值是1。

# 修改优先级# 1、进入任意节点,比如:./mongo --host=127.0.0.1 --port=27017cfg=rs.conf()# 2、对某个成员设置,n为第几个成员,m为权重值,可以通过rs.conf()查询各个成员情况cfg.members[n].priority=m# 配置rs.reconfig(cfg)

4、Compass和SpringBoot连接

4.1、Compass

在这里插入图片描述
在这里插入图片描述

4.2、SpringBoot连接

连接格式如下:

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

比如:

spring:  #数据源配置  data:    mongodb:      # 集群连接,test为副本集名称      uri: mongodb://111.229.160.175:27017,111.229.160.175:27018,111.229.160.175:27019/articledb?connect=replicaSet&slaveOk=true&replicaSet=test

注意:

主机必须是副本集中所有的主机,包括主节点、副本节点、仲裁节点,SpringDataMongoDB自动实现了读写分离。

MSDN工具下载