如何在Ubuntu 14.04上使用memcached将NoSQL查询添加到MySQL

2018-09-19 17:37:02 浏览数 (1)

介绍

在许多优秀的文章中已经描述了使用memcached及其独立服务器实现与MySQL的一般概念,但是,作为独立服务器的memcached在MySQL客户端访问层之前充当中介,并且仅在内存中管理信息,而无需持久存储它。这使得它适用于缓存重复MySQL查询结果等任务。这样可以节省资源并优化繁忙站点的性能。

但是,在本文中,我们将讨论不同的内容。Memcached将作为MySQL插件安装并紧密集成到MySQL中。它将提供NoSQL样式访问层,用于直接在常规MySQL InnoDB表中管理信息。这有很多好处,我们将在本文后面看到。

基本理解

为了能够理解本文,您需要对NoSQL和memcached的基本知识有所了解。简而言之,NoSQL以键值项的形式处理信息。这种明显比标准SQL更简单的方法表明了更好的性能和可扩展性,这些都是处理大量信息(大数据)时特别需要的。

但是,NoSQL的良好性能还不足以取代通常的SQL。NoSQL的简单性使其不适用于具有复杂关系的结构化数据。因此,NoSQL不是SQL的替代品,而是一个重要的补充。

至于memcached,它可以被视为NoSQL的流行实现。顾名思义,它的速度非常快,并且具有出色的缓存机制。这就是它使得将NoSQL风格带入传统MySQL成为绝佳选择的原因。

您还需要对memcached协议有一些了解。Memcached适用于具有以下部分的项目:

  • 一个键 - 字母数字值,它将是访问项目值的关键。
  • 一个值 -任意数据,其中所述有效载荷基本保持。
  • 一个标志 -一般用于建立与主值的附加参数的值。例如,它可能是一个是否使用压缩的标志。
  • 一个到期时间 -以秒为到期时间。回想一下,memcached最初设计时考虑了缓存。
  • 一个CAS值 -每个项目的唯一标识符。

先决条件

本指南已在Ubuntu 14.04上测试过。所描述的安装和配置在其他OS或OS版本上类似,但配置文件的命令和位置可能不同。

您将需要以下内容:

  • 全新安装的Ubuntu 14.04服务器
  • 具有sudo权限的非root用户

没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器。

本教程中的所有命令都应以非root用户身份运行。如果命令需要root访问权限,则前面会有sudo

第1步 - 安装MySQL 5.6

MySQL中的memcached插件可用于5.6.6以上的MySQL版本。这意味着您无法使用标准Ubuntu 14.04存储库中的MySQL包(版本5.5)。相反,你必须:

  1. 添加MySQL官方存储库
  2. 从中安装MySQL服务器,客户端和库

您可以直接在腾讯云CVM上下载该软件包。建议您直接使用云关系型数据库,云关系型数据库让您在云中轻松部署、管理和扩展的关系型数据库,提供安全可靠、伸缩灵活的按需云数据库服务。腾讯云关系型数据库提供 MySQL、SQL Server、MariaDB、PostgreSQL 数据库引擎,并针对数据库引擎的性能进行了优化。云关系型数据库是一种高度可用的托管服务,提供容灾、备份、恢复、监控、迁移等数据库运维全套解决方案,可将您从耗时的数据库管理任务中解放出来,让您有更多时间专注于您的应用和业务。

代码语言:javascript复制
wget https://dev.mysql.com/get/mysql-apt-config_0.3.5-1ubuntu14.04_all.deb

接下来,使用dpkg安装它:

代码语言:javascript复制
sudo dpkg -i mysql-apt-config_0.3.5-1ubuntu14.04_all.deb

运行上述命令时,会出现一个文本模式向导,其中包含两个问题:

  • 您希望配置哪种MySQL产品?用Server回答。
  • 您希望收到哪个服务器版本?用mysql-5.6回答。

回答完这两个问题之后,您将回到第一个问题,即您要安装哪个产品。用最底层的选择Apply回答,确认您的选择并退出向导。

现在你有了新的MySQL repo,你将不得不更新apt缓存,即有关在Ubuntu中安装的可用包的信息。因此,当您选择安装MySQL时,它将从新存储库中检索。要更新apt缓存,请运行以下命令:

代码语言:javascript复制
sudo apt-get update

之后,您可以使用以下命令在Ubuntu 14.04上安装MySQL 5.6:

代码语言:javascript复制
sudo apt-get install mysql-server

运行上述命令后,系统会要求您选择MySQL root(管理员)密码。为方便起见,您可以选择此时不设置密码,在提示时只需按ENTER键。但是,一旦您决定将此服务器投入生产,建议您运行该命令sudo mysql_secure_installation以保护MySQL安装并配置root密码。

安装过程完成后,您将安装MySQL服务器5.6及其命令行客户端和必要的库。您可以使用以下命令启动客户端来验证它:

代码语言:javascript复制
mysql -u root

如果设置了密码,则需要使用以下命令并在出现提示时输入MySQL root密码:

代码语言:javascript复制
mysql -u root -p

你会看到:

代码语言:javascript复制
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

代码语言:javascript复制
CREATE DATABASE test;

我们稍后需要这个数据库进行测试。

要退出MySQL客户端:

代码语言:javascript复制
quit

最后,作为memcached插件的依赖项,您还需要为异步事件通知库安装开发包 - libevent-dev。要实现此目的,请运行以下命令:

代码语言:javascript复制
sudo apt-get install libevent-dev

第2步 - 在MySQL中安装memcached插件

要准备memcached插件安装,首先必须在文件/usr/share/mysql/innodb_memcached_config.sql中执行查询。启动MySQL客户端:

代码语言:javascript复制
mysql -u root

或者,如果您设置了密码:

代码语言:javascript复制
mysql -u root -p

并执行:

代码语言:javascript复制
source /usr/share/mysql/innodb_memcached_config.sql;

这将为数据库innodb_memcache中的插件创建所有必要的设置,并在我们新创建的数据库test中插入一些示例数据。

之后,您可以使用以下命令从MySQL终端执行memcached插件的安装:

代码语言:javascript复制
install plugin daemon_memcached soname "libmemcached.so";

退出MySQL会话:

代码语言:javascript复制
quit

这将安装memcached插件,该插件位于Ubuntu 14.04 的目录/usr/lib/mysql/plugin/中。此文件仅在MySQL 5.6及更高版本中可用。

安装完成后,您必须配置memcached插件侦听器。您将需要它来连接到memcached插件。为此,请使用您喜欢的编辑器打开文件/etc/mysql/my.cnf,如下所示:

代码语言:javascript复制
sudo vim /etc/mysql/my.cnf

[mysqld]行之后的某处添加一个包含以下内容的新行:

代码语言:javascript复制
daemon_memcached_option="-p11222 -l 127.0.0.1"

以上配置仅在端回IP 127.0.0.1上启用的端口11222上的memcached插件侦听器。这意味着只有腾讯云CVM的客户端才能连接。如果省略关于IP(-l 127.0.0.1)的部分,则可以从任何地方免费访问新的侦听器,这是一个严重的安全风险。

要启动memcached插件的新侦听器进程,请使用以下命令重新启动MySQL服务器:

代码语言:javascript复制
sudo service mysql restart

第3步 - 测试memcached插件

要验证安装是否成功,请从MySQL客户端运行以下MySQL命令(使用mysql -u root或启动客户端mysql -u root -p):

代码语言:javascript复制
show plugins;

如果一切正常,你会在输出中看到:

代码语言:javascript复制
| daemon_memcached           | ACTIVE  | DAEMON           | libmemcached.so | GPL     |

如果您没有看到这个,请确保您使用的是MySQL 5.6或更高版本,并且您已经准确地遵循了安装说明。

您还可以尝试使用腾讯云CVM中的Telnet连接到新的memcached插件接口,如下所示:

代码语言:javascript复制
telnet localhost 11222

成功后,您应该看到输出,例如:

代码语言:javascript复制
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实现关键字段。
  • c2实现值字段。
  • c3实现标志字段。
  • c4实现CAS字段。
  • c5实现到期字段。

该表demo_test将是我们将要测试的表。首先,让我们用MySQL客户端使用以下命令打开数据库/表:

代码语言:javascript复制
mysql -u root test

或者,如果您设置了MySQL密码:

代码语言:javascript复制
mysql -u root test -p

demo_test表中应该已经有一行:

代码语言:javascript复制
SELECT * FROM demo_test;

结果应如下所示:

代码语言:javascript复制
 ------------- -------------- ------ ------ ------ 
| c1          | c2           | c3   | c4   | c5   |
 ------------- -------------- ------ ------ ------ 
| AA          | HELLO, HELLO |    8 |    0 |    0 |
 ------------- -------------- ------ ------ ------ 
1 rows in set (0.00 sec)

退出MySQL会话:

代码语言:javascript复制
quit

现在,让我们使用memcached NoSQL接口和telnet创建第二条记录。再次连接到TCP端口11222上的localhost:

代码语言:javascript复制
telnet localhost 11222

然后使用以下语法:

代码语言:javascript复制
set [key] [flag] [expiration] [length in bytes]
[value]

请注意,该值必须位于新行上。此外,对于每个记录,您必须以上述方式指定值的长度(以字节为单位)。

例如,让我们创建一个新项(数据库行),其中包含关键字段 newkey,标志值0和到期字段值(永不过期)。该值的长度为12个字节。

代码语言:javascript复制
set newkey 0 0 12
NewTestValue

当然,您也可以通过此NoSQL界面检索值。这是通过get命令完成的,该命令后跟要检索的键的名称。仍在Telnet会话中,键入:

代码语言:javascript复制
get newkey

结果应该是:

代码语言:javascript复制
VALUE newkey 0 12
NewTestValue

以上setget命令的有效期为每个memcached服务器。这些只是一些简单的示例,说明如何以NoSQL样式插入和检索记录。

现在让我们使用命令mysql -u root test或者mysql -u root test -p再次连接到MySQL客户端,然后通过运行qyery再次查看demo_test表的内容:

代码语言:javascript复制
SELECT * FROM demo_test WHERE c1="newkey";

你应该看到新创建的行如下:

代码语言:javascript复制
 -------- -------------- ------ ------ ------ 
| c1     | c2           | c3   | c4   | c5   |
 -------- -------------- ------ ------ ------ 
| newkey | NewTestValue |    0 |    1 |    0 |
 -------- -------------- ------ ------ ------ 

到目前为止,您可能想知道memcached插件如何知道要连接到哪个数据库和表以及如何将信息映射到表列。答案在数据库innodb_memcache及其表containers中。

执行这个select语句:

代码语言:javascript复制
select * from containers G

您将看到以下内容:

代码语言:javascript复制
*************************** 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)

将MySQL与memcached插件集成的好处

以上信息和示例概述了通过memcached插件将MySQL与NoSQL集成的一些重要好处:

  • 您的所有数据(MySQL和NoSQL)都可以保存在一个地方。您无需为NoSQL数据安装和维护其他软件。
  • 借助强大的InnoDB存储引擎,可以实现NoSQL数据的数据持久性,恢复和复制。
  • 仍然可以使用非常快速的memcached数据访问层,这样与使用较慢的MySQL客户端相比,您可以使用更多的信息。
  • 可以使用MySQL接口和语法管理NoSQL数据。因此,您可以在更复杂的SQL查询(如左连接)中包含NoSQL数据。

结论

在本文结束时,您应该熟悉使用MySQL提供的NoSQL数据的新可能性。这可能不是替换MongoDB等专用NoSQL服务器的通用解决方案,但它确实有其优点。

想要了解更多关于memcashed插件的相关教程,请前往腾讯云 社区学习更多知识。

参考文献:《How To Add NoSQL Queries to MySQL with memcached on Ubuntu 14.04》

0 人点赞