mongodb主从配置

复制概述

复制就是在多台服务器上分布并管理数据库服务器。MongoDB提供了两种复制风格:主从复制和副本集。两种方式都是在一个主节点进行写操作(写入的数据被异步地同步到所有的从节点上),并从节点上读取数据。

所有数据库都对其运行环境中的故障很敏感,而复制提供了一种抵御故障的机制。

主从配置

配置主从复制注意点

  1. 在数据库集群中要明确的知道谁是主服务器,主服务器只有一台;
  2. 从服务器要知道自己的数据源也就是对应的主服务器是谁;
  3. master用来确定主服务器,slave和source来控制从服务器。

机器环境

192.168.160.145 master node
192.168.160.146 slave node

主节点配置

master.conf

#data file directory
dbpath=/home/soft/mongodb/data
# log file directory
logpath=/home/soft/mongodb/logs/mongodb.log
#port
port=26016
#daemon process
fork=true
#log type of output
logappend=true
#pid file
pidfilepath=/home/soft/mongodb/bin/mongo.pid

软链接使命令全局可用

ln -s /home/soft/mongodb/bin/mongod /usr/bin/mongod
ln -s /home/soft/mongodb/bin/mongo /usr/bin/mongo

启动mongodb master

mongod -f master.conf

启动报错

about to fork child process, waiting until server is ready for connections.
forked process: 31619
ERROR: child process failed, exited with error number 1

怀疑是配置文件中数据和日志目录未创建

mkdir /home/soft/mongodb/data
mkdir /home/soft/mongodb/logs
touch /home/soft/mongodb/logs/mongodb.log

创建目录后,再次执行启动命令,启动结果如下:

about to fork child process, waiting until server is ready for connections.
forked process: 31678
child process started successfully, parent exiting

说明启动成功

启动mongo并创建用户

mongo --port=26016

use admin;
db.createUser({user: 'root', pwd:'root', roles:[{role: '__system', db: 'admin'}]});

结果:

Successfully added user: {
    "user" : "root",
    "roles" : [
        {
            "role" : "__system",
            "db" : "admin"
        }
    ]
}

查看新建用户:

show users;

结果:

{
    "_id" : "admin.root",
    "user" : "root",
    "db" : "admin",
    "roles" : [
        {
            "role" : "__system",
            "db" : "admin"
        }
    ]
}

或使用db.system.users.find()查看用户。

slave节点配置步骤同上。

认证配置

生成密钥文件mongo_key

openssl rand -base64 1024 >> mongo_key

chmod 700 mongo_key

修改master.conf并重新启动

#data file directory
dbpath=/home/soft/mongodb/data
# log file directory
logpath=/home/soft/mongodb/logs/mongodb.log
#port
port=26016
#daemon process
fork=true
#log type of output
logappend=true
#pid file
pidfilepath=/home/soft/mongodb/mongodb/bin/mongo.pid
journal=true
# authentication
auth=true
#key file
keyFile=/home/soft/mongodb/mongodb/mongo_key
#master node
master=true
#set oplog size(MB)
oplogSize=1024

关掉mongodb进程时不要使用kill -9 pid,这种方式杀掉进程会导致错误,即使mongod --repair也无法恢复。应使用killall mongod关闭mongodb进程。

启动过程报错

Unable to lock file mongod.lock

2018-11-08T22:46:54.594-0800 I STORAGE  [initandlisten] exception in initAndListen: 98 Unable to lock file: /home/soft/mongodb/data/mongod.lock Resource temporarily unavailable. Is a mongod instance already running?, terminating
2018-11-08T22:46:54.594-0800 I NETWORK  [initandlisten] shutdown: going to close listening sockets...
2018-11-08T22:46:54.594-0800 I NETWORK  [initandlisten] shutdown: going to flush diaglog...
2018-11-08T22:46:54.594-0800 I CONTROL  [initandlisten] now exiting
2018-11-08T22:46:54.594-0800 I CONTROL  [initandlisten] shutting down with code:100

解决方法:

删除data目录下的mongod.lock

addr already in use

2018-11-08T22:53:30.757-0800 E NETWORK  [initandlisten] listen(): bind() failed Address already in use for socket: 0.0.0.0:26016
2018-11-08T22:53:30.757-0800 E NETWORK  [initandlisten]   addr already in use

解决方法

杀掉mongodb进程,重新启动

若执行上述方法仍报错,可查询占用端口的进程,杀掉即可。

lsof -i:26016

占用端口的进程如下:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mongod  31678 root    7u  IPv4  62742      0t0  TCP *:26016 (LISTEN)

杀掉进程:

kill -9 31678

再次启动,无错误。

修改slave.conf并重新启动

#data file directory
dbpath=/home/soft/mongodb/data
# log file directory
logpath=/home/soft/mongodb/logs/mongodb.log
#port
port=26016
#daemon process
fork=true
#log type of output
logappend=true
#pid file
pidfilepath=/home/soft/mongodb/bin/mongo.pid
# authentication
auth=true
#key file
keyFile=/home/soft/mongodb/mongo_key
#slave node
slave=true
#replication source
source=192.168.160.145:26016
#add global lock when slave have much to replicate
autoresync=true
oplogSize=1024

需配置source指定复制源,slave=true设置为从节点

查看数据库时出错 not master and slaveOk=false

2018-11-08T23:12:26.598-0800 E QUERY    [thread1] Error: listDatabases failed:{
    "ok" : 0,
    "errmsg" : "not master and slaveOk=false",
    "code" : 13435,
    "codeName" : "NotMasterNoSlaveOk"
}

输入如下命令,重新执行即可:

rs.slaveOk();

测试

在主节点新建数据库,从节点查看是否复制

> show dbs;
admin       0.000GB
datavisual  0.197GB
local       0.000GB

多了datavisual,数据库复制成功.

admin和local中数据不会被复制。

查看日志有如下输出,说明一直在请求主节点进行数据复制。

2018-11-08T23:07:17.297-0800 I REPL     [replslave] syncing from host:192.168.160.145:26016
2018-11-08T23:07:18.299-0800 I REPL     [replslave] syncing from host:192.168.160.145:26016
2018-11-08T23:07:19.302-0800 I REPL     [replslave] syncing from host:192.168.160.145:26016
2018-11-08T23:07:20.303-0800 I REPL     [replslave] syncing from host:192.168.160.145:26016
2018-11-08T23:07:22.292-0800 I REPL     [replslave] syncing from host:192.168.160.145:26016
2018-11-08T23:07:23.295-0800 I REPL     [replslave] syncing from host:192.168.160.145:26016

日志文件一直在写入。

主从架构面临的问题

a. 如果读写都是对主节点的操作,会导致主节点压力过大;
b. 如果主节点挂掉,架构失效;
c. 如果多个从节点从主节点复制数据,主节点压力过大。

主从复制,主节点挂掉后从节点不会自动提升为主节点,需手动配置;可设置从节点读取数据,减轻主节点压力。

其他

关于oplog

oplog是MongoDB复制的关键。oplog是一个固定集合,位于每个复制节点的local数据库里,记录了所有对数据的变更。每次客户端向主节点写入数据,就会自动向主节点的oplog里添加一个条目,其中包含了足够的信息来再现数据。一旦写操作被复制到某个从节点上,从节点的oplog也会保存一条关于写入的记录。每个oplog条目都由一个BSON时间戳进行标识,所有从节点都使用这个时间戳来追踪它们最后应用的条目。

调整复制OPLOG大小

因为oplog是一个固定集合,所以一旦创建就无法重新设置大小,为此要慎重选择初始oplog大小。

默认的oplog大小会随着环境发生变化。在32位系统上,oplog默认是50MB,而在64位系统上,oplog会增大到1GB或空余磁盘空间的5%。对于多数部署环境,空余磁盘空间的5%绰绰有余。对于这种尺寸的oplog,要意识到一旦重写20次,磁盘可能就满了。

因此默认大小并非适用于所有应用程序。如果知道应用程序写入量会很大,在部署之前应该做些测试。配置好复制,然后以生产环境的写入量向主节点发起写操作,像这样对服务器施压起码一小时。完成之后,连接到任意副本集成员上,获取当前复制信息:

db.getReplicationInfo();

一旦了解了每小时会生成多少oplog,就能决定分配多少oplog空间了。你应该为从节点下线八小时做好准备。发生网络故障或类似事件时,要避免任意节点重新同步完整数据,增加oplog大小能为你争取更多事件。

如果要改变默认oplog大小,必须在每个成员节点首次启动时使用mongod的--oplogSize选项,其值的单位是兆。

读扩展

经复制的数据库能很好地适用于读扩展。如果单台服务器无法承担应用程序的读负载,那么可以将查询路由到更多的副本上。大多数驱动都内置了将查询发送到从节点的功能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容