mongo集群有三种方式
1.Replica Set副本
2.Sharding分片
3.Master-slave主备
通常来说,我们用第1、2种较多,第3种官方并不推荐。这里我们主要介绍Replica Set副本集。
Replica Set
中文翻译叫做副本集,不过我并不喜欢把英文翻译成中文,总是感觉怪怪的。其实简单来说就是集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务,提供的前提就是数据需要和主节点一致。如下图:
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()
10、 查看状态
rs.status()
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