数据库分库分表、读写分离

    xiaoxiao2022-07-13  147

    文章目录

    拆分方式拆分带来的问题主从同步配置原理binlog格式延时问题 Mycat应用实战

    拆分方式

    垂直拆分:垂直地拆分一张表,在表的列层面切分一张表水平拆分:水平地拆分一张表,在表的行层面拆分一张表 拆分策略: 一致性hash方式(可以为主键):数据分布在分库分表中分布均匀,但是基于范围查询性能较低日期时间方式:实际也算是一种范围方式的拆分方式范围方式:数据可能在某几个分库分表中集中,性能较低,但是基于范围查询较好

    拆分带来的问题

    跨库join问题

    设计时,放到同一库,规避该问题服务层查询不同库,连接全局表(公共数据) 数据变更较少,数据层面实现公共服务 字段冗余(空间换时间(订单表,商家id,商家名称(名称变更通过定时任务或通知)))

    跨分片数据排序分页

    服务层合并(mycat),性能并不是很好查询字段非分片字段,且该查询方式存在的比例很高时,可考虑将数据按两种分片方式存储两份,但需要做到数据一致性

    唯一主键问题

    RedisUUIDsnowflakezookeeper数据库全局表

    分布式事务问题

    2PC、3PC强一致性,牺牲性能

    应用的查询补偿机制,保证最终一致性

    主从同步

    配置

    master

    创建一个用户’repl’,并且允许其他服务器可以通过该用户远程访问master,通过该用户去读取二进制数据,实现数据同步

    Create user repl identified by ‘repl; repl用户必须具有REPLICATION SLAVE权限,除此之外其他权限都不需要

    GRANT REPLICATION SLAVE ON . TO ‘repl’@’%’ IDENTIFIED BY ‘repl’ ;

    修改master的 my.cnf配置文件,在[mysqld] 下添加如下配置

    log-bin=mysql-bin //启用二进制日志文件

    server-id=130 服务器唯一ID

    重启数据库 systemctl restart mysqld

    登录到数据库,通过show master status 查看master的状态信息

    slave

    修改slave的 my.cnf配置文件, 在[mysqld]下增加如下配置

    server-id=132 服务器id,唯一

    relay-log=slave-relay-bin

    relay-log-index=slave-relay-bin.index

    read_only=1

    重启数据库: systemctl restart mysqld

    连接到数据库客户端,通过如下命令建立同步连接

    change master to master_host=’192.168.11.140’, master_port=3306,master_user=’repl’,master_password=’repl’,master_log_file=’mysql-bin.000001’,master_log_pos=0;

    加粗部分从master的show master status可以找到对应的值,不能随便写。

    执行 start slave

    show slave status\G;查看slave服务器状态,当如下两个线程状态为yes,表示主从复制配置成功

    Slave_IO_Running=Yes

    Slave_SQL_Running=Yes

    原理

    master记录二进制文件至binlog中slave将master的binlog拷贝到自己的中继日志中(I/O线程)SQL线程读取中继日志,并进行数据更新

    binlog格式

    statement:基于sql语句模式;优点:文件较小;缺点:部分sql方法无法使用,如uuid,now()

    row:基于行模式,记录每一条修改的值;优点:数据一致;缺点:文件过大

    mixed:混合模式;优点:结合以上两种格式的优点,mysql自行选择;缺点:可读性较差

    修改方式:

    修改binlog_formater,通过在mysql客户端输入如下命令可以修改

    set global binlog_format=’row/mixed/statement’;

    在vim /etc/my.cnf 的[mysqld]下增加binlog_format=‘mixed’

    延时问题

    问题:

    当master库tps比较高的时候,产生的DDL数量超过slave一个sql线程所能承受的范围,或者slave的大型query语句产生锁等待

    网络传输: bin文件的传输延迟

    磁盘的读写耗时:文件通知更新、磁盘读取延迟、磁盘写入延迟

    解决方式:

    在数据库和应用层增加缓存处理,优先从缓存中读取数据

    减少slave同步延迟,可以修改slave库sync_binlog属性;

    sync_binlog=0 文件系统来调度把binlog_cache刷新到磁盘

    sync_binlog=n

    增加延时监控

    Nagios做网络监控

    mk-heartbeat

    Mycat应用实战

    主要的配置文件为server.xml,schema.xml,rule.xml

    server.xml:作为服务提供者的相关服务连接等配置schema.xml:配置连接的分库分表的信息rule.xml:分片规则的配置,也可自定义

    具体参见如下文档

    Mycat权威指南

    最新回复(0)