MongoDB 3.4 - 复制集、鉴权、主从同步以及读写分离

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 许久没更新了。带来centos7下MongoDB3.4的复制集、鉴权、主从同步和读写分离方案。转载请注明出处:http://blog.lzoro.comBiuBiu老惯例之碎碎念。

许久没更新了。带来centos7下MongoDB3.4的复制集、鉴权、主从同步和读写分离方案。
转载请注明出处:http://blog.lzoro.com

BiuBiu

老惯例之碎碎念。
厦门的夏天又来了,热得整个人都没脾气了。
最近忙得连轴转,博客也停了很久,空闲下来还是要继续写的。

环境

一台装有vsphere6.5的宿主机,和宿主机上的centos7三台。

1、vsphere 6.5
2、centos 7 X 3
    192.168.1.207(master)
    192.168.1.245(secodary)
    192.168.1.249(arbiter)
3、MongoDB 3.4
4、Java SSM 结构的应用

安装MongoDB

1、这里采用的是yum源的方式安装,所以需要先添加yum源
vim /etc/yum.repos.d/mongodb-org-3.4.repo
2、输入以下内容并保存,如果yum源无效,请百度新的yum源。
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=0
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc
3、执行安装
yum install -y mongodb-org
安装成功的提示
4、修改配置(yaml格式),如有需要可以对配置文件的标注的[1][2][3][4]点进行修改。
vim /etc/mongod.conf

下面为配置文件内容

# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  # [1]日志存储路径
  path: /var/log/mongodb/mongod.log

# Where and how to store data.
storage:
  # [2]数据存储路径
  dbPath: /var/lib/mongo
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile

# network interfaces
net:
  # [3]端口,默认为27017,可修改为其他
  port: 27017
  # [4]如果需要对外提供访问,请把该下面那行注释掉
  bindIp: 127.0.0.1  # Listen to local interface only, comment to listen on all interfaces.


#security:

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options

#auditLog:

#snmp:
5、分别在三台服务器上执行上述三个安装操作

配置鉴权、复制集并启动

1、从三台MongoDB中选择一台作为master,我这里是192.168.1.207,启动并创建管理员,方便开启鉴权后的操作

启动

mongod -f /etc/mongod.conf

连接

mongo --port=27017

创建账号

use admin;

db.createUser({user:"dba",pwd:"yourpassword",roles:[{role:"root",db:"admin"},{role:"userAdminAnyDatabase",db:"admin"}]});
2、主从间的同步需要安全机制,所以需要先生成秘钥,yourKeyFile为秘钥文件名称,可以自定义
openssl rand -base64 753 > yourKeyFile 
3、将yourKeyFile放到MongoDB的数据存储路径下,也就是上面配置文件中的dbPath,上面的例子为/var/lib/mongo,并授权,注意你的秘钥存放路径。
chmod 600 yourKeyFile
4、拷贝yourKeyFile分别放到其他两台mongo服务器的数据存储路径下,也需要上面的600授权。
5、配置复制集和鉴权,还是上面的配置文件,yaml节点为securityreplication,三台机器都需要配置。
security:
  # 启用鉴权
  authorization: enabled
  # 你的keyFile存放路径
  keyFile: /var/lib/mongo/yourKeyfile
replication:
  # oplogSize的大小,单位为M,建议空闲磁盘的5%
  oplogSizeMB: 1024
  # 复制集的名称,需要记住
  replSetName: myReplSet
6、分别重启MongoDB服务,并进入master(192.168.1.207)

确认服务器的防火墙是否开放了相应的端口27017,如未开放,先开放

firewall-cmd --zone=public --add-port=27017/tcp --permanent
systemctl reload firewalld.service

若关闭Mongo时出现There doesn't seem to be a server running with dbpath: /data/db提示,则需指定数据库路径来关闭

mongod --shutdown --dbpath=/var/lib/mongo

连接后,由于开启了鉴权,所以需要认证

# 连接
mongo --port=27017
# 使用admin
use admin;
# 鉴权
db.auth('dba','yourpassword');

输入配置,这里的第一个_id需要和配置里面的replSetName一致

myReplSet_conf={
    _id: "myReplSet",
    members: [{
        _id: 0,
        host: "192.168.1.207:27017"
    }, {
        id: 1,
        host: "192.168.1.245:27017"
    }]
};

初始化

rs.initiate(myReplSet_conf);

若出现{ "ok" : 1}则表示配置成功,退出再重启则可以看到PRIMARY标识,在192.168.1.245登录,则看到的是SECONDARY

测试主从同步情况

登录主库(192.168.1.207),创建数据库,并创建用户,然后插入数据

# 连接
mongo --port=27017
# 使用admin
use admin;
# 鉴权
db.auth('dba','yourpassword');
# 创建数据库
use test;
# 创建用户
db.createUser({user:"testdba",pwd:"testpassword",roles:[{role:"dbOwner",db:"test"}]});
# 插入数据
db.testCol.insert({id:1,name:'zoro'});

登录从库(192.168.1.245),查询是否有主库插入的数据

# 连接
mongo --port=27017
# 使用test
use test;
# 鉴权
db.auth('testdba','testpassword');
# 允许读
rs.slaveOk();
# 查询
db.testCol.find();

如果有数据,则证明同步成功

实现master自动切换

MongoDB的复制集是有mater自动切换机制的,当集群中的master出现问题的时候,会由剩下的机器进行投票重新选举出master,但是,如果剩余活跃的机器是偶数个的话,比如现在只有两台/或一台,那将有可能陷入僵持,导致投票失败而没有master出现,这个时候,就需要配置一台MongoDB,作为仲裁角色加入集群(不做数据存储,只做为投票)。

1、启动最后一台mongo服务(192.168.1.249)
mongod -f /etc/mongod.conf
2、在主机上配置仲裁角色
# 连接
mongo --port=27017
# 使用admin
use admin;
# 鉴权
db.auth('dba','yourpassword');
# 加入仲裁角色
rs.addArb("192.168.1.249:27017");
3、查看复制集状态,以下为正常状态
{
    "set" : "myReplSet",
    "date" : ISODate("2018-05-25T09:46:12.137Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "optimes" : {
        "lastCommittedOpTime" : {
            "ts" : Timestamp(1527241561, 1),
            "t" : NumberLong(1)
        },
        "appliedOpTime" : {
            "ts" : Timestamp(1527241561, 1),
            "t" : NumberLong(1)
        },
        "durableOpTime" : {
            "ts" : Timestamp(1527241561, 1),
            "t" : NumberLong(1)
        }
    },
    "members" : [
        {
            "_id" : 0,
            "name" : "192.168.1.207:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 1403,
            "optime" : {
                "ts" : Timestamp(1527241561, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2018-05-25T09:46:01Z"),
            "electionTime" : Timestamp(1527240420, 1),
            "electionDate" : ISODate("2018-05-25T09:27:00Z"),
            "configVersion" : 2,
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "192.168.1.245:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 1162,
            "optime" : {
                "ts" : Timestamp(1527241561, 1),
                "t" : NumberLong(1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1527241561, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2018-05-25T09:46:01Z"),
            "optimeDurableDate" : ISODate("2018-05-25T09:46:01Z"),
            "lastHeartbeat" : ISODate("2018-05-25T09:46:11.898Z"),
            "lastHeartbeatRecv" : ISODate("2018-05-25T09:46:11.913Z"),
            "pingMs" : NumberLong(0),
            "configVersion" : 2
        },
        {
            "_id" : 2,
            "name" : "192.168.1.249:27017",
            "health" : 1,
            "state" : 7,
            "stateStr" : "ARBITER",
            "uptime" : 10,
            "lastHeartbeat" : ISODate("2018-05-25T09:46:11.898Z"),
            "lastHeartbeatRecv" : ISODate("2018-05-25T09:46:11.930Z"),
            "pingMs" : NumberLong(0),
            "configVersion" : 2
        }
    ],
    "ok" : 1
}

测试是否能够自动切换master

先关闭master服务,然后进入原先secondary的服务,查看是否被提升成master,如果是,则测试成功。

注:切换会有延迟,示网络情况而定

SSM应用中配置读写分离

格子这边的应用是用java语言,基于SringMVC + Mybatis + mongoTemplate等框架的,下面说一下在这个框架下,如何配置MongoDB的读写分离。

配置文件,省略了其他,只列出mongo的关键配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mongo="http://www.springframework.org/schema/data/mongo"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:task="http://www.springframework.org/schema/task" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/data/mongo
        http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/task
        http://www.springframework.org/schema/task/spring-task.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">


    ...

   <!--mongo factory-->
   <mongo:db-factory id="mongoDbFactory" mongo-ref="mongoClient" dbname="${mongodb.database}"/>
   <!--mongo client config-->
   <mongo:mongo-client id="mongoClient" replica-set="${mongodb.host}:${mongodb.port}"
                        credentials="${mongodb.username}:${mongodb.password}@${mongodb.database}">
        <mongo:client-options
                connections-per-host="100"
                threads-allowed-to-block-for-connection-multiplier="10"
                connect-timeout="10000"
                max-wait-time="10000"
                socket-keep-alive="true"
                read-preference="SECONDARY_PREFERRED"
        />
    </mongo:mongo-client>
    
    ...

配置后开启MongoDB的日志,然后启动项目,并执行MongoDB响应的写入和读取操作,观察日志打印,就可以验证读写分离是否成功,是不是很简单呢。Spring家的东西还是蛮强大的。

写在最后

如果对你有帮助,帮格子点个赞呗。
溜了溜了。

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
3月前
|
运维 监控 NoSQL
【MongoDB 复制集秘籍】Secondary 同步慢怎么办?深度解析与实战指南,让你的数据库飞速同步!
【8月更文挑战第24天】本文通过一个具体案例探讨了MongoDB复制集中Secondary成员同步缓慢的问题。现象表现为数据延迟增加,影响业务运行。经分析,可能的原因包括硬件资源不足、网络状况不佳、复制日志错误等。解决策略涵盖优化硬件(如增加内存、升级CPU)、调整网络配置以减少延迟以及优化MongoDB配置(例如调整`oplogSize`、启用压缩)。通过这些方法可有效提升同步效率,保证系统的稳定性和性能。
93 4
|
16天前
|
存储 NoSQL MongoDB
【赵渝强老师】部署MongoDB复制集
本文介绍了如何在单个节点上搭建MongoDB复制集环境,通过监听不同端口实现多节点配置。详细步骤包括创建数据目录、编辑配置文件、启动节点、初始化复制集、查看状态以及测试主从库的读写操作。文中还提供了视频讲解和代码示例,帮助读者更好地理解和操作。
|
16天前
|
存储 NoSQL MongoDB
【赵渝强老师】MongoDB复制集的体系架构
MongoDB的复制集是一种集群技术,由一个Primary节点和多个Secondary节点组成,实现数据的高可用性。Primary节点处理写入请求,Secondary节点同步数据。当Primary节点故障时,Secondary节点可通过选举成为新的Primary节点。视频讲解和示意图详见正文。
|
3月前
|
C# UED 开发者
WPF与性能优化:掌握这些核心技巧,让你的应用从卡顿到丝滑,彻底告别延迟,实现响应速度质的飞跃——从布局到动画全面剖析与实例演示
【8月更文挑战第31天】本文通过对比优化前后的方法,详细探讨了提升WPF应用响应速度的策略。文章首先分析了常见的性能瓶颈,如复杂的XAML布局、耗时的事件处理、不当的数据绑定及繁重的动画效果。接着,通过具体示例展示了如何简化XAML结构、使用后台线程处理事件、调整数据绑定设置以及利用DirectX优化动画,从而有效提升应用性能。通过这些优化措施,WPF应用将更加流畅,用户体验也将得到显著改善。
245 1
|
3月前
|
监控 NoSQL 大数据
【MongoDB复制集瓶颈】高频大数据写入引发的灾难,如何破局?
【8月更文挑战第24天】在MongoDB复制集中,主节点处理所有写请求,从节点通过复制保持数据一致性。但在大量高频数据插入场景中,会出现数据延迟增加、系统资源过度消耗、复制队列积压及从节点性能不足等问题,影响集群性能与稳定性。本文分析这些问题,并提出包括优化写入操作、调整写入关注级别、采用分片技术、提升从节点性能以及持续监控调优在内的解决方案,以确保MongoDB复制集高效稳定运行。
78 2
|
3月前
|
C# 开发者 Windows
全面指南:WPF无障碍设计从入门到精通——让每一个用户都能无障碍地享受你的应用,从自动化属性到焦点导航的最佳实践
【8月更文挑战第31天】为了确保Windows Presentation Foundation (WPF) 应用程序对所有用户都具备无障碍性,开发者需关注无障碍设计原则。这不仅是法律要求,更是社会责任,旨在让技术更人性化,惠及包括视障、听障及行动受限等用户群体。
82 0
|
4月前
|
分布式计算 DataWorks NoSQL
DataWorks产品使用合集之怎么离线同步MongoDB的增量数据
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
4月前
|
自然语言处理 运维 NoSQL
MongoDB集群同步
实现 MongoDB Cluster-to-Cluster 即集群同步的工具是:mongosync 详情可参考如下官方文档: https://www.mongodb.com/zh-cn/docs/cluster-to-cluster-sync/current/quickstart/ 以上这个地址的文档一看就是机器翻译的,可能有不恰当的地方,但基本可参考使用。 以下是本次在某项目地配置集群同步的简要步骤,可参考使用。
89 6
|
5月前
|
NoSQL 测试技术 MongoDB
使用同步和异步方式更新插入MongoDB数据的性能对比
在这篇文章中,我将探讨如何使用同步和异步方式插入数据到MongoDB,并对两种方式的性能进行对比。并将通过Python中的 pymongo 和 motor 库分别实现同步和异步的数据插入,并进行测试和分析。
|
5月前
|
分布式计算 DataWorks NoSQL
DataWorks操作报错合集之从MongoDB同步数据到MaxCompute(ODPS)时,出现报错,该怎么解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
DataWorks操作报错合集之从MongoDB同步数据到MaxCompute(ODPS)时,出现报错,该怎么解决
下一篇
无影云桌面