当前数据库服务存在问题
现在的架构设计
问题1:如果数据库主库宕机,则影响整个数据库服务.
问题2:如果后台的Amoeba宕机,也会影响整个服务.
主库宕机影响
- 因为配置数据库主从服务器.从库可以实时备份主库的数据.但是当主库宕机后.如果通过某些技术手段可以实现数据库的故障迁移.但是这时从库需要同时读写数据.一段时间后,从库的数据会比主库的数据要多.
- 如果这时主库服务器修复.amoeba根据原有的配置继续实现读写分离.
但是从库中的数据比主库中的数据多.这时IO线程会断掉.至此无法实现主从同步. - 该问题导致之前用户写入的数据,主库中没有.同时用户新增的数据从库中没有,导致数据不一致.
改进策略
- 主从切换
如果主库(A库)宕机,那么原来的从库(B库)升级为主库主写或者读.同时将A库降级为从库并且挂载到B库上.----已经实现需要依赖于第三方插件.同时该方案不适用于多个主从服务配置. - 双机热备形式(双主模式)
采用双机热备的形式是实现数据库高可用的最为简单的方案.2台数据库互为主从结构.即使其中一台宕机,也不会影响整个数据库服务.
配置互为主从
A库: 192.168.126.162:3306
B库: 192.168.126.162:3306
上篇中:
B库挂载到A库上
现在:
A库挂载到B库上
/*查询从状态*/
SHOW MASTER STATUS;
/*实现主从挂载*/
CHANGE MASTER TO MASTER_HOST="192.168.126.163",
MASTER_PORT=3306,
MASTER_USER="root",
MASTER_PASSWORD="root",
MASTER_LOG_FILE="mysql-bin.000001",
MASTER_LOG_POS=387
/*启动主从服务*/
START SLAVE
/*检查主从状态*/
SHOW SLAVE STATUS;
主从测试
分别修改主库和从库数据,检查数据是否自动同步.
Mycat
介绍
Mycat安装
前提要求:Mycat的安装需要依赖JDK1.8,
上传文件后解压
命令:
./mycat start启动
./mycat stop停止
./mycatstatus状态信息
编辑Server.xml
编辑schemas配置文件
<!--定义节点名称/节点主机/数据名称-->
<dataNode name="jtdb" dataHost="localhost1" database="jtdb" />
<!--参数介绍-->
<!--balance 0表示所有的读操作都会发往writeHost主机 -->
<!--1表示所有的读操作发往readHost和闲置的主节点中-->
<!--writeType=0 所有的写操作都发往第一个writeHost主机-->
<!--writeType=1 所有的写操作随机发往writeHost中-->
<!--dbType表示数据库类型mysql/oracle-->
<!--dbDriver="native" 固定参数不变-->
<!--switchType=-1 表示不自动切换, 主机宕机后不会自动切换从节点-->
<!--switchType=1 表示会自动切换(默认值)如果第一个主节点宕机后,Mycat会进行3次心跳检测,如果3次都没有响应,则会自动切换到第二个主节点-->
<!--并且会更新/conf/dnindex.properties文件的主节点信息 localhost1=0 表示第一个节点.该文件不要随意修改否则会出现大问题-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select 1</heartbeat>
<!--配置第一台主机主要进行写库操作,在默认的条件下Mycat主要操作第一台主机在第一台主机中已经实现了读写分离.因为默认写操作会发往137的数据库.读的操作默认发往141.如果从节点比较忙,则主节点分担部分压力.
-->
<writeHost host="hostM1" url="192.168.126.162:3306" user="root" password="root">
<!--读数据库-->
<readHost host="hostS1" url="192.168.126.163:3306" user="root" password="root" />
</writeHost>
<!--定义第二台主机由于数据库内部已经实现了双机热备.-->
<!--Mycat实现高可用.当第一个主机137宕机后.mycat会自动发出心跳检测.检测3次.-->
<!--如果主机137没有给Mycat响应则判断主机死亡.则回启东第二台主机继续为用户提供服务.-->
<!--如果137主机恢复之后则处于等待状态.如果141宕机则137再次持续为用户提供服务.-->
<!--前提:实现双机热备.-->
<writeHost host="hostM2" url="192.168.126.163:3306" user="root" password="root">
<readHost host="hostS1" url="192.168.126.162:3306" user="root" password="root" />
</writeHost>
</dataHost>
Mycat高可用测试
将主库关闭后/测试高可用是否能够实现.测试数据是否同步
分库分表
为什么要分库分表
当数据库中存储的数据很多,使用优化策略也无法达到用户的要求时才会进行分库分表
数据库的垂直拆分
根据业务逻辑进行拆分,将一个数据库中的表,拆分到多了数据库中
数据库的水平拆分
由于单表数据量很大,将单表中的数据,水平拆分到多张表中.分配到多个数据库中.
由于分库分表比较复杂,后期我将会整理一下关于mycat如何做分库分表的文章。
数据库如何优化
- 优化sql语句
原则:1.尽量根据主键查询
2.尽量使用单表查询/不要关联查询
3.查询时可以使用in但是绝对不要使用not in - 创建索引
CREATE INDEX 索引名称ON 表名称 (列名称) - 添加缓存
例如:mybatis一/二级缓存该操作效率低
主要:redis/memercache(String)
作用:可以有效的缓解数据库压力. - 使用数据库的读写分离
- 定期将历史数据进行转储.
当前表/查询历史表 - 进行分库分表(最后策略)
数据库服务器数量和运维都需要花费很多的时间和精力.