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 } ]
副本集数据量比较大时如何添加次节点

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

友情链接
  • Salesforce闹剧:共享用户数据后陷入数小时的瘫痪
  • 韩国政府计划从Windows 7迁移到Linux
  • Redis作者antirez:开源维护者的挣扎
  • 最常用还是最近搜索?你的Chrome地址栏如何自动填充?
  • Stack Overflow安全事件新进展:部分用户私人信息遭窃
  • 英特尔发布Clear Linux开发者版本
  • 思科报告Nexus 9000数据中心交换机,PI软件和EPN管理器中的严重
  • Google AI工程师介绍Translatotron,一种端到端的直接语音翻译模
  • Racket 7.3 发布,改进了Racket
  • V8 7.5 Beta 发布,WebAssembly隐式缓存
  • 开发人员辩论是否为Fedora 31阻止基于密码的Root SSH登录
  • Mozilla,Cloudflare和其他人建议使用BinaryAST以加快JavaScript
  • GCC 10支持使用SSE指令模拟MMX
  • KDE Plasma 5.16 beta发布,许多增强功能
  • Microsoft开源VS Code扩展Web Template Studio,可轻松创建全栈W
  • NotePad++ 正则表达式替换高级用法
  • 针对Linux 5.1内核更新的MuQSS补丁
  • DXVK 1.2 发布,支持Direct3D 11特定于供应商的扩展
  • NVIDIA 430.14 Linux驱动程序发布,Vulkan性能优化
  • SMPlayer 19.5.0发布,如何在Ubuntu中安装它
  • Phoronix Test Suite 8.8 正式发布
  • LLVM Clang 9.0采用初始C2x语言模式
  • 使用Linux操作系统的网络安全:您需要知道的一切
  • SwiftWasm
  • Mesa 19.1
  • Wine 4.0.1 发布,44个修复
  • Flutter启用新的lint规则来构建更好的Chrome OS应用程序
  • Proton 4.2
  • 微软开源基于近邻图的最近邻搜索算法SPTAG
  • GitHub Package Registry测试版发布,新的软件包管理服务
  • Mozilla修复旧版Firefox插件bug,专用扩展现可用于Firefox 52
  • 如何在Mozilla Firefox中获得扩展建议
  • Google和Collabora为Chrome OS设备的Linux 5.1内核进行重大更改
  • Ant Design 3.18.1 发布,企业级UI设计语言
  • Atom 1.37 发布,跨平台文本编辑器
  • Apple发布iOS 12.3和tvOS 12.3,macOS Mojave 10.14.5,watchOS
  • G7国家将在6月模拟跨境网络攻击
  • VirtualBox 6.0.8 发布,Linux Kernel 3.16.35与共享文件夹一起
  • Linux kernel 5.1.1第一个点发布,可准备好进行大规模部署
  • KDE Frameworks 5.58 发布,许多修复及改进
  • 英特尔的Clear Linux OS为Linux开发人员提供量身定制的工作流程
  • KDE Plasma 5.16桌面环境将带来全新的通知
  • 微软确认WSL与WSL2共存,以及Windows Linux子系统的更多信息
  • Apple发布了iOS 12.4,macOS 10.14.6,watchOS 5.3和tvOS 12.4的
  • Clear Linux 准备新的内核选项
  • Linux新闻 第972页
  • 如何在Ubuntu 18.04上配置MySQL主从复制
  • ORA
  • 领航时时彩
  • 九龙图库下载
  • 现金开户
  • 宝盈娱乐注册-上鼎狐网
  • 老时时彩360