MongoDB与Docker共舞:副本集集群搭建完美指南
MongoDB与Docker共舞:副本集集群搭建完美指南
目录
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自动实现了读写分离。
更多推荐
所有评论(0)