- Mycat介绍
- Mycat原理
- Mycat 核心配置
- Scheam.xml 逻辑数据库和节点对应关系配置
- Server.xml mycat的连接配置
- Rule.xml. 分片规则
- 自动分片auto-sharding-long,比如0-10000节点1 ,10001-20000节点2
- 枚举分片sahrding-bt-intfile ,比如beijing节点1,shanghai节点2
- 取模分片mod-long,
- 按日期分片
- 操作(水平分库)
- 可以用数据库工具直接连接Mycat的逻辑数据库。
- 在Mycat上创建逻辑表,就会在对应的节点上创建真实的物理表(这里会有多个节点)。
- 执行插入语句,如果是自动分片,那么Mycat就会根据Id存到对应的物理数据库中。
- Mycat乱码问题
- dbDriver="native"
- url="192.168.52.10:3306"
- 全局序列号问题(分库分表后主键没办法用自增主键)
- Server.xml里sequnceHandlerTypes设为0,表示使用本地文件sequence_conf.properties的配置当前全局Id
- Mycat读写分离
- 为什么需要读写分离?
- 性能提升:在高并发的情况下,数据库的读操作往往远多于写操作。通过读写分离,可以将读请求分散到多个从数据库上,只将写请求发送到主数据库。这样可以显著减轻主数据库的压力,提升整个数据库系统的处理能力。
- 可扩展性:随着业务量的增加,数据库的负载会逐渐增大。读写分离允许动态地添加更多的从数据库来应对读负载的增加,从而实现数据库的水平扩展。
- 高可用性:在Mycat的读写分离模式下,如果主数据库发生故障,可以迅速切换到从数据库进行读操作,保证业务的连续性。同时,也可以通过配置多个从数据库来提高系统的容错能力。
- 资源优化:读写分离可以根据数据库的负载情况,优化硬件资源的使用。例如,读操作通常不需要太高的CPU性能,但需要更多的I/0资源和网络带宽。可以针对性地为读服务器配置更优的I/0设备和更宽的带宽,而为写服务器配置更强的CPU。
- 为什么需要读写分离?
- 为什么有的必须要从主节点查询?为什么不是所有的查询都放到从节点上?
- 对事务一致性要求高的查询,为了保证事务的一致性,必须从主节点查询。
- 主从复制架构
- 主从复制用途
- 实时灾备,用于故障切换
- 读写分离,提高性能
- 数据备份
- 原理
- 把主服务器上的binlog复制到从服务器上执行一遍,这样主从服务器的数据就相同了
- 其实主节点上会有一个dump线程读取binlog的数据发送给从节点的IO线程
- 如果有两个从节点,主节点就会有两个dump线程与之对应
- 为什么需要dump线程?
- 因为数据安全性考虑,主节点的binlog肯定不能备外部直接访问
- 把主服务器上的binlog复制到从服务器上执行一遍,这样主从服务器的数据就相同了
- 主从复制用途
- 执行步骤
- 造成主从延迟的原因?及解决方案?
- 延迟1:binlog写入延迟
- 每个事务提交时会把数据都写入到缓存里,在由fsync线程统一刷到磁盘
- 这里我可以调整sync_binlog的值,来提高效率
- 延迟1:binlog写入延迟
- 延迟2:sqlThread处理慢的问题
- Mysql5.6往后把现有的sql线程 替换成了coordinator组件
- coordinator负责读取realylog的数据,分发给多个worker线程去执行,每个worker线程都会有一个队列(如何保证队列里的事务时有序的?逻辑时钟算法,每个事务在提交的时候都会生成一个时间戳的id,可以排序 )
- 分配策略(如何保证不同worker之间的事务有序?):1. 更新同一行数据的两个事务,必须发到一个worker上 2. 同一个事务的也不能备拆开,必须分配到一个work中。
- 解决了原先sql Thread单线程的瓶颈。
- 搭建步骤
- 准备主从两个mysql服务器,在主库上创建数据库,表,并插入数据
- 修改vim /etc/my.cnf配置文件
- lower_case_table_names=1 忽略大小写
- log-bin=mysql-bin 开启binlog功能
- server-id=1
- binlog-do-db=test 只备份test数据库
- binlog_ignore_db=dev忽略dev数据库
- 不加binlog-do-db和binlog_ignore_db表示备份全部数据库
- 重启mysql
- 在主服务器上创建一个从服务器访问的用户账户,用replication slave赋权
- 在从库上创建数据库,表,导入现有主库的数据
- 修改从库的my.cnf的server-id,并重启
- 配置从数据库访问主库的连接参数
- 保证主从服务的auto.cnf配置的uuid不相同
- 启动从服务器的复制进程,start slave (注意slave就是从服务访问主服务器的账户)
- Show slave status查看状态,保证slave_io_running和slave_sql_running都是yes
- 如果不是yes,就用show slave status \G进行排查
- 在主库进行插入删除更新,看从库有无同步成功
- 实现读写分离
- 在Scheam.xml 逻辑数据库和对应的节点,(这里节点应该是一个)
- 设定balance=1和writeType=0,比如保证从库读,主库写,并设定主从数据库的连接参数
- 在mycat上创建逻辑库,这样在mycat读其实就是读的从节点的数据库,写就是写的主节点的数据库