最近在了解MemSQL架构,看了些官方文档,在这里做个记录,原文在这里:http://docs.memsql.com/latest/concepts/distributed_architecture/
分布式架构
MemSQL的分布式架构被设计为直接的、简单的并且快速的。这里概述了MemSQL集群,包括各式组件的交互。同时介绍了当你执行一个查询或者管理操作的时候,MemSQL环境发生了什么。
几个概念:
1、Aggregators(汇聚器) MemSQL集群的一种节点,为访问MemSQL集群的网关,一个集群中可以有多个汇聚器,汇聚器主要负责向叶子节点发送DML请求、汇聚操作结果并返回给客户端
2、Master Aggregator(主汇聚器) 是一种特殊的汇聚器,除了一般汇聚器的功能,还负责监控集群、失效切换及DDL语句的操作。每一个MemSQL的集群只能有一个主汇聚器。当主汇聚器失效时,MemSQL的集群和DDL语句操作将被挂起,而一般的DML语句仍可以通过其他的汇聚器进行操作。如果主汇聚器的程序文件没有丢失,那么只要重启一下主汇聚器即可,主汇聚器将会自动重连。否则的话,可以在一个子汇聚器上执行命令来将子汇聚器提升为主汇聚器。
3、Leaf Node(叶子节点) 在MemSQL集群中,叶子节点的作用是存储和计算。负责在集群中存储数据的切片。为了优化性能,MemSQL会围绕叶子节点自动分布数据到分区。每一个叶子节点由若干个分区组成。每一个分区其实就是一个database。
4、Partitions(分区) 一个叶子节点由多个分区组成。每一个分区其实就是一个database。比如说,如有你创建了一个database名为test,那么当你在一个叶子节点执行SHOW DATABASES 时,会看到数据库名为类似test_5,表明这是分区5。通过SHOW DATABASES EXTENDED命令输出的State列,可以查看分区是Master或者slave分区或者正处于其他状态的分区。Master分区是数据库真正执行操作的分区,而slave分区则是通过网络和sql操作将Master上的数据复制到slave上。另外,slave分区是只读的。
设计原则
MemSQL分布式系统的设计遵循如下的原则:
- 性能优先 MemSQL是世界上最快的single-box数据库,分布式部署在多台服务器上时更是能让性能有线性的提升。MemSQL集群能够处理每秒数十亿行数据,而硬件只需要普通的商用硬件即可。
- 将集群分为汇聚层和叶子层同时尽可能多的将工作交由叶子层处理 这允许你在线增加额外的叶子节点到集群来提升集群容量和查询性能
- 无单点失败风险 通过运行冗余的集群,可以确保每一个数据分区都有一个热备份。当叶子节点失效时,MemSQL将自动切换到salve分区。汇聚层同样也有类似的技术来规避单节点风险。
- 强大但又简单的集群管理 分布式系统提供了REBALANCE PARTITIONS功能来恢复分区数据
- 没有隐式的数据移动
集群组件
一个MemSQL集群由两个层面组成:
- 汇聚器 汇聚器处理分布式系统的元数据,路由查询并汇聚结果。依赖于查询量,一个集群可能有一个或者多个汇聚器。主汇聚器是一个特殊的汇聚器,只处理元数据并负责集群的监控和失效切换
- 叶子节点 叶子节点存储和执行sql查询。一个叶子节点是一个由多个分区组成的MemSQL服务实例。
汇聚器和叶子节点共享同一套MemSQL的二进制程序文件,因此你在集群中部署时可以完全相同。默认的话MemSQL只会作为叶子节点来运行。要运行MemSQL作为一个汇聚器,需要使用./memsqld --master-aggregator来指定主汇聚器。
MemSQL集群最小安装只需要一个主汇聚器和一个叶子几点即可。你可以添加更多的汇聚器,这些汇聚器会从主汇聚器读取元素据,也能够在叶子节点运行DML命令
已部署的汇聚器和叶子节点的数量决定了集群的存储容量和性能。典型的部署结构中,叶子节点和汇聚器的比例为5:1。在一个设计良好的集群中:
- 当集群需要比较高的连接能力的时候,汇聚器比叶子节点的比率要较高
- 当集群需要比较大的存储容量时,叶子节点比汇聚器的比率要比较高
你能够列出所有的汇聚器和叶子节点通过使用SHOW AGGREGATORS 和 SHOW LEAVES命令
memsql> SHOW AGGREGATORS;+---------------+-------+--------+--------------------+---------------------------+-------------------+| Host | Port | State | Opened_Connections | Average_Roundtrip_Latency | Master_Aggregator |+---------------+-------+--------+--------------------+---------------------------+-------------------+| 127.0.0.1 | 3306 | online | 0 | NULL | 1 || 192.168.1.116 | 3306 | online | 1 | 0.200 | 0 |+---------------+-------+--------+--------------------+---------------------------+-------------------+2 rows in set (0.00 sec)memsql> SHOW LEAVES;+---------------+-------+--------------------+---------------+-----------+--------+--------------------+---------------------------+| Host | Port | Availability_Group | Pair_Host | Pair_Port | State | Opened_Connections | Average_Roundtrip_Latency |+---------------+-------+--------------------+---------------+-----------+--------+--------------------+---------------------------+| 192.168.1.110 | 3306 | 1 | 192.168.1.112 | 3306 | online | 5 | 0.299 || 192.168.1.111 | 3306 | 1 | 192.168.1.113 | 3306 | online | 5 | 0.293 || 192.168.1.112 | 3306 | 2 | 192.168.1.110 | 3306 | online | 1 | 0.271 || 192.168.1.113 | 3306 | 2 | 192.168.1.111 | 3306 | online | 1 | 0.264 |+---------------+-------+--------------------+---------------+-----------+--------+--------------------+---------------------------+
集群通信
除了复制时的数据传输,所有MemSQL节点间的通信都是通过SQL命令实现的。比如说,集群心跳是通过select 1查询实现的而非特殊的接口。
后续内容将在MemSQL分布式架构介绍(二)中继续记录