如何在 Ubuntu 14.04 上安装 MemSQL

與 [MemSQL] 合作撰寫(http://www.memsql.com/)

介绍

MemSQL是一种内存数据库,可以提供比传统数据库更快的阅读和写入服务,尽管它是一种新技术,但它讲述了MySQL协议,所以感觉很熟悉。

MemSQL 拥抱了 MySQL 的最新功能,具有现代功能,如 JSON 支持和数据上传的能力,MemSQL 对 MySQL 的最大优势之一是它能够将单个查询分成多个节点,称为 massively parallel processing,从而导致更快的读取查询。

在本教程中,我们将安装MemSQL在一个Ubuntu 14.04服务器上,运行性能基准,并通过命令行MySQL客户端插入JSON数据。

前提条件

要遵循本教程,您将需要:

步骤 1 – 安装 MemSQL

在本节中,我们将为MemSQL安装准备我们的工作环境。

我们将下载和安装MemSQL Ops,这是一个管理下载和准备您的服务器正确运行MemSQL的程序。

首先,从他们的网站下载MemSQL的安装包文件。

1wget http://download.memsql.com/memsql-ops-4.0.35/memsql-ops-4.0.35.tar.gz

接下来,提取包裹。

1tar -xzf memsql-ops-4.0.35.tar.gz

提取包创建了一个名为 memsql-ops-4.0.35的文件夹. 请注意,文件夹名称具有版本号码,所以如果您下载比本教程所指定的更新的版本,您将有一个文件夹与您下载的版本。

在此文件夹中更改目录。

1cd memsql-ops-4.0.35

然后,运行安装脚本,这是我们刚刚提取的安装包的一部分。

1sudo ./install.sh

您将看到脚本的一些输出. 过了一会儿,它会问你是否只想在这个主机上安装MemSQL。 我们将在未来的教程中查看在多个机器上安装MemSQL。

 1[label Installation script prompt and output]
 2. . .
 3Do you want to install MemSQL on this host only? [y/N] y
 4
 52015-09-04 14:30:38: Jd0af3b [INFO] Deploying MemSQL to 45.55.146.81:3306
 62015-09-04 14:30:38: J4e047f [INFO] Deploying MemSQL to 45.55.146.81:3307
 72015-09-04 14:30:48: J4e047f [INFO] Downloading MemSQL: 100.00%
 82015-09-04 14:30:48: J4e047f [INFO] Installing MemSQL
 92015-09-04 14:30:49: Jd0af3b [INFO] Downloading MemSQL: 100.00%
102015-09-04 14:30:49: Jd0af3b [INFO] Installing MemSQL
112015-09-04 14:31:01: J4e047f [INFO] Finishing MemSQL Install
122015-09-04 14:31:03: Jd0af3b [INFO] Finishing MemSQL Install
13Waiting for MemSQL to start...

现在你已经部署了一个MemSQL集群到你的Ubuntu服务器! 但是,从上面的日志,你会注意到MemSQL安装了两次。

MemSQL可以作为两个不同的角色运行:一个聚合节点和一个叶节点,原因是MemSQL安装了两次是因为它需要至少一个聚合节点和至少一个叶节点才能运行一个群集。

_aggregator node_是您对MemSQL的界面,对外界来说,它看起来很像MySQL:它在同一端口上收听,您可以连接希望与MySQL和标准MySQL库交谈的工具。

一个 leaf node 实际上存储数据. 当叶节点收到从聚合节点读取或写入数据的请求时,它执行该查询并返回结果到聚合节点。

当您有多个叶节点时,聚合器负责将MySQL查询转换为应该参与该查询的所有叶节点,然后从所有叶节点中获取答案,并将结果合并为一个查询,返回您的MySQL客户端。

我们的单主机设置具有在同一台机器上运行的聚合器和叶节点,但您可以在许多其他机器上添加更多的叶节点。

步骤2 - 运行基准

让我们看看MemSQL可以使用MemSQL Ops工具运行多快,该工具是MemSQL安装脚本的一部分。

在您的网页浏览器中,点击http://your_server_ip:9000

img

MemSQL Ops 工具为您提供了群集的概述,我们有 2 个 MemSQL 节点:主集合器和叶节点。

让我们在我们的单机MemSQL节点上进行速度测试。从左侧菜单中点击 Speed Test ,然后点击 ** START TEST** 。

Speed test example results

在本教程中,我们不会涵盖如何在多个服务器上安装MemSQL,但为了比较,这里是来自3个8GB Ubuntu 14.04节点(一个聚合节点和两个叶节点)的MemSQL集群的基准:

img

通过将叶片节点数量翻倍,我们几乎可以翻倍我们的插入率. 通过查看 Rows Read 部分,我们可以看到我们的三节点集群能够在相同的时间内同时读取 12M 多个行,而不是单节点集群。

步骤 3 – 通过 mysql-client 与 MemSQL 互动

对于客户端来说,MemSQL 看起来像 MySQL;它们都说同一个协议. 要开始与我们的 MemSQL 集群交谈,让我们安装一个 mysql 客户端。

首先,更新 apt,以便我们在下一步安装最新客户端。

1sudo apt-get update

现在,安装一个MySQL客户端,这将给我们一个mysql命令来执行。

1sudo apt-get install mysql-client-core-5.6

我们现在已经准备好使用 MySQL 客户端连接到 MemSQL. 我们将作为 root 用户连接到端口 3306 的主机 `127.0.0.1 (这是我们的 localhost IP 地址)。

1mysql -u root -h 127.0.0.1 -P 3306 --prompt="memsql> "

您将看到几个输出行,然后是memsql>提示。

让我们列出数据库。

1show databases;

你会看到这个输出。

1[label Database output]
2+--------------------+
3| Database           |
4+--------------------+
5| information_schema |
6| memsql             |
7| sharding           |
8+--------------------+
93 rows in set (0.01 sec)

创建一个名为 tutorial 的新数据库。

1create database tutorial;

然后通过使用命令切换到使用新数据库。

1use tutorial;

接下来,我们将创建一个用户表,其中将有ide-mail字段。我们必须为这两个字段指定一个类型。让我们使id成为一个大字符,并发送一个长度为255的 varchar,我们还会告诉数据库,id字段是主要密钥,而e-mail字段不能为null。

1create table users (id bigint auto_increment primary key, email varchar(255) not null);

您可能会注意到最后一个命令(15 - 20 秒)的运行时间不佳,有一个主要原因是MemSQL在创建这个新表时很慢:代码生成。

在封面下,MemSQL 使用 code generation 来执行查询,这意味着每次遇到新类型的查询时,MemSQL 都需要生成和编译代表查询的代码,然后将此代码发送到集群执行。

回到我们的用户表,看看表定义。

1describe users;
1[label Table definition output]
2+-------+--------------+------+------+---------+----------------+
3| Field | Type         | Null | Key  | Default | Extra          |
4+-------+--------------+------+------+---------+----------------+
5| id    | bigint(20)   | NO   | PRI  | NULL    | auto_increment |
6| email | varchar(255) | NO   |      | NULL    |                |
7+-------+--------------+------+------+---------+----------------+
82 rows in set (0.00 sec)

现在,让我们将一些示例电子邮件插入用户表. 这个语法与我们可能使用的MySQL数据库相同。

1insert into users (email) values ('[email protected]'), ('[email protected]'), ('[email protected]');
1[label Inserting emails output]
2Query OK, 3 rows affected (1.57 sec)
3Records: 3 Duplicates: 0 Warnings: 0

现在查询用户表。

1select * from users;

你可以看到我们刚刚输入的数据:

1[label Users table output]
2+----+-------------------+
3| id | email             |
4+----+-------------------+
5|  2 | [email protected]   |
6|  1 | [email protected]   |
7|  3 | [email protected] |
8+----+-------------------+
93 rows in set (0.07 sec)

步骤 4 – 插入和查询 JSON

MemSQL 提供 JSON 类型,所以在这个步骤中,我们将创建一个事件表来利用即将到来的事件。

1create table events (id bigint auto_increment primary key, event json not null);

在 JSON 中,我们将引用一个电子邮件字段,反过来,引用了我们在步骤 3 中插入的用户ID。

1insert into events (event) values ('{"name": "sent email", "email": "[email protected]"}'), ('{"name": "received email", "email": "[email protected]"}');

现在我们可以看看我们刚刚插入的事件。

1select * from events;
1[label Event table output]
2+----+-----------------------------------------------------+
3| id | event                                               |
4+----+-----------------------------------------------------+
5|  2 | {"email":"[email protected]","name":"received email"} |
6|  1 | {"email":"[email protected]","name":"sent email"}     |
7+----+-----------------------------------------------------+
82 rows in set (3.46 sec)

接下来,我们可以查询所有事件,其JSON名称属性是文本收到电子邮件

1select * from events where event::$name = 'received email';
1[label "received email" query output]
2+----+-----------------------------------------------------+
3| id | event                                               |
4+----+-----------------------------------------------------+
5|  2 | {"email":"[email protected]","name":"received email"} |
6+----+-----------------------------------------------------+
71 row in set (5.84 sec)

尝试更改该查询以找到那些其名称属性为发送电子邮件的文本。

1select * from events where event::$name = 'sent email';
1[label "sent email" query output]
2+----+-------------------------------------------------+
3| id | event                                           |
4+----+-------------------------------------------------+
5|  1 | {"email":"[email protected]","name":"sent email"} |
6+----+-------------------------------------------------+
71 row in set (0.00 sec)

这是因为我们只改变了查询中的一个参数,所以MemSQL能够跳过代码生成。

让我们为分布式 SQL 数据库做一些先进的事情:让我们在非主键上连接两个表,其中一个值的连接嵌入 JSON 值中,但过滤到不同的 JSON 值。

首先,我们将要求用户表中的所有字段与事件表连接,通过匹配电子邮件,其中事件名称为收到电子邮件

1select * from users left join events on users.email = events.event::$email where events.event::$name = 'received email';
1[label "received email" fields output]
2+----+-----------------+------+-----------------------------------------------------+
3| id | email           | id   | event                                               |
4+----+-----------------+------+-----------------------------------------------------+
5|  2 | [email protected] |    2 | {"email":"[email protected]","name":"received email"} |
6+----+-----------------+------+-----------------------------------------------------+
71 row in set (14.19 sec)

接下来,尝试相同的查询,但仅过滤发送电子邮件事件。

1select * from users left join events on users.email = events.event::$email where events.event::$name = 'sent email';
1[label "sent email" fields output]
2+----+-----------------+------+-------------------------------------------------+
3| id | email           | id   | event                                           |
4+----+-----------------+------+-------------------------------------------------+
5|  1 | [email protected] |    1 | {"email":"[email protected]","name":"sent email"} |
6+----+-----------------+------+-------------------------------------------------+
71 row in set (0.01 sec)

与之前一样,第二个查询比第一个更快。在运行数百万行时代码生成的好处会得到回报,正如我们在基准中所看到的那样。

结论

你已经安装了MemSQL,运行了节点性能的基准,通过标准的MySQL客户端与节点进行交互,并玩了一些在MySQL中找不到的先进功能。

还需要了解MemSQL如何实际地分布数据,如何构建表以获得最大性能,如何在多个节点上扩展MemSQL,如何复制数据以获得高可用性,以及如何保护MemSQL。

Published At
Categories with 技术
comments powered by Disqus