实战7、mysql存储引擎-复制原理__周四 2018.7.4

一 mysql存储引擎

mysql存储引擎说明:
- mysql时一个基于存储引擎解决方案的db,不同的业务及场景,可以选择一个合适的引擎从而满足需求
- 又给mysql可以提供并维护多个存储引擎
- 每个引擎有自己的特点
- 创建表时可以指定使用的引擎
每个引擎都需要分配buffer_pool,都需要相应的内存管理。
每个实例(instance只能管理自己的buffer_pool),用到多个的话,需要为多个分配。
引擎:按照某种规则去存储的。
innodb:innodb_buffer_size
myisam:key_buffer_size
memory:max_heap_table_size

了解engine:
show engines;

  • 查看db里支持的engine
  • 重点学习innodb

    • 能描述出来innodb引擎的特点
    • 理解innodb的表空间存储结构
  • 了解业界常见的引擎及特点

P_S也是一个单独的引擎,没有做持久化。

查看支持的引擎:
官方自带引擎

 - Innodb
 - Memory
 - MyISAM
 - ...
  • 其他第三方优化引擎
    • tokudb
    • MyRocks
    • Spider
    • Sequence
    • SphinxSE

mysqlbinlog命令来做binlogserver的同步。

tokudb: ->10:1的压缩,单机能压缩
MyRocks:facebook
Spider引擎:结构类似于:
spider相当于proxy

这里写图片描述
这里写图片描述

delete from  ntrx_tb  where id<100;

update trx_tb  set col1=...  where id<1000;

rollback;

事务里边不能操作非实物表

有个bug:

begin;
update tb1 set col1=...  where  id=N1;
update tb2 set col2=... where id=N;
commit;

用的mysql-proxy,需要做会话保持,最好不要用mysql-proxy。

短链接

innodb engine

  • 是mysql的默认存储引擎,提供高可靠性和高性能及以下主要优点:

    • 事务安全(通过ACID)
    • MVCC (Muti-version Concurrency Control)多版本并发控制

      • innodb行级别锁定
      • oracle样式一致非锁定读取
    • 表数据进行整理来优化基于逐渐的查询

    • 支持外键引用完整性约束
    • 大型数据卷上的max性能
    • 出现故障后快速自动恢复
    • 用于在内存中缓存数据和索引的缓冲区池

Innodb也是mysql5.6、5.7内置的默认引擎

  • 增加的硬盘驱动器和内存容量
  • 扩大的性价比要求
  • 增加的性能可靠性和故障恢复要求
  • 不断增加的大型、忙碌、强大、分布式和重要的mysql db

问:slow.log里有长事务,里边有更新、有插入,经常慢查询里有commit。Why?
连接数太高了,并发高、提交,慢,binlog拿不到锁了。

这里写图片描述
一个instance > 2G
innodb_buffer_pool_instances默认是8,原因,官方认为跑innodb的机器,内存不会低于16G,最好 > 16G 。

innodb表空间:
lsn: log sequence number

先写第一个,写完第一个再写第2个,。。。0,1,2, ->0,要刷到datafile里,如果没写,->日志等待,
推荐配置4个,大小,1G,
一个redo文件最少能写 1h,
lsn

这里写图片描述

innodb表是索引聚集表,是IOT,股票信息怎么用IOT设计,好友关系怎么用IOT涉及。
让读取用顺序IO,写,用随机IO。

innodb NoSQL/Memcache API

  • 配置Memcached表:
  • SOURCE /scripts/innodb_memcached_config.sql

    • 创建innodb_memcache db,期包含下列表:

      • cache_policies:存放每个memcached 操作的后备存储,策略:本地RAM高速缓存、innodb或两者
      • Containers:存放用作Memcached后备存储的每个Innodb表的配置
      • config_options:存放separator 和 table_map_delimiter 配置选项的值
    • 安装Memcached插件:

      • INSTALL PLUGIN daemon_memcahed SONAME “libmemcached.so”;
      • 配置Memcached变量:
        • daemon_memcached_option :在启动时传递给Memcached守护进程的空格分隔的选项。

日志类的可以用tokudb引擎

Memrory引擎

  • 内存表、不落地
  • 支持hash和Btree索引
  • 每次重启mysqld会对内存表进行一个trunate table操作。运行中进行truncate table操作,会释放内存。
  • 不支持blob和varchar列
  • 大小受限:max_heap_table_size

b-trrr 和b+tree区别
b+tree多了一个左边分页到右边分页的指向,分支质检有链表,

tokudb & MyRocks

  • tokudb
    • 高速写入引擎,使用的LSM Tree
    • 支持多个主键
    • 高压缩存储
    • 对写入环境有很多优化
      -MyRocks
    • 目标在于替换innodb,适用于读写混合模式
    • 基于LSM Tree
    • 高压缩存储
    • 同样CPU使用情况下,同样的项目存储上可以节省一半以上的空间
    • github上有压测参数

Spider

  • 支持网络分区及XA事务,可以让表分布在不同的实例上
  • 在MariaDB的发行版中,国内腾讯游戏大量使用
<node1>create table s(id int not null auto_increment,code varchar(10),primary key(id));
<spider>create table s(id int not null auto_increment,code varchar(10),primary key(id))
engine SPIDER
comment  'host"127.0.0.1",user "msandbox",password "masandbox",port "8607"';

非事务表不会回滚。

复制:

version 5.7都是基于row+gtid的复制。
这样就是给每个事务做个编号,M上可以查出来有哪些事务,S上执行了哪些事务。

这里写图片描述

1、异步复制:

适用场景:异地
不足:M只负责通知一下唉,至于S上有没有接收完binlog,不管。

Master Slave
dump_thread IO_thread
SQL_thread

(M上写完日志后,拿到filename和position,写到redolog,M完成。然后M的 dump_thread通知S的IO_thread去拉日志,(拉完之后要不要给M 回个包,->到以后的增强半同步复制了。)拉到本地后放到relaylog里,sql_thread重新读取relaylog的内容,进行逻辑的重放,完成复制过程。

问题:mysql replication 是主库把日志推给slave,还是Slave从 主库上把日志拉过来的。
答:拉。是M通知S去拉,拉完之后,要不要给回个包,–>到以后的增强半同步复制了。

2、半同步复制

适用:金融环境
说明:

  • 半:是保证到relaylog,不保证到datafile里。
  • 单工通信
    这里写图片描述
    不足:-> 脏读
    IO_thread给主库一个回包,说我数据拉完了,主库再提交,会不会存在复制延迟(复制延迟:IO_thread获取最新的new_timestamp)?
    io_thread.new_timestamp - sql_thread.exec_timestamp >0s(说明有延迟)

3、增强半同步

说明:性能特别好,双工通信
after_sync:

这里写图片描述

在M上创建单独的线程接收线程来响应S的回包。大致流程如下:
这里写图片描述

MGR

Mysql Group Replication

多源复制

总结:

关于io_thread和sql_thread的复制
IO_thread

  • 关联复制分类
  • 多源复制
  • 基于filename + position
  • 基于gtid自动找同步位置
  • replication crash recovery

SQL_thread

  • 早期单进程
  • v5.6 基于database级别的并行
  • v5.7基于事务级别的并行

    • binlog group commit
  • v8.0基于行级别的并行

复制应用场景
- 主库压力较大扛不住
- 把读压力分担一部分到从库上

  • 业务高峰db 连接数太多
    • 例如高峰的认证,只需要把这个业务拆分到从库上
  • 有些大的sql出现不多,不好优化 ->专用从库
    • 后面的统计分析类的sql
  • 利用从库做高可用切换(从库开read only)
    • 高可用场景:S上数据没复制完,能切换到S上吗?
  • 利用主从复制,实现多IDC架构

问题1:
一主三从的结构,从库second_behind_master 延迟五千多秒,io_thread和sql_thread都是yes,这种情况怎么处理这个延迟?是不是等sql_thread执行完就行了?
答:
解析下binlog,看是不是有大事务。

问题2:

如果用增强半同步,如果主从之间网络断了,主库还在不停的写入数据,从库没有获取主库的binlog了,那么等主从网络恢复了,binlog能搞到从库上吗,并且主从数据还是一致的吗?
答:
看配置允不允许退化,如果退化,->主库裸奔了。
rpl_semi_sync_master_timeout

超过这个参数设置的时间就变成异步复制

猜你喜欢

转载自blog.csdn.net/ha_123_qq/article/details/80969639