资源预览内容
第1页 / 共22页
第2页 / 共22页
第3页 / 共22页
第4页 / 共22页
第5页 / 共22页
第6页 / 共22页
第7页 / 共22页
第8页 / 共22页
第9页 / 共22页
第10页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
分布式关系型数据库 DRDS最佳实践最佳实践最佳实践切分维度的选择是决定我们的分布式数据最重要的一个权衡性因素,需要审慎选择,一般而言,您可以按照以下五个维度进行思考和权衡,包括数据均衡度考虑、事务边界因素、常用查询效率考虑、异构索引考虑、简单性策略。 每一个应用业务类型可能都不太一样,也不太可能匹配所有因素的最优策略,具体采用何种方式,还需要通过综合考量,每个因素都不能太走极端,否则会导致开发运维成本急剧增长。容量和访问均衡容量和访问均衡一般来说数据容量和访问均衡是我们考量的第一点,不均衡的数据分布和访问可能不能充分发挥数据拆分的能力,让访问体验变差,同时带来成本上的损耗,相当于1+1分布式关系型数据库 DRDS最佳实践2小数据量导入小数据量导入数据量较小(千万级别),且不需要增量的一次性数据导入,或者以测试兼容性为目的导入一些数据。推荐直接使用Mysql source或Navicat进行单线程迁移,或者手写代码多线程batch将数据写入DRDS。单线程导入数据,其劣势是导入的速度会比较慢,无法发挥分布式数据库非常高的系统并行度优势,但实际使用相当方便。例如,使用mysql source命令导入数据:http:/www.blogjava.net/hh-lux/archive/2007/05/05/115419.html 或使用navicat进行xxx.sql 或xxx.csv的数据导入大数据导入大数据导入DRDS在数据散列均衡的时候是可以充分发挥下层存储100%的读写能力的,您可以不用担心。如果希望使用自己的数据进行写入性能验证,那么我们建议您使用batch 方式进行写入(同时多线程读取效果更佳),如用java,可以使用jdbc api中有batch提交sql的接口,代码如果要实现高效必须在jdbc url中加入参数rewriteBatchedStatements=true(代码片段使用druid数据源 https:/github.com/alibaba/druid ),允许mysql connector将多条insert语句 合并成multi values格式的一条insert语句提交给mysql server执行,并且需要是PrepareStatement执行sql。具体原理分析可以参考: http:/www.cnblogs.com/xhan/p/3958521.html代码示例:/连接设置和创建 ds = new DruidDataSource(); ds.setUrl(“jdbc:mysql:/“ + c.getHost() + “:“ + c.getPort() + “/“ + c.getSchema(); ds.setConnectionProperties(“autoReconnect=true;socketTimeout=600000;rewriteBatchedStatements=true“); ds.setDriverClassName(“com.mysql.jdbc.Driver“); ds.setUsername(c.getUser(); ds.setPassword(c.getPassword(); ds.setMaxActive(16); ds.setMaxWait(5000); ds.init();分布式关系型数据库 DRDS最佳实践3DRDS对于数据导入的支持DRDS对于数据导入的支持对于应用正式上线,我们有专用的工具进行数据迁移。这种情况下通常需要准备一台或多台迁移机,具体部署方式根据用户数据库的网络情况分为两类:1)1) 如果用户数据库可以从云内直接访问,此时推荐使用ECS作为迁移机器。由于ECS到DRDS通过内网传输数据,带宽很高,同时ECS的公网带宽可以弹性升级,可以使得数据迁移的效率达到最优。为了降低上云的成本,我们已经部署好了一些专门用于迁移的ECS,一般情况下不需要额外准备。2)2) 某些案例中出于安全或其他方面的考虑,用户网络能够访问到阿里云,而阿里云环境中的机器无法访问用户网络。这种场景下需要将迁移程序部署在用户的机器上进行数据迁移。/数据导入代码 import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; public class BatchedInsertDemo public static void doBatchedInsert(Connection conn, int batchSize, int insertCount) throws SQLException PreparedStatement ps = conn.prepareStatement(“insert into Test (name,gmt_created,gmt_modified) values (?,now(),now()“); for (int i = 0; i EXPLAIN SELECT * FROM test; +-+-+-+ | GROUP_NAME | SQL | PARAMS | +-+-+-+ | TESTDB_1478746391548CDTCTESTDB_OXGJ_0000_RDS | select test.c1,test.c2 from test | | | TESTDB_1478746391548CDTCTESTDB_OXGJ_0001_RDS | select test.c1,test.c2 from test | | | TESTDB_1478746391548CDTCTESTDB_OXGJ_0002_RDS | select test.c1,test.c2 from test | | | TESTDB_1478746391548CDTCTESTDB_OXGJ_0003_RDS | select test.c1,test.c2 from test | | | TESTDB_1478746391548CDTCTESTDB_OXGJ_0004_RDS | select test.c1,test.c2 from test | | | TESTDB_1478746391548CDTCTESTDB_OXGJ_0005_RDS | select test.c1,test.c2 from test | | | TESTDB_1478746391548CDTCTESTDB_OXGJ_0006_RDS | select test.c1,test.c2 from test | | | TESTDB_1478746391548CDTCTESTDB_OXGJ_0007_RDS | select test.c1,test.c2 from test | | +-+-+-+ 8 rows in set (0.04 sec)mysql SHOW NODE; +-+-+-+-+-+- -+ | ID | NAME | MASTER_READ_COUNT | SLAVE_READ_COUNT | MASTER_READ_PERCENT | SLAVE_READ_PERCENT | +-+-+-+-+-+- -+ | 0 | TESTDB_1478746391548CDTCTESTDB_OXGJ_0000_RDS | 69 | 0 | 100% | 0% | | 1 | TESTDB_1478746391548CDTCTESTDB_OXGJ_0001_RDS | 45 | 0 | 100% | 0% | | 2 | TESTDB_1478746391548CDTCTESTDB_OXGJ_0002_RDS | 30 | 0 | 100% | 0% | | 3 | TESTDB_1478746391548CDTCTESTDB_OXGJ_0003_RDS | 29 | 0 | 100% | 0% |分布式关系型数据库 DRDS最佳实践62、无法使用 SQL 语句表示的执行计划,DRDS 使用自定义格式的执行计划来表示。例如:其中,SQL 字段内容中的 executeOn 表示下推的 SQL 语句在哪个分库上执行,分库执行后返回的结果最终由DRDS 进行合并。RDS/MySQL 层执行计划RDS/MySQL 层执行计划RDS/MySQL 层执行计划的结果与原生 MySQL 执行计划一致,请参考 MySQL 官方文档。一个 DRDS 逻辑表可能由多个分布在不同分库上的分片所组成,所以查看 RDS/MySQL 层执行计划也有多种方法。1、查看一个 RDS/MySQL 分片的执行计划。如果查询条件中带有拆分键,则直接使用 EXPLAIN EXECUTE 指令来查看对应分片上的执行计划。例如:| 4 | TESTDB_1478746391548CDTCTESTDB_OXGJ_0004_RDS | 11 | 0 | 100% | 0% | | 5 | TESTDB_1478746391548CDTCTESTDB_OXGJ_0005_RDS | 1 | 0 | 100% | 0% | | 6 | TESTDB_1478746391548CDTCTESTDB_OXGJ_0006_RDS | 8 | 0 | 100% | 0% | | 7 | TESTDB_1478746391548CDTCTESTDB_OXGJ_0007_RDS | 50 | 0 | 100% | 0% | +-+-+-+-+-+- -+ 8 rows in set (0.10 sec)mysql EXPLAIN DETAIL SELECT COUNT(*) FROM test; +-+-+-+ | GROUP_NAME | SQL | PARAMS | +-
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号