一.背景:
最近公司一个项目由于初期部署MongoDB使用单节点部署,考虑到业务量大了之后数据量随之增长,对数据库并发性,可靠性,容灾方面要求较高。所以决定新增三台服务器,组建MongoDB的集群,并将原单节点运行的部分数据迁移到新集群当中,同时实现不同业务系统间数据分离。把流量较大的业务系统的数据操作分配到新搭建的集群当中,提升数据读写性能。
二.基本信息:
软件版本:mongodb-4.0.11
系统环境如下:
编号 | IP地址 | 操作系统 | 备注 |
---|---|---|---|
A | 192.168.99.42 | CentOS 7.6.1810(Core) X86_64 | 原单节点 |
B | 192.168.193.118 | CentOS 7.8.2003(Core) X86_64 | 新集群主节点 |
C | 192.168.193.119 | CentOS 7.8.2003(Core) X86_64 | 新集群从节点1 |
D | 192.168.193.120 | CentOS 7.8.2003(Core) X86_64 | 新集群从节点2 |
三.操作过程:
1.在服务器A上的操作:
(1)登录mongodb终端,确认需要导出的数据情况
mongo --host 192.168.99.42 -u "idr" --authenticationDatabase "admin" -p "Idr@2019"
(2)查看数据库和集合情况
show dbs;
use idr_attendance_record;
show collections;
(3)确定好需要导出的业务数据库为idr_attendance_record后,退出mongodb终端,开始执行数据导出,导出数据备份存放目录要提前建立好,仅导出需迁移的库idr_attendance_record,以及账号权限管理相关所在的库admin,命令行最后添加“&”表示后台执行,不会因为终端连接超时退出而中断导出操作
mongodump --host 192.168.99.42 -u "idr" --authenticationDatabase "admin" -p "Idr@2019" -d idr_attendance_record -o /data/backup/mongodb/ &
mongodump --host 192.168.99.42 -u "idr" --authenticationDatabase "admin" -p "Idr@2019" -d admin -o /data/backup/mongodb/ &
(4)最后便是打包导出文件,并上传到集群主节点的服务器B中,远程传输操作和过程省略
2.在服务器B,C,D上操作:
(1)首先每台服务器上安装mongodb,直接解压即可,并把bin目录路径添加到环境变量/etc/profile下
(2)新建实例目录,存放配置文件,数据,日志等,如下图
(3)编写配置文件mongodb.conf,并保存到conf目录下,配置文件内容如下
##### 是否以守护进程方式运行 #######
fork = true
#### 数据目录 #######
dbpath = /data/mongodb_cluster/27017/data
#### 运行端口 ######
port = 27017
#### 绑定的IP地址 #####
bind_ip = 127.0.0.1,10.100.108.79
#### 日志目录 #####
logpath = /data/mongodb_cluster/27017/logs/mongodb.log
###### 日志写入模式为追加 #####
logappend=true
#复制集名字
replSet=idrdb
#### 数据引擎 #####
storageEngine=wiredTiger
#### 最大连接数 ####
maxConns = 5000
###### 开启journal日志 ####
journal = true
# Inspect all client data for validity on receipt (useful for
# developing drivers)用于开发驱动程序时验证客户端请求
objcheck = true
#### 进程号文件 ######
pidfilepath = /data/mongodb_cluster/27017/mongodb27017.pid
####### 关闭密码认证 #####
#noauth = true
##### 开启密码认证 #####
auth = true
#KeyFile鉴权文件:改为实际路径
keyFile=/data/mongodb_cluster/27017/keyfile/keyfile
#####操作日志大小限制5G
oplogSize = 2000
######## 数据库分析等级记录到logpath下
profile = 2
####### 慢日志默认100毫秒
slowms = 100
##### 开启详细诊断日志记录读写操作到logpath下
#diaglog = 3
##### 开启CPU和IO日志
cpu = true
##### 一个数据库一个文件夹
directoryperdb = true
(4)添加为系统服务,方便开机启a动,以下内容保存到文件/usr/lib/systemd/system/mongodb27017.service
[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target
[Service]
User=mongodb
Group=mongodb
Type=forking
ExecStart=/data/mongodb/bin/mongod --config /data/mongodb_cluster/27017/conf/mongodb.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/data/mongodb/bin/mongod --shutdown --config /data/mongodb_cluster/27017/conf/mongodb.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
(5)之后重载系统服务,并设置服务开机自启
systemctl daemon-reload
systemctl enable mongodb27017
(6)修改配置文件mongodb.conf,注释掉密码认证相关项,并开启无需密码即可登录
noauth = true
#auth = true
#keyFile = /data/mongodb_cluster/27017/keyfile/keyfile
(7)为了确保系统安全性和用户权限隔离,新建无法直接登录的用户mongodb,用来启动服务
useradd -s /sbin/nologin -M mongodb
(8)然后把相关数据库文件从属都改成mongodb,以便读写,不会出现权限导致禁止写入数据的问题
chown -R mongodb:mongodb /data/mongodb_cluster
(9)最后启动数据库服务即可
systemctl start mongodb27017
3.在集群三个节点服务器B,C,D上都进行步骤1和2的安装和部署操作之后,下面开始搭建mongodb的复制集(Replica Set)模式的集群
(1)首先在分配为主节点的服务器B上,登录到mongodb终端,由于设置了免密登录,所以无需输入账号密码
mongodb
(2)之后就是进行集群配置初始化,采用一主两从模式,当主节点故障时候,优先级越高越容易被选为新的主节点,id的值为复制集名称,参考配置文件mongodb.conf中的replSet配置项
use admin;
cfg={ _id:"idrdb", members:[ {_id:0,host:'192.168.193.118',priority:3}, {_id:1,host:'192.168.193.119',priority:2}, {_id:2,host:'192.168.193.120',priority:1}] };
rs.initiate(cfg);
(3)配置完毕,可查看个服务器节点是否都已联通并加入到集群中的角色
rs.status(); //需在主节点PRIMARY上执行
4.集群搭建完毕后,即可把A迁移过来的数据恢复到集群BCD中去,首先恢复admin库,然后开启密码登录认证和keyfile鉴权,keyfile需要使用openssl生成并统一部署到集群所有节点
(1)恢复admin库
mongorestore -h localhost:27017 -d admin --dir /data/backup/mongodb/admin/
(2)生成新的keyfile秘钥串,文件权限要求为600
openssl rand -base64 745 > /data/mongo_cluster/27017/keyfile/keyfile
chmod 600 /data/mongo_cluster/27017/keyfile/keyfile
(3)修改配置文件,开启密码登录认证和keyfile鉴权
#noauth = true
auth = true
keyFile = /data/mongodb_cluster/27017/keyfile/keyfile
(4)集群BCD所有服务器操作完毕后,按先重启C,D两台,最后重启B,确保每台都重启mongodb服务使配置生效,重启完毕还需确认集群节点角色状态是否为一主两从
systemctl restart mongodb27017
5.最后使用账户密码登录认证,导入余下的业务系统相关库的数据,已实际验证,导入过程中可以同步进行数据写入,新数据不会因为旧数据导入而被覆盖掉
(1)在主节点上导入旧的业务数据,只要集群状态正常,数据会自动同步到从节点上,同样,添加“&”让进程置于后台操作
mongorestore -h 192.168.193.118 -u "idr" --authenticationDatabase "admin" -p "Idr@2019" -d idr_attendance_record --dir /data/bac
kup/mongodb/idr_attendance_record/ &
(2)导入完毕后确认每个集合的数据量
db.attendance_record.find().count();