技术分享 | 数据库产品选型测试 集中式与分布式

前文

数据库派别分为集中式和分布式,谁强谁弱,一直争论不休。什么样的场景用上集中式数据库,什么时候适合用分布式,**分库分表的契机在哪里?**纸上得终学浅,绝知此事要躬行。还是需要做下测试,测试之前在各个博客与官网上做了大量的调研,宏观上基于shardingproxy上面进行sysbench测试,后面证实我也走过各位博主的坑。整体而言,不敢说100%的科学严谨,比起一些博主的结论严谨很多。

测试环境

ip mysql版本 角色 硬件配置
192.168.10.160 mysql 5.7、shardingproxy 5.1.0 shardingproxy 角色、mysql节点、 sysbench客户端执行 8C,12G
192.168.153.128 mysql 5.7 mysql节点 8C,6g

测试思路

  • 数据量级从500万起、1000万级别、5000万级往上递进【后面直接用5000万】
  • SQL语句采用sysbench的oltp_read_write.lua
  • 调整虚拟机CPU核数,逐步从1升到8,观察 sysbench的QPS和TPS以及CPU、内存、IO的消耗
  • 针对MYSQL单机测试不用 数据量级别下的QPS和TPS、以及CPU、内存、IO的消耗
  • 针对shardingproxy转发单个MYSQL,并观测QPS和TPS、以及CPU、内存、IO的消耗
  • 针对shardingproxy转发两个MYSQL,并观测QPS和TPS、以及CPU、内存、IO的消耗
  • 基于shardingproxy,基于原生语句DistSQL创建单表,创建分片规则,并通过 insert插 入大量数据,观测QPS和TPS、以及CPU、内存、IO的消耗
  • 通过sysbench生成相关数据,测试数据、销毁数据

环境了解

  • oltp_read_write.lua覆盖7个动作 execute_simple_ranges(),execute_sum_ranges()、 execute_order_ranges()、execute_distinct_ranges()、execute_index_updates()、execute_non_index_updates()、execute_delete_inserts(),某个程度,oltp_read_write.lua代表sysbench最有代表性的TPS和QPS的测试选项。

sum_ranges = { "SELECT SUM(k) FROMsbtest%u WHERE id BETWEEN ? AND ?", t.INT, t.INT}, order_ranges = { "SELECT c FROMsbtest%u WHERE id BETWEEN ? AND ? ORDER BY c", t.INT, t.INT}, distinct_ranges = { "SELECT DISTINCT cFROM sbtest%u WHERE id BETWEEN ? AND ? ORDER BY c", t.INT, t.INT}, index_updates = { "UPDATE sbtest%uSET k=k+1 WHERE id=?", t.INT}, non_index_updates = { "UPDATE sbtest%uSET c=? WHERE id=?", {t.CHAR, 120}, t.INT}, deletes = { "DELETE FROMsbtest%u WHERE id=?", t.INT}, inserts = { "INSERT INTOsbtest%u (id, k, c, pad) VALUES (?, ?, ?, ?)", t.INT, t.INT, {t.CHAR,120}, {t.CHAR, 60}}