mysql主从复制
mysql日志
二进制日志
数据目录 mysql.bin.XXXXXXXXXX
滚动:达到最大上限。flush logs;服务器重启
mysql>PURGE
二进制日志的格式:
statement 不建议使用
row 一般使用
mixed
mysql-bin.index 二进制日志文件的索引文件
mysql >SHOW MASTER STATUS;
mysql >SHOW BINARY LOGS;
mysql >SHOW BINLOG EVENTS IN "file";
event
timestamp
position,offset,operstion server_id
即时点还原,用二进制日志恢复的数据和原始数据会有可能不一样。因为二进制记录日志的时候,有些事物执行的时候是并行的,所以会导致恢复的时候会有不一样。 二进制日志恢复数据很慢。
mysql的隔离级别:
READ-UNCOMMITTED
READ-COMMITTED
REPEATABLE-READ + STATMENT 很有可能导致二进制日志恢复的和源数据不一样。建议raw格式
SERIAILZABLE
主从模型:
master数据库执行语句,会保存一个事件。记录本地二进制文集
把二进制日志产生的事件发送到另一台数据库slave服务器上,
先保存到relay log 中继日志。
另一台服务器根据这个日志事件,执行写操作。
从的服务器会慢一点。如果主服务器上如果写操作太快的话,从数据库同步会慢一点。
默认要异步。同步会导致瓶颈。
从数据库上不应该允许写操作。只让它能读就行了。
可以一主多从。
只保证一个节点,同步到了信息。其他的不管。
从服务器和主服务器有可能不在一个机房里。
从数据库服务器就不需要记录二进制日志文件了。没必要。
但是一个从可能是从的从。所以有的情况下也有需要。多级复制。
复制的作用
辅助实现备份。
高可用
异地容灾
最重要的就是分摊负载了。。scale out。
读 从服务器
写 主服务器
不能在一个服务器上不能同时读写。
多个从的时候,负载均衡器,找一个mysql代理,能将mysql语句读写分离。rw-splitting
可以把多个从mysql做一个lvs。
查询到的先存到memcache缓存中,再一次查的时候先查memcache。再查从服务器。
主向从服务器,每一个都要发一次二进制文件。会导致大量IO。
单独拿出来一个从,负载给其他从发送二进制文件。这个从,只负责发送。本地不需要保存。要提供二进制文件。要有中继日志。但是不写又没有二进制文件。但是写了又浪费io。
block hole 。写到block hole里。不会保存。但是会产生二进制文件。
简化结构:
master slave
主从结构中 不使用mysql代理,如何让主的负责写,从的负责读。
比如让php程序(论坛)自己寻找主从。比较麻烦。
双主模型。但并不建议使用。
能分担读操作。但是对写操作无法减轻。
如果写实在是太大太多
分库,分表。
把大数据库拆分。垂直拆分。热分。
水平拆分表。
事物日志
错误日志
一般查询日志
中继日志
慢查询日志
一个mater对应n个slave
一从只能属于一个主服务器。
mysql5.6以后复制上 有了gtid。使得复制更加安全。不会产生数据混乱。
引入了多线程复制 multi-thread replication
配置mysql复制的基本步骤
master
1.启用二进制日志
log-bin = mater-bin
log-bin-index = master-bin.index
2 选择一个唯一的server-id
server-id = {0-2^32}
3创建具有复制权限的用户
REPLICATION SLAVE
REPLICATION CLIENT
SLAVE
1 启用中继日志
relay-log =relay-log
relay-log-index =
2 选择一个唯一的server-id
server-id ={0-2^32}
3 连接至主服务器,并开始复制数据:
CHANGER MASTER TO
MASTER_HOST = '',MASTEER_PORT='',MATER_LOG_FILE='',MASTER_LOG_FILE_POS=''
MASTER_USER='',MASTER_PASSWORD=''
START SLAVE;
mysql的复制线程
主 提供dump线程。 从 io线程 ,io接受保存至中继日志。sql进程读取中继日志。
执行sql。 IO_Thread SQL_tHREAD
具体步骤:
mysql要5.5或者5.6的?
用5.1的做。
修改master配置文件vim /etc/my.cnf
port=3306
log-bin=/var/lib/mysql/mysql-binlog
server-id=1
binlog_do_db=handb
innodb_file_per_table=1
修改slave配置文件
server-id=2
master-host=172.25.254.118
master-user=han
master-password=han
master-port=3306
master-connect-retry=5
replicate-do-db=handb
master:
mysql>grant replication slave,reload,super on . to han@172.25.254.119 identified by ‘han’;
mysql>create database handb;
show master status;
slave
mysql -uhan -phan -h 172.25.254.118
mysql>show slave status;
Slave_IO_Running: Yes
如果同步不成功
主库
slave stop
show master status;
手动同步
mysql>change master to
master_host=”
master_user=
master_password=
master_port=
master_log_file=
master_log_pos=
slave start
跳过异常
slave stop
SET GLOBAL sql_slave_skip_counter =1;
slave start
1 创建主库 从库
2 dump主库数据灌到从库
3 修改主库 从库配置
4 主库grant 从库 start slave