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.conf2.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.conf2.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自动实现了读写分离。



