一 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
超过这个参数设置的时间就变成异步复制