dot Redis 8 来了——而且它是开源的

了解更多

将 Redis 模块引入 ARM 领域 – 第 1 部分

在 Redis,我们将 Redis 模块引入 ARM 领域的动机是 RedisEdge。当然,Redis 早已 natively 支持该领域,包括 glibc 和 alpine/musl 版本。Redis 模块已经在多平台场景中出现,运行在各种 Linux 发行版上,并主要为了开发体验而支持 macOS。然而,直到 RedisEdge(它面向 IoT 设备),它才变得更加面向企业/数据中心。在本系列文章中,我将描述我们对 ARM 平台支持的愿景和开发者用户体验,以及我们为实现这一目标所采取的步骤。

如果您按照步骤操作,您将拥有一个功能齐全的 ARM 构建实验室。

RedisEdge 内部

让我们看看 RedisEdge。RedisEdge 不是一个 Redis 模块,而是三个 Redis 模块的集合:RedisGears、RedisAI 和 RedisTimeSeries。它作为 Docker 镜像分发,基于 Redis Server 5.0。因此,用户可以简单地拉取镜像,运行它,然后开始发布 Redis 命令;将模型加载到 RedisAI 中;并在 RedisGears 上执行 Python gears 脚本。虽然通过安装 Redis 服务器和复制 Redis 模块文件可以轻松地将 Docker 从等式中移除,但我们将看到 Docker 实际上提供了重要的附加价值,值得保留。

RedisEdge 内部:模块结构

现在,让我们看看 RedisEdge 的每个组件,以确定将它们移植到 ARM 需要什么。首先是 RedisTimeSeries。它是一个使用 make 构建的简单 C 库。甚至没有 configure 脚本。这没什么问题。接下来是 RedisGears。它是一个使用 make 构建的 C 库,并且还使用了嵌入式 Python 3.7 解释器,该解释器是从源代码构建的。这需要运行 automake 来生成特定于平台的 makefile。最后是 RedisAI。它是一个使用 CMake 构建的 C 库,它包括模块化的“引擎”,允许抽象和封装 TensorFlow、PyTorch 和 ONNXRuntime 等 AI 库的 C 库形式——大多数用户通常在 Python 中使用它们,而 PyTorch 和 ONNXRuntime 并不官方支持 ARM。所以看起来,构建要求迅速恶化。从构建一个简单的 C 库,变成了使用复杂的构建系统编译庞大的源代码基础。

在以下各节中,我们将为每个组件匹配其适当的构建方法。

为 ARM 构建

现在,我们将暂停一下,评估为 ARM 构建软件所需的条件。最显而易见的方法是使用基于 ARM 的设备,比如 Raspberry Pi。一旦设置好,您将能够以最自然的方式进行构建和测试。

测试介质很重要:即使您无需物理 ARM 设备就可以构建几乎所有 ARM 软件,但在没有此类设备的情况下,尤其对于非标准设备,也无法可靠地测试结果。因此,尽管虚拟化/仿真/容器化测试可能有用,但您应该始终在其指定的目标设备上测试您的软件。

一台带有 4GB 内存(以及同样重要的 1Gbps 网卡)和一张快速 microSD 卡的 Raspberry Pi 4 看起来很有前景。

关于 ARM 上的操作系统选择:选项有限,经验法则是选择最新版本的 Raspbian(这是为 RPi 定制的 Debian 发行版)、Ubuntu 或 Fedora,后两者提供了易于安装的 ARM 系统。不用担心不成熟:事实一次又一次证明,较新的系统工作得更好,而旧系统无法跟上。

安装操作系统带来了第一个困境:如果我们安装 Raspbian,我们将获得一个 32 位操作系统(即 arm32v7 平台)。如果我们选择 64 位 Ubuntu,我们将获得一个 arm64v8 平台(我们稍后会详细讨论 ARM 平台)。如果我们打算支持这两个平台(就像我们对 RedisEdge 所做的那样),我们可以获得两张 SD 卡,在每张卡上安装各自的操作系统,并轮流使用设备,或者获得两台 RPi 设备(这并不是非常昂贵)。我推荐后一种方法。

现在,关于操作系统选择的主要原则是:我们的目标是拥有一个带有最新 Docker 版本的稳定系统。任何满足这些要求的操作系统都可以。没错:我们将使用 Docker 来获取我们真正希望为其构建的操作系统,将底层操作系统用作基础设施。这也有助于确保我们的构建实验 propery 隔离。

如果您手头有一台 RPi 设备,现在就可以着手使其可用。在下一篇文章中,我们将介绍无需物理 ARM 机器的构建方法。

在 RPi 3 和 4 上安装 Ubuntu 19.04

关于如何在 RPi 上下载和安装最新 Ubuntu Server for ARM 的非常好的详细说明,可以在此处找到,适用于 Linux、Windows 和 macOS。但是,您应该按照以下说明安装 Ubuntu 19.04,而不是最新发布的版本

  • 准备一张 microSD 卡:64GB,Class 10,任何与 Samsung EVO 或 SanDisk Ultra 相当(即价格水平相当)的都可以。
  • 下载操作系统 镜像 (通常是 .img 或 .raw 格式,已存档)并解压。虽然可以从 .iso 文件安装,但使用 .img 镜像更直接,因此推荐使用。
  • 使用 Balena Etcher 等工具将其写入 microSD 卡(它适用于所有平台,我个人使用 Win32 Disk Imager)。为了写入,您应该使用笔记本电脑内置的 microSD 读卡器或获取一个带有 USB 接口的外部读卡器。
  • 将 microSD 卡插入 RPi 并打开设备电源。
  • 用户名/密码:ubuntu/ubuntu

在 RPi 3 和 4 上安装 Raspbian Buster

  • 使用 Raspbian Lite 镜像 重复上述步骤。
  • 用户名/密码:pi/raspberry

连接到工作站

我所说的“工作站”是指一个存放开发环境和 git 仓库的 Linux 或 macOS 主机。另外,我强烈建议使用台式机(那是另一篇博客文章),尽管大多数人使用笔记本电脑。无论哪种情况,我还建议在您的工作站上拥有一些虚拟化基础设施,例如 VMware Workstation/Fusion 或 VirtualBox。

因此,我们需要在 RPi 和工作站之间建立网络连接。如前所述,RPi 4 具有 1Gbps 网卡,这是相对于具有 100Mbps 网卡的 RPi 3 的巨大改进。将 RPi 连接到网络很简单:获取任何千兆以太网非网管交换机和两根网线,然后将 RPi 连接到交换机,并将交换机连接到您的网关以太网端口。您也可以将工作站连接到交换机。

在此阶段,我们需要从工作站收集一些信息。

首先,我们需要确定拥有视图的工作站用户的 UID 和 GID

_id

我们将它们称为 MY-UID 和 MY-GID。

接下来,我们需要找出我们的时区

timedatectl

我们将它称为 MY-TIMEZONE。

最后,我们将需要您的工作站 IP

ip a

我们将它称为 MY-WORKSTATION-IP。

RPi 配置

在初始设置期间,您需要将 RPi 连接到显示器和键盘。设置完成后,可以通过 SSH 从工作站控制它。

另一个好的做法是避免将源代码克隆到 RPi 中,而是通过 NFS 在工作站和 RPi 之间共享源代码。

为方便起见,我假设我们以 root 用户身份操作(例如通过 sudo bash)。

那么让我们开始配置吧

主机名
hostnamectl set-hostname MY-HOSTNAME
时区和 NTP
# recall MY-TIMEZONE from previous section
timedatectl set-timezone MY-TIMEZONE
# confirm settings
timedatectl
SSH 服务器
apt-get -qq update
apt install -qy openssh-server
systemctl start openssh-server
systemctl enable openssh-server
IP
ip a
# record ip address, connect via ssh from workstation
NFS 客户端
apt install -qy nfs-common
mkdir -p /mnt/views
ln -s /mnt/views /v

将以下内容添加到 etc/hosts

workstation MY-WORKSTATION-IP

此外,将以下行添加到 etc/fstab

workstation:/views /mnt/views nfs defaults 0 0
工具
apt install -qy tmux ca-certificates curl wget htop mc tmux

在工作站端

关于 git 仓库,我将在整个讨论中采用以下术语和结构。这并非强制,您也可以以不同方式组织。术语“view”指在特定上下文中使用的 git 仓库克隆集。例如,如果我们在 ARM 编译的上下文中处理 RedisEdge 模块,我们将得到以下目录结构

/views/arm1/
	RedisEdge
	RedisTimeSeries
	RedisGears
	RedisAI

这里 ‘arm1’ 是视图名称,它包含的目录是相应的 git clone 命令的结果。可能还有其他视图服务于其他上下文。目的是在所有主机和容器之间共享此结构,以避免代码移动和 git 密钥管理的麻烦。

为了更加方便,我添加了以下链接

mkdir /views
ln -s /views /v

所以,最后,我们来设置 NFS。

现在以 root 用户身份继续

Ubuntu/Debian

注意 MY-UID 和 MY-GID 的值。

apt-get -qq update
apt-get install -qy nfs-kernel-server nfs-common
echo "/views *(rw,all_squash,anonuid=MY-UID,anongid=MY-GID)" >> /etc/exports
systemctl start nfs-kernel-server
systemctl enable nfs-kernel-server
Fedora/CentOS

注意 MY-UID 和 MY-GID 的值。

yum install nfs-utils
echo "/views *(rw,all_squash,anonuid=MY-UID,anongid=MY-GID)" >> /etc/exports
systemctl start rpcbind nfs-server
systemctl enable rpcbind nfs-server

请注意,如果您的工作站防火墙已启用,可能会干扰 NFS。对于有线连接,请考虑将其关闭。

回到 RPi

现在我们在工作站上设置了 NFS,可以将视图目录挂载到 RPi 中

mount -a
ls /v

最后,我们可以安装 Docker 和 Docker Compose。

在 Ubuntu 19.04 上安装 Docker
# install Docker
curl -fsSL https://get.docker.com | sh

# install Docker Compose
curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker- compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
在 Raspbian Buster 上安装 Docker
# install Docker
apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
add-apt-repository \
    "deb [arch=armhf] https://download.docker.com/linux/raspbian buster stable"
apt-get -qq update
apt-get install docker-ce docker-ce-cli containerd.io
# this will prevent "docker login" failure
rm -f /usr/bin/docker-credential-secretservice

# install Docker Compose
apt-get install -y pass gnupg2
apt-get install -y python libffi-dev python-openssl python-dev
curl -sSL https://bootstrap.pypa.io/get-pip.py | python
pip2 install docker-compose==1.24.1

在下一章中

在下一篇文章中,我将介绍我们所期望的开发者体验,详细讨论 ARM 平台,介绍无需使用 ARM 硬件构建 ARM 版本的方法,并开始将理论付诸实践,使用 RedisEdge 模块。

敬请关注!