MySQL 的日志类型
二进制日志,事务日志,错误日志,一般查询日志,中继日志,慢查询日志
二进制日志有以下内容
数据目录,一般放置在mysql-bin.XXXXX编号)
滚动:达到一个最大上限,flush logs,服务器重启
格式:statement
row
mixed
mysql-bin.index:二进制日志文件索引文件
mysql > SHOW MASTER STATUS查看主服务器的状态
mysql > SHOW BINARY LOGS 查看二进制日志
mysql > SHOW BINLOG EVENTS IN ‘file‘查看二进制日志中的事件
event中比较重要的选项:
timestamp时间戳
position,offset,operation,server-id
MySQL的隔离级别:
READ-UNCOMMITED
READ-COMMITED
如果使用mixed可能会发生数据不一致的情况
官方推荐使用row 的方法
REPEATABLE-READ
SERIALIZABLE
复制实现的功能
- 实现数据备份
- 如果有从服务器,主服务器发生故障之后,开通从服务器的写入功能,从而提供高可用的使用功能
- 异地容灾
- 分摊负载(scale out )主服务器:写 从服务器:读
复制方法有三种,分别是主从复制,半同步复制以及主主复制
首先介绍主从复制(使用较频繁)
在主服务器上,前端用户每次执行一次数据库发生修改或者引起修改的指令,都会在二进制日志中保存为一个事件,每保存一个事件,都会通过MySQL的3306端口发送给另外一个服务器,另外一台服务器将这个日志接收下来,然后先保存在本地的日志文件中,然后每次读取一个操作,然后将每一次修改执行到自己服务器上,这个过程叫做MySQL 的复制
master上存在一个二进制文件Binary log
slave 从主服务器上二进制文件复制而成的文件,叫做中继日志(relay log)
在主服务器上当有多个事务并发执行的时候,但是在写入二进制文件中的时候只能一条一条写,因此就需要一个暂时缓存的日志文件进行缓存,接着再向二进制文件中写入
其中在复制方法上同时又有同步复制以及异步复制的区分:
同步复制
从服务器不能比主服务器慢,前端发生的修改不能及时的得到slave 的响应
因此基本上是使用半同步复制的方法
半同步复制只是将数据同步发送给另一个节点,只能保证近的节点能够及时的响应
异步复制:一主多从,等待每一个服务器都同步完成的时候,
在多台从服务器进行复制的时候,可能会因为请求过多,主服务器难以有效的处理,因此就需要一个前端代理。
读写分离(rw-splitting):找一个MySQL的前端代理,工作在应用层,能够理解MySQL的语句,能够完成将不同的操作(读 写)定向到不同的服务器,分别分发给主服务器和从服务器,从而完成读写分离
多级复制:一个从服务器可能是一个主服务器的从服务器,也可能是另一个从服务器的从服务器
如果一个从服务器不记录中继日志,则不能将内容发送给下一级服务器,从服务器上不能进行写操作
接下来介绍双主模型:
双主模型的时候,配置几乎一样,但是要很注意server-id的重要性,防止出现复制环路的产生
无法实现减轻写操作,很容易出问题
例如
tutors:name,age,gender,tid
tom 10
jerry 30
A主机:UPDATE tutords SET name=jerry
B主机:UPDATE tutors SET age=30 WHERE name=tom
在最终的完成同步的时候,查询出来的结果并不认能够合并,会产生冲突
所以在生产环境中,一般不建议使用双主模型
读写分离可以由下面的组件实现:
mysql-proxy
amoeba
数据拆分之后实现路由:
cobar
补充:
master :slave
1-->N
slave :master
1-->N X
一个从服务器只能属于一个主服务器
MySQL 5.5之前的复制实现非常简单,
MySQL 5.6之后引用了 gtid,multi-thread replication(多线程复制)
配置MySQL复制基本步骤
主从复制
一.master
启用二进制日志
log-bin=master-bin
log-bi-index =master-bin.index
-
- 选择一个唯一的server-id
server-id ={0-2^32}
- 创建具有复制权限的用户
- 选择一个唯一的server-id
REPLICATION SLAVE
REPLICATION CLIENT
二.slave
1.启用中继日志
relay-log =relay-log
log-bin-index=
2.选择一个唯一的server-id
server-id ={0-2^32}
3.连接至主服务器,并开始复制数据
mysql > CHANGER MASTER TO MASTER_HOST= ‘ ‘,MASTER_PORT= ‘ ‘,MASTER_LOG_FILE=‘ ‘,MASTER_LOG_FILE_POS=‘ ‘,MASTER_USER=‘ ‘ ,MASTER_PASSWORD=‘ ‘;
mysql >START SLAVE
mysql>START SLAVE SQL_Thread 开启SQL线程
mysql>START SLAVE IO_Thread开启IO线程
复制线程:
master:dump
slave :IO_Thread,SQL_Thread
read_only=YES
在从服务器上设定,对具有SUPER权限的用户不生效
sync-binlog = ON
在主服务器上设定,用于事务安全
半同步复制
在master 和slave 上各自安装一个google提供的插件
主服务器上
mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;
mysql>SET GLOBAL rpl_semi_sync_master_enabled=1;
mysql>SET GLOBAL rpl_semi_syc_master_timeout=1000;
从服务器上
mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so‘;
mysql>SET GLOBAL rpl_semi_sync_slave_enables =1;
mysql_STOP SLAVE IO_Thread;START SLAVE IO_Thread;
双主复制
- 在两台服务器上各自建立一个具有复制权限的用户
- 修改配置文件
主服务器上
server-id =10
log-bin =mysql-bin
relay -log=relay -mysql
relay-log -index =relay -mysql.index
auto-increment-incremeng =2
auto-increment-offset =1
从服务器上
server-id=20
log-bin=mysql=bin
relay-log=relay-mysql
relay-log-index=relay-mysql.index
auto-increment-increment=2
auto-increment-offset =2
3.如果此时两台服务器均为新建立,且无其他写入操作,各服务器之需记录当前自己的二进制文件以及事件位置,以之作为另一台服务器复制起始位置即可
4.各服务器接下来指定对另一台服务器为自己的主服务器即可
A主机必须查看B的二进制文件及位置,并以之作为自己的复制起点
B主机必须查看A的二进制文件及位置,并以之作为自己的复制起点
两个服务器都能进行读写,即为双主模型