• MongoDB的搭建并配置主从以及读写分离


    1、环境准备 


    1Centos7 
    2mongodb3.4.9
    3、三台机器IP分别是:10.170.1.16、10.170.1.18、10.170.1.33

    2、mongdb数据库的安装

    如下操作是分别在三台机器进行

    1、首先分别在三台机器上下载好mongodb安装包mongodb-linux-x86_64-amazon-3.4.9.tgz

    2、使用tar命令解压安装包然后修改解压后的目录名

    tar zxvf mongodb-linux-x86_64-amazon-3.4.9.tgz

    mv  mongodb-linux-x86_64-amazon-3.4.9.tgz  mongodb

    3、 进入 mongodb目录中新建三个目录conf、logs 、db 


    conf存储配置文件目录,logs用来存储日志目录,db用来存储数据目录

    cd mongodb

    mkdir conf logs db

    4、 进入conf目录新建mongodb的配置文件mongodb.conf

    cd conf

    touch mongodb.conf

    5、 编写配置文件mongodb.conf,内容如下 


    其中dbpath是数据库文件目录,logpath是日志目录,portmongodb所占用的端口,forktrue的时候表示在后台启动

    dbpath=/data/mongodb/db

    logpath=/data/mongodb/log/mongodb.log

    port=27017

    fork=true

     

    6、 分别在三台机器上启动mongodb 其中–replSet表示副本集群参数 ,mongoTest是副本集名称,这里的名字可以任意取,另外两台机也要和这个一样

    /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/mongodb.conf --replSet mongoTest

     

    7、 配置副本集

    进入mongodb

    mongo 10.170.1.16:27017/admin -u test -p

    输入密码

    config_test={_id : 'mongoTest',members : [{_id : 0, host : '10.170.1.16:27017'},{_id : 1, host : '10.170.1.18:27017'},{_id : 2, host : '10.170.1.33:27017'}]}

    初始化副本集

    rs.initiate(config_test);

    查看副本状态

    rs.status();

     

    health表示副本集中该节点是否正常,0表示不正常,1表示正常;state表示节点的身份,0表示非主节点,1表示主节点;stateStr用于对节点身份进行字符描述,PRIMARY表示主节点,SECONDARY表示副节点;name是副本集节点的ip和端口信息

    查看副本同步状态

    db.printSlaveReplicationInfo();

     

    8、主库配置用户

    在没有添加权限之前进入到mongodb主库操作页面并添加用户

    db.createUser({user:'admin',pwd:'admin',roles:[{role:'userAdminAnyDatabase

    ',db:'admin'}]})

    刚建立了 userAdminAnyDatabase 角色,用来管理用户,可以通过这个角色来创建、删除用户。

     

    9、增加安全认证机制KeyFile

    mkdir -p /data/mongo_set/usercenter/27017/

    touch mongodb-keyfile

    #生成key

    openssl rand -base64 745 > /data/mongo_set/usercenter/27017/mongodb-keyfile

    chmod 600 /data/mongo_set/usercenter/27017/mongodb-keyfile

    key的权限必须是600

     

    注:将该key放到集群中机器的每一台上,记住必须保持一致,权限设置成600

    修改mongodb.conf配置

    keyFile=/data/mongo_set/usercenter/27017/mongodb-keyfile

     

    重新启用所有服务器

    注:记住重新启动时候,keyfile的指定如果没有在配置文件中配置,就必须启动时候使用参数keyfile指定,关闭顺序注意下,mongodb集群有自动切换主库功能,如果先关主库,主库就切换到其它上面去了,这里预防主库变更,从库关闭后再关闭主库

    开启keyfile认证就默认开启了auth认证了,在此可以用之前创建的账号进行登录

     

     

    10、最后检查主从的状态

    rs.status();

     

    11、配置副本集的读写分离

    配置副本集的读写分离需要以下两步:

    (1)在副本节点上设置setSlaveOk(为了使从机变为可读状态);

    通过命令sudo find / -name .mongorc.js找到.mongorc.js

    .mongorc.js中添加rs.slaveOk();

    注:一般这个文件都是空的,直接加上去。保存退出。之后退出mongo在进去就可以了。

    尽量每台服务器都添加上去。

    (2)代码层面,在读操作过程中设置从副本节点读取数据,如下所示:

     

    ReadPreference preference = ReadPreference.secondary();

    mongoTemplate.setReadPreference(preference);

    配置完后经过测试读操作就会自动分配到从服务器,而写操作则在主服务器进行

     这部分可以从控制台查看日志进行分析

    附单元测试程序:

    package com.sinoway.cisp;

    import org.junit.Test;

    import org.junit.runner.RunWith;

    import org.springframework.beans.factory.annotation.Autowired;

    import org.springframework.boot.test.context.SpringBootTest;

    import org.springframework.test.context.junit4.SpringRunner;

    import com.sinoway.cisp.constant.CollectionEnum;

    import com.sinoway.cisp.mongo.collection.BasicReport;

    import com.sinoway.cisp.mongo.dao.SinowayReportDao;

    @RunWith(SpringRunner.class)

    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

    public class XMLTest {

    @Autowired

    private SinowayReportDao reportDao;

    @Test

    public void testSql() {

    System.out.println("++++++++++++++++++++++++开始读");

    BasicReport historyReport =  reportDao.findOneBySinoCardid("SW-8X760156-20161122",

    BasicReport.class, CollectionEnum.HISTORYREPORT_COLLECTION_NAME.getCollectionName());

    System.out.println(historyReport);

    System.out.println("++++++++++++++++++++++++读结束");

    System.out.println("++++++++++++++++++++++++开始写");

    BasicReport report = new BasicReport();

    report.setSino_cardid("3333");

    reportDao.insertOneReport(report);

    System.out.println("++++++++++++++++++++++++写结束");

    }

    }

    这些可以从控制台的日志中查看,例如:刚才进行了读操作,

     

    16是从机

    下面进行了一次写操作,输出如下

     

    18是主机

    可以查看主从状态

    经测试,删除操作也在主机进行,所以不属于读操作

    经测试:mongodb中upsert方法属于写操作

  • 相关阅读:
    MySQL binlog 组提交与 XA(分布式事务、两阶段提交)【转】
    一致性哈希算法原理
    【MySQL (六) | 详细分析MySQL事务日志redo log】
    Replication基础(六) 复制中的三个线程(IO/SQL/Dump)
    硬盘基本知识(磁头、磁道、扇区、柱面
    MySQL架构总览->查询执行流程->SQL解析顺序
    Redis之AOF重写及其实现原理
    MySQL binlog中的事件类型
    linux(mac) 编译安装MySQL
    写给自己看的Linux运维基础(四)
  • 原文地址:https://www.cnblogs.com/java-spring/p/8855927.html
Copyright © 2020-2023  润新知