Mongodb集群搭建

一、Mongodb集群搭建的三种方式
  1. Replica Set(首选)副本集,集群中包含了多份数据,主节点挂掉之后从节点能继续提供服务。

  1. Sharding 分片集群,只有真正的大数据才能展现它的优势,毕竟节点同步数据是需要消耗时间的。Sharding能够将多片数据集中到路由节点进行一些对比,然后再将数据返回,效率稍稍较低。

  1. Master-Slaver 主备集群,官方已经不推荐。

二、Replica Set工作原理
  1. Replica Set叫作副本集,集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务,提供的前提就是数据须要和主节点一致。

  1. Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。

  1. 默认设置下,主节点提供全部增删查改服务,备节点不提供任何服务。可是能够经过设置使备节点提供查询服务,这样就能够减小主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。这个设置叫作Read Preference Modes,同时Java客户端提供了简单的配置方式,能够没必要直接对数据库进行操做。

  1. 仲裁节点是一种特殊的节点,它自己并不存储数据,主要的做用是决定哪个备节点在主节点挂掉以后提高为主节点,因此客户端不须要连接此节点。这里虽然只有一个备节点,可是仍然须要一个仲裁节点来提高备节点级别。

三、Replica Set集群搭建

  1. 解压mongo安装包和工具包

tar -zxvf mongodb-database-tools-rhel70-x86_64-100.5.2.tgz
mv mongodb-database-tools-rhel70-x86_64-100.5.2 mongodb-tools-100.5.2
tar -zxvf mongodb-linux-x86_64-rhel70-4.4.12.tgz
mv mongodb-linux-x86_64-rhel70-4.4.12 mongodb4.4.12
cd /data/tools/mongodb-tools-100.5.2/bin/
cp bsondump mongodump mongoexport mongofiles mongoimport mongorestore mongostat mongotop /data/tools/mongodb4.4.12/bin/
  1. 分别建立主、从、仲裁节点mongo目录

mkdir -p /data/tools/mongodb4.4.12-master/data

mkdir -p /data/tools/mongodb4.4.12-slaver/data

mkdir -p /data/tools/mongodb4.4.12-arbiter/data

  1. 创建和编辑配置文件mongo.conf分别放置于mongo主目录:/data/tools/mongodb4.4.12-master/

#master.conf
dbpath=/data/tools/mongodb4.4.12-master/data
logpath=/data/tools/mongodb4.4.12-master/master.log
pidfilepath=/data/tools/mongodb4.4.12-master/master.pid
directoryperdb=true
logappend=true
replSet=tmsrs
bind_ip=0.0.0.0
port=28017
oplogSize=10000
fork=true
#slaver.conf
dbpath=/data/tools/mongodb4.4.12-slaver/data
logpath=/data/tools/mongodb4.4.12-slaver/slaver.log
pidfilepath=/data/tools/mongodb4.4.12-slaver/slaver.pid
directoryperdb=true
logappend=true
replSet=tmsrs
bind_ip=0.0.0.0
port=28018
oplogSize=10000
fork=true
#arbiter.conf
dbpath=/data/tools/mongodb4.4.12-arbiter/data
logpath=/data/tools/mongodb4.4.12-arbiter/arbiter.log
pidfilepath=/data/tools/mongodb4.4.12-arbiter/arbiter.pid
directoryperdb=true
logappend=true
replSet=tmsrs
bind_ip=0.0.0.0
port=28018
oplogSize=10000
fork=true
  1. 启动mongodb的主、从、仲裁节点

#启动mongo
/data/tools/mongodb4.4.12-master/bin/mongod --config /data/tools/mongodb4.4.12-master/master.conf
/data/tools/mongodb4.4.12-slaver/bin/mongod --config /data/tools/mongodb4.4.12-slaver/slaver.conf
/data/tools/mongodb4.4.12-arbiter/bin/mongod --config /data/tools/mongodb4.4.12-arbiter/arbiter.conf
  1. 保证各个节点之间网络互通,配置集群

登录master节点: mongo 127.0.0.1:28017
> use admin
> config={_id:"tmsrs",members:[{_id:0,host:'10.20.28.4:28017',priority:2},{_id:1,host:'10.20.28.4:28018',priority:1},{_id:2,host:'10.20.28.4:28019',arbiterOnly:true}]};
> rs.initiate(config)	# 使config配置生效
#priority:优先级越大,则优先分配成为主节点。
#仲裁节点,必须要配置arbiterOnly:true,否则主从模式不能生效。
登录从节点: mongo 127.0.0.1:28018
> db.getMongo().setSecondaryOk()
#当去从节点操作数据时,直接插入会报错,需要设置从节点为只读。
  1. 查看集群状态: 登录主节点后输入rs.status()

  1. 配置主节点用户

登录master节点:mongo 127.0.0.1:28017
> use admin
> db.createUser({user:"admin",pwd: "admin",roles:[{role:"root",db:"admin"}]});
> db.grantRolesToUser("admin", ["clusterAdmin"])  #需要给admin用户赋予集群权限,不然后面执行rs.status()会报错:"errmsg" : "not authorized on admin to execute command { replSetGetStatus:......
> db.auth("admin", "admin")
> db.system.users.find()
  1. 生成mongodb_key文件:

openssl rand -base64 128 > /data/tools/mongodb4.4.12-master/mongodb_key
chmod 600 mongodb_key #修改文件权限
  1. 分别在主、从、仲裁节点的配置文件中加上权限和mongodb_key

# master.conf  slaver.conf  arbiter.conf
......
auth=true
keyFile=/data/tools/mongodb4.4.12-master/mongodb_key
  1. 重启mongo数据库,登录主节点查看集群状态

kill -2 mongo_pid
#启动mongo
/data/tools/mongodb4.4.12-master/bin/mongod --config /data/tools/mongodb4.4.12-master/master.conf
/data/tools/mongodb4.4.12-slaver/bin/mongod --config /data/tools/mongodb4.4.12-slaver/slaver.conf
/data/tools/mongodb4.4.12-arbiter/bin/mongod --config /data/tools/mongodb4.4.12-arbiter/arbiter.conf
#登录mongo
/data/tools/mongodb4.4.12-master/bin/mongo 127.0.0.1:28017
> use admin;
> db.auth("admin","admin");
> rs.status();
  1. 模拟故障,kill 28017主节点,登录28018从节点,查看集群状态。检查功能是否正常运行,插入数据是否能在28018查到。恢复故障,重启28017主节点,检查数据是否会同步回28017主节点。

四、java连接mongodb集群
  1. 添加maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
    <version>2.6.7</version>
</dependency>
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.4.3</version>
</dependency>
  1. 配置application.yml文件

spring:
  data:
    mongodb:
      # 集群配置mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
      uri: mongodb://[username:password@]100.200.280.40:28017,100.200.280.40:28018/admin?replicaSet=tmsrs
  1. 然后就可以启动访问数据库啦!