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

Posted 劈天造陆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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方法属于写操作

 

以上是关于MongoDB的搭建并配置主从以及读写分离的主要内容,如果未能解决你的问题,请参考以下文章

mysql的主从复制和读写分离

mysql的主从复制和读写分离

搭建MySql主从复制与读写分离

MySQL主从读写分离搭建-ShardingSphere-Proxy

MySQL数据库--主从复制读写分离

mysql主从复制以及读写分离