linuxsir首页 LinuxSir.Org | Linux、BSD、Solaris、Unix | 开源传万世,因有我参与欢迎您!
网站首页 | 设为首页 | 加入收藏
您所在的位置:主页 > Linux数据库 >

MongoDB 副本集搭建与管理详解

时间:2019-05-13  来源:未知  作者:admin666
基本环境:
 系统 CentOS 7
 MongoDB 版本 4.0.8
fymongodb001 内网IP:172.18.186.161 公网ip: 47.112.129.2 # 主节点
fymongodb002 内网IP: 172.18.186.162 公网ip: 47.112.131.231 # 次节点
fymongodb003 内网IP: 172.18.186.163 公网ip: 47.112.98.64 # 仲裁节点
副本集名称: fymongodb

三个节点都需要执行

# 下载mongodb 
cat EOF /etc/hosts
172.18.186.161 fymongodb001
172.18.186.162 fymongodb002
172.18.186.163 fymongodb003
cd /tmp wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.8.tgz
tar -zxf mongodb-linux-x86_64-4.0.8.tgz 
mv mongodb-linux-x86_64-4.0.8 /opt/mongodb
mkdir /opt/mongodb/{data,logs}
useradd mongodb
# 我们这里使用的配置文件 是YAML 格式的
wget https://raw.githubusercontent.com/tobewithyou1996/LinuxGuide/master/MongoDB/mongodb_rep.yaml -P /opt/mongodb/
chown -R mongodb:mongodb /opt/mongodb/
cat EOF /usr/lib/systemd/system/mongodb.service
[Unit]
Description= mongodb service manager
[Service]
# Other directives omitted
# (file size)
LimitFSIZE=infinity
# (cpu time)
LimitCPU=infinity
# (virtual memory size)
LimitAS=infinity
# (locked-in-memory size)
LimitMEMLOCK=infinity
# (open files)
LimitNOFILE=64000
# (processes/threads)
LimitNPROC=64000
Type=forking
User=mongodb
Group=mongodb
PIDFile=/opt/mongodb/logs/mongod.pid
ExecStart= /opt/mongodb/bin/mongod -f /opt/mongodb/mongodb_rep.yaml
ExecStop= /opt/mongodb/bin/mongod --shutdown --dbpath /opt/mongodb/data
Restart=always
[Install]
WantedBy=multi-user.target
# 添加环境变量
echo "export PATH=$PATH:/opt/mongodb/bin" /etc/profile
source /etc/profile
# 启动 
systemctl start mongodb

主节点操作

# 主节点操作
[root@fymongodb001 tmp]# mongo
MongoDB shell version v4.0.8
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("77f60167-1d37-4796-bf2a-60cfdc4b0526") }
MongoDB server version: 4.0.8
 use admin # 切换到 admin 数据库
switched to db admin 
# 初始化副本集,副本集名称为 fymongodb ,第一个成员为自己本身。
 rs.initiate({_id:'fymongodb',members: [{ _id: 0 , host: "fymongodb001:27017"}]}) 
{ "ok" : 1 } 
fymongodb:SECONDARY # 接着回车,直到显示这个节点为Primary主节点
fymongodb:PRIMARY # 接着添加 次节点 fymongodb002
# 添加次节点
fymongodb:PRIMARY rs.add('fymongodb002:27017')
 "ok" : 1,
 "operationTime" : Timestamp(1555663440, 1),
 "$clusterTime" : {
 "clusterTime" : Timestamp(1555663440, 1),
 "signature" : {
 "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
 "keyId" : NumberLong(0)
# 添加仲裁节点
fymongodb:PRIMARY rs.addArb("fymongodb003:27017")
 "ok" : 1,
 "operationTime" : Timestamp(1555663631, 1),
 "$clusterTime" : {
 "clusterTime" : Timestamp(1555663631, 1),
 "signature" : {
 "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
 "keyId" : NumberLong(0)
# 查看当前配置
fymongodb:PRIMARY rs.conf()
 "_id" : "fymongodb",
 "version" : 3,
 "protocolVersion" : NumberLong(1),
 "writeConcernMajorityJournalDefault" : true,
 "members" : [
 "_id" : 0,
 "host" : "fymongodb001:27017",
 "arbiterOnly" : false,
 "buildIndexes" : true,
 "hidden" : false,
 "priority" : 1,
 "tags" : {
 "slaveDelay" : NumberLong(0),
 "votes" : 1
 "_id" : 1,
 "host" : "fymongodb002:27017",
 "arbiterOnly" : false,
 "buildIndexes" : true,
 "hidden" : false,
 "priority" : 1,
 "tags" : {
 "slaveDelay" : NumberLong(0),
 "votes" : 1
 "_id" : 2,
 "host" : "fymongodb003:27017",
 "arbiterOnly" : true,
 "buildIndexes" : true,
 "hidden" : false,
 "priority" : 0,
 "tags" : {
 "slaveDelay" : NumberLong(0),
 "votes" : 1
 "settings" : {
 "chainingAllowed" : true,
 "heartbeatIntervalMillis" : 2000,
 "heartbeatTimeoutSecs" : 10,
 "electionTimeoutMillis" : 10000,
 "catchUpTimeoutMillis" : -1,
 "catchUpTakeoverDelayMillis" : 30000,
 "getLastErrorModes" : {
 "getLastErrorDefaults" : {
 "w" : 1,
 "wtimeout" : 0
 "replicaSetId" : ObjectId("5cb98534cd9d16ff3f4fffdc")
# rs.status() 查看各个节点的身份

当我们完成上面的操作的时,我们主节点更改的数据已经是会自动同步到次节点的。

次节点操作

fymongodb002次节点(Secondary)设置允许读写操作。

[root@fymongodb002 ~]# mongo
MongoDB shell version v4.0.8
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("f353edd5-d79a-4947-9844-7f9bde98a949") }
MongoDB server version: 4.0.8
fymongodb:SECONDARY fymongodb:SECONDARY show dbs; # 我们发现无法读写
2019-04-19T17:04:40.852+0800 E QUERY [js] Error: listDatabases failed:{
 "operationTime" : Timestamp(1555664675, 1),
 "ok" : 0,
 "errmsg" : "not master and slaveOk=false",
 "code" : 13435,
 "codeName" : "NotMasterNoSlaveOk",
 "$clusterTime" : {
 "clusterTime" : Timestamp(1555664675, 1),
 "signature" : {
 "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
 "keyId" : NumberLong(0)
fymongodb:SECONDARY rs.slaveOk() # 允许 次节点 进行读取
fymongodb:SECONDARY show dbs; # 我们就可以查看到次节点的数据了。
admin 0.000GB
config 0.000GB
djx 0.000GB
local 0.000GB
fymongodb:SECONDARY use djx;
switched to db djx
fymongodb:SECONDARY show collections; # 从主节点同步过来的数据。
lsp
数据同步测试

测试数据的同步,我们在主节点创建一个集合test 并添加一条数据 'age':38 ,我们可以看到次节点也同步了该数据。

故障模拟测试

测试一

模拟主???点 fymongodb001 宕机了,然后查看次节点 fymongodb002 是否会被选举成为主节点。

我们可以看到 fymongodb002 选举为主节点.

测试二

当 fymongodb002 选举为主节点后,fymongodb001 恢复了,fymongodb001 会作为次节点加入。

测试三

测试在次节点(Secondary)进行数据删除。是删除不了的。

fymongodb:SECONDARY db.test.drop()
2019-04-19T21:48:38.140+0800 E QUERY [js] Error: drop failed: {
 "operationTime" : Timestamp(1555681711, 1),
 "ok" : 0,
 "errmsg" : "not master",
 "code" : 10107,
 "codeName" : "NotMaster",
 "$clusterTime" : {
 "clusterTime" : Timestamp(1555681711, 1),
 "signature" : {
 "hash" : BinData(0,"I+dFkOHcdqW+La7xvy8JFij+5CY="),
 "keyId" : NumberLong("6681517989155569665")
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DBCollection.prototype.drop@src/mongo/shell/collection.js:707:1
@(shell):1:1
配置副本集登录验证

副本集配置用户和密码,登录主节点,添加admin 用户。

 use admin
switched to db admin
 db.createUser({ user: "admin", pwd: "9toc7tpji8", roles: [{ role: "root", db: "admin" }] })
Successfully added user: {
 "user" : "admin",
 "roles" : [
 "role" : "root",
 "db" : "admin"
}

在主节点生成 keyflie 并复制到其它两个节点

# 生成 keyFile
openssl rand -base64 90 -out /opt/mongodb/keyfile
#并复制到其它两个节点
scp /opt/mongodb/keyfile fymongodb002:/opt/mongodb/
scp /opt/mongodb/keyfile fymongodb003:/opt/mongodb/ 

更改三个节点的 keyFile 文件权限和所有者

chmod 600 /opt/mongodb/keyfile # 一定要更改成 600 权限,否正会报错
chown mongodb:mongodb /opt/mongodb/keyfile # 更改文件所有者

更改三个节点的 mongodb_rep.yaml 配置文件,将 security 的参数 authorization 设置为 enabled,并配置

keyFile 的路径。

security:
 authorization: "enabled" 
 keyFile: '/opt/mongodb/keyfile'
 clusterAuthMode: "keyFile"

然后依次重启 fymongodb001、 fymongodb002、 fymongodb003 。

# fymongodb001
systemctl restart mongodb 
# fymongodb002
systemctl restart mongodb 
# fymongodb003
systemctl restart mongodb 

登陆 fymongodb001,我们使用 db.auth() 进行登陆验证。

fymongodb:PRIMARY show dbs;
fymongodb:PRIMARY use admin 
switched to db admin
fymongodb:PRIMARY db.auth('admin','9toc7tpji8')
fymongodb:PRIMARY show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
三 、副本集维护 副本集成员如何以单节点启动

副本集当做单节点启动需要更改配置文件,主要的配置文件有以下几点:

注释副本集名称设置,replSet=fymongodb 如果是分片储存的,那么还需要注释分片配置,添加 skipShardingConfigurationChecks = true。

然后我们执行维护完后,关闭节点

use admin
db.shutdownServer()

然后还原原来的配置,然后作为副本集成员加入副本集。

副本集设置节点的优先级

如果我们想让某个节点成为主节点,或者是当主节点 down 了后,你想指定某个节点 优先级更高地成为 次节点。

cfg = rs.conf()
cfg.members[0].priority = 0.5
cfg.members[1].priority = 0.5
cfg.members[2].priority = 1
rs.reconfig(cfg)
副本集使用备份数据进行启动
# 使用备份数据进行启动
mongod --dbpath /data/db 
# 删除 local 数据库
use local
db.dropDatabase()
# 指定副本集名称并以备份数据 启动
mongod --dbpath /data/db --replSet replName 
# 启动副本集
rs.initiate( {
 _id : replName ,
 members: [ { _id : 0, host : host:port } ]
副本集数据量比较大时如何添加次节点

当副本集的数据量比较大的时候,我们添加新的节点的时候,如果使用初始化同步的话,会给主节点造成比较大的压力。我们有以下选择:

友情链接
  • Linux Lite用户第一个尝试Linux Kernel 5.1,以下是如何安装它
  • Ubuntu 18.04 Linux上安装Etherpad,基于Web的实时协作编辑器
  • Kakoune - 受 Vim 启发的代码编辑器
  • Slimbook - Ubuntu的电池优化工具
  • 如何在Linux中创建磁盘分区
  • Oracle 经典面试题分享
  • 如何使用Vi/Vim编辑器删除文件中的所有文本
  • Vis - 类似Vim的文本编辑器
  • MySQL 正则表达式详解
  • 关于 Linux系统用户、组和权限管理
  • Rust更换Crates源为国内中科大镜像源
  • MySQL数据库优化
  • 命令行中的 vi 模式
  • AMP - 受Vi/Vim启发的Linux终端文本编辑器
  • MySQL查询表与表字段的信息
  • Ubuntu 18.04源码安装caffe步骤
  • 一份比较全的 VS Code 快捷键
  • MySQL 中的日期时间类型
  • Ubuntu 18.04源码编译安装OpenCV 4.0步骤
  • VMware虚拟机下Ubuntu Cheese黑屏问题解决方法
  • Oracle 分页查询与数据去重实例
  • Aria2 - 适用于Linux的多协议命令行下载工具
  • Ubuntu 18.04.2下编译安装OpenCV 3.4.0 过程
  • Oracle中order by造成分页错误
  • 如何在Ubuntu 18.04/16.04/Linux中安装FreeCAD 0.18
  • git clone速度太慢的解决办法(亲测还有效)
  • Hive0.13.1介绍及安装部署
  • 从命令行关闭Linux计算机的5种方法
  • 简单测试latch nowilling等待模式案例
  • Python面向对象之私有属性和方法
  • TypeScript 中的方法重载
  • Python面向对象之类属性类方法静态方法
  • TypeScript 中非代码模块的导入
  • Python面向对象之单例模式
  • 理解 KMP 算法
  • Python3使用TCP编写一个简易的文件下载器
  • 一道C语言面试题:大整数乘法
  • Python Numpy 数组的基本操作示例
  • Python中模块互相调用的例子
  • Python多进程编程详解
  • Python实现全排列算法
  • Python函数search()和match()的区别
  • 使用Python的matplotlib绘制广义mandelbrot集
  • 如何使用Python删除一个文件或文件夹
  • 使用Python的matplotlib绘制lozi混沌映射吸引子
  • 双色球走势图500期图
  • 福彩3d预测分析
  • 金沙中文
  • 一肖彩经
  • 赌大小
  • 855a网页游戏