安装MongoDB
安装MongoDB
安装单机
下载解压
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.20.tgz
tar -zxvf mongodb-linux-x86_64-rhel70-4.4.20.tgz -C /usr/local
mv /usr/local/mongodb-linux-x86_64-rhel70-4.4.20/ /usr/local/mongodb-linux-4.4.20
修改配置
创建目录
创建文件夹 data,在 data 文件夹下再创建 db 文件夹(用于存放数据库数据)和 log文件夹(存放 mongo 日志)。然后为其设置可读写权限。
# 创建目录
mkdir -p /usr/local/mongodb-linux-4.4.20/data/db
mkdir -p /usr/local/mongodb-linux-4.4.20/logs
# 设置可读写权限
sudo chmod -R 666 /usr/local/mongodb-linux-4.4.20/data/db
sudo chmod -R 666 /usr/local/mongodb-linux-4.4.20/logs
配置文件
mongodb 目录下新建配置文件 mongodb.conf(可选,但建议配置),打开文件输入以下内容。
# 数据库数据存放目录
dbpath=/usr/local/mongodb-linux-4.4.20/data/db
# 日志文件存放目录
logpath=/usr/local/mongodb-linux-4.4.20/logs/mongodb.log
# 日志追加方式
logappend=true
# 端口
port=27017
# 是否认证
auth=true
# 以守护进程方式在后台运行
fork=true
# 远程连接要指定ip,否则无法连接;0.0.0.0代表不限制ip访问
bind_ip=0.0.0.0
3.0以后使用的yaml格式的配置文件
--系统日志有关
systemLog:
destination: file
path: "/mongodb/log/mongodb.log" --日志位置
logAppend: true --日志以追加模式记录
--数据存储有关
storage:
journal:
enabled: true
dbPath: "/mongodb/data" --数据路径的位置
-- 进程控制
processManagement:
fork: true --后台守护进程
pidFilePath: <string> --pid文件的位置,一般不用配置,可以去掉这行,自动生成到data中
--网络配置有关
net:
bindIp: <ip> -- 监听地址,如果不配置这行是监听在0.0.0.0
port: <port> -- 端口号,默认不配置端口号,是27017
-- 安全验证有关配置
security:
authorization: enabled --是否打开用户名密码验证
样例
cat > /usr/local/mongodb-linux-4.4.20/conf/mongo.conf <<EOF
systemLog:
destination: file
path: "/mongodb/log/mongodb.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "/mongodb/data/"
processManagement:
fork: true
net:
port: 27017
bindIp: 192.168.80.51,127.0.0.1
EOF
环境变量
配置环境变量,使用 sudo vi /etc/profile 命令打开系统文件,并在末尾加入以下内容后保存,最后使用 source /etc/profile 命令重启系统配置。
export MONGODB_HOME=/usr/local/mongodb-linux-4.4.20
export PATH=$PATH:$MONGODB_HOME/bin
允许服务
启动运行
# -f 等同于 --config
[root@cdh1 ~]# mongod -f /usr/local/mongodb-linux-4.4.20/conf/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 1566
child process started successfully, parent exiting
# 连接mongo
[root@cdh1 ~]# mongo --host 172.18.11.111 -u "myUserAdmin" --authenticationDatabase "admin" -p'123456'
# 停止服务
[root@cdh1 ~]# mongod -f /usr/local/mongodb-linux-4.4.20/conf/mongodb.conf --shutdown
开机自启
使用 vi /lib/systemd/system/mongodb.service 命令新建开机启动配置文件,输入以下内容保存。
[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/mongodb-linux-4.4.20/bin/mongod -f /usr/local/mongodb-linux-4.4.20/conf/mongodb.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/usr/local/mongodb-linux-4.4.20/bin/mongod -f /usr/local/mongodb-linux-4.4.20/conf/mongodb.conf --shutdown
PrivateTmp=true
[Install]
WantedBy=multi-user.target
然后依次执行以下4个命令,使之生效。
# 启动 mongodb
[root@cdh1 ~]# systemctl start mongodb.service
# 查看服务状态
[root@cdh1 ~]# systemctl status mongodb.service
● mongodb.service - mongodb
Loaded: loaded (/usr/lib/systemd/system/mongodb.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2023-04-25 19:23:14 CST; 9s ago
Process: 8922 ExecStart=/usr/local/mongodb-linux-4.4.20/bin/mongod -f /usr/local/mongodb-linux-4.4.20/conf/mongodb.conf (code=exited, status=0/SUCCESS)
Main PID: 8924 (mongod)
CGroup: /system.slice/mongodb.service
└─8924 /usr/local/mongodb-linux-4.4.20/bin/mongod -f /usr/local/mongodb-linux-4.4.20/conf/mongodb.conf
Apr 25 19:23:14 cdh1 systemd[1]: Starting mongodb...
Apr 25 19:23:14 cdh1 mongod[8922]: about to fork child process, waiting until server is ready for connections.
Apr 25 19:23:14 cdh1 mongod[8922]: forked process: 8924
Apr 25 19:23:14 cdh1 mongod[8922]: child process started successfully, parent exiting
Apr 25 19:23:14 cdh1 systemd[1]: Started mongodb.
# 开机自启动
[root@cdh1 ~]# systemctl enable mongodb.service
Created symlink from /etc/systemd/system/multi-user.target.wants/mongodb.service to /usr/lib/systemd/system/mongodb.service.
# 修改 mongodb.service文件时,重新加载文件
[root@cdh1 ~]# systemctl daemon-reload
[root@cdh1 ~]#
创建用户
启动 MongoDB 服务默认是没有账号密码的,即连接上即可进行各种操作。
但是我们在启动配置文件中,指定了 auth=true,即开启了认证,所以链接后需要认证才能执行操作。默认情况下,MongoDB 是没有管理员账户的,所以我们需要在 admin 数据库中使用 db.createUser() 命令添加管理员帐号或其他角色。
内置角色
- 数据库用户角色: read、readWrite
- 数据库管理角色: dbAdmin、dbOwner、userAdmin
- 集群管理角色: clusterAdmin、clusterManager、clusterMonitor、hostManager
- 备份恢复角色: backup、restore
- 所有数据库角色: readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色: root
- 内部角色: __system
创建管理员账号
切换到 admin 数据库,使用以下命令创建管理账号,拥有操作所有数据库权限。
# 连接mongodb
[root@cdh1 ~]# mongo
MongoDB shell version v4.4.20
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("5be0188a-b0d3-4927-8411-3ca4acf4fcf1") }
MongoDB server version: 4.4.20
# 切换数据库
> use admin
switched to db admin
# 创建用户
> db.createUser({user:"admin",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
>
# 查看集群的状态
> rs.status();
# 集群的配置信息
> rs.conf()
# 查看当前是否是主节点
> rs.isMaster();
# 删除一个节点
> rs.remove("ip:port");
# 新增
> rs.add("ip:port");
# 新增仲裁节点
> rs.addArb("ip:port");
验证
使用 mongo 命令连接上之后,如果不进行 db.auth("用户名","密码") 进行用户验证的话,是执行不了任务命令的,只有通过认证才可以。注意,每一个用户都需要在创建这个用户的认证库下进行认证。
> use admin
switched to db admin
> db.auth("admin","123456")
1
> show tables
system.users
system.version
>
修改密码
切换至mongo的bin目录下,登录mongo
登陆成功后,切换至admin表 (mongodb的所有用户都会存储在admin表中,所以需要切换至admin表再进行用户的修改)
use admin
db.changeUserPassword('用户名','新密码');
db.auth('用户名','新密码');
可以退出exit验证 ,再次登录
为单个数据库创建账号
平常开发中,一般新项目会创建新的数据库,而且创建一个新的数据库用户仅对此数据库进行读写。
以下演示创建 sado 用户,密码为123456,并设置对 nobody 数据库读写的权限。注意,创建新用户前,先使用 admin 用户登录,因为我们刚才为 admin 用户设置了 userAdminAnyDatabase 权限。
# 先使用有创建用户权限的用户登录
> use admin
switched to db admin
> db.auth("admin","123456")
1
# 新用户的认证库
> use nobody
switched to db nobody
# 创建sado用户,密码123465,对nobody数据库有读写权限
> db.createUser({user:'sado',pwd:'123456',roles:[{role:'readWrite',db:'nobody'}]})
Successfully added user: {
"user" : "sado",
"roles" : [
{
"role" : "readWrite",
"db" : "nobody"
}
]
}
>
安装集群
主从集群
基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB) Paxos(mysql MGR 用的是变种))
如果发生主库宕机,复制集内部会进行投票选举,
选择一个新的主库替代原有主库对外提供服务。
同时复制集会自动通知客户端程序,主库已经发生切换了。应用就会连接到新的主库。
| 序号 | 域名 | 角色 | 服务器IP | 端口 | mongodb版本 |
|---|---|---|---|---|---|
| 1 | cdh1 | PRIMARY | 172.18.11.111 | 27017 | 4.4.20 |
| 2 | cdh2 | SECONDARY | 172.18.11.112 | 27017 | 4.4.20 |
| 3 | cdh3 | SECONDARY | 172.18.11.113 | 27017 | 4.4.20 |
修改配置(ms)
分别修改 cdh1、cdh2、cdh3 的 mongodb_ms.conf 配置文件
cat > /usr/local/mongodb-linux-4.4.20/conf/mongod_ms.conf <<EOF
systemLog:
destination: file
path: /usr/local/mongodb-linux-4.4.20/logs/mongodb_ms.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /usr/local/mongodb-linux-4.4.20/data/ms
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
bindIp: 0.0.0.0
port: 27017
replication:
oplogSizeMB: 2048
replSetName: my_repl
EOF
重启 cdh1、cdh2、cdh3 的 mongodb
mongod -f /usr/local/mongodb-linux-4.4.20/conf/mongod_ms.conf --shutdown
mongod -f /usr/local/mongodb-linux-4.4.20/conf/mongod_ms.conf
集群初始化
在 cdh1 上执行该段脚本
# 登录mongo
[root@cdh1 ~]#mongo --port 27017 admin
> config = {_id: 'my_repl', members: [
{_id: 0, host: '172.18.11.111:27017'},
{_id: 1, host: '172.18.11.112:27017'},
{_id: 2, host: '172.18.11.113:27017'}]}
# 初始集群
> rs.initiate(config)
查看 cdh1、cdh2、cdh3 三者的角色和状态
# 查看集群的状态
my_repl:SECONDARY> rs.status();
# 集群的配置信息
my_repl:SECONDARY> rs.conf()
# 查看当前是否是主节点
my_repl:SECONDARY> rs.isMaster();
# 删除一个节点
my_repl:SECONDARY> rs.remove("ip:port");
# 新增
my_repl:SECONDARY> rs.add("ip:port");
# 新增仲裁节点
my_repl:SECONDARY> rs.addArb("ip:port");
副本集群
副本集类似于有自动故障恢复功能的主从集群。通俗的讲就是用多台机器进行同一数据的异步同步,从而使多台机器拥有同一数据的多个副本,并且当主库当掉时在不需要用户干预的情况下自动
切换其他备份服务器做主库。而且还可以利用副本服务器做只读服务器,实现读写分离,提高负载。
副本集的两种类型:
主节点(Primary)类型:数据操作的主要连接点,可读写。
次要(辅助、从)节点(Secondaries)类型:数据冗余备份节点,可以读或选举。
三种角色:
- 主要成员(Primary):主要接收所有写操作。就是主节点。
- 副本成员(Replicate):从主节点通过复制操作以维护相同的数据集,即备份数据,不可写操作,但可以读操作(但需要配置)。是默认的一种从节点类型。
- 仲裁者(Arbiter):不保留任何数据的副本,只具有投票选举作用。当然也可以将仲裁服务器维护为副本集的一部分,即副本成员同时也可以是仲裁者。也是一种从节点类型。
| 序号 | 域名 | 角色 | 服务器IP | 端口 | mongodb版本 |
|---|---|---|---|---|---|
| 1 | cdh1 | 主节点 | 172.18.11.111 | 27017 | 4.4.20 |
| 2 | cdh2 | 副本/仲裁节点 | 172.18.11.112 | 27017 | 4.4.20 |
| 3 | cdh3 | 副本/仲裁节点 | 172.18.11.113 | 27017 | 4.4.20 |
修改配置
vim /usr/local/mongodb-linux-4.4.20/conf/mongod_replica.conf
# 设置数据文件的存放目录
dbpath=/usr/local/mongodb-linux-4.4.20/data/replica
# 设置日志文件的存放目录及其日志文件名
logpath=/usr/local/mongodb-linux-4.4.20/logs/mongodb_replica.log
# 设置为以守护进程的方式运行,即在后台运行
fork=true
#使用追加的方式写日志
logappend=true
#每次写入会记录一条操作日志(通过journal可以重新构造出写入的数据)
journal=true
#即使宕机,启动时wiredtiger会先将数据恢复到最近一次的checkpoint点,然后重放后续的journal日志来恢复
#存储引擎有mmapv1、wirtiger、mongorocks
storageEngine=wiredTiger
#最大同时连接数
maxConns=100
#绑定ip
bind_ip= 0.0.0.0
#端口
port=27017
# 设置副本集名称
replSet=myrs
启动三个节点
mongod -f /usr/local/mongodb-linux-4.4.20/conf/mongod_replica.conf
集群初始化
rs.initiate({
"_id" : "myrs",
"members" : [
{ "_id" : 0, "host" : "172.18.11.111:27017",priority:3},
{ "_id" : 1, "host" : "172.18.11.112:27017",priority:2},
{ "_id" : 2, "host" : "172.18.11.113:27017",priority:1},
]
})
使用 rs.status() 或 rs.config() 可以查看副本集状态和当前配置信息
rs.status()
分片集群
在单机环境下,高频率的查询会给服务器 CPU 和 I/O 带来巨大的负担,基于这个原因,MongoDB 提供了分片机制用于解决大数据集的分布式部署,从而提高系统的吞吐量。一个标准的 MongoDB 分片集群通常包含以下三类组件:
- mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。
- config server,为配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,防止数据丢失!
- shard,分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程。将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载。基本思想就是将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一部分,最后通过一个均衡器来对各个分片进行均衡(数据迁移)。
| 主机名 | IP地址 | mongos-router | config-server | shard |
|---|---|---|---|---|
| cdh1 | 172.18.11.111 | mongos-router:27017 | config-server:27018 | shard1:27019 shard2:27020 shard3:27021 |
| cdh2 | 172.18.11.112 | mongos-router:27017 | config-server:27018 | shard1:27019 shard2:27020 shard3:27021 |
| cdh3 | 172.18.11.113 | mongos-router:27017 | config-server:27018 | shard1:27019 shard2:27020 shard3:27021 |
部署说明:
- configServer配置服务器建议部署为包含3个成员的副本集模式,出于测试目的,您可以创建一个单成员副本集;
- shard分片请使用至少包含三个成员的副本集。出于测试目的,您可以创建一个单成员副本集;
- mongos没有副本集概念,可以部署1个、2个或多个。
- 本次部署使用3台服务器,部署3个mongos、3个configServer、以及3个分片,每个分片包含3个成员,都分布在不同服务器上。
创建数据目录和日志目录
[root@cdh1 ~]# mkdir -p /usr/local/mongodb-linux-4.4.20/cluster/{config,mongos,shard1,shard2,shard3}/{data,logs}
[root@cdh1 ~]# tree /usr/local/mongodb-linux-4.4.20/cluster/
/usr/local/mongodb-linux-4.4.20/cluster/
├── config
│ ├── data
│ └── logs
├── mongos
│ ├── data
│ └── logs
├── shard1
│ ├── data
│ └── logs
├── shard2
│ ├── data
│ └── logs
└── shard3
├── data
└── logs
12 directories, 0 files
[root@cdh1 ~]#
修改配置
configServer配置
修改configServer配置文件:
cat > /usr/local/mongodb-linux-4.4.20/cluster/config/mongod.conf <<EOF
systemLog:
destination: file
logAppend: true
path: /usr/local/mongodb-linux-4.4.20/cluster/config/logs/mongod.log
# Where and how to store data.
storage:
dbPath: /usr/local/mongodb-linux-4.4.20/cluster/config/data
journal:
enabled: true
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /usr/local/mongodb-linux-4.4.20/cluster/config/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27018
bindIp: cdh1
sharding:
clusterRole: configsvr
replication:
replSetName: config
EOF
shard1配置
修改shard1分片配置文件
cat > /usr/local/mongodb-linux-4.4.20/cluster/shard1/mongod.conf <<EOF
systemLog:
destination: file
logAppend: true
path: /usr/local/mongodb-linux-4.4.20/cluster/shard1/logs/mongod.log
# Where and how to store data.
storage:
dbPath: /usr/local/mongodb-linux-4.4.20/cluster/shard1/data
journal:
enabled: true
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /usr/local/mongodb-linux-4.4.20/cluster/shard1/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27019
bindIp: cdh1
sharding:
clusterRole: shardsvr
replication:
replSetName: shard1
EOF
shard2配置
修改shard2分片配置文件
cat > /usr/local/mongodb-linux-4.4.20/cluster/shard2/mongod.conf <<EOF
systemLog:
destination: file
logAppend: true
path: /usr/local/mongodb-linux-4.4.20/cluster/shard2/logs/mongod.log
# Where and how to store data.
storage:
dbPath: /usr/local/mongodb-linux-4.4.20/cluster/shard2/data
journal:
enabled: true
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /usr/local/mongodb-linux-4.4.20/cluster/shard2/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27020
bindIp: cdh1
sharding:
clusterRole: shardsvr
replication:
replSetName: shard2
EOF
shard3配置
修改shard3分片配置文件
cat > /usr/local/mongodb-linux-4.4.20/cluster/shard3/mongod.conf <<EOF
systemLog:
destination: file
logAppend: true
path: /usr/local/mongodb-linux-4.4.20/cluster/shard3/logs/mongod.log
# Where and how to store data.
storage:
dbPath: /usr/local/mongodb-linux-4.4.20/cluster/shard3/data
journal:
enabled: true
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /usr/local/mongodb-linux-4.4.20/cluster/shard3/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27021
bindIp: cdh1
sharding:
clusterRole: shardsvr
replication:
replSetName: shard3
EOF
router配置
修改mongos-router配置文件,注意mongos没有storage部分配置
cat > /usr/local/mongodb-linux-4.4.20/cluster/mongos/mongod.conf <<EOF
systemLog:
destination: file
logAppend: true
path: /usr/local/mongodb-linux-4.4.20/cluster/mongos/logs/mongod.log
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /usr/local/mongodb-linux-4.4.20/cluster/mongos/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27017
bindIp: cdh1
sharding:
configDB: config/cdh1:27018,cdh2:27018,cdh3:27018
EOF
分发配置到各个节点,注意,使用rsync复制能够保留文件目录权限
rsync -avzp /usr/local/mongodb-linux-4.4.20/cluster 172.18.11.112:/usr/local/mongodb-linux-4.4.20
rsync -avzp /usr/local/mongodb-linux-4.4.20/cluster 172.18.11.113:/usr/local/mongodb-linux-4.4.20
更新各个节点配置
# 在cdh2节点更新配置文件绑定地址
grep -rl bindIp /usr/local/mongodb-linux-4.4.20/cluster/ | xargs sed -i 's#bindIp: cdh1#bindIp: cdh2#g'
# 在cdh3节点更新配置文件绑定地址
grep -rl bindIp /usr/local/mongodb-linux-4.4.20/cluster/ | xargs sed -i 's#bindIp: cdh1#bindIp: cdh3#g'
# 验证更新成功
grep -rn "bindIp: cdh" /usr/local/mongodb-linux-4.4.20/cluster/
集群初始化
初始化configserver
连接3个节点执行以下命令分别启动configServer
mongod -f /usr/local/mongodb-linux-4.4.20/cluster/config/mongod.conf
连接到第一个节点cdh1
[root@cdh1 ~]# mongo --host cdh1 --port 27018
初始化configServer副本集
rs.initiate(
{
_id: "config",
configsvr: true,
members: [
{ _id : 0, host : "cdh1:27018" },
{ _id : 1, host : "cdh2:27018" },
{ _id : 2, host : "cdh3:27018" }
]
}
)
# 查看节点状态
rs.status()
初始化shard分片
3个节点每个节点执行以下命令启动3个shard分片副本集
mongod -f /usr/local/mongodb-linux-4.4.20/cluster/shard1/mongod.conf
mongod -f /usr/local/mongodb-linux-4.4.20/cluster/shard2/mongod.conf
mongod -f /usr/local/mongodb-linux-4.4.20/cluster/shard3/mongod.conf
连接到第一个shard分片并初始化
[root@cdh1 ~]# mongo --host cdh1 --port 27019
rs.initiate(
{
_id: "shard1",
members: [
{ _id : 0, host : "cdh1:27019" },
{ _id : 1, host : "cdh2:27019" },
{ _id : 2, host : "cdh3:27019" }
]
}
)
连接到第二个shard分片并初始化
[root@cdh1 ~]# mongo --host cdh1 --port 27020
rs.initiate(
{
_id: "shard2",
members: [
{ _id : 0, host : "cdh1:27020" },
{ _id : 1, host : "cdh2:27020" },
{ _id : 2, host : "cdh3:27020" }
]
}
)
连接到第三个shard分片并初始化
[root@cdh1 ~]# mongo --host cdh1 --port 27021
rs.initiate(
{
_id: "shard3",
members: [
{ _id : 0, host : "cdh1:27021" },
{ _id : 1, host : "cdh2:27021" },
{ _id : 2, host : "cdh3:27021" }
]
}
)
# 查看各个分片副本集节点状态
rs.status()
初始化mongos
3个节点启动mongos-router,注意启动时使用mongos命令而非mongod命令:
mongos -f /usr/local/mongodb-linux-4.4.20/cluster/mongos/mongod.conf
连接到第一个mongos节点cdh1并初始化
[root@cdh1 ~]# mongo --host cdh1 --port 27017
执行以下操作将3个分片副本集添加到集群:
sh.addShard( "shard1/cdh1:27019,cdh2:27019,cdh3:27019")
sh.addShard( "shard2/cdh1:27020,cdh2:27020,cdh3:27020")
sh.addShard( "shard3/cdh1:27021,cdh2:27021,cdh3:27021")
# 查看mongos状态
sh.status()
查看当前节点运行的所有mongod进程:
[root@cdh1 ~]# ps -ef | grep mongod | grep -v grep
root 37847 1 5 17:53 ? 00:01:43 mongod -f /usr/local/mongodb-linux-4.4.20/cluster/config/mongod.conf
root 37993 1 3 18:01 ? 00:00:49 mongod -f /usr/local/mongodb-linux-4.4.20/cluster/shard1/mongod.conf
root 38036 1 3 18:01 ? 00:00:48 mongod -f /usr/local/mongodb-linux-4.4.20/cluster/shard2/mongod.conf
root 38079 1 3 18:01 ? 00:00:50 mongod -f /usr/local/mongodb-linux-4.4.20/cluster/shard3/mongod.conf
root 38329 1 0 18:13 ? 00:00:06 mongos -f /usr/local/mongodb-linux-4.4.20/cluster/mongos/mongod.conf
至此分片集群部署完成,接下来执行数据分片操作。
集群验证
为数据库启用分片
在分片集合之前,必须为集合的数据库启用分片,连接任意一台mongos节点shell,以cdh1节点为例。
mongo --host cdh1 --port 27017
# 创建testdb数据库
use testdb;
为集合启用分片
为testdb数据库启用分片
sh.enableSharding("testdb")
为order集合设置分片规则
sh.shardCollection("testdb.order", {"_id": "hashed" })
插入1000条数据进行验证:
use testdb
for (i = 1; i <= 1000; i=i+1){
db.order.insert({'price': 1})
}
查看插入的数据量
db.order.find().count()
访问3个分片查看数据量
[root@cdh1 ~]# mongo --host cdh1 --port 27019
shard1:PRIMARY> use testdb
switched to db testdb
shard1:PRIMARY> db.order.find().count()
336
[root@cdh1 ~]# mongo --host cdh1 --port 27020
shard2:PRIMARY> use testdb
switched to db testdb
shard2:PRIMARY> db.order.find().count()
326
[root@cdh1 ~]# mongo --host cdh1 --port 27021
shard3:PRIMARY> use testdb
switched to db testdb
shard3:PRIMARY> db.order.find().count()
338
参考:
- Linux CentOS7 环境下安装 MongoDB_centos linux7安装 monggo_陈皮的JavaLib的博客-CSDN博客
- MongoDB的安装centos7--01_centos7-01_长安有故里y的博客-CSDN博客
- mongodb集群的搭建(1主2从,或1主3从,一个从隐身)--03_mongodb 一主两从_长安有故里y的博客-CSDN博客
- MongoDB忘记密码、修改密码总结_mongodb修改密码_饮雪煮茶的博客-CSDN博客
- MongoDB副本集 集群搭建_mongodb副本集群_小毕超的博客-CSDN博客
- MongoDB部署分片集群_freesharer的博客-CSDN博客
- MongoDB 3种部署方式简要对比_mongodb三种部署方式_Smile_Leo的博客-CSDN博客