跳转至

实验 6 - NoSQL 数据库练习

概述

本次实验中,我们需要搭建起两个热门的 NoSQL 数据库环境并进行一些基本操作:

我们在实验 1的基础上,在 namenode 机器上完成 Redis 和 MongoDB 的搭建。

不一定要在 namenode

我们只是在本次实验中,借助之前已经安装好的 Ubuntu 环境而已。你可以在 datanode1, datanode2 上,甚至全新安装一个 Linux 系统来完成本次实验。除了 Linux 以外,你还可以在以下环境或系统中运行 Redis/MongoDB:

  • Arch Linux
  • Debian
  • Fedora
  • RHEL
  • 其他发行版的 Linux 设备
  • Windows (native)
    • Windows Subsystem for Linux (WSL)
    • Windows Subsystem for Android + Termux + proot (why not!)
  • macOS (Intel & Apple Silicon)
  • Android (Termux & proot)

那么,我们开始吧。

安装 Redis

Redis 的安装相对简单明了一些,我们先把它搞定。

  • 使用 super 身份登录到虚拟机,你可以使用 SSH(推荐)或者直接在虚拟机界面和虚拟机交互
  • 更新 APT 数据库
    sudo apt update
    
  • 使用包管理器安装 Redis:
    sudo apt install -y redis
    
  • 修改 Redis 配置:
    sudo nano /etc/redis/redis.conf
    
  • 寻找到 bind 127.0.0.1 ::1 字样,在行首添加 #,将其注释掉
  • 向下寻找 protected-mode yes,修改为 protected-mode no
  • 保存

这是不安全的配置!

我们到底在 Redis 配置文件里修改了什么?我们将 Redis 服务的监听主机改为了所有可达的 IP 地址,并且关闭了保护模式,允许无密码访问。这样的配置是不安全的。不可在实际生产环境使用。否则会产生极大的安全隐患,并可能导致生产事故。建议在虚拟化软件中将网络适配器设置为 NAT 模式,阻止将虚拟机直接暴露在外部网络,以防被第三方扫描到、访问或攻击。

如果配置正确,应该长得像这样:

配置文件图

接下来我们来启动 Redis:

sudo systemctl enable redis-server
sudo systemctl restart redis-server

以上命令将 Redis 设置为开机启动,并启动 Redis 服务器。

通过这样的安装方法,我们不需要自己编译 Redis,不需要保持登录,不需要手动启动 Redis 服务,同时符合由 systemd 管理系统服务的标准操作。

如果你想确认 Redis 启动成功,可以执行 sudo systemctl status redis-server 来查看运行状态。

Redis 服务启动

安装 MongoDB

MongoDB 的安装比 Redis 更复杂一些,一部分原因是 MongoDB 的发行模式和微软臭味相投:自行维护软件库,而不是同步到各大发行版的软件包库中。

小修复

修正 Ubuntu 22 废弃 libssl1.1 的问题:

echo "deb http://mirrors.ustc.edu.cn/ubuntu focal-security main" | sudo tee /etc/apt/sources.list.d/focal-security.list
sudo apt update
sudo apt install -y libssl1.1

怪谁呢?

MongoDB 官方并没有 Ubuntu 22 支持。所以我们只能强制从 Ubuntu 20 获取 libssl1.1 包,具体是否有安全性问题仍然有待商榷。不建议在生产环境使用。

安装 MongoDB

wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
sudo apt update
sudo apt install -y mongodb-org

修改 MongoDB 配置文件

  • 修改 MongoDB 配置文件:
    sudo nano /etc/mongod.conf
    
  • 找到 bindIp 字段,修改为 0.0.0.0
  • 保存退出

这还是不安全的!

由于受到虚拟机 NAT 的保护,我们可以在本次实验中这么配置,但务必不可在生产环境中如此配置服务器。

mongod.conf

启动 MongoDB

类似 Redis:

sudo systemctl enable mongod
sudo systemctl start mongod

如果你想确认 MongoDB 启动成功,可以执行 sudo systemctl status mongod 来查看运行状态。

mongod 状态

使用 Redis CLI

运行 redis-cli 来进入 Redis CLI.

  1. 用 Redis 的 hash 结构设计出学生表 Student1
    hset student.zhangsan English 69
    
    hset student.zhangsan Math 86
    
    hset student.zhangsan Computer 77
    
    hset student.lisi English 55
    
    hset student.lisi Math 100
    
    hset student.lisi Computer 88
    
  2. hgetall 命令分别输出 zhangsanlisi 的成绩信息:
    hgetall student.zhangsan
    
    hgetall student.lisi
    
  3. hget 命令查询 zhangsanComputer 成绩:
    hget student.zhangsan Computer
    
  4. 修改 lisiMath 成绩,改为 95
    hset student.lisi Math 95
    

使用 exit 命令退出。

Redis CLI

使用 Mongosh

运行 mongosh 来进入 Mongo Shell.

  1. 用 MongoDB Shell 设计出 student 集合:
    use student;
    var stus = [
      {
        "name": "zhangsan",
        "scores": {
          "English": 69,
          "Math": 86,
          "Computer": 77
        }
      },
      {
        "name": "lisi",
        "scores": {
          "English": 55,
          "Math": 100,
          "Computer": 88
        }
      }
    ];
    db.student.insert(stus);
    
  2. find() 函数输出两个学生的信息:
    db.student.find().pretty();
    
  3. find() 函数查询 zhangsan 的所有成绩(只显示 score 列)
    db.student.find({"name":"zhangsan"},{"_id":0,"name":0});
    
  4. 修改 lisiMath 成绩为 95
    db.student.update({"name":"lisi"}, {"$set":{"scores.Math":95}});
    

Mongosh 效果图 1 Mongosh 效果图 2

使用 exit 命令退出。

使用 Java API

不要直接运行!

在下载源码后,请修改 src/main/org/example/Main.java 中的 jobActions 定义,设置为正确的 Redis/MongoDB 服务器地址。

不需要在虚拟机运行

本实验中的 Java 程序可以在本机运行,不需要打包为 jar 后放置在服务器上运行。甚至不需要服务器有 Java 环境。

本实验项目主要供参考,不需要进行太多的代码补全,请 下载示例源码运行。


  1. 这么写的原因是 Redis CLI 不接受多行输入……方便逐条复制粘贴操作