在本文中,我们讨论了一个用例,该用例从单个服务器开始(单个分片设置),并随着应用程序及其数据的增长而逐步扩展。我们还将在这里描述使用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
- 启动一个充当状态存储的MySQL Server。
- 更改fabric.cfg(用于配置Fabric)以将此MySQL Server用作状态存储。
- 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未分片的设置迁移到分片的设置。