1.分库分表架构
MySQLA和MySQLB都是单点的,如果一个节点出现问题,那么就会出现数据不完整的问题,导致业务不可用。
2.复制与分库分表架构的结合
给MySQLA和MySQLB都配置一个从库,保证数据的完整性以及可靠性。
3.使用DBLE进行读写分离
(1).原理
- DBLE分析SQL语义
- 将写语句发送给主节点
- 将读语句发送给从节点
(2).rwSplitMode配置
- 0:直接分发到主实例
- 1:读操作必须在所有从实例中均衡
- 2:读操作在所有实例中均衡
- 3:读操作尽量在所有从实例中均衡
(3).读写分离架构
4.读写分离实战
(1).将A现有数据库和数据表里的数据同步到A’上,并参照主从复制章节为A配置一个从节点A’
(2).进入DBLE所在节点,为A配置一个从节点A’
<?xml version="1.0"?>
<dble:db xmlns:dble="http://dble.cloud/" version="4.0">
<!-- 修改rwSplitMode为1,将读操作打到从节点 -->
<dbGroup name="dbGroup1" rwSplitMode="1" delayThreshold="100">
<heartbeat>show slave status</heartbeat>
<!-- 修改url、user和password -->
<dbInstance name="instanceM1" url="121.4.211.73:3306" user="root" password="********" maxCon="1000" minCon="10" primary="true" readWeight="1" id="xx1">
<property name="testWhileIdle">true</property>
</dbInstance>
<!-- 配置从节点实例信息 -->
<dbInstance name="instanceS1" url="121.4.191.137:3306" user="root" password="********" maxCon="1000" minCon="10" readWeight="2" disabled="false">
<property name="testWhileIdle">true</property>
</dbInstance>-->
</dbGroup>
<dbGroup name="dbGroup2" rwSplitMode="0" delayThreshold="100" disableHA="true">
<heartbeat errorRetryCount="1" timeout="10" keepAlive="60">show slave status</heartbeat>
<!-- 修改url、user和password -->
<dbInstance name="instanceM2" url="121.4.191.124:3306" user="root" password="********" maxCon="1000" minCon="10" primary="true">
<property name="testWhileIdle">true</property>
</dbInstance>
</dbGroup>
</dble:db>
(3).重启DBLE
cd /root/dble
bin/dble restart
(4).在每个MySQL实例上设置监控SQL语句
#监控
mysql> SET GLOBAL log_output = 'TABLE';SET GLOBAL general_log = 'ON';
#查询
mysql> select * from mysql.general_log order by event_time desc limit 0,10;
(5).测试读
通过DBLE数据端,查询id=1的数据,然后查看A和A’的SQL语句执行情况。
mysql -uroot -h'127.0.0.1' -P8066 -p123456
use testdb;
select * from tb_range_sharding where id = 1;
可以看到主数据库A并没有查询语句,而从数据库A’出现了查询语句,与db.xml中配置的rwSplitMode="1"预期结果一致。
5.分库分表之后性能反而下降的解决方案
(1).原因
DBLE根据拆分字段,判断数据在哪个节点上,如果DBLE不知道数据在哪里或者需要扫描更多的节点,就会导致性能下降。
(2).解决方案
- 插入时必须带上拆分字段,否则无法插入数据,删改查尽量带上拆分字段
- 拆分字段尽量等值,避免模糊查询,扫描过多节点
- 减少跨节点连表
- 经常join的表使用相同的拆分规则,这样便可以在同一个库操作
- 使用拆分字段作为join条件
- 尽量对驱动表添加更多的过滤条件
- 尽量少使用跨节点排序、排序等功能