一、环境准备

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 <<EOF export PATH=/安装路径/bin/:\$PATH EOF

使其生效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: <string> --pid文件的位置,一般不用配置,可以去掉这行,自动生成到data

--网络配置有关
net:
bindIp: <ip> --
监听地址,如果不配置这行是监听在0.0.0.0
port: <port> --
端口号,默认不配置端口号,是27017

-- 安全验证有关配置
security:
authorization: enabled --
是否打开用户名密码验证

------------------以下是复制集与分片集群有关----------------------
replication:
oplogSizeMB: <NUM>
replSetName: "<REPSETNAME>"
secondaryIndexPrefetch: "all"

sharding:
clusterRole: <string>
archiveMovedChunks: <boolean>

---for mongos only
replication:
localPingThresholdMs: <int>

sharding:
configDB: <string>

例子如下:

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
-hMongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d需要备份的数据库实例,例如:test
-o备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。
恢复:mongorestore -h <hostname><:port> -d dbname <path>

四、docker部署(主、备、仲裁)

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开放等因素都不行。查了下具体的报错日志显示HostUnreachableConnection refused)。因为mongo启动成功,所以还是容器链接通信的问题。但是各种网络拦截防火墙都开了,IP也不可能错。所以抱着试下的心态修改了host配置的端口用默认的27017(之前部署es时踩过类似的坑),居然成功了。启动参数中容器映射端口和配置文件中的端口没生效。docker ps显示的和进入容器看配置文件的port也不是默认端口,就是没生效暂时不知道原因,后续研究下。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐