跳至主要內容

安装MongoDB

soulballad环境配置CentOSCentOS约 4636 字大约 15 分钟

安装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() 命令添加管理员帐号或其他角色。

内置角色

  1. 数据库用户角色: read、readWrite
  2. 数据库管理角色: dbAdmin、dbOwner、userAdmin
  3. 集群管理角色: clusterAdmin、clusterManager、clusterMonitor、hostManager
  4. 备份恢复角色: backup、restore
  5. 所有数据库角色: readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  6. 超级用户角色: root
  7. 内部角色: __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版本
1cdh1PRIMARY172.18.11.111270174.4.20
2cdh2SECONDARY172.18.11.112270174.4.20
3cdh3SECONDARY172.18.11.113270174.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版本
1cdh1主节点172.18.11.111270174.4.20
2cdh2副本/仲裁节点172.18.11.112270174.4.20
3cdh3副本/仲裁节点172.18.11.113270174.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-routerconfig-servershard
cdh1172.18.11.111mongos-router:27017config-server:27018shard1:27019 shard2:27020 shard3:27021
cdh2172.18.11.112mongos-router:27017config-server:27018shard1:27019 shard2:27020 shard3:27021
cdh3172.18.11.113mongos-router:27017config-server:27018shard1: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

参考:

上次编辑于:
贡献者: soulballad