美文网首页运维杂谈
MongoDB 3.2 维护

MongoDB 3.2 维护

作者: akka9 | 来源:发表于2017-06-28 23:36 被阅读0次

一般配置

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

相关文章

网友评论

    本文标题:MongoDB 3.2 维护

    本文链接:https://www.haomeiwen.com/subject/brypcxtx.html