搜索
搜索
天涯的知库
显示页面
过去修订
您的足迹:
•
与高我对话
•
指标备忘录
•
标签&插件
•
Favorit
本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。
====== MongoDB 架构 ====== [[https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-ubuntu/|安装 Mongodb@5.0 ubuntu]] [[https://www.mongodb.com/docs/v5.0/tutorial/install-mongodb-on-os-x/|mac OX]] [[https://www.mongodb.com/developer/products/mongodb/mongodb-on-raspberry-pi/|树莓派只能安装4.4版本]] sudo systemctl restart mongod ===== 安全 ===== [[https://zhuanlan.zhihu.com/p/37837627|防止被黑客攻击]] 主要措施 * 启动认证登录 * 设定复杂密码 * 修改端口 * 限制内网访问 通过 MongoDB 自带的 bindip 参数在我的实践中并不管用,这里采用的是 Linux 自带的iptables 功能,限制允许访问 MongoDB 端口的IP地址: <code bash> # 拒绝所有访问27027端口的请求 $ sudo iptables -I INPUT -p tcp --dport 27027 -j DROP # 允许本地访问mongo端口 $ sudo iptables -I INPUT -s 127.0.0.1 -p tcp --dport 27027 -j ACCEPT $ sudo iptables-save </code> {{tag>database mongo}} ===== 搭建副本 ===== 参考文章: [[https://jelly.jd.com/article/5f990ebbbfbee00150eb620a|MongoDB 副本集之入门]] ==== 主机设定 ==== 设定主机名字:''hostnamectl set-hostname serverpi'' 为''serverpi'' ,存储在 ''/etc/hostname'' \\ 编辑 ''/etc/hosts'' 使得服务器之间互相认识 <code bash> 217.160.61.19 serverionos 192.168.0.136 servcerpi ... </code> ==== 配置用例 ==== 修改''mongod.conf'' 文件,并启动案例。详细请参阅以下上篇文章:[[https://segmentfault.com/a/1190000039403622|文章一]] [[https://www.cnblogs.com/gjc592/p/13454845.html|文章二]] [[https://www.cnblogs.com/operationhome/p/10744712.html|文章三]] <code bash> /usr/bin/mongod -f /home/mongodb/33720/etc/mongod.conf /usr/bin/mongod -f /home/mongodb/33721/etc/mongod.conf db.shutdownServer({force: <boolean>,timeoutSecs: <int>}) #关闭服务, 这种方式启动的案例 systemctl 不认识 </code> 此文章提及到主节点[[https://www.jianshu.com/p/73b5ad930f47|人工降级]]为副本集。 ===== 数据备份 ===== ==== mongodump ==== <code bash> mongodump --uri="mongodb://user:pw@192.168.0.157:33720" --authenticationDatabase admin -d Stock -o ~/projects/Backup mongorestore --uri="mongodb://user:pw@143.47.185.127:33720" --authenticationDatabase admin -d Stock ~/projects/Backup/Stock </code> 注意备份前锁写操作 ''db.fsyncLock()'' 以及备份结束后开通写操作 ''db.fsyncUnlock()'' ==== 压缩文件备份 ==== 将目录压缩到一个文件当中 <color #ff7f27>''%%tar -czf /home/ubuntu/Backup/`date +%F`_mongo_all.tar.gz /home/ssd/mongodb%%''</color> 解压到原来的目录 <color #ff7f27>''%%tar -xzf /home/ubuntu/Backup/2021-07-17_mongo_all.tar.gz -C /%%''</color> :!: //解压的参数写根目录就可以了,它会按照压缩时的目录解压// 。 利用系统 crontab 定时任务,制定一个每周和每月的备份计划。编写备份数据的脚本如下, <file sh dobachup.sh> #/usr/bin/sh! mongo --port 33720 -u goldentianya -p 's#;zb_OfJW]P' <<EOF db.fsyncLock() EOF tar -czf /home/mongobackup/`date +%F`_mongo_all.tar.gz /home/ssd/mongodb mongo --port 33720 -u goldentianya -p 's#;zb_OfJW]P' <<EOF db.fsyncUnlock() EOF # 删除6天以前的文件 find /home/ubuntu/apis/test/temp/ -mtime +6 | xargs rm </file> 然后制定计划任务 <code bash> crontab -e # 系统会建立/修改一个临时脚本文件。在文件中输入 # 每周日或每月1号的凌晨2点执行数据库备份 0 2 1 * 0 /home/mongobackup/dobachup.sh </code> ==== 硬盘快照备份 ==== 参考文章:[[https://www.cnblogs.com/despotic/p/11951886.html|linux 逻辑卷管理]][[https://www.cnblogs.com/zknublx/p/9188341.html|Linux LVM 总结]] === 1 挂载一个USB并且格式化 === ''sudo fdisk /dev/sdb'' === 2 全部转换成物理分区 === <code bash> pvcreate /dev/sdc $> pvs #显示结果 pvdisply pvscan PV VG Fmt Attr PSize PFree /dev/sdc1 lvm2 --- <30.00g <30.00g </code> === 3 创建卷组 VG (VolumeGroup) === <code bash> vgcreate datavg /dev/sdc $> pvs #显示结果, sdc1 有组织了,datavg PV /dev/sdc1 VG datavg lvm2 [<30.00 GiB / <30.00 GiB free] Total: 1 [<30.00 GiB] / in use: 1 [<30.00 GiB] / in no VG: 0 [0 ] </code> 创建完可以用命令查看 ''<color #7092be>vgdisplay datavg</color>'' 其实 ''<color #7092be>vgs vgscan</color>'' 都可以。 将来需要用到分区扩容或者减容,用一下命令 <code bash> vgextend datavg /dev/sdd # /dev/sdd 是新的物理硬盘 vgreduce datavg /dev/sdd # 减少 pvmove /dev/sdd [/dev/sdc] # 将物理卷 sdd 的数据导出到 /dev/sdc,也可以不添加第二个参数 </code> === 4 创建逻辑卷 === 创建一个名为 '"mongolv" 的逻辑卷(([[https://blog.csdn.net/debimeng/article/details/72470030|lvcreate 解释]])) <code bash> # lvcreate -l 100%VG -n datalv datavg # lvcreate mongovg -l 80%Free -n mongolv #80%空余 # lvcreate mongovg -L 5G -n mongolv #5G的卷 lvcreate -l 102400 -n datalv datavg # 使用6000PE,大概 80%左右的容量 </code> <code bash> $> lvs #查看结果 LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert datalv datavg -wi-a----- <23.44g $> lvscan ACTIVE '/dev/datavg/datalv' [<23.44 GiB] inherit </code> <color #c3c3c3>这个USB有30G左右容量,创建一个 80%左右的逻辑卷,剩下的留给快照卷。</color> === 逻辑卷扩容 === 需要两个操作,一个是逻辑卷的扩容,一个是文件系统的扩展 <code bash> vgs #查看vg是否还有剩余空间 lvextend -l 15 /dev/datavg/datalv # 最终到15个LE lvextend -l +15 /dev/datavg/datalv # 加15个LE </code> 以上只是逻辑卷扩容,但文件系统没有扩大,还需要对文件系统扩容 <code bash> # xfs 格式 xfs_growfs /dev/datavg/datalv # ext4 格式 resize2fs /dev/datavg/datalv </code> === 5 格式化 === 建议使用 xfs 格式,比ext4格式要更优秀。 <code bash> mke2fs -t ext4 /dev/datavg/datalv mkfs.ext4 /dev/datavg/datalv mkfs.xfs /dev/datavg/datalv #也行 </code> === 6 挂载 === <code bash> mkdir /home/mongosnap mount /dev/datavg/datalv /home/ssd </code> 如果要开机就挂载 <code bash> vim /etc/fstab # 加入一下一行 /dev/mapper/datavg-datalv /home/ssd ext4 defauts 0 0 # 重启后查看是否已经挂载。 $> df -Th /dev/mapper/datavg-datalv ext4 30G 45M 28G 1% /home/mongosnap </code> 也可以设置完 ''fstab'' 文件后用 ''<color #7092be>mount -a</color>'' 命令看看是否挂载成功。 === 7 使用 LVM 创建快照 snapshot === 创建快照卷(([[https://qastack.cn/ubuntu/424225/setting-up-lvm-snapshot-as-a-backup-restore-point-in-ubuntu|将LVM快照设置为ubuntu中的备份/还原点]])) <code bash> vim /etc/fstab # lvcreate -L 100M -n mdb-snap -s /dev/datavg/datalv lvcreate -l 100%FREE -n mdb-snap -s /dev/datavg/datalv # Logical volume "mdb-snap" created. lvcreate -l 100%FREE -n mdb-snap -p r -s /dev/datavg/datalv </code> <color #c3c3c3>参数说明\\ -s: snapshot 创建快照\\ 对 datavg 下面的逻辑卷 datalv 进行快照,快照名称mb-snap</color> 查看结果 <code bash> $> lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert datalv datavg owi-aos--- <23.44g mdb-snap datavg swi-a-s--- <6.56g datalv 0.72 $> lvscan ACTIVE Original '/dev/datavg/datalv' [<23.44 GiB] inherit ACTIVE Snapshot '/dev/datavg/mdb-snap' [<6.56 GiB] inherit </code> <color #c3c3c3>显示 datalv 是原始卷 'Original',MdB-snap 是快照卷 Snapshot</color> 挂载快照卷到文件系统,进行查看。 <code bash> mkdir /home/mdb-snap mount -o ro /dev/datavg/mdb-snap /home/mdb-snap/ # xfs 格式的挂载要用参数 -o nouuid mount -o nouuid,ro /dev/datavg/mdb-snap /home/mdb-snap </code> <color #c3c3c3>-o ro : 使用只读的方式将快照卷挂载到 /home/mb-01\\ 防止快照卷中的数据被破坏</color> <note tip>快照卷与原卷必须在同一个VG里头。快照卷无需与原卷一样大,10%就OK</note> 日常维护时需要的脚本 <file sh dosnapshot.sh> #!/bin/bash # db.fsyncLock() umount /dev/datavg/mdb-snap lvremove -f /dev/datavg/mdb-snap lvcreate -l 100%FREE -n mdb-snap -s /dev/datavg/datalv # db.fsyncUnlock(); # 先解锁,然后慢慢备份 # umount /dev/datavg/mdb-snap # dd if=/dev/datavg/mdb-snap | gzip> /home/mongobackup/mdb-snap`date +%F`.gz mount -o nouuid,ro /dev/datavg/mdb-snap /home/mdb-snap # 只读 tar -czf /home/mongobackup/`date +%F`_mongo_all.tar.gz /home/mb-snap </file> 更高效的恢复数据方式为。将快照文件恢复到逻辑卷,然后删除掉自己。 <color #7092be>lvconvert –merge /dev/datavg/mdb-snap</color>。 {{tag>database mongo 文件系统}} ===== 数据库迁移 ===== 参考文章 [[https://zhuanlan.zhihu.com/p/113645698|mongo复制data文件迁移数据出错解决方案]] 查看文件夹信息 ''ls -l'' <code> ls -l /var/lib #得出以下信息 drwxr-xr-x 4 mongodb mongodb 4096 Jul 15 15:01 mongodb </code> //<color #c3c3c3>第一个字符表示文件的类型,- 表示这是一个普通文件;d表示这是一个文件夹。 接下来的9个字符表示,三种用户的读、写、运行的权限。如第一行 rwxr-xr-x,表示文件所有者有r (读)、w(写)、x(运行)的权限;属组有 读权限 、没有写权限,有运行权限;其他人有 读权限 、没有写权限,有运行权限。 第二个数字表示文件的连接 和书。 第三个和第四个分别表示文件的属主和属组。 最后分别是文件大小、最后修改日期和时间、文件的路径。 Lesen = 4 Schreiben = 2 Ausführen = 1 chmod -R 751</color>// 复制数据内容到新的目录: ''cp -R /var/lib/mongodb/* /home/mongodata/data'' 检查文件数目是否出错 ''ls | wc -l'' 更改文件所有人以及权限,同样操作日志文件 ''/var/log/mongodb/mongod.log'' <code bash> chown -R mongodb:mongodb /home/mongodata/data # drwxr-xr-x 5 mongodb mongodb 4096 Jul 15 15:09 mongodata drwxr-xr-x 4 mongodb mongodb 4096 Jul 15 15:18 mongodb # 权限好像不需要更改 chmod -R 777 /home/mongodata </code> 如果启动失败,查看一下sock文件的权限 <code bash> ls - lat /tmp/mongodb-2222.sock # 2222 为设定的数据库端口 sudo chown mongodb:mongodb /tmp/mongodb-2222.sock </code> ===== 优化与管理 ===== 限制内存用量 <code> storage: dbPath: /var/lib/mongodb journal: enabled: true # engine: mmapv1: smallFiles: true wiredTiger: engineConfig: configString : cache_size=160M </code>
it/database/mongo_install.txt
· 最后更改: 2024-05-25 15:42 由
goldentianya
回到顶部