====== 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地址:
# 拒绝所有访问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
{{tag>database mongo}}
===== 搭建副本 =====
参考文章: [[https://jelly.jd.com/article/5f990ebbbfbee00150eb620a|MongoDB 副本集之入门]]
==== 主机设定 ====
设定主机名字:''hostnamectl set-hostname serverpi'' 为''serverpi'' ,存储在 ''/etc/hostname'' \\ 编辑 ''/etc/hosts'' 使得服务器之间互相认识
217.160.61.19 serverionos
192.168.0.136 servcerpi
...
==== 配置用例 ====
修改''mongod.conf'' 文件,并启动案例。详细请参阅以下上篇文章:[[https://segmentfault.com/a/1190000039403622|文章一]] [[https://www.cnblogs.com/gjc592/p/13454845.html|文章二]] [[https://www.cnblogs.com/operationhome/p/10744712.html|文章三]]
/usr/bin/mongod -f /home/mongodb/33720/etc/mongod.conf
/usr/bin/mongod -f /home/mongodb/33721/etc/mongod.conf
db.shutdownServer({force: ,timeoutSecs: }) #关闭服务, 这种方式启动的案例 systemctl 不认识
此文章提及到主节点[[https://www.jianshu.com/p/73b5ad930f47|人工降级]]为副本集。
===== 数据备份 =====
==== mongodump ====
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
注意备份前锁写操作 ''db.fsyncLock()'' 以及备份结束后开通写操作 ''db.fsyncUnlock()''
==== 压缩文件备份 ====
将目录压缩到一个文件当中 ''%%tar -czf /home/ubuntu/Backup/`date +%F`_mongo_all.tar.gz /home/ssd/mongodb%%''
解压到原来的目录 ''%%tar -xzf /home/ubuntu/Backup/2021-07-17_mongo_all.tar.gz -C /%%''
:!: //解压的参数写根目录就可以了,它会按照压缩时的目录解压// 。
利用系统 crontab 定时任务,制定一个每周和每月的备份计划。编写备份数据的脚本如下,
#/usr/bin/sh!
mongo --port 33720 -u goldentianya -p 's#;zb_OfJW]P' <
然后制定计划任务
crontab -e # 系统会建立/修改一个临时脚本文件。在文件中输入
# 每周日或每月1号的凌晨2点执行数据库备份
0 2 1 * 0 /home/mongobackup/dobachup.sh
==== 硬盘快照备份 ====
参考文章:[[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 全部转换成物理分区 ===
pvcreate /dev/sdc
$> pvs #显示结果 pvdisply pvscan
PV VG Fmt Attr PSize PFree
/dev/sdc1 lvm2 --- <30.00g <30.00g
=== 3 创建卷组 VG (VolumeGroup) ===
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 ]
创建完可以用命令查看 ''vgdisplay datavg'' 其实 ''vgs vgscan'' 都可以。
将来需要用到分区扩容或者减容,用一下命令
vgextend datavg /dev/sdd # /dev/sdd 是新的物理硬盘
vgreduce datavg /dev/sdd # 减少
pvmove /dev/sdd [/dev/sdc] # 将物理卷 sdd 的数据导出到 /dev/sdc,也可以不添加第二个参数
=== 4 创建逻辑卷 ===
创建一个名为 '"mongolv" 的逻辑卷(([[https://blog.csdn.net/debimeng/article/details/72470030|lvcreate 解释]]))
# 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%左右的容量
$> 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
这个USB有30G左右容量,创建一个 80%左右的逻辑卷,剩下的留给快照卷。
=== 逻辑卷扩容 ===
需要两个操作,一个是逻辑卷的扩容,一个是文件系统的扩展
vgs #查看vg是否还有剩余空间
lvextend -l 15 /dev/datavg/datalv # 最终到15个LE
lvextend -l +15 /dev/datavg/datalv # 加15个LE
以上只是逻辑卷扩容,但文件系统没有扩大,还需要对文件系统扩容
# xfs 格式
xfs_growfs /dev/datavg/datalv
# ext4 格式
resize2fs /dev/datavg/datalv
=== 5 格式化 ===
建议使用 xfs 格式,比ext4格式要更优秀。
mke2fs -t ext4 /dev/datavg/datalv
mkfs.ext4 /dev/datavg/datalv
mkfs.xfs /dev/datavg/datalv #也行
=== 6 挂载 ===
mkdir /home/mongosnap
mount /dev/datavg/datalv /home/ssd
如果要开机就挂载
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
也可以设置完 ''fstab'' 文件后用 ''mount -a'' 命令看看是否挂载成功。
=== 7 使用 LVM 创建快照 snapshot ===
创建快照卷(([[https://qastack.cn/ubuntu/424225/setting-up-lvm-snapshot-as-a-backup-restore-point-in-ubuntu|将LVM快照设置为ubuntu中的备份/还原点]]))
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
参数说明\\
-s: snapshot 创建快照\\
对 datavg 下面的逻辑卷 datalv 进行快照,快照名称mb-snap
查看结果
$> 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
显示 datalv 是原始卷 'Original',MdB-snap 是快照卷 Snapshot 挂载快照卷到文件系统,进行查看。
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
-o ro : 使用只读的方式将快照卷挂载到 /home/mb-01\\
防止快照卷中的数据被破坏
快照卷与原卷必须在同一个VG里头。快照卷无需与原卷一样大,10%就OK
日常维护时需要的脚本
#!/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
更高效的恢复数据方式为。将快照文件恢复到逻辑卷,然后删除掉自己。 lvconvert –merge /dev/datavg/mdb-snap。
{{tag>database mongo 文件系统}}
===== 数据库迁移 =====
参考文章 [[https://zhuanlan.zhihu.com/p/113645698|mongo复制data文件迁移数据出错解决方案]]
查看文件夹信息 ''ls -l''
ls -l /var/lib #得出以下信息
drwxr-xr-x 4 mongodb mongodb 4096 Jul 15 15:01 mongodb
//第一个字符表示文件的类型,- 表示这是一个普通文件;d表示这是一个文件夹。 接下来的9个字符表示,三种用户的读、写、运行的权限。如第一行 rwxr-xr-x,表示文件所有者有r (读)、w(写)、x(运行)的权限;属组有 读权限 、没有写权限,有运行权限;其他人有 读权限 、没有写权限,有运行权限。 第二个数字表示文件的连接 和书。 第三个和第四个分别表示文件的属主和属组。 最后分别是文件大小、最后修改日期和时间、文件的路径。 Lesen = 4 Schreiben = 2 Ausführen = 1 chmod -R 751//
复制数据内容到新的目录: ''cp -R /var/lib/mongodb/* /home/mongodata/data''
检查文件数目是否出错 ''ls | wc -l''
更改文件所有人以及权限,同样操作日志文件 ''/var/log/mongodb/mongod.log''
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
如果启动失败,查看一下sock文件的权限
ls - lat /tmp/mongodb-2222.sock # 2222 为设定的数据库端口
sudo chown mongodb:mongodb /tmp/mongodb-2222.sock
===== 优化与管理 =====
限制内存用量
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
# engine:
mmapv1:
smallFiles: true
wiredTiger:
engineConfig:
configString : cache_size=160M