MySQL性能优化之主从同步,读写分离

时间:2024-05-23 16:16:22

一.Innodb_buffer_pool_size

1,Innodb_buffer_pool_size:innodb的缓存,可以用于缓存索引,同时还会缓存实际的数据;
innodb_buffer_pool_size 参数用来设置Innodb 最主要的Buffer(Innodb_Buffer_Pool)的大小,对Innodb 整体性能影响也最大,可以按需要设置大一些;

2,可以通过show status like ‘Innodb_buffer_pool_%’;查看innodb buffer的状态
1,Innodb_buffer_pool_pages_data:使用到了的缓存页数;
2,Innodb_buffer_pool_pages_flushed:刷新过的缓存页数;
3,Innodb_buffer_pool_pages_free:剩余的缓存页数;
4,Innodb_buffer_pool_pages_total:总缓存页数;
5,Innodb_buffer_pool_read_requests:从缓存中读取的数据量;
6,Innodb_buffer_pool_reads:直接从磁盘读取的数据量;

3,可以通过这些参数计算出缓存命中率和缓存利用率等;

二.事务优化

(1).隔离级别优化
1,innodb实现了
READ UNCOMMITTED
/READ COMMITTED/
REPEATABLE READ/
SERIALIZABLE四种隔离级别;
2,默认使用REPEATABLE READ隔离级别;
3,可以通过SELECT @@tx_isolation;查看当前的事务隔离级别;
4,可以通过set tx_isolation=‘read-committed’;来修改默认的事务隔离级别;

(2).innodb_flush_log_at_trx_commit
1,理解Innodb事务机制:
1,事务在buffer中对数据进行修改;
2,事务的变化记录在事务日志中;
3,在合适的时机同步事务日志中的数据到数据库中;
2,所以什么时候提交事务日志文件,对系统性能影响较大,可以通过设置innodb_flush_log_at_trx_commit来修改事务日志同步时机:
1,innodb_flush_log_at_trx_commit = 0,每1秒钟同步一次事务日志文件;
2,innodb_flush_log_at_trx_commit = 1,默认设置,每一个事务完成之后,同步一次事务日志文件;
3,innodb_flush_log_at_trx_commit = 2,事务完成之后,写到事务日志文件中,等到日志覆盖再同步数据;
注意,1性能最差,2不能完全保证数据是写到数据文件中,如果宕机,可能会有数据丢失现象,但性能最高;1,性能和安全性居中;

三.MYSQL的主从

(1).为什么要做主从?
MySQL性能优化之主从同步,读写分离
1,就算MYSQL拆成了多个,也必须分出主和从,所有的写操作都必须要在主MYSQL 上完成;
2,所有的从MYSQL的数据都来自于(同步于)主MYSQL;
3,既然涉及到同步,那一定有延迟;有延迟,就一定可能在读的时候产生脏数据;所以,能够在从MYSQL上进行的读操作,一定对实时性和脏数据有一定容忍度的数据;比如,登陆日志,后台报表,首页统计信息来源;文章;资讯;SNS消息;
4,在我们的P2P中,做主从,绝大部分的读操作,都必须在主MYSQL上执行;只有(登陆日志,报表等查询类的业务可以定位到从MYSQL);
5,[一定注意]:在MYSQL主从时,如果一个业务(service中的一个方法)中,如果既有R操作,又有W操作,因为W操作一定要在主MYSQL上,所以在一个事务中所有的数据来源都只能来自于一个MYSQL
只要涉及到了写的操作,一定是在主MySQL上,否则会产生脏数据.

(2).MYSQL主从原理
MySQL性能优化之主从同步,读写分离
1,要完成主从同步,就必须让在Master上执行的所有的DML和DDL能够正确的在Salve上再执行一遍;MYSQL选择使用文件来记录SQL;
2,要完成主从同步,第一个事情就是把在主服务器上的bin-log(二进制文件)打开,bin-log文件就可以记录在MYSQL上执行的所有的DML+DDL+TCL;
3,MYSQL使用被动注册的方式来让从MYSQL请求同步主MYSQL的binlog;原因:被动请求的方式,主的MYSQL不需要知道有哪些从的MYSQL,我额外添加/去掉从MYSQL服务器,对主MYSQL服务器的正常运行没有任何影响;
4,第二步,从MYSQL后台一个线程发送一个请求,到主服务器请求更新数据;最重要的数据(我这次请求,请求你bin-log的哪一行数据之后的数据)
5,第三步,主MYSQL后台一个线程接收到从MYSQL发送的请求,然后读取bin-log文件中指定的内容,并放在从MYSQL的请求响应中;
6,第四步,从MYSQL的请求带回同步的数据,然后写在从MYSQL中的relay-log(重做日志)中;relay-log中记录的就是从主MYSQL中请求回来的哪些SQL数据;
7,第五步,从MYSQL后台一个线程专门用于从relay-log中读取同步回来的SQL,并写入到从MYSQL中,完成同步;
8,MYSQL的主从同步是经过高度优化的,性能非常高;

(3).配置主从:
配置主从:
1,添加一个新的MYSQL实例
①,复制mysql安装目录;
②,修改新mysql的相关配置(端口,安装目录,数据目录)
③,为新的mysql创建数据目录(从mysql的安装目录中拷贝data文件夹);
④,为新的mysql创建windows系统服务mysqld install MySQL2 --defaults-file=“E:\MySQL\mysql_base\ini\my.ini”
⑤,检查创建的系统服务,并启动测试;
2,配置主从:
①,因为主数据库之前的内容没有放在binlog中,所以要同步这些数据,只能通过主数据库备份来完成;
②,配置主数据库;
1,server-id://给数据库服务的唯一标识,一般为大家设置服务器Ip的末尾号,在一个集群中,这个id是不能重复的;
2,log-bin=master-bin://开启二进制文件;后面设置的这个master-bin就是二进制文件的名字前缀(名字);
3,log-bin-index=master-bin.index//开启二进制文件的索引;名字一般为log-bin.index
3,启动主数据库,执行show master status命令;
MySQL性能优化之主从同步,读写分离
只要能够看到正常的查询结果,说明主服务器已经配置完成;
结果中,注意两个重点:
1,File:二进制文件的文件名;
2,Position:当前文件已经记录到的位置;

4,配置从服务器;
①,server-id;
②,relay-log=slave-relay-bin
③,relay-log-index=slave-relay-bin.index
5,启动从服务器;
6,回复主数据库的备份;
7,让从数据库指定Master库:
change master to master_host=‘127.0.0.1’, //Master 服务器Ip
master_port=3306,//Master服务器的端口
master_user=‘root’,//Master服务器的账户(其实应该是一个专门用于数据同步的账户)
master_password=‘admin’,//Master服务器的同步账户密码
master_log_file=‘master-bin.000001’,//Master服务器产生的日志
master_log_pos=0;//指定请求同步Master的bin-log的哪一行数据之后的内容;

8,启动从MYSQL;start slave;

关于springboot读写分离的相关测试代码,请参考下面的文章
基于SpringBoot的MYSQL数据库读写分离