Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何在Ubuntu 14.04上安装MemSQL

如何在Ubuntu 14.04上安装MemSQL

原创
作者头像
尘埃
修改于 2018-10-09 09:31:19
修改于 2018-10-09 09:31:19
2.4K00
代码可运行
举报
运行总次数:0
代码可运行

介绍

MemSQL是一种内存数据库,可以提供比传统数据库更快的读写操作。即使它是一项新技术,它也会说MySQL协议,因此使用起来非常熟悉。

MemSQL已经采用了MySQL的最新功能和现代功能,例如JSON支持和数据插入功能。MemSQL over MySQL的最大优势之一是它能够跨多个节点拆分单个查询,称为大规模并行处理,从而实现更快的读取查询。

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

先决条件

要学习本教程,您需要:

  • 一个Ubuntu 14.04 x64 腾讯CVM,至少8 GB RAM,没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 具有sudo权限的非root用户。

-

第1步 - 安装MemSQL

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

最新版本的MemSQL列在其下载页面上。我们将下载并安装MemSQL Ops,这是一个管理下载和准备服务器以正确运行MemSQL的程序。在编写本文时,最新版本的MemSQL Ops是4.0.35。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wget http://download.memsql.com/memsql-ops-4.0.35/memsql-ops-4.0.35.tar.gz

接下来,提取包。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tar -xzf memsql-ops-4.0.35.tar.gz

提取包已创建一个名为memsql-ops-4.0.35的文件夹。请注意,文件夹名称具有版本号,因此如果您下载的版本低于本教程指定的版本,您将拥有一个包含所下载版本的文件夹。

将目录更改为此文件夹。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd memsql-ops-4.0.35

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo ./install.sh

您将看到脚本的一些输出。片刻之后,它会询问您是否只想在此主机上安装MemSQL。我们将在未来的教程中介绍如何在多台机器上安装MemSQL。所以,为了本教程的目的,让我们输入y来表示肯定。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
. . .
Do you want to install MemSQL on this host only? [y/N] y
​
2015-09-04 14:30:38: Jd0af3b [INFO] Deploying MemSQL to 45.55.146.81:3306
2015-09-04 14:30:38: J4e047f [INFO] Deploying MemSQL to 45.55.146.81:3307
2015-09-04 14:30:48: J4e047f [INFO] Downloading MemSQL: 100.00%
2015-09-04 14:30:48: J4e047f [INFO] Installing MemSQL
2015-09-04 14:30:49: Jd0af3b [INFO] Downloading MemSQL: 100.00%
2015-09-04 14:30:49: Jd0af3b [INFO] Installing MemSQL
2015-09-04 14:31:01: J4e047f [INFO] Finishing MemSQL Install
2015-09-04 14:31:03: Jd0af3b [INFO] Finishing MemSQL Install
Waiting for MemSQL to start...

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

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

聚合器是你的界面MemSQL。对于外部世界,它看起来很像MySQL:它在同一个端口上侦听,你可以连接期望与MySQL和标准MySQL库交谈的工具。聚合器的工作是了解所有MemSQL叶节点,处理MySQL客户端,并将其查询转换为MemSQL。

叶节点实际存储的数据。当叶节点从聚合器节点接收到读取或写入数据的请求时,它执行该查询并将结果返回到聚合器节点。MemSQL允许您跨多个主机共享数据,每个叶节点都有一部分数据。(即使使用单个叶节点,您的数据也会在该叶节点内拆分。)

当您有多个叶节点时,聚合器负责将MySQL查询转换为该查询中应该涉及的所有叶节点。然后它接收来自所有叶节点的响应,并将结果聚合到一个返回MySQL客户端的查询中。这就是管理并行查询的方式。

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

第2步 - 运行基准

让我们看看MemSQL可以通过使用MemSQL Ops工具来快速运行,该工具是作为MemSQL安装脚本的一部分安装的。

在您的Web浏览器中,转到 http://your_server_ip:9000

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

让我们在单机MemSQL节点上进行速度测试。单击左侧菜单中的Speed Test,然后单击START TEST。以下是您可能会看到的结果示例:

我们将不介绍如何在本教程中跨多个服务器安装MemSQL,但为了进行比较,这里是一个带有三个8GB Ubuntu 14.04节点(一个聚合器节点和两个叶节点)的MemSQL集群的基准测试:

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

第3步 - 通过mysql-client与MemSQL交互

对于客户端,MemSQL看起来像MySQL; 他们都有着同样的协议。为了要开始与我们的MemSQL集群交谈,让我们先安装一个mysql-client。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt-get update

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt-get install mysql-client-core-5.6

我们现在准备使用MySQL客户端连接到MemSQL。我们将以root用户身份连接到端口3306上的127.0.0.1主机(这是我们的本地主机IP地址)。我们还将把提示消息自定义为memsql>

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql -u root -h 127.0.0.1 -P 3306 --prompt="memsql> "

你会看到几行输出的后面写着memsql>提示符。

我们列出数据库。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show databases;

你会看到这个输出。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+--------------------+
| Database           |
+--------------------+
| information_schema |
| memsql             |
| sharding           |
+--------------------+
3 rows in set (0.01 sec)

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create database tutorial;

然后使用use命令来切换至使用新数据库。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use tutorial;

接下来,我们将创建一个users表,该表将有id字段和email字段。我们必须为这两个字段指定一个类型。让我们将id设为bigint并通过电子邮件发送长度为255的varchar。我们还将告诉数据库该id字段是主键,并且该email字段不能为空。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create table users (id bigint auto_increment primary key, email varchar(255) not null);

你可能会注意到最后一个命令的执行时间很短(15 - 20秒)。MemSQL创建这个新表的速度有一个主要原因:代码生成。

在引擎盖下,MemSQL使用代码生成来执行查询。这意味着每当遇到新类型的查询时,MemSQL都需要生成和编译代表查询的代码。然后将此代码发送到集群以供执行。这加快了处理实际数据的速度,但是准备成本很高。MemSQL尽其所能重用预先生成的查询,但是从未见过结构的新查询将会减速。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
describe users;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-------+--------------+------+------+---------+----------------+
| Field | Type         | Null | Key  | Default | Extra          |
+-------+--------------+------+------+---------+----------------+
| id    | bigint(20)   | NO   | PRI  | NULL    | auto_increment |
| email | varchar(255) | NO   |      | NULL    |                |
+-------+--------------+------+------+---------+----------------+
2 rows in set (0.00 sec)

现在,让我们在users表中插入一些示例电子邮件。此语法与我们可能用于MySQL数据库的语法相同。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert into users (email) values ('one@example.com'), ('two@example.com'), ('three@example.com');
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Query OK, 3 rows affected (1.57 sec)
Records: 3  Duplicates: 0  Warnings: 0

现在查询users表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from users;

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+----+-------------------+
| id | email             |
+----+-------------------+
|  2 | two@example.com   |
|  1 | one@example.com   |
|  3 | three@example.com |
+----+-------------------+
3 rows in set (0.07 sec)

第4步 - 插入和查询JSON

MemSQL提供了JSON类型,因此在此步骤中,我们将创建一个事件表来使用传入事件。该表将包含一个id字段(就像我们为用户所做的那样)和一个event字段,该字段将是一个JSON类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create table events (id bigint auto_increment primary key, event json not null);

让我们插入几个事件。在JSON中,我们将引用一个email字段,该字段又引用回到我们在步骤3中插入的用户的ID。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert into events (event) values ('{"name": "sent email", "email": "one@example.com"}'), ('{"name": "received email", "email": "two@example.com"}');

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from events;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+----+-----------------------------------------------------+
| id | event                                               |
+----+-----------------------------------------------------+
|  2 | {"email":"two@example.com","name":"received email"} |
|  1 | {"email":"one@example.com","name":"sent email"}     |
+----+-----------------------------------------------------+
2 rows in set (3.46 sec)

接下来,我们可以查询其JSON name属性是文本“已接收电子邮件”的所有事件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from events where event::$name = 'received email';
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+----+-----------------------------------------------------+
| id | event                                               |
+----+-----------------------------------------------------+
|  2 | {"email":"two@example.com","name":"received email"} |
+----+-----------------------------------------------------+
1 row in set (5.84 sec)

尝试更改该查询以查找name属性为“已发送电子邮件”文本的查询。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from events where event::$name = 'sent email';
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+----+-------------------------------------------------+
| id | event                                           |
+----+-------------------------------------------------+
|  1 | {"email":"one@example.com","name":"sent email"} |
+----+-------------------------------------------------+
1 row in set (0.00 sec)

这个最新的查询比前一个查询运行得快得多。这是因为我们只更改了查询中的参数,因此MemSQL能够跳过代码生成。

让我们为分布式SQL数据库做一些高级操作:让我们在非主键上连接两个表,其中一个连接值嵌套在一个JSON值中,但过滤不同的JSON值。

首先,我们将通过匹配事件名称为“已接收电子邮件”的电子邮件来请求加入事件表的用户表的所有字段。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from users left join events on users.email = events.event::$email where events.event::$name = 'received email';
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+----+-----------------+------+-----------------------------------------------------+
| id | email           | id   | event                                               |
+----+-----------------+------+-----------------------------------------------------+
|  2 | two@example.com |    2 | {"email":"two@example.com","name":"received email"} |
+----+-----------------+------+-----------------------------------------------------+
1 row in set (14.19 sec)

接下来,尝试相同的查询,但只过滤到“已发送电子邮件”事件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from users left join events on users.email = events.event::$email where events.event::$name = 'sent email';
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+----+-----------------+------+-------------------------------------------------+
| id | email           | id   | event                                           |
+----+-----------------+------+-------------------------------------------------+
|  1 | one@example.com |    1 | {"email":"one@example.com","name":"sent email"} |
+----+-----------------+------+-------------------------------------------------+
1 row in set (0.01 sec)

像以前一样,第二个查询比第一个快得多。正如我们在基准测试中看到的那样,在执行数百万行时,代码生成的好处得到了回报。使用能够理解JSON的横向扩展SQL数据库以及如何在表之间任意连接的灵活性是一个强大的用户功能。

结论

您已经安装了MemSQL,运行节点性能的基准测试,通过标准MySQL客户端与您的节点进行交互,并使用MySQL中没有的一些高级功能。这应该很好地了解内存中的SQL数据库可以为您做什么。

还有很多东西需要了解MemSQL如何实际分发您的数据,如何构建表以获得最佳性能,如何跨多个节点扩展MemSQL,如何复制数据以实现高可用性以及如何保护MemSQL。

更多Ubuntu教程请前往腾讯云+社区学习更多知识。


参考文献:《How to Install MemSQL on Ubuntu 14.04》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
security实现验证码andRemember-Me
自定义拦截器配置类,实现UsernamePasswordAuthenticationFilter
用户11097514
2024/05/30
1290
security实现验证码andRemember-Me
Spring Boot 2 + Spring Security 5 + JWT 的 Restful简易教程!
本项目中 JWT 密钥是使用用户自己的登入密码,这样每一个 token 的密钥都不同,相对比较安全。
Java小咖秀
2021/05/07
2.4K0
SpringBoot入门建站全系列(十二)Spring Security使用token做认证
Spring 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。
品茗IT
2019/08/14
3.4K0
Spring-Security & JWT 实现 token
因为使用的是mybatis plus,所以没有使用mapper.xml书写sql语句,直接调用提供的CRUD。
BUG弄潮儿
2022/12/05
9930
Spring-Security & JWT 实现 token
实战篇:Security+JWT组合拳 | 附源码
之前我们已经说过用Shiro和JWT来实现身份认证和用户授权,今天我们再来说一下「Security和JWT」的组合拳。
阿Q说代码
2021/07/20
1.6K0
权限框架 | 学会Spring Security权限框架,就是这么简单
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架(简单说是对访问权限进行控制 )。
码神联盟
2019/07/31
4.5K0
权限框架 | 学会Spring Security权限框架,就是这么简单
Spring Security 实现 Remember Me
Remember Me 即记住我,常用于 Web 应用的登录页目的是让用户选择是否记住用户的登录状态。当用户选择了 Remember Me 选项,则在有效期内若用户重新访问同一个 Web 应用,那么用户可以直接登录到系统中,而无需重新执行登录操作。相信国内很多开发者都使用过或听过一个 云端软件开发协作平台 —— 码云,下图是它的登录页:
阿宝哥
2019/11/19
2.8K0
SpringBoot入门建站全系列(十二)Spring Security使用token做认证
Spring 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。
品茗IT
2019/09/12
8750
spring security——基本介绍(一)「建议收藏」
其核心就是一组过滤器链,项目启动后将会自动配置。最核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在spring security中一种过滤器处理一种认证方式。
全栈程序员站长
2022/07/04
9850
spring security——基本介绍(一)「建议收藏」
【第十一篇】SpringSecurity基于JWT实现Token的处理
  前面介绍了手写单点登录和JWT的应用,本文结合SpringSecurity来介绍下在SpringBoot项目中基于SpringSecurity作为认证授权框架的情况下如何整合JWT来实现Token的处理。
用户4919348
2022/05/27
1.1K0
【第十一篇】SpringSecurity基于JWT实现Token的处理
spring security 实践 + 源码分析
Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在 Spring 应用上下文中配置的 Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和 AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。当前版本为 5.0.5。
大道七哥
2019/09/10
5830
spring security 实践 + 源码分析
RBAC权限---SpringBoot整合Security
在浏览器输入该请求路径,会自重定向到Spring Security的登录页。默认的用户名是user,密码请去IDEA的Consolse去找项目每次启动时随机生成的字符串:
关忆北.
2021/12/07
1.2K0
RBAC权限---SpringBoot整合Security
SpringSecurity学习
其核心就是一组过滤器链,项目启动后将会自动配置。最核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在spring security中一种过滤器处理一种认证方式
云边小卖部
2022/12/02
6920
万字搞定 Spring Security!
RBAC 全称为基于角色的权限控制,本段将会从什么是 RBAC,模型分类,什么是权限,用户组的使用,实例分析等几个方面阐述 RBAC.
用户2242639
2023/09/02
3100
万字搞定 Spring Security!
Spring Security安全
如果添加了Spring Security的依赖,那么web应用默认对所有的HTTP路径(也称为终点,端点,表示API的具体网址)使用’basic’认证。为了给web应用添加方法级别(method-level)的保护,可以添加@EnableGlobalMethodSecurity并使用想要的设置。
关忆北.
2020/10/15
7740
源码剖析 Spring Security 的实现原理
Spring Security 是一个轻量级的安全框架,可以和 Spring 项目很好地集成,提供了丰富的身份认证和授权相关的功能,而且还能防止一些常见的网络攻击。
架构狂人
2023/11/22
6960
源码剖析 Spring Security 的实现原理
Spring Security 上
FilterSecurityInterceptor:是一个方法级的 权限过滤器 ,基本位于过滤链的最底部
张小驰出没
2021/05/08
6600
Spring Security  上
Spring Security 实战干货:使用 JWT 认证访问接口
欢迎阅读Spring Security 实战干货系列。点击原文阅读进入系列。之前我讲解了如何编写一个自己的 Jwt 生成器以及如何在用户认证通过后返回 Json Web Token 。今天我们来看看如何在请求中使用 Jwt 访问鉴权。DEMO 获取方法在文末。
码农小胖哥
2019/12/10
1.8K0
Spring Security 实战干货:使用 JWT 认证访问接口
Spring Security的认证和授权
Spring Security是为基于Spring的应用程序提供声明式安全保护的安全性框架。Spring Security提供了完整的安全性解决方案,它能够在Web请求级别和方法调用级别处理身份认证和授权。因为基于Spring框架,所以Spring Security充分利用了依赖注入(dependency injection,DI)和面向切面(AOP)的技术。
兜兜转转
2023/03/29
2.4K0
Spring Security的认证和授权
Spring Security Oauth2 单点登录案例实现和执行流程剖析
OAuth是一个关于授权的开放网络标准,在全世界得到的广泛的应用,目前是2.0的版本。OAuth2在“客户端”与“服务提供商”之间,设置了一个授权层(authorization layer)。“客户端”不能直接登录“服务提供商”,只能登录授权层,以此将用户与客户端分离。“客户端”登录需要获取OAuth提供的令牌,否则将提示认证失败而导致客户端无法访问服务。关于OAuth2这里就不多作介绍了,网上资料详尽。下面我们实现一个 整合 SpringBoot 、Spring Security OAuth2 来实现单点登录功能的案例并对执行流程进行详细的剖析。
朝雨忆轻尘
2019/06/19
2.8K0
Spring Security Oauth2 单点登录案例实现和执行流程剖析
推荐阅读
相关推荐
security实现验证码andRemember-Me
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验