当前位置: 首页 > news >正文

大型网站开发 框架百度 网站质量

大型网站开发 框架,百度 网站质量,建设公司网站费用,微信端网站开发转自#xff1a;兴趣部落​buluo.qq.com导读#xff1a; Spider是为MySQL/MariaDB开发的一个特殊引擎#xff0c;具有内嵌分片功能。现在它已经被集成到MariaDB10.0及以上版本中#xff0c;作为MariaDB的一个新的主要性。Spider的主要功能是将数据分散到多个后端节点#…转自兴趣部落​buluo.qq.com导读 Spider是为MySQL/MariaDB开发的一个特殊引擎具有内嵌分片功能。现在它已经被集成到MariaDB10.0及以上版本中作为MariaDB的一个新的主要性。Spider的主要功能是将数据分散到多个后端节点它的作用类似于一个代理。1. 表链接Spider的表链接的技术参考ISO/IEC 9075-9:2008 SQL/MED标准。利用spider的这个特性你可以像操作本地MariaDB实例的表一样来操作远程MariaDB实例上的表也可以像操作本地MariaDB实例的表一样来操作分布在多个MariaDB实例上的表。当创建一个spider存储引擎的表时该表指向远程服务器上对应的一张表或者多个实例上的表就像UNIX/Linux中的软链接一样。远程服务器上的表可以是任何存储引擎的表。在执行CREATE TABLE命令创建spider引擎的表时需要添加COMMENT或CONNECTION语法来指定远程服务器的地址等信息。例如在远程服务器(该服务器是数据节点假设IP为192.168.0.1)上创建了如下一张表spider节点创建一张表指向该表spider节点表字段定义可以忽略。Spider第一次访问表的时候如果发现没有表字段定义会从后端节点拉取相关元数据然后缓存在本地。Spider的系统表spider_tables记录了各个数据分片的位置信息类似于编程语言中指针作用。该系统表可以便利spider跨节点的join操作访问数据所在的机器然后把数据拉取到本地进行join操作如果进行join操作字段不是分片字段那么需要广播SQL语句将数据拉取到spider节点进行join操作。Spider_tables类似图1所示。图1. Spider表链接2.事务Spider分别针对单机事务与XA事务实现了相应的操作事务的方法。图2列出了部分实现的方法。图2. Spider部分实现的事务接口Spider参照分布式事务DTP/XA模型实现了分布式XA事务(见图3)。在这个模型中存在RM(Resource Manager资源管理器)、TM(Transaction Manager 事务管理器)以及AP(Application 应用程序)三种角色。AP通过RM API来操作和管理资源通过TM接口开启/终止/结束事务。RM与TM之间需要实现XA接口。XA接口定义了两阶段提交的必要步骤以及RM与TM之间需要进行的交互。Spider扮演的是TM角色而后端的数据节点扮演的是RM的角色。图3. 分布式DTP/XA模型为了使用分布式XA事务业界定义的XA命令如下Spider会在系统表spider_xa中记录XA事务的状态同时在另外一张系统表 spider_xa_members 中记录参与该XA事务的节点以便进行操作。在spider中XA事务分别有四种状态如图4所示对应于NOT YET, PREPAED, ROLLBACK 以及 COMMITTED。 Spider在开始PREPARE阶段之际会在系统表 spider_xa中标记该XA事务的状态为NOT YET。在所有数据节点都接收到PREPARE消息以后, 该 XA事务的状态进入到PREPARED阶段。假如在PREPARE阶段某一个数据节点发生故障那么spider会回滚该事务。相应地事务的状态变成ROLLBACK。最后如果所有参与事务的节点都返回PREPARE OK该事务进入提交阶段。图5给出了对应上述命令的每一个步骤spider向后端节点发送的消息。图4. Spider XA事务状态转换图5. 执行XA事务Spider与后端节点的交互从图5可以看到spider向后端节点发送XA START命令的时候会设置会话级别的事务特性同时将XA事务ID发送到后端节点。因为XA事务ID由三部分组成spider会 将这三个部分的解析出来然后拼接成对应的字符串发送到后端节点。为了节省网络开销Spider将XA END与XA PREPARE命令合并起来一起发送。也就是在这个 阶段初始spider在系统表里面记录事务的状态。如果所有的RM都返回OK那么spider进入PREPARED 状态准备提交事务。否则事务进入到回滚状态。3.插拨式引擎MySQL最强大的功能之一以及区别于其他关系型数据库系统的一个主要的特色是不同的表能够采用不同的存储引擎。每一个存储引擎都有其优缺点用户能够根据自己的需要定制MySQL的存储引擎。存储引擎能够控制在哪里以及如何存放、获取数据。它代表了下面物理层提供的抽象逻辑接口也是数据库执行实际I/O操作的地方。这是一个组件体系结构。在这个结构中handler类定义了存储引擎提供的接口和功能。因为所有的存储引擎从基类handler继承而来所以它们能够提供相同的功能。总的来说handler类和handlerton结构在整个体系结构中扮演了中间层的角色。你所编写的存储引擎只有满足了handler的要求后才能顺利插入到运行的MySQL服务器中。所有的网络连接、安全认证、解析和优化由MySQL服务器本身完成与存储引擎无关。Spider作为MySQL的一个可插拔引擎实现了handler类定义的相应的存取方法。Spider本身并不存放数据而是类似一个代理的功能将访问请求路由到后端的数据节点。Spider提供了两种途径访问后端节点存储的数据。如图6所示spider可以遵循MySQL传统的查询处理流程来访问数据也开发了自有的一套来加速数据访问。在传统的查询处理方式下SQL查询请求经过查询解析、查询重写、查询优化等步骤。按照生成的查询执行计划spider从后端节点拉取数据交给MySQL服务器处理。Spider在这种查询处理框架之下的一个缺点是不能很好地利用后端节点可并行化特性同时需要对SQL查询进行两次解析带来的性能损耗问题比较严重。在我们的测试中性能损耗约50%左右。基于这个原因为了加速聚集、统计等查询spider开发团队提供了DirectSQL方式执行查询。DirectSQL的原理类似于Map Reduce方案将查询直接下发到后端节点无需在MySQL服务器层进行解析(Map阶段)后端节点将结果返回给spider由spider合并结果集。(Reduce阶段)。这个方式很好地利用后端节点可并行处理查询的特点消除重复解析SQL语句的行为。图6. MySQL体系下的spider上面已经谈到spider本身并不存储数据因此需要将数据访问请求转换成其它方式例如Handler、Handler Socket以及SQL方式。前面两种访问方式更像是一种NoSQL的数据访问方式允许查询绕过SQL layer层。Spider允许后端的数据节点可以是不同的数据库系统通过2PC保证事务提交的原子性。4.读写流程为了更清楚地了解spider的读写流程我们有必要研究一下数据库系统的查询执行模型以及MySQL的插拔式引擎如何跟这个模型对接的。数据库系统基本都采用迭代器模型处理查询也叫volcano查询执行引擎(发明这个词的学者大概是因为查询执行计划树看起来像一座火山如图7)。执行计划树的上层节点通过get_next方法驱动子节点获取一条元组子节点递归调用。在叶子节点也就是基本表将数据返回。这个模型的一个好处就是实现起来很优雅同时数据流与控制流结合在一起方便程序的调试。这个模型的缺点是函数的大量调用使得进程/线程上下文切换频繁程序的局部性受到损害。因此后来针对OLAP场景采用了向量查询执行模型来减少进程上下文的切换以及保证保证高速缓存的命中率。再次以图7为例子图中的SQL语句的功能是查询一个部门的平均薪资。假如在职工表EMP的员工ID字段Dno上存在索引MySQL在Server层针对该查询语句生成的查询计划如下:顺序扫描部门表通过索引访问职工表然后在两表join操作之后进行投影操作。下一个阶段为分组排序操作。上层的操作算子(例如join)驱动子节点调用get_next方法(表扫描方法)获取一条元组。底层操作算子(表访问方法handler接口定义)将数据返回。至此我们可以总结一下MySQL体系的工作原理查询执行计划由MySQL server层生成存储引擎受执行计划驱动而访问表。MySQL的handler已经定义好表的访问方法实现了这些访问方法的存储引擎就可以作为MySQL的插件式引擎而存在。下面我们对spider的读写流程结合server层代码进行分析。图7. 查询计划树示例4.1 SELECT操作上面提到spider的作用类似一个proxy本身并不存储数据。因此spider处理SELECT语句(UPDATE与DELETE类似)首先需要根据查询解析的信息生成一个SELECT语句发送到查询涉及的后端节点将数据从远端拉到本地然后进行处理。函数spider_db_append_select_columns根据查询涉及的读集以及写集获取相应的字段构造一个SQL语句从后端节点拉取数据到本地。如果涉及多个分片, spider将从不同实例获取过来的结果集存放在不同的结果集spider_db_result中。类spider_db_fetch 提供了fetch_next, current_row等方法供上层方法调用。Server层调用get_next方法驱动引擎层获取下一条数据。对于表访问方法MySQL 实现了索引扫描(ha_index_read)与随机访问(ha_rnd_next)的方法。对于切分为多个分片的DB索引扫描需要借助优先队列。索引扫描需要区分是否是第一次调用该方法。如果是第一次调用该方法需要遍历所有的分片读取一条记录然后插入到优先队列。对应到spider如果第一次调用访问远端实例表的方法需要生成SELECT语句将远端实例的数据拉到本地存放。在使用索引扫描的情况MySQL 为每个分片保留一个key buffer以及record buffer。server利用队列头部的m_top_entry 获得访问的分片ID。接着调用get_next方法获取相应的元组将返回的数据存放在record buffer并插入到优先队列。函数最后将元组从优先队列返回。为缓解内存等资源的压力spider实现全表扫描的方法是逐个分片串行扫描(为了加速spider也提供了并行扫描数据节点的选项)。图8给出了spider对于上述两种表访问方法的实现机制。图8-1.索引扫描实现图8-2. 全表扫描4.2 INSERT操作MySQL的handler类对于INSERT操作提供的接口函数的名字是write_row。存储引擎想要支持INSERT操作就必须实现write_row方法。Spider对于write_row方法的实现是简单地根据查询解析的信息拼接一条INSERT语句发往后端节点处理。如果是批量插入操作则需要与MySQL Server层配合将INSERT语句批量发到后端节点。图9结合一条批量插入的INSERT语句给出MySQL中INSERT操作的具体实现。mysql_insert调用write_row执行具体的插入操作(第8行)。这是存储引擎必须实现的方法。对应于spiderspider根据查询涉及到的列(field)拼成一条INSERT语句(如果是分片数据库VALUSE中的列必须包含分区键分区键是自增列的情况除外)。图8中的QUERY将用户ID(ID)和用户名(Name)插入到user表其中ID是分区键。mysql_insert根据VALUES包含的元组数目判断是否需要进行批量插入操作。该例子的QUERY的VALUES包含4条元组所有需要进行批量插入操作。MySQL循环调用write_row方法触发spider生成INSERT语句。Spider的write_row方法实现中会根据分区键将INSERT语句进行分组(第5行~第9行)。图8给出的实例只有两个数据分片所以SQL语句被分成两组。处理完VALUES以后spider的INSERT语句也拼接完成。ha_end_bulk_insert方法通知spider完成VALUES处理。此时spider将INSERT发送到后端节点进行处理(第11行)。图9. spider中INSERT操作的实现4.3 DELETE实现Spider想要支持DELETE操作必须实现MySQL handler类提供的ha_delete_row方法。与INSERT操作不同DELETE操作需要生成一条SELECT语句将查询涉及的分区键拉到spider节点。这是因为MySQL Server层的“once-a-tuple”的查询执行模型(实际上基本所有的关系数据库系统都采用该模型)会驱动spider逐个拼接DELETE语句然后发往后端节点。这时候spider需要知道对应的DELETE语句该往哪个后端节点发送。为了减少网络开销spider提供了批量发送DELETE语句的功能。图10给出了spider中delete的实现。MySQL server层首先确定表的访问方法采用索引扫描或者全部扫描(第5行)。DELETE方法需要执行一次查找操作调用get_next方法(info.read_record)获取一条元组(第10行)。Spider需要判断是否第一次调用get_next方法。如果是的话则需要生成SELECT语句将数据节点的数据拉到本地。否则spider直接从本地返回数据给上层调用者。接下来server层调用ha_delete_row方法将数据删除。这是存储引擎需要具体实现的方法。由于Spider本身并不存储数据的缘故其实现delete操作的主要思想是利用从后端节点拉取过来的数据(分区键过滤条件等)拼接成一条DELETE语句。然后发送该请求到数据节点。Spider为了优化网络开销提供了批量发送DELETE语句的选项。UPDATE操作的实现类似DELETE都需要spider生成SELECT语句从后端节点拉取数据。只不过UPDATE在更新区分键的时候可能需要多一次DELETE操作(删除原来分区的数据将新的数据插入到不同的分区)。图10. DELETE实现5.总结Spider的最大亮点是为MySQL的使用者提供分库分表的中间件解决方案同时在SQL语法上兼容MySQL。这得益于spider作为MySQL的插拔式引擎而存在。 Spider 是一个proxy其本身并没有存储数据因此上层的读写表请求需要转换成SQL语句重新路由到后端的数据节点。相比其它的中间件解决方案spider的查询解析次数都是两次并没有过多开销。此外spider还针对聚集、排序等操作提供了MAP REDUCE的解决方案。总而言之从兼容性、性能上衡量spider是MySQL分库分表的一个不错的选项。
http://www.yutouwan.com/news/425327/

相关文章:

  • 泉州市培训建设系统中心网站珠海本地网站设计公司
  • 怎么做自己的单机网站asp网站 证书
  • 网站建设预算和流程介绍企业网站开发软件
  • 国外工会网站建设微信网站建设知识
  • 一学一做看视频网站有哪些内容写作网站
  • 个人怎么建网站河北综合网站建设系列
  • 织梦怎么建设论坛网站好用的网页编辑器
  • 世界建筑网站中国做外贸网站有哪些问题
  • 网页和网站的联系wordpress 禁止缩略图
  • 广告联盟上怎么做网站wordpress添加模板
  • 有哪些做微博长图网站成都建设网站
  • 河北网站建设推广电话内蒙古做网站找谁
  • 宿迁建设局网站拆除备案网站推广运营公司
  • 正定网站建设资讯网站 怎样 增强用户粘度
  • 李尚荣网站建设迁安建设局网站
  • 品牌网站建设 杭州义乌义亭招工做网站养猪工作
  • 咨询网站设计国家企业信用公示信息网官网
  • 佛山网站开发网易网
  • 朵朵软件网站建设专门做图的网站
  • 优速网站建设工作室北京建筑信息网
  • 株洲网站关键词优化种子搜索引擎在线
  • 政务咨询投诉举报网站建设百度自动优化
  • 做58同城网站花了多少钱网站备案详细流程
  • 平台网站建设多少钱有什么比较好的做简历的网站
  • 网站开发制作报价深圳seo搜索优化
  • 网站制作建福建省第一电力建设公司网站
  • 苏州网站建设公司哪家好北京公司摇号
  • 全景网站如何做永州内部网站建设公司
  • 网站每个月8g流量关于服装的网站规划与设计
  • 伏羲方舟网站建设白云区网站建设