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

MongoDB 副本集搭建与管理详解

时间:2019-05-21  来源:未知  作者: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 } ]
副本集数据量比较大时如何添加次节点

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

友情链接
  • Mozilla发布Firefox 67.0.4,修复沙箱逃逸漏洞
  • 蚂蚁金服正式成为CNCF云原生计算基金会黄金会员
  • Firefox 68将采用Microsoft BITS安装更新
  • OpenSSH增加对存储在RAM中的私钥的保护
  • 谷歌想实现自己的curl,为什么?
  • Raspberry Pi 4发布:更快的CPU、更大的内存
  • Firefox的UA将移除CPU架构信息
  • Ubuntu放弃支持32位应用程序实属乌龙,Steam会否重回Ubuntu怀抱
  • Qt 5.13稳定版发布:引入glTF 2.0、改进Wayland以及支持Lottie动
  • 红帽企业Linux 7现已内置Redis 5最新版
  • Slack进入微软内部禁用服务清单,GitHub也在其列?
  • 安全的全新编程语言V发布首个可用版本
  • Windows Terminal已上架,快尝鲜
  • 阿里巴巴微服务开源生态报告No.1
  • 面世两年,Google地球将支持所有基于Chromium的浏览器
  • 推进企业容器化持续创新,Rancher ECIC千人盛典完美收官
  • CentOS 8.0最新构建状态公布,或于数周后发布
  • Debian移植RISC
  • 微软拆分操作系统的计划初现雏形
  • Oracle发布基于VS Code的开发者工具,轻松使用Oracle数据库
  • Ubuntu 19.10停止支持32位的x86架构
  • 微软为Windows Terminal推出全新logo
  • 联想ThinkPad P系列笔记本预装Ubuntu系统
  • 微软发布适用于Win7/8的Microsoft Edge预览版
  • 启智平台发布联邦学习开源数据协作项目OpenI纵横
  • 经过六个多月的延迟,微软终于推出Hyper
  • ZFS On Linux 0.8.1 发布,Python可移植性工作
  • DragonFly BSD 5.6.0 发布,HAMMER2状态良好
  • Linux Kernel 5.2
  • CentOS 8.0 看起来还需要几周的时间
  • 百度网盘Linux版正式发布
  • PCIe 6.0宣布:带宽翻倍 狂飙至256GB/s
  • PHP 7.4 Alpha 发布,FFI扩展,预加载Opcache以获得更好的性能
  • Canonical将在未来的Ubuntu版本中放弃对32位架构的支持
  • Scala 2.13 发布,改进的编译器性能
  • 微软的GitHub收购了Pull Panda,并且使所有订阅完全免费
  • Windows Subsystem for Linux 2 (WSL 2)现在适用于Windows 10用
  • Debian 10 “Buster”的RISC
  • MariaDB宣布发布MariaDB Enterprise Server 10.4
  • DXVK 1.2.2 发布,带来微小的CPU开销优化
  • DragonFlyBSD 5.6 RC1 发布,VM优化,默认为HAMMER2
  • PrimeNG 8.0.0 发布,支持Angular 8,FocusTrap等
  • GIMP 2.10.12 发布,一些有用的改进
  • 清华大学Anaconda 镜像服务即将恢复
  • Debian GNU/Linux 10 “Buster” 操作系统将于2019年7月6日发布
  • 时时彩论坛
  • 五星体育斯诺克
  • 北单比分直播
  • 河北11选5走势图
  • 福建体彩36选7开奖结果
  • 九龙图库下载