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 serverpiserverpi ,存储在 /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
防止快照卷中的数据被破坏

快照卷与原卷必须在同一个VG里头。快照卷无需与原卷一样大,10%就OK

日常维护时需要的脚本

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

数据库迁移

参考文章 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
it/database/mongo_install.txt · 最后更改: 2024-05-25 15:42 由 goldentianya
回到顶部
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0