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