如何在Ubuntu14.04上使用memcached向MySQL添加NoSQL查询
介绍
使用 memcached 及其与 MySQL 的独立服务器实现的一般想法已在许多优秀文章中进行了描述,例如 How To Install and Use Memcache on Ubuntu 14.04。 但是,memcached 作为独立服务器在 MySQL 客户端访问层之前充当中介,并且仅在内存中管理信息,而没有持久存储它的选项。 这使其适用于缓存重复 MySQL 查询的结果等任务。 这可以节省资源并优化繁忙站点的性能。
但是,在本文中,我们将讨论一些不同的东西。 Memcached 将作为 MySQL 插件安装并紧密集成到 MySQL 中。 它将提供 NoSQL 风格的访问层,用于直接管理常规 MySQL InnoDB 表中的信息。 这有很多好处,我们将在本文后面看到。
基本理解
为了能够阅读本文,您需要对 NoSQL 和 memcached 是什么有一些基本的了解。 简而言之,NoSQL 使用键值项形式的信息。 这种明显比标准 SQL 更简单的方法表明具有更好的性能和可扩展性,尤其适用于处理大量信息(大数据)。
但是,NoSQL 的良好性能并不足以取代通常的 SQL。 NoSQL 的简单性使其不适用于其中具有复杂关系的结构化数据。 因此,NoSQL 不是 SQL 的替代品,而是对它的重要补充。
至于memcached,可以看做是NoSQL的一个流行实现。 顾名思义,它非常快并且具有出色的缓存机制。 这就是为什么它将 NoSQL 风格引入传统 MySQL 的绝佳选择。
还需要对 memcached 协议有所了解。 Memcached 适用于具有以下部分的项目:
- A key — 字母数字值,它将成为访问项目的 value 的键。
- A value — 保存基本有效负载的任意数据。
- A flag — 通常用于设置与主值相关的附加参数的值。 例如,它可以是是否使用压缩的标志。
- 过期时间 — 过期时间,以秒为单位。 回想一下,memcached 最初设计时考虑了缓存。
- CAS 值 — 每个项目的唯一标识符。
先决条件
本指南已在 Ubuntu 14.04 上进行了测试。 所描述的安装和配置在其他操作系统或操作系统版本上会类似,但配置文件的命令和位置可能会有所不同。
您将需要以下内容:
- Ubuntu 14.04 全新安装
- 具有 sudo 权限的非 root 用户
本教程中的所有命令都应以非 root 用户身份运行。 如果该命令需要 root 访问权限,它将在前面加上 sudo
。 如果您还没有设置,请按照本教程进行操作:使用 Ubuntu 14.04 进行初始服务器设置。
第 1 步 — 安装 MySQL 5.6
MySQL 中的 memcached 插件在 MySQL 5.6.6 以上的版本中可用。 这意味着您不能使用标准 Ubuntu 14.04 存储库中的 MySQL 包(版本 5.5)。 相反,您必须:
- 添加 MySQL 官方仓库
- 从它安装 MySQL 服务器、客户端和库
首先,转到 MySQL apt 存储库页面 并下载将 MySQL 存储库添加到您的 Ubuntu 14.04 系统的软件包。 您可以直接在 Droplet 上下载该软件包:
wget https://dev.mysql.com/get/mysql-apt-config_0.3.5-1ubuntu14.04_all.deb
接下来,使用 dpkg
安装它:
sudo dpkg -i mysql-apt-config_0.3.5-1ubuntu14.04_all.deb
运行上述命令时,会出现一个文本模式向导,其中包含两个问题:
- 您希望配置哪个 MySQL 产品? 用
Server
回答。 - 您希望收到哪个服务器版本? 用
mysql-5.6
回答。
回答完这两个问题后,您将回到第一个问题,即您希望安装哪种产品。 回答 Apply
(底部选项)以确认您的选择并退出向导。
现在您有了新的 MySQL 存储库,您必须更新 apt 缓存,即 有关可在 Ubuntu 中安装的可用软件包的信息。 因此,当您选择安装 MySQL 时,它将从新存储库中检索。 要更新 apt 缓存,请运行以下命令:
sudo apt-get update
之后,您就可以使用以下命令在 Ubuntu 14.04 上安装 MySQL 5.6:
sudo apt-get install mysql-server
运行上述命令后,系统会要求您选择 MySQL 根(管理员)密码。 为方便起见,此时您可以选择不设置密码,并在出现提示时按 ENTER。 但是,一旦您决定将此服务器投入生产,建议您运行命令 sudo mysql_secure_installation
以保护您的 MySQL 安装并配置 root 密码。
安装过程完成后,您将安装 MySQL 服务器 5.6 及其命令行客户端和必要的库。 您可以通过使用以下命令启动客户端来验证它:
mysql -u root
如果您设置了密码,则需要使用以下命令并在出现提示时输入您的 MySQL root 密码:
mysql -u root -p
你应该看到:
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.6.25 MySQL Community Server (GPL) ...
在 MySQL 监视器(客户端)中,创建一个名为 test
的新数据库:
CREATE DATABASE test;
稍后我们将需要此数据库进行测试。
要退出 MySQL 客户端类型:
quit
最后,作为 memcached 插件的依赖项,您还需要安装异步事件通知库的开发包 - libevent-dev
。 要做到这一点,请运行以下命令:
sudo apt-get install libevent-dev
第 2 步 — 在 MySQL 中安装 memcached 插件
要准备 memcached 插件安装,您首先必须执行文件 /usr/share/mysql/innodb_memcached_config.sql
中的查询。 启动 MySQL 客户端:
mysql -u root
或者,如果您设置了密码:
mysql -u root -p
并执行:
source /usr/share/mysql/innodb_memcached_config.sql;
这将在数据库 innodb_memcache
中为插件创建所有必要的设置,并在我们新创建的数据库 test
中插入一些示例数据。
之后,您可以使用以下命令从 MySQL 终端安装 memcached 插件:
install plugin daemon_memcached soname "libmemcached.so";
退出 MySQL 会话:
quit
这将安装在 Ubuntu 14.04 的目录 /usr/lib/mysql/plugin/
中找到的 memcached 插件。 此文件仅在 MySQL 5.6 及更高版本中可用。
安装完成后,您必须配置 memcached 插件侦听器。 您将需要它来连接到 memcached 插件。 为此,请使用您喜欢的编辑器打开文件 /etc/mysql/my.cnf
,如下所示:
sudo vim /etc/mysql/my.cnf
在 [mysqld]
行之后的某处添加一个新行,其中包含:
/etc/mysql/my.cnf
daemon_memcached_option="-p11222 -l 127.0.0.1"
以上配置了仅对环回 IP 127.0.0.1 启用的端口 11222 上的 memcached 插件侦听器。 这意味着只有来自 Droplet 的客户端才能连接。 如果省略 IP 部分(-l 127.0.0.1
),新的监听器将可以从任何地方自由访问,这是一个严重的安全风险。 如果您进一步担心 memcached 插件的安全性,请查看 其安全文档。
要为 memcached 插件启动新的侦听器进程,请使用以下命令重新启动 MySQL 服务器:
sudo service mysql restart
第 3 步 — 测试 memcached 插件
要验证安装是否成功,请从 MySQL 客户端运行以下 MySQL 命令(使用 mysql -u root
或 mysql -u root -p
启动客户端):
show plugins;
如果一切正常,您应该在输出中看到:
| daemon_memcached | ACTIVE | DAEMON | libmemcached.so | GPL |
如果您没有看到这一点,请确保您使用的是 MySQL 5.6 或更高版本,并且您已完全按照安装说明进行操作。
您还可以尝试从您的 Droplet 使用 Telnet 连接到新的 memcached 插件接口,如下所示:
telnet localhost 11222
成功后,您应该会看到如下输出:
Connected to localhost. Escape character is '^]'.
现在您可以运行一个通用命令,例如 stats
,用于统计,以查看此连接是如何工作的。 要退出提示,同时按下键盘上的 CTRL 和 ] 的组合。 之后键入 quit
退出 Telnet 客户端本身。
Telnet 为您提供了连接到 memcached 插件和 MySQL 数据本身的最简单方法。 它非常适合测试,但是当您决定专业使用它时,您应该使用现成的库来支持 PHP 和 Python 等流行的编程语言。
第 4 步 — 通过 memcached 插件在 MySQL 中运行 NoSQL 查询
如果你回到本文中 memcached 插件的安装部分,你会看到我们执行了文件 /usr/share/mysql/innodb_memcached_config.sql
中的语句。 这些语句在 test
数据库中创建了一个新表 demo_test
。 demo_test
表有以下符合 memcached 协议的列:
c1
实现了 key 字段。c2
实现 value 字段。c3
实现了 flag 字段。c4
实现 CAS 字段。c5
实现了 expiration 字段。
表 demo_test
将是我们将要测试的表。 首先,让我们使用以下命令使用 MySQL 客户端打开数据库/表:
mysql -u root test
或者,如果您设置了 MySQL 密码:
mysql -u root test -p
demo_test
表中应该已经有一行:
SELECT * FROM demo_test;
结果应如下所示:
+-------------+--------------+------+------+------+ | c1 | c2 | c3 | c4 | c5 | +-------------+--------------+------+------+------+ | AA | HELLO, HELLO | 8 | 0 | 0 | +-------------+--------------+------+------+------+ 1 rows in set (0.00 sec)
退出 MySQL 会话:
quit
现在,让我们使用 memcached NoSQL 接口和 telnet 创建第二条记录。 再次连接到 TCP 端口 11222 上的 localhost:
telnet localhost 11222
然后使用以下语法:
set [key] [flag] [expiration] [length in bytes] [value]
请注意, 值 必须在新行上。 此外,对于每条记录,您必须在以上述方式工作时指定值的字节长度。
例如,让我们创建一个新项目(数据库行),键为 newkey
,值为 0
为标志,值为 0
为过期(永不过期)。 该值的长度为 12 个字节。
set newkey 0 0 12 NewTestValue
当然,您也可以通过这个 NoSQL 接口检索值。 这是通过 get
命令完成的,该命令后跟要检索的密钥的名称。 仍在 Telnet 会话中时,键入:
get newkey
结果应该是:
VALUE newkey 0 12 NewTestValue
上面的 set
和 get
命令对每个 memcached 服务器都有效。 这些只是如何以 NoSQL 样式插入和检索记录的几个简单示例。
现在让我们使用命令 mysql -u root test
或 mysql -u root test -p
再次连接到 MySQL 客户端,并通过运行 qyery 再次查看 demo_test
表的内容:
SELECT * FROM demo_test WHERE c1="newkey";
在那里,您应该会看到新创建的行,如下所示:
+--------+--------------+------+------+------+ | c1 | c2 | c3 | c4 | c5 | +--------+--------------+------+------+------+ | newkey | NewTestValue | 0 | 1 | 0 | +--------+--------------+------+------+------+
现在您可能想知道 memcached 插件如何知道要连接到哪个数据库和表以及如何将信息映射到表列。 答案在数据库 innodb_memcache
及其表 containers
中。
执行这个选择语句:
select * from containers \G
您将看到以下内容:
*************************** 1. row *************************** name: aaa db_schema: test db_table: demo_test key_columns: c1 value_columns: c2 flags: c3 cas_column: c4 expire_time_column: c5 unique_idx_name_on_key: PRIMARY 1 row in set (0.00 sec)
要了解有关如何创建不同映射和了解 memcached 插件的高级功能的更多信息,请查看 memcached 插件内部页面 。
将 MySQL 与 memcached 插件集成的好处
以上信息和示例概述了通过 memcached 插件将 MySQL 与 NoSQL 集成的一些重要好处:
- 您的所有数据(MySQL 和 NoSQL)都可以保存在一个地方。 您不必为 NoSQL 数据安装和维护其他软件。
- 得益于强大的 InnoDB 存储引擎,NoSQL 数据的数据持久化、恢复和复制成为可能。
- 仍然可以使用令人难以置信的快速 memcached 数据访问层,因此与使用速度较慢的 MySQL 客户端相比,您可以处理更多的信息。
- NoSQL 数据可以使用 MySQL 接口和语法进行管理。 因此,您可以在更复杂的 SQL 查询(例如左连接)中包含 NoSQL 数据。
结论
在本文结束时,您应该熟悉使用 MySQL 提供的 NoSQL 数据的新可能性。 这可能不是替代 MongoDB 等专用 NoSQL 服务器的通用解决方案,但它确实有其优点。