Mongodb集群搭建
一、Mongodb集群搭建的三种方式
Replica Set(首选)副本集,集群中包含了多份数据,主节点挂掉之后从节点能继续提供服务。
Sharding 分片集群,只有真正的大数据才能展现它的优势,毕竟节点同步数据是需要消耗时间的。Sharding能够将多片数据集中到路由节点进行一些对比,然后再将数据返回,效率稍稍较低。
Master-Slaver 主备集群,官方已经不推荐。
二、Replica Set工作原理
Replica Set叫作副本集,集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务,提供的前提就是数据须要和主节点一致。
Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。
默认设置下,主节点提供全部增删查改服务,备节点不提供任何服务。可是能够经过设置使备节点提供查询服务,这样就能够减小主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。这个设置叫作Read Preference Modes,同时Java客户端提供了简单的配置方式,能够没必要直接对数据库进行操做。
仲裁节点是一种特殊的节点,它自己并不存储数据,主要的做用是决定哪个备节点在主节点挂掉以后提高为主节点,因此客户端不须要连接此节点。这里虽然只有一个备节点,可是仍然须要一个仲裁节点来提高备节点级别。
三、Replica Set集群搭建
解压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/
分别建立主、从、仲裁节点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
创建和编辑配置文件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
启动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
保证各个节点之间网络互通,配置集群
登录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()
#当去从节点操作数据时,直接插入会报错,需要设置从节点为只读。
查看集群状态: 登录主节点后输入rs.status()
配置主节点用户
登录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()
生成mongodb_key文件:
openssl rand -base64 128 > /data/tools/mongodb4.4.12-master/mongodb_key
chmod 600 mongodb_key #修改文件权限
分别在主、从、仲裁节点的配置文件中加上权限和mongodb_key
# master.conf slaver.conf arbiter.conf
......
auth=true
keyFile=/data/tools/mongodb4.4.12-master/mongodb_key
重启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();
模拟故障,kill 28017主节点,登录28018从节点,查看集群状态。检查功能是否正常运行,插入数据是否能在28018查到。恢复故障,重启28017主节点,检查数据是否会同步回28017主节点。
四、java连接mongodb集群
添加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>
配置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
然后就可以启动访问数据库啦!