irpas技术客

MongoDB+Docker+Linux实现副本集集群搭建_一恍过去_linux mongodb副本集群搭建

大大的周 2865

目录 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、Compass4.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目录分别创建27017、27018、27019三个文件夹,表示存放三个mongodb服务的数据。

mkdir -p /opt/mongodb/replica/27017[8|9]/data mkdir -p /opt/mongodb/replica/27017[8|9]/log mkdir -p /opt/mongodb/replica/27017[8|9]/conf

2、创建配置文件 分别在27017、27018、27019三个文件夹中的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、mongorocks storageEngine=wiredTiger #访问IP bind_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: true storag #mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。 dbPath: "/opt/mongodb/replica/27017[8|9]/data" journal: #启用或禁用持久性日志以确保数据文件保持有效和可恢复。 enabled: true processManagement: #启用在后台运行mongos或mongod进程的守护进程模式。 fork: true net: #服务实例绑定的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:只读,库管理员:userAdminAnyDatabase db.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=27017 cfg=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自动实现了读写分离。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #Linux #mongodb副本集群搭建