MongoDB 架构
安全
防止被黑客攻击 主要措施
- 启动认证登录
- 设定复杂密码
- 修改端口
- 限制内网访问
通过 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
搭建副本
参考文章: MongoDB 副本集之入门
主机设定
设定主机名字:hostnamectl set-hostname serverpi
为serverpi
,存储在 /etc/hostname
编辑 /etc/hosts
使得服务器之间互相认识
217.160.61.19 serverionos 192.168.0.136 servcerpi ...
配置用例
修改mongod.conf
文件,并启动案例。详细请参阅以下上篇文章:文章一 文章二 文章三
/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 不认识
此文章提及到主节点人工降级为副本集。
数据备份
mongodump
mongodump --uri="mongodb://user:[email protected]:33720" --authenticationDatabase admin -d Stock -o ~/projects/Backup mongorestore --uri="mongodb://user:[email protected]: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 定时任务,制定一个每周和每月的备份计划。编写备份数据的脚本如下,
- 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
然后制定计划任务
crontab -e # 系统会建立/修改一个临时脚本文件。在文件中输入 # 每周日或每月1号的凌晨2点执行数据库备份 0 2 1 * 0 /home/mongobackup/dobachup.sh
硬盘快照备份
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” 的逻辑卷1)
# 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
创建快照卷2)
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
防止快照卷中的数据被破坏
日常维护时需要的脚本
- 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
更高效的恢复数据方式为。将快照文件恢复到逻辑卷,然后删除掉自己。 lvconvert –merge /dev/datavg/mdb-snap。
数据库迁移
查看文件夹信息 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