绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
MySQL Fabric-分片-简单示例
2020-05-18 14:25:56

在本文中,我们讨论了一个用例,该用例从单个服务器开始(单个分片设置),并随着应用程序及其数据的增长而逐步扩展。我们还将在这里描述使用MySQL Fabric创建分片的不同方面及其各自的含义。

注意:与前面的示例不同,本示例不适用于已经存在的数据。

注意:该示例还介绍了如何修改python应用程序代码以与Fabric一起使用。

在单个MySQL碎片设置上对应用程序进行原型制作


下图描述了使用和不使用MySQL Fabric之间的初始设置差异。

注意:对于初始设置,全局组只能包含在同一台计算机上运行的另一个MySQL Server。

注意:当切换到FABRIC时,应用程序还需要更改其使用python连接器的方式。


应用程序

为了始终专注于使用Fabric,以一个非常简单的应用程序为例。该应用程序基本上注册并查询员工详细信息。模式本身经过了高度简化,并包含了覆盖Fabric中所有用例的低限度要求。

应用架构:

根据用作分片键的emp_no对雇员,部门和薪水表进行分片。
fuel_reimb代表一个表,该表经常用于(在联接查询中)查找各个雇员的燃料津贴。联接中通常需要此表中的所有数据。

连接到数据库:
我们使用python连接器写入数据库。python连接器支持MySQL Fabric。我们将在本博客的后面部分详细研究使用支持Fabric的python连接器。

启动MySQL Fabric


  1. 启动一个充当状态存储的MySQL Server。
  2. 更改fabric.cfg(用于配置Fabric)以将此MySQL Server用作状态存储。
  3. Fabric将有关分片拓扑的元数据保留在充当状态存储的MySQL Server的一组关系表中。此步骤在状态存储中创建表的架构。

命令:

mysqlfabric管理设置

启动Fabric服务器(包含XML-RPC服务器)。

命令:

mysqlfabric管理启动

创建分片拓扑

建立全球集团

分片设置中的全局组用于将模式更新传播到分片设置中的所有表,并更新整个分片生态系统中的全局表。全局组包含

分片表的模式

  • 全局表

命令:

mysqlfabric组创建GLOBAL_GROUP

mysqlfabric组添加GLOBAL_GROUP localhost:13001根“”

mysqlfabric组添加GLOBAL_GROUP localhost:13002根“”

查找localhost:13001的UUID并将其升级为主服务器
mysqlfabric组lookup_servers GLOBAL_GROUP

mysqlfabric组提升GLOBAL_GROUP <在本地主机上运行的MySQL Server的UUID:13001>

创建服务器组(用于个分片)


每个分片都映射到服务器组。每个服务器组都是HA配置中的一组MySQL服务器。该应用程序从单个服务器组开始,并根据需要添加更多的分片(服务器组)。让我们创建个碎片。


命令:

mysqlfabric组创建GROUPID1
mysqlfabric组添加GROUPID1 localhost:13003根“”

mysqlfabric组添加GROUPID1 localhost:13004根“”


mysqlfabric组lookup_servers GROUPID1

mysqlfabric组提升<在本地主机上运行的MySQLServer的UUID:13003>


创建分片定义

分片定义引入了一种特定的分片方案,可以将多个表(由公共分片键关联)映射到该分片方案。分片定义包括

  • 分片方案– RANGE,HASH
  • 全局组–获取映射到此分片定义的所有分片表的全局更新。它还将全局表存储在此分片定义中。

命令

mysqlfabric分片定义RANGE GLOBAL_GROUP

将表映射到分片定义

每个分片定义都与的ID相关联。当我们创建分片定义时,将生成此ID。在上述情况下,此ID为1。我们将此ID映射到要分片的表。每个映射都将一个表和包含分片键的列映射到分片定义。


命令:


mysqlfabric分片add_mapping 1 employee.employee emp_no

mysqlfabric分片add_mapping 1员工。工资emp_no

mysqlfabric分片add_mapping 1名员工。dept_empemp_no


添加碎片


添加分片时,我们会基于分片键定义数据分片的方式。每个碎片,

指定它所属的分片映射ID。

  • 它还指定了将存在分片数据的组。
  • 添加分片时,我们还需要指定是否对分片操作启用它。
  • RANGE分片定义还指定了一个Lower_bound,它表示将在特定分片中出现的分片键的小值。在这种情况下,我们假设lower_bound = 1。

命令:

mysqlfabric分片add_shard 1 GROUPID1 ENABLED 1


在全局组上定义架构


表的模式在全局组的主服务器上定义,以便将其复制到所有分片。

查询:

创建数据库员工;

使用员工;

创建表员工(emp_no INT主键AUTO_INCREMENT,出生日期DATE,名字VARCHAR(14),姓VARCHAR(16),性别ENUM('M','F'),雇用日期DATE);

创建表的薪水(emp_no INT,薪水INT,from_date DATE,to_date DATE,FOREIGN KEY(emp_no)参考employee(emp_no));

创建表dept_emp(emp_no INT,dept_no CHAR(4),from_date DATE,to_date DATE,FOREIGN KEY(emp_no)REFERENCES employee(emp_no));

创建表fuel_reimb(角色VARCHAR(20),配额INTEGER);

编写申请

下面的应用程序是用Python编写的。该应用程序非常简单,并使用连接器python在表中插入一行。该应用程序的目标是演示python连接器中的扩展,使其能够识别FABRIC。

申请代码:

导入mysql.connector.fabric作为连接器

如果__name__ ==“ __main__”:

fabric_params = {

“ fabric”:{“ host”:“ localhost”,“ port”:8080},

“ user”:“ root”,“ passwd”:“”

}

__cnx = connector.MySQLFabricConnection(** fabric_params)

__cnx.set_property(key = str(1),tables = [“ employee.employee”])

cur = __cnx.cursor()

cur.execute(“使用员工”)

cur.execute(“ INSERT INTO employee(出生日期,名字,姓氏,性别,雇用日期)VALUES(NULL,'A','B','M',NULL)”)

__cnx.commit()

说明:

fabric_params = {

“ fabric”:{“ host”:“ localhost”,“ port”:8080},

“ user”:“ root”,“ passwd”:“”

}


__cnx = connector.MySQLFabricConnection(** fabric_params)

上面的代码获得了到正在运行的Fabric XML-RPC服务器的连接。传递给MySQLFabricConnection类的参数是

host” -Fabric服务器运行所在的主机名。

port” -Fabric服务器运行的端口号。

用户”,“ passwd” -结构状态存储的登录凭据。

__cnx.set_property(key = str(1),tables = [“ employee.employee”])

–分片键值

–被分片的表名。

set_property自动在内部重定向到执行查询的正确分片。

如果需要对所有分片执行查询,例如对全局表进行更新或对所有分片进行模式更改操作,则添加一个参数

范围=“全球”

表示全球运营。默认情况下,此设置为“ LOCAL”。

添加更多碎片

随着分片大小的增加,我们将更多分片添加到分片拓扑中。

命令:

为分片添加组

mysqlfabric组创建GROUPID2

mysqlfabric组添加GROUPID2 localhost:13005根“”

mysqlfabric组添加GROUPID2 localhost:13006根“”

mysqlfabric组lookup_servers GROUPID2

mysqlfabric组提升<在本地主机上运行的MySQLServer的UUID:13005>

添加分片定义

与以前的定义的不同之处在于,lower_bound将指向我们从其开始插入此分片的员工编号。在这种情况下,我们选择一个假设值10001。这意味着从10001开始,员工信息将存储在此分片中。
mysqlfabric分片add_shard 1 GROUPID2 ENABLED 10001

下面将把应用程序定向到这个新的分片。

__cnx.set_property(key = str(10001),tables = [“ employee.employee”])

在上述情况下,任何大于10001的键值都会自动将插入内容重定向到新的分片。
注意:上面的步骤实际上是从指定的lower_bound开始添加一个新的分片。在分片设置中移动数据的其他选项是分片移动和拆分。这些将在以后的博客中进行探讨。在http://vnwrites.blogspot.in/2013/09/mysqlfabric-sharding-migration.html上

找到如何从n未分片的设置迁移到分片的设置。

分享好友

分享这个小栈给你的朋友们,一起进步吧。

MySQL干货资料
创建时间:2020-05-06 14:18:32
每天都有干货输出哦
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 飘絮絮絮丶
    专家
戳我,来吐槽~