Mycat分库分表


                                分库分表

分库分表解决问题

超大容量,性能问题

 

如何做

垂直拆分,水平拆分

垂直分库:解决表过多的问题

垂直分表:解决单表列过多的问题

 

水平拆分:大数据表拆成小表,单表1000

 

常见拆分策略

垂直拆分(er分片,避免跨库)

 

水平拆分:

一致性hash,根据订单号,hash取模

 

范围切分  id  0-100000010000001-20000000

 

日期拆分

 

 

拆分带来的问题:

 

1跨库jion问题   (尽量避免)

 1如果存在,可以通过代码单独查询服务A,一个查询结果作为条件传给服务B,关联建是主键

不能做

For(list){

  Rpc调用服务B

}

 

要一次性返回去处理

 

 

2 全局表(数据变更少,基于全局应用的)

 

 

  1. 做字段有效冗余(空间换时间)

   订单表,商家表,商家名称,两表jion,订单表增加商家名称字段

   商家名称变更通知订单表,定时任务

 

 

 

 

跨分片数据表分页问题

 

应用层实现,每个表进行查询,然后应用进行排序

 

  

唯一主键问题

 

自增id做主键,只针对单表

解决方案:

Uuid,字段长,索引大,影响性能

算法做主键,snowflake

 

Mongodbobjectid

Zookeeper

Redis incr

 

数据库表做递增

 

分布式事务问题

 

多个数据库表之间保证原子性,2pc3pc,导致问题:影响性能

 

如何权衡公司的存储需要优化

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  slavesql/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 1000uuidnow 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的库,插入delupdate是操作128,然后128同步到129

 

 

这种双主配置

数据库双主架构图

 

 

跨库分表能够读写分离吗?  

跨库分片规则,shading分片

 

 

 

 

 

实现自己的分片规则

 

 

全局主键,mycat自带的,zookeeperredis  incr

 

 

通过mycat连接,代码中事务不能用了吗

 

 

分库分表如果条件有分片建还有其他的,那么会查所有库吗

通过mycat连接,代码中事务不能用了吗?  自己查资料

 

 

Mycat集群

 

 

 

 

 

 

 

高可用配置  ha  keepalive进行

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM