MongoDB 3.2 维护

一般配置

openssl rand -base64 12 > /app/mongodb/conf/keyfile
cat /app/mongodb/conf/keyfile
pXvFZbWEyteLbTHV

# rep.conf
port=27017 #端口
dbpath=/app/data/mongodb #数据文件存放目录
logpath=/app/logs/mongodb/mongodb.log #日志文件存放目录
logappend=true #使用追加的方式写日志
#fork=true #在后台运行,Systemd启动时,需要注释掉此配置
maxConns=5000 #最大同时连接数 默认2000
storageEngine = wiredTiger
auth=true #启用验证
nohttpinterface=true
rest=false
replSet=rep   #  集群名
oplogSize=10240
keyFile=/app/mongodb/conf/keyfile
wiredTigerCacheSizeGB=4

systemd 启动脚本

说明

  • 使用systemd启动脚本时,配置文件的 fork=true 需要注释掉。
  • Restart=on-failure , 进程如果异常重启,会自动拉起进程。
  • OOMScoreAdjust=-100,会避免被 OOM。 ( OOM 发送的信号为 SIGKILL)
# /etc/systemd/system/mongodb.service
[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target

[Service]
#User=mongodb
Restart=on-failure
RestartSec=30
OOMScoreAdjust=-1000
ExecStartPre=/bin/mkdir -p /app/logs/mongodb /app/data/mongodb
ExecStart=/usr/bin/numactl --interleave=all /app/mongodb/bin/mongod --quiet --config /app/mongodb/conf/rep.conf

[Install]
WantedBy=multi-user.target

集群

角色:PRIMARY(主节点,读写) SECONDARY(从节点,保存数据,默认不读写) ARBITER(仲裁节点,不保存数据,不提供读写)
主从节点的角色可以相互切换。
仲裁节点始终为仲裁节点,仲裁节点只参与主从节点切换时的投票。
节点:一般为3个节点、5个节点。3节点的部署,一般为1主1从1仲裁,或1主2从。
5节点部署一般为1主2从2仲裁,或1主3从1仲裁。
硬件配置:主从节点配置需保持一致,仲裁节点配置因不存业务数据,配置可以低一些。

单节点如何无缝升级到集群

  1. 单节点上创建用户和库,正常跑业务。此单节点,就是即将升级到集群中的主节点。
  2. 新增两个节点,参考上文的配置,注意各节点 keyFile 和 replSet 保持一致,正常启动新节点。启动后,不用对这两个节点操作。
  3. 在主节点上执行下文的初始化集群的命令,执行完 rs.initiate(config) 之后,从节点就会自动同步数据
  4. 通过命令 rs.status() 查看集群各节点状态。

初始化集群:

说明: priority 越高,则主从切换的时候优先切换到哪台机器上作为主节点。

config = {
_id:"rep",
"version" : 1,
members:[
{_id:0,host:"192.168.10.2:27017",priority:3},
{_id:1,host:"192.168.10.145:27017",priority:1,arbiterOnly: true},
{_id:2,host:"192.168.10.146:27017",priority:2}
]}
//config.members[1] = {"_id":1,"host":"192.168.10.145:27017","arbiterOnly":true}
rs.initiate(config)

初始化之后,在主节点创建用户,其他数据节点会自动同步用户

/app/mongodb/bin/mongo admin 
db.createUser({user:"aaa",pwd:"123",roles:[{role:"root",db:"admin"}]})

默认读写都是主节点,(根据业务需要)通过以下命令设置从节点只读:

db.setSlaveOk()

重新配置集群

use local
db.dropDatabase()

config = {
_id:"rep",
"version" : 1,
members:[
{_id:0,host:"192.168.10.2:27017",priority:3},
{_id:1,host:"192.168.10.145:27017",priority:1,arbiterOnly: true},
{_id:2,host:"192.168.10.146:27017",priority:2}
]}
//rs.initiate(config)
rs.reconfig(config, {force: true})

查看集群:

rs.config()

use local
db.system.replset.find()

提升指定服务器为 PRIMARY :

cfg = rs.conf()
cfg.members[0].priority = 3
cfg.members[1].priority = 1
cfg.members[2].priority = 2
rs.reconfig(cfg)

将主节点切换到从节点,并且指定时间内都不在作为主节点。

rs.freeze(86400);   // 该节点 xx 秒内不会作为主节点(实际发现下面的命令更有用)

// 主节点切为从节点,并且一天内不能作为主
rs.stepDown(86400);      

关闭从节点

db.shutdownServer()

Docker 部署 mongodb 单节点

自动创建 DB_NAME 的数据库

# docker-compose.yml
version: '2.2'

services:
  mongo:
    image: mongo:4.0
    restart: unless-stopped
    container_name: "mongo"
    command: mongod --smallfiles --oplogSize 128 --replSet rep --storageEngine=wiredTiger
    ports:
    - 50007:27017
    volumes:
    - /srv/mongo/db:/data/db

  mongo-init-replica:
    image: mongo:4.0
    container_name: "mongo-init"
    command: ["bash", "-c", 'sleep 10 && mongo mongo/DB_NAME --eval "rs.initiate({ _id: ''rep'', members: [ { _id: 0, host: ''localhost:27017'' } ]})"']
    depends_on:
      - mongo


常见问题:

  • 关闭 numa
    关闭 numa 可以通过 numactl –interleave=all mongod ... 来实现

  • cmdline oplogsize (10240) different than existing (400) see: http://dochub.mongodb.org/core/increase-oplog
    解决办法,增加 oplogsize 从 400 增加到 10240

  • 初始化时,报错 code 13, 提示 “not authorized on admin to execute command { replSetGetStatus: 1.0 }”
    解决办法: 使用 mongo localhost:27027/admin 命令进行操作(假设服务端口为27027)。

ref:
http://www.cnblogs.com/ljhdo/p/4583276.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,282评论 19 139
  • Codis 3.2 部署配置汇总 概念总结 集群配置前需要了解架构,集群分片主要分三种: 客户端分片:这个需要自己...
    三杯水Plus阅读 11,372评论 0 11
  • 最近在研究Docker的源码.读到ApiServer的启动过程时,发现其有一个新的概念,叫做service act...
    AlstonWilliams阅读 4,900评论 1 4
  • 说到挑担,有个人是不能忘记的,他就是小镇上的挑水伯伯。 小镇老街除了有河外,十字街上还有一口公用的井,可以淘米洗菜...
    薇薇安的30天阅读 2,642评论 0 0
  • 今天最重要的事情就是去学校给小十二选照片啦 本来说好一早去的 因为时间紧张怕来不及去上班 就没去!晚上下班请假啦一...
    路露小魔女阅读 1,378评论 0 0

友情链接更多精彩内容