1、官方建议在Linux机器上禁用THP(大页内存机制),以确保最佳性能
在/etc/rc.local最后添加如下代码
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag fi
保存后并赋予可执行权限chmod +x /etc/rc.local
2、修改打开文件数(看需要)
vi /etc/security/limits.conf
添加以下配置
* - nofile 65535
3、配置环境变量
cat >/home/mongod/.bash_profile <
使其生效source .bash_profile
4、安装openssl
yum install openssl-devel
敲黑板:
官方文档显示,在MongoDB 5.0之前,MongoDB的奇数版本(如4.3)是开发版本在MongoDB 5.0之前,MongoDB的奇数版本(如4.3)是开发版本。
MongoDB 4.4开始,如果打开文件数的ulimit值低于64000,则会生成启动错误
1、下载安装
可yum安装(略,注意组件源配置,详看官网)
可官方文档下载压缩包(略)
2、创建用户和用户组、规划目录
默认情况下,MongoDB使用mongod用户帐户运行,并使用/var/lib/mongo(数据目录)和/var/log/mongodb(日志目录)。软件包管理器在安装过程中创建默认目录。所有者和组名为mongod。
也可自定义创建,创建完毕要赋予对应用户和目录的权限 chown -R 用户名:组名 xx/xxx。并修改/mongod.conf配置文件中数据目录storage.dbPath和日志目录systemLog.path位置。副本集的话主、备、仲裁的data和log最好分开存储规划。
3、配置修改(详见三)
若是副本集则修改每个节点对应的IP、端口等。
4、启动验证
按配置文件启动/xx/bin/mongod -f /xxx/mongodb.conf(若是集群则所有节点都启动)
关闭命令:xx/mongod -f /mongodb/conf/mongodb.conf --shutdown
链接数据库:mongo --port 端口号
5、副本集启动(主、备、仲裁)
./xx/bin/mongo 节点IP:端口
use admin
cfg={_id: "nimble",members:[{_id: 0,host: '172.16.2.14:27017',priority: 5},{_id: 1,host: '172.16.2.21:27017',priority: 3},{_id: 2,host: '172.16.2.13:27017',arbiterOnly: true}]};
rs.initiate(cfg) 使配置生效
rs.status() 查看集群状态
说明:
cfg是可以任意的名字,当然最好不要是mongodb的关键字,conf,config都可以。最外层的_id表示replica set的名字,members里包含的是所有节点的地址以及优先级。优先级最高的即成为主节点,即这里的172.16.2.14:27017。特别注意的是,对于仲裁节点,需要有个特别的配置——arbiterOnly:true。这个千万不能少了,不然主备模式就不能生效。
1、基本配置mongodb.conf(以主、备、仲裁副本集为例)
配置说明:
--系统日志有关
systemLog:
destination: file
path: "/mongodb/log/mongodb.log" --日志位置
logAppend: true --日志以追加模式记录
--数据存储有关
storage:
journal:
enabled: true
dbPath: "/mongodb/data" --数据路径的位置
-- 进程控制
processManagement:
fork: true --后台守护进程
pidFilePath:
--网络配置有关
net:
bindIp:
port:
-- 安全验证有关配置
security:
authorization: enabled --是否打开用户名密码验证
------------------以下是复制集与分片集群有关----------------------
replication:
oplogSizeMB:
replSetName: "
secondaryIndexPrefetch: "all"
sharding:
clusterRole:
archiveMovedChunks:
---for mongos only
replication:
localPingThresholdMs:
sharding:
configDB:
例子如下:
systemLog:
destination: file
logAppend: true
path: /opt/mongodb/logs/secondary.log
storage:
dbPath: /opt/mongodb/data/secondary
directoryPerDB: true
journal:
enabled: true
processManagement:
fork: true
# fork and run in background
pidFilePath: /opt/mongodb/logs/secondary.pid
# location of pidfile
timeZoneInfo: /usr/share/zoneinfo
net:
port: 27017
bindIp: 172.16.2.11
replication:
replSetName: nimble
oplogSizeMB: 10000
2、备份与恢复
备份:
mongodump -h dbhost -d dbname -o dbdirectory
-h:MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d:需要备份的数据库实例,例如:test
-o:备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。
恢复:
mongorestore -h
<:port> -d dbname
1、规划准备环境、目录、配置文件
略(详见二、三)
2、启动副本节点
sudo docker run --name mongodb1 -p 26101:26101 -d --restart=always --privileged=true \
-v /mnt/logs/mongodb/primary/:/logs/primary/ \
-v /mnt/data/mongodb/primary/:/data/primary/ \
-v /mnt/data/mongodb/primary/primary.conf:/data/primary/primary.conf \
mongo:latest --replSet "replset"
sudo docker run --name mongodb2 -p 26102:26102 -d --restart=always --privileged=true \
-v /mnt/logs/mongodb/secondary/:/logs/secondary/ \
-v /mnt/data/mongodb/secondary/:/data/secondary/ \
-v /mnt/data/mongodb/secondary/secondary.conf:/data/secondary/secondary.conf \
mongo:latest --replSet "replset"
sudo docker run --name mongodb3 -p 26103:26103 -d --restart=always --privileged=true \
-v /mnt/logs/mongodb/arbiter/:/logs/arbiter/ \
-v /mnt/data/mongodb/arbiter/:/data/arbiter/ \
-v /mnt/data/mongodb/arbiter/arbiter.conf:/data/arbiter/arbiter.conf \
mongo:latest --replSet "replset"
3、副本集群配置
进入到容器进行配置
docker exec -it 容器名 bash
进入mongo shell模式
mongo/mongo --host x.x.x.x --port xxxx
配置集群节点
cfg={_id: "replset",members:[{_id: 0,host: '容器IP:26101',priority: 5},{_id: 1,host: '容器IP:26102',priority: 3},{_id: 2,host: '容器IP:26103',arbiterOnly: true}]};
说明:详见上文
使配置生效
rs.initiate(cfg)
查看集群配置
rs.conf()
查看集群状态
rs.status()
踩坑:
执行rs.initiate(cfg)后报
No host described in new configuration with {version: 1, term: 0} for replica set replset maps to this node
上网上查看关于此的报错都是类似,没有完全一样的。试了下网上通用的几个办法,排查尝试命令行和mongo.conf发副本名一致,重新核对容器IP、端口号,防火墙端口、IP开放等因素都不行。查了下具体的报错日志显示HostUnreachable(Connection refused)。因为mongo启动成功,所以还是容器链接通信的问题。但是各种网络拦截防火墙都开了,IP也不可能错。所以抱着试下的心态修改了host配置的端口用默认的27017(之前部署es时踩过类似的坑),居然成功了。启动参数中容器映射端口和配置文件中的端口没生效。docker ps显示的和进入容器看配置文件的port也不是默认端口,就是没生效暂时不知道原因,后续研究下。