mongo集群有三种方式

1.Replica Set副本
2.Sharding分片
3.Master-slave主备

通常来说,我们用第1、2种较多,第3种官方并不推荐。这里我们主要介绍Replica Set副本集。

Replica Set

       中文翻译叫做副本集,不过我并不喜欢把英文翻译成中文,总是感觉怪怪的。其实简单来说就是集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务,提供的前提就是数据需要和主节点一致。如下图:

mongodb 子集合查询 mongodb集群查询主节点_mongodb 子集合查询

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

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

       仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。我开始也不相信必须要有仲裁节点,但是自己也试过没仲裁节点的话,主节点挂了备节点还是备节点,所以咱们还是需要它的。

由于资源有限,我只使用一台虚拟机(192.168.1.119)搭建三个节点,每个节点的端口号不一样:

Mongodb(M)端口号27017,Mongodb(S)端口号27018,Mongodb(A)端口号27019

先官网下载mongodb文件,这里我解压到/usr/local/mongodb4  文件夹下。

1、设置配置文件:

Mongodb(M): testrs_27017.yaml

systemLog:
   #MongoDB发送所有日志输出的目标指定为文件
   destination: file
   #指定日志文件路径
   path: "/usr/local/mongodb4/datasource/log/testrs_27017.log"
   logAppend: true


storage:
   #存储数据库的数据目录
   dbPath: "/usr/local/mongodb4/datasource/data/db/testrs_27017"
   #启用或禁用持久性日志以确保数据文件保持有效和恢复
   journal:
      enabled: true


processManagement:
   #支持后台启动
   fork: true
   #记录进程id
   pidFilePath: "/usr/local/mongodb4/datasource/pid/testr_27017.pid"

net:
   #设置绑定ip地址
   bindIp:   192.168.1.119
   #绑定端口号
   port: 27017

setParameter:
   #认证设置
   enableLocalhostAuthBypass: false

#副本集名称
replication:
   replSetName: "testrs"

Mongodb(S)  testrs_27018.yaml

systemLog:
   #MongoDB发送所有日志输出的目标指定为文件
   destination: file
   #指定日志文件路径
   path: "/usr/local/mongodb4/datasource/log/testrs_27018.log"
   logAppend: true


storage:
   #存储数据库的数据目录
   dbPath: "/usr/local/mongodb4/datasource/data/db/testrs_27018"
   #启用或禁用持久性日志以确保数据文件保持有效和恢复
   journal:
      enabled: true


processManagement:
   #支持后台启动
   fork: true
   #记录进程id
   pidFilePath: "/usr/local/mongodb4/datasource/pid/testr_27018.pid"

net:
   #设置绑定ip地址
   bindIp:   192.168.1.119
   #绑定端口号
   port: 27018

setParameter:
   #认证设置
   enableLocalhostAuthBypass: false

#副本集名称
replication:
   replSetName: "testrs"

 Mongodb(A) :testrs_27019.yaml

systemLog:
   #MongoDB发送所有日志输出的目标指定为文件
   destination: file
   #指定日志文件路径
   path: "/usr/local/mongodb4/datasource/log/testrs_27019.log"
   logAppend: true


storage:
   #存储数据库的数据目录
   dbPath: "/usr/local/mongodb4/datasource/data/db/testrs_27019"
   #启用或禁用持久性日志以确保数据文件保持有效和恢复
   journal:
      enabled: true


processManagement:
   #支持后台启动
   fork: true
   #记录进程id
   pidFilePath: "/usr/local/mongodb4/datasource/pid/testr_27019.pid"

net:
   #设置绑定ip地址
   bindIp: 192.168.1.119
   #绑定端口号
   port: 27019

setParameter:
   #认证设置
   enableLocalhostAuthBypass: false

#副本集名称
replication:
   replSetName: "testrs"

2、创建数据库文件夹和日志文件夹:

mkdir -p /usr/local/mongodb4/datasource/pid
mkdir -p /usr/local/mongodb4/datasource/log
mkdir -p /usr/local/mongodb4/datasource/data/db/testrs_27017
mkdir -p /usr/local/mongodb4/datasource/data/db/testrs_27018
mkdir -p /usr/local/mongodb4/datasource/data/db/testrs_27019

3、启动服务:

/usr/local/mongodb4/bin/mongod -f    /文件路径/testrs_27017.yaml
/usr/local/mongodb4/bin/mongod -f    /文件路径/testrs_27018.yaml
/usr/local/mongodb4/bin/mongod -f    /文件路径/testrs_27019.yaml

4、查看服务情况:

[root@localhost conf]# ps -ef|grep mongo
 root     13289     1  1 18:07 ?        00:02:38 ../bin/mongod -f testrs_2017.conf
 root     13813     1  1 19:00 ?        00:02:12 ../bin/mongod -f testrs_2018.conf
 root     13837     1  1 19:00 ?        00:02:12 ../bin/mongod -f testrs_2019.conf

5、选择主节点进入:

/usr/local/mongodb4/bin/mongo 192.168.1.119:27017

6、初始化副本集

rs.initiate()

7、添加备节点

rs.add("192.168.1.119:27018")

8、添加仲裁节点

rs.add("192.168.1.119:27019",true) 或者rs.addArb("192.168.1.119:27019")

注意:6、7、8可以一部操作

rs.initiate(
   {
      _id: "testrs",
      version: 1,
      members: [
         { _id: 0, host : "192.168.1.121:27017" },
         { _id: 1, host : "192.168.1.121:27019", arbiterOnly: true },
         { _id: 2, host : "192.168.1.121:27018" }
      ]
   }
)

9、查看配置

rs.conf()

mongodb 子集合查询 mongodb集群查询主节点_mongodb 子集合查询_02

10、 查看状态

rs.status()

mongodb 子集合查询 mongodb集群查询主节点_mongodb_03

11、删除节点

rs.remove("192.168.1.119:27019")

问题:

1、这个时候在备节点上执行命令都会报错。

原因,当前备节点只是一个备份,不是奴隶节点,无法读取数据,写操作更不行了,默认情况下从节点是没有读写权限的,可以增加读的权限,但是需要进行设置。

设置读操作权限:

 rs.slaveOk()或者rs.slaveOk(true)

该命令是db.getMongo().setSlaveOk()的简化命令。

如果想取消奴隶节点:

rs.slaveOk(false)

二、设置用户名密码

1、生成密钥文件

openssl rand -base64 90 > keyfile

2、该key的权限必须是600

chmod 600 /文件目录/keyfile

3、在配置文件中testrs_27017.yaml、testrs_27018.yaml、testrs_27019.yaml都添加:

security:
   keyFile: /文件路径/keyfile
   authorization: enabled

4、启动mongo服务,添加管理员可以操作复制集的权限(在primary节点上面)

#切换到admin库
>use admin
#创建系统超级用户myroot,设置密码123456,设置角色root
>db.createUser({user:"myroot",pwd:"123456",roles:[{role:"root",db:"admin"}]})
或者db.createUser({user:"myroot",pwd:"123456",roles:[role:"root"]})
#创建专门管理admin库的账号myadmin,只用来做为用户权限管理
>db.createUser({user:"myadmin",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})

5、创建普通用户

创建普通用户可以在没有开启认证的时候添加,也可以在开启认证之后添加,但是开启认证之后,必须使用有操作admin库的用户登录认证之后才能操作。

#切换将来要操作的数据库cumulo_order
>use cumulo_order
#创建用户qqbo,拥有cumulo_order数据库的读写权限readWrite,密码是123456
>db.createUser({user:"qqbo",pwd:"123456",roles:[{role:"readWrite",db:"cumulo_order"}]})
#查看已经创建的用户情况
>db.system.users.find()
#删除用户
>db.dropUser("myadmin")
#修改密码
>db.changeUserPassword("myroot","12345")

5、认证测试

#切换数据库
>use admin
#验证用户名密码
>db.auth("myroot","123456")

6、连接集群

mongo mongodb://192.168.1.119:27017,192.168.1.119:27018,192.168.1.119:27019/?replicaSet=testrs