分库分表
分库分表解决问题
超大容量,性能问题
如何做
垂直拆分,水平拆分
垂直分库:解决表过多的问题
垂直分表:解决单表列过多的问题
水平拆分:大数据表拆成小表,单表1000万
常见拆分策略
垂直拆分(er分片,避免跨库)
水平拆分:
一致性hash,根据订单号,hash取模
范围切分 id 0-1000000,10000001-20000000
日期拆分
拆分带来的问题:
1跨库jion问题 (尽量避免)
1如果存在,可以通过代码单独查询服务A,一个查询结果作为条件传给服务B,关联建是主键
不能做
For(list){
Rpc调用服务B
}
要一次性返回去处理
2 全局表(数据变更少,基于全局应用的)
- 做字段有效冗余(空间换时间)
订单表,商家表,商家名称,两表jion,订单表增加商家名称字段
商家名称变更通知订单表,定时任务
跨分片数据表分页问题
应用层实现,每个表进行查询,然后应用进行排序
唯一主键问题
自增id做主键,只针对单表
解决方案:
Uuid,字段长,索引大,影响性能
算法做主键,snowflake
Mongodb的objectid
Zookeeper的
Redis incr
数据库表做递增
分布式事务问题
多个数据库表之间保证原子性,2pc,3pc,导致问题:影响性能
如何权衡公司的存储需要优化
1 提前规划(主键问题,jion问题提前考虑)
2 当前单表数据超过1000万,每天增长量持续上升---需要优化
Mysql主从
写少读多的,读写分离,读库到写库同步数据,分多个读卡对数据库进行压力释放,
读卡实现负载均衡 HAProxy 进行分流,增加集群的性能
单主多从
安装数据库
启动数据库
systemctl start mysqld
Mysql
数据文件和二进制文件 var/lib/mysql
配置文件 /etc/my.cnf
日志文件 /var/log/mysql.log
修改配置文件:
开启二进制文件开启
设置id
创建一个用户
create user repl identified by 'repl’ ;
赋允许拷贝的权限
grant replication slave on *.* to 'repl'@'%' identified by 'repl';
修改配置文件:my.cnf
增加
log-bin=mysql-bin
server-id=128
从数据库
中记日志
server-id=129
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
Read_only=1
在从数据库执行
change master to master_host='192.168.72.128',master_port=3306,master_user='repl',master_password='repl',master_log_file='mysql-bin.000002',master_log_pos=154;
start slave;
show slave status\G;
主从同步完成
原理
Master数据库数据发生变化会记录bin-log
Slave 通过io./thread读取bin-log内容 然后写到 relay-log ,slave的sql/thread read relay-log 然后同步数据
Bin-log,用来记录数据库更新或者潜在更新,文件存储在/var/lib/mysql
查看bin-log内容:
mysqlbinlog --base64-output=decode-rows -v mysql-bin.000001
Binlog格式
Statement 基于sql语句模式 update effect 1000;uuid, now other function
Row 基于行模式 存在1000条数据变更,记录修改以后每一条变化的值
Mixed 混合模式 由mysql自动判断处理
查看模式
Show variables like ‘%log%’;
修改模式
set global binlog_format=’row/mixed/statement’;
双主配置通过keepalive保持会话,只开启一台
主从延时问题
Binlogcache
Sync binlog来设置刷新机制
Sync binlog = 0 文件系统调度吧binlogcache刷新到磁盘
Sync binlog = n n个事务 文件系统调度吧binlogcache刷新到磁盘
延时监控
网络监控
心跳监控:主从库都建一个表,然后插入时间当前,比较主从库时间差,如果差距大就说明延迟
应用解决,通过redis,每次插入之后同时插入redis里,然后取数据先从redis取,缓解下数据库延时时间
Mycat
核心数据库
逻辑数据库
核心配置文件
???
实在演示
Explain sql
根据分片建做路由
分片键和非分片键作为查询条件一起查询呢 根据分片建去查询
不是分片建做条件,都去查一遍,是不是影响性能了呢 影响性能,有缓存机制
???
能不能先分表,再去查询??? 用分片建就会查单表
跨库分表
支持oracle吗
我们分库分表路由是自己代码写的连接不同的数据库可以用mycat吗
读写分离
两种配置的差异
Writehost readhost
双主策略,不需要haproxy做路由
测试下一台挂了的情况
此配置数据库挂了,还可以继续操作数据库,但是会造成数据差异的风险
这种配置数据库挂了就不能操作数据库,可以避免造成数据差异的风险但是引起不能高可用
这种读写分离配置,查询都是查询129的库,插入del,update是操作128,然后128同步到129
这种双主配置
数据库双主架构图
跨库分表能够读写分离吗?
跨库分片规则,shading分片
实现自己的分片规则
全局主键,mycat自带的,zookeeper,redis incr
通过mycat连接,代码中事务不能用了吗
分库分表如果条件有分片建还有其他的,那么会查所有库吗 ?
通过mycat连接,代码中事务不能用了吗? 自己查资料
Mycat集群
高可用配置 ha keepalive进行