MongoDB-PSA架构配置

Mongodb副本集高可用架构

1.简介

Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点。

Mongodb Driver(客户端)的所有数据都写入Primary,Secondary从Primary同步写入的数据,以保持复制集内所有成员存储相同的数据集,实现数据的高可用。

使用场景:

       1. 数据冗余,用做故障恢复使用,当发生硬件故障或者其它原因造成的宕机时,可以使用副本进行恢复。

        2.读写分离,读的请求分流到副本上,减轻主节点的读压力。

一个典型的副本集架构如下图所示:


2.副本集角色

主节点(Primary)

接收所有的写请求,然后把修改同步到所有Secondary。一个Replica Set只能有一个Primary节点,当Primary挂掉后,其他Secondary或者Arbiter节点会重新选举出来一个主节点。默认读请求也是发到Primary节点处理的,可以通过修改客户端连接配置以支持读取Secondary节点。

副本节点(Secondary)

与主节点保持同样的数据集。当主节点挂掉的时候,参与选主。

仲裁者(Arbiter)

不保有数据,不参与选主,只进行选主投票。使用Arbiter可以减轻数据存储的硬件需求,Arbiter几乎没什么大的硬件资源需求,但重要的一点是,在生产环境下它和其他数据节点不要部署在同一台机器上。

3.两种架构模式

1.PSS

Primary + Secondary + Secondary模式,通过Primary和Secondary搭建的Replica Set

该模式下 Replica Set节点数必须为奇数,目的是选主投票的时候要出现大多数才能进行选主决策,由一个主和两个次级组成的3个成员副本集的图:


2.PSA

Primary + Secondary + Arbiter模式,使用Arbiter搭建Replica Set

偶数个数据节点,加一个Arbiter构成的Replica Set


4.数据同步

Primary 与 Secondary 之间通过 oplog 来同步数据,Primary 上的写操作完成后,会向特殊的 local.oplog.rs 特殊集合写入一条 oplog,Secondary 不断的从 Primary 取新的 oplog 并应用。

因 oplog 的数据会不断增加,local.oplog.rs 被设置成为一个 capped 集合,当容量达到配置上限时,会将最旧的数据删除掉。另外考虑到 oplog 在 Secondary 上可能重复应用,oplog 必须具有幂等性,即重复应用也会得到相同的结果。 

在异常回滚方面,当 Primary 宕机时,如果有数据未同步到 Secondary,当 Primary 重新加入时,如果新的 Primary 上已经发生了写操作,则旧 Primary 需要回滚部分操作,以保证数据集与新的 Primary 一致。旧 Primary 将回滚的数据写到单独的 rollback 目录下,数据库管理员可根据需要使用 mongorestore 进行恢复

如下 oplog 的格式,包含 ts、h、op、ns、o 等字段。

{

"ts" : Timestamp(1446011584, 2),

"h" : NumberLong("1687359108795812092"),

"v" : 2,

"op" : "i",

"ns" : "test.nosql",

"o" : { "_id" : ObjectId("563062c0b085733f34ab4129"), "name" : "mongodb", "score" : "100" }

}

属性说明

ts 操作时间,当前 timestamp + 计数器,计数器每秒都被重置        

h 操作的全局唯一标识

v oplog 版本信息                           op 操作类型

op.i 插入操作                                 op.u 更新操作

op.d 删除操作                                op.c 执行命令(如 createDatabase,dropDatabase)

op.n 空操作,特殊用途                ns 操作针对的集合

o 操作内容                                      o2 操作查询条件,仅 update 操作包含该字段

5.安装前准备

操作系统:CentOS Linux release 7.5.1804 (Core)

MongoDB版本:mongodb-linux-x86_64-rhel70-3.4.18

下载地址: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.4.18.tgz

副本集模式:PSA

设备3台:

192.168.1.246(27020端口, primary)

192.168.1.247(27020端口, secondary)

192.168.1.248(27020端口, arbiter)

在三台机器上进行下面操作:

1.创建相关文件夹

mkdir /data/mongodb

将安装包mongodb-linux-x86_64-rhel70-3.4.18.tgz解压到/data/mongodb

tar -zxvf mongodb-linux-x86_64-rhel70-3.4.18.tgz -C /data/mongodb

2.创建用于保存配置文件,日志文件,数据库。

mkdir  /data/mongodb/{conf,logs,db}

3.将/data/mongodb/bin加入到环境变量.bash_profile方便日后使用。

vi /root/.bash_profile

export PATH=$PATH:/data/mongodb/bin

source /root/.bash_profile

4.开放防火墙端口。

firewall-cmd --zone=public --add-port=27020/tcp --permanent

firewall-cmd --reload

6.主节点安装

1.在/data/mongodb/conf新增下面配置文件mongod.conf

systemLog:

  destination: file

  path: /data/mongodb/logs/mongod.log

  logAppend: true

storage:

  dbPath: /data/mongodb/db

  journal:

    enabled: true

  directoryPerDB: true

processManagement:

  fork: true

  pidFilePath: /data/mongodb/mongod.pid

net:

  port: 27070

  bindIp: 192.168.1.246

setParameter:

  failIndexKeyTooLong: false

security:

  keyFile: /data/mongodb/mongodb.keyfile

  authorization: enabled

replication:

  replSetName: mongodb_set

2.启动MongoDB服务

mongod -f /data/mongodb/conf/mongod.conf  

3.连接MongoDB,必须指定端口号,因为默认的端口为27017

mongo 172.17.30.250:27020

4.创建管理员账号

use  admin;

db.createUser(

   {

     user: "admin",

     pwd: "admin",   #密码设置一定复杂

     roles: [ "__system","backup","clusterAdmin","dbAdminAnyDatabase","readWriteAnyDatabase","userAdminAnyDatabase" ]   #设置权限

   }

);

5.关闭MongoDB服务

mongod -f /data/mongodb/conf/mongod.conf  --shutdown

6.生成keyfile文件

openssl rand -base64  741 > /data/mongodb/mongodb.keyfile

chmod 600 mongodb.keyfile         #权限必须为600

7.新增配置文件项

 vi /data/mongodb/conf/mongod.conf

security:

  keyFile: /data/mongodb/mongodb.keyfile  #使用keyfile认证

  authorization: enabled

replication:   #主从复制

  replSetName: mongodb_set          #复制集名称,可自定义,但主节点,从节点,仲裁者设置需要一致。 

7.配置从节点,仲裁节点

1.将主节点mongod.conf和mongodb.keyfile拷贝到从节点和仲裁节点的相应目录。

2.需修改仲裁节点mongod.conf。


         #注意,尝试3.4.18版本可以设置,4.0.4设置false无法启动,有待进一步测试

3.启动各节点MongoDB

8.初始化集群

一、在主节点登录MongoDB

mongo 172.17.30.250:27020/admin -uadmin -p

二、执行下面命令,初始化副本集配置。确认返回的是{ “ok” : 1 }

use admin;

config={_id:"mongodb_set",members:

    [{_id:0,host:" 192.168.1.246:27020","priority":1}]}

rs.initiate(config);

三、添加从节点

rs.add("192.168.1.247:27020");

四、添加仲裁节点

rs.addArb("192.168.1.248:27020");

五、在主节点执行rs.config();查看集群配置。

rs.config();

9.测试集群

1.插入数据

1.1 在主节点执行下面语句插入数据。

db.use.insert({username: "test1", age: 26})

1.2 在从节点依次执行下面三条语句测试验证

rs.slaveOk();                                          #明确从节点参数,暂时设置为可读

show collections;                                    #查看当前集合

db.use.find();                                           #查看数据

1.3 在从节点尝试插入数据。因从节点是不能写的,所以会报no-master.

db.use.insert({username: "test2", age: 27})

2.测试故障转移

2.1 强行停止主节点的MongoDB。(不建议使用Kill停止mongodb服务)

mongod -f /data/mongodb/conf/mongod.conf  --shutdown

2.2 查看从节点和仲裁节点的日志。可以发现显示检测不到主节点的心跳

2.3 可以发现从节点的输入栏从SECONDARY变为PRIMARY

2.4 重新启动之前的主节点,发现PRIMARY变成SECONDARY。

节点故障转移成功

10.其他设置

1. 加入服务、开机自启

cd /usr/lib/systemd/system

vi mongod.service

[Unit]

Description=mongodb

After=network.target

[Service]

Type=forking

ExecStart=/data/mongodb/bin/mongod -f /data/mongodb/conf/mongod.conf

ExecReload=/bin/kill -s HUP $MAINPID

ExecStop=/data/mongodb/bin/mongod --shutdown -f /data/mongodb/conf/mongod.conf

PrivateTmp=true

[Install]

WantedBy=multi-user.target

chmod 754 mongod.service

systemctl enable mongod.service

2. 日志分割:

编辑配置文件

新增 logRotate: rename

mkdir /usr/local/mongodb/sh/

vi /usr/local/mongodb/sh/mongod_LogCut.sh

#!/bin/bash

#Rotate the MongoDB logs to prevent a single logfile from consuming too much disk space.

service=mongod

mongodPath=/data/mongodb/bin/

pidArray=$(pidof $mongodPath/$service)

for pid in $pidArray;do

if [ $pid ]

then

kill -SIGUSR1 $pid

fi

done

exit

chmod +x mongodb_LogCut.sh

vi /etc/crotab

59 23 * * * root /usr/local/mongodb/sh/mongodb_LogCut.sh

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

推荐阅读更多精彩内容