MySQL主从复制和读写分离
主从复制原理:
主数据库的数据 新增 修改 表 表里的数据 都会同步到从数据库
MySQL主从辅助的模式
架构:主从复制和读写分离
三台MySQL MySQL1 主(192.168.1.10) MySQL2 从 (192.168.1.11) MySQL3 从 (192.168.1.12)
Test1 读写分离 (192.168.1.20) Test2 客户端
主从服务器之间的时间也要同步 安装时间工具 ntp
Stratum 8 数字越小 时间精确度越高 设置fudge 8 时间层级是8 最高是15 从本地获取时间源 不走网络
主的完成
从:
两台服务器时间源指向主服务器 添加定时任务:
Crontab -e -u root
Date 查看当前时间
主:
Log:允许从服务器复制数据时 可以从主的二进制日志写到自己的二进制日志当中
重启MySQL
进入主数据库 给从服务器新建用户 给从库赋权
Flush privileges 刷新权限
Show master status 查看位置点
从库:/etc/my.cnf
Server – id =2 不能重复
默认是0 1表示开启中继日志的恢复 从服务器出现异常或者崩溃时 从服务器会从主服务器的二进制日志正确读取和应用中继日志
重启MySQL
从2:
重启mysql
2 3分别进入数据库 和主同步
CHANGE master to master_host='192.168.233.21',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=604;
Start slave 两台都要
Show slave status\G;
第一个是负责和主库的io通信 第二个是负责自己的slave MySQL进程
Slave io running no怎么解决
主服务器创建kgc 查看从服务器是否同步 主从复制完成 主从复制是单项的 只能从主复制到从
主从复制延迟问题:
解决方案:
安全性:
Innodb_flush_log_at_trx_commit=1
每次事务提交时都会刷新事务日志 确保持久性 最高级别的数据安全性 但是会影响性能 默认·是1 关闭改0 改0之后事务提交时不会立刻刷新 而是每秒刷新一次 可以提高性能 但是发送故障会导致数据丢失 设置为2时 事务提交时 事务日志不会写入硬盘 而是保存在系统缓存 不会进行刷新 有一定的安全性和性能 对内存的要求高
Sync_binlog=1
1也是默认值 每次提交事务之后直接把日志刷新到磁盘 以确保日志的持久性 占用很高性能 改成0后会把二进制日志写入到缓存 也不会刷新日志 故障发送也会丢失数据 可以自定义事务刷新次数 改成3 每三个事务执行一次刷新到磁盘 提高性能 但是一旦崩溃 数据会大量丢失
追求性能:
Innodb_flush_log_at_trx_commit=2
Sync_binlog=0
Logs-slave-updates=0 :从库的更新不会写入二进制文件
Innodb_buffer_pool_size 300M innodb存储引擎的缓冲池大小 设置数值越高 可以提高innodb的性能 更多的数据和索引都可以缓存在内存中 减少磁盘的访问次数 对系统内存要求比较高
主从复制的工作过程:
1、主节点的数据记录发送变化都会记录在二进制日志
2、slave节点会在一定时间内对主库的二进制文件进行探测 是否发送变化
3、如果有变化 从库会开启一个I/O的线程 请求主库的二进制事件
4、主库会给每一个I/O的线程启动一个dump 用于发送二进制事件给从库 从库通过I/O线程获取更新 slave_sql负责将更新写入到从库中 实现主从一致
读写分离:
要实现读写分离 必须要实现主从复制
所有的写入操作都在主MySQL 从库只负责读 如果有更新是从主库复制到从库
数据库的写入和读取是分开的 哪怕是写入的数据量比较大 但是不影响查询的效率
什么场景下需要读写分离?
数据库不是一定需要读写分离的 只有在某些程序在使用数据库过程中 更新少 但是查询多 可以考虑读写分离 生产库一般都会做读写分离
数据库的读写不会在同一个库中完成 既不安全也不能满足高可用 也不能实现高并发
读写分离的原理:
面试题:
Show slave status\G 纵向查看 IO SQL 两个都是yes
85%是配置文件
IO和SQL的线程状态信息 master服务器的IP地址和端口事务开始的位置 最近一次错误信息和错误位置 最近一次IO和SQL的报错信息
6、主从复制的延迟如何解决