MySQL主从复制
二进制日志
事务日志
错误日志
一般查询日志
中继日志
慢查询日志
二进制日志:
数据目录
mysql-bin.XXXXXX
滚动:达到最大上限,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,OPERATION, server-id
即时点还原:
MySQL: tx1
MySQL隔离级别:
READ-UNCOMMITTED
READ-COMMITTED
REPEATABLE-READ
SERIALIZABLE
复制的作用:
辅助实现备份
高可用
异地容灾
scale out:分摊负载
主从架构中,不使用MySQL代理,如何让主的负责写,从的负责读?
双主:无法减轻写操作;
双主模型:
读写分离:
mysql-proxy
amoeba
数据拆分:
cobar:
一个从只能属于一个主服务器
MySQL 5.5:
MySQL 5.6: gtid, multi-thread replication
配置MySQL复制基本步骤:
一、master
1、启用二进制日志
log-bin = master-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、连接至主服务器,并开始复制数据;
mysql> CHANGER MASTER TO MASTER_HOST='',MASTER_PORT='',MASTER_LOG_FILE='',MASTER_LOG_FIEL_POS='',MASTER_USER='',MASTER_PASSWORD='';
mysql> START SLAVE;
mysql> START SLAVE IO_Thread;
mysql> START SLAVE SQL_Thread;
复制线程:
master: dump
slave: IO_Thread, SQL_Thread
read- YES
在从服务器上设定,但对具有SUPER权限的用户不生效;
sync-binlog = ON
在主服务器上设定,用于事务安全;
percona: percona-tools
mattkit-tools
SSL:
Dual MASTER:
1、从服务器能不能执行“写”操作?
CREATE
INSERT
如何阻止写从服务器?
my.cnf
[mysqld]
read- 1
不能阻止 SQL Thread
如果某用户有SUPER权限,则不被阻止;
mysql> FLUSH TABLES WITH READ LOCK;
2、一个主服务器可否多从?可以
一从是否多主?不行
3、主-->从:异步
mysql 5.5 google 补丁
半同步: semisync
半同步如果无法在指定时间完成-->自动 降到异步模式;
4、如何从服务器的mysql服务在启动时候不要自动启动从服务线程?
master.info
relay-log.info
在从服务器上:
[mysqld]
skip-slave-start=1
5、数据库复制过滤
在主服务器上实现:
binlog-do-db=testdb
binlog-do-db=mydb
binlog-ignore-db=mysql
主服务器
[mysqld]
binlog-do-db=
OR
binlog-ignore-db=
在主服务器过滤:任何不涉及到数据库相关的写操作都不会被记录到二进制日志当中;
从服务器:
replicate_do_db
rpplicate_ignore_db
replicate_do_table
replicate_ignore_table
replicate_wild_do_table
replicate_wild_ignore_table
在从服务器上只复制mageedu一个数据库:
[mysqld]
replicate_do_db=mageedu
replicate_do_db=mysql
设置半同步步骤:
在Master和Slave的mysql命令行运行如下代码:
# On Master
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_sync_master_timeout = 1000;
# On Slave
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
在Master和Slave的my.cnf中编辑:
# On Master
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 # 1 second
# On Slave
[mysqld]
rpl_semi_sync_slave_enabled=1
# 也可通过设置全局变量的方式来设置,如下:
set global rpl_semi_sync_master_enabled=1
# 取消加载插件
mysql> UNINSTALL PLUGIN rpl_semi_sync_master;
==============================================
查看从服务器上的semi_sync是否开启:
mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';
查看主服务器上的semi_sync是否开启,注意clients 变为1 ,证明主从半同步复制连接成功:
mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';
6、主服务器崩溃,事务已经提交-->写入二进制日志;
在主-从架构上建议使用的配置:
主服务器:
sync_binlog=1
innodb_flush_logs_at_trx_commit=1
从服务器:
skip_slave_start=1
read_>
SSL:
REQURIED SSL
auto_increment
1,3,5
2,4,8
设置主-主复制:
1、在两台服务器上各自建立一个具有复制权限的用户;
2、修改配置文件:
# 主服务器上
[mysqld]
server-id = 10
log-bin = mysql-bin
relay-log = relay-mysql
relay-log-index = relay-mysql.index
auto-increment-increment = 2
auto-increment-offset = 1
# 从服务器上
[mysqld]
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、如果此时两台服务器均为新建立,且无其它写入操作,各服务器只需记录当前自己二进制日志文件及事件位置,以之作为另外的服务器复制起始位置即可
server1|mysql> SHOW MASTER STATUS\G
************************** 1. row ***************************
File: mysql-bin.000001
Position: 710
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
server2|mysql> SHOW MASTER STATUS\G
mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
File: mysql-bin.000003
Position: 811
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
4、各服务器接下来指定对另一台服务器为自己的主服务器即可:
server1|mysql> CHANGE MASTER TO ...,MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=811
server2|mysql> CHANGE MASTER TO ...,MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=710
A: 查看B的二进制日志文件及位置,并以及作为自己的复制起点;
B:
配置主从复制的基本步骤:
1、master
启用二进制日志、惟一server-id、具有复制权限的用户(REQUIRE SSL);
2、slave
启用中继日志、惟一server-id、连接主服务器并启动复制线程(IO_THREAD, SQL_THREAD);
MySQL读写分离:
master: 写
slave: 只读
mysql-proxy、amoeba
cobar:
php --> MySQL
LAMP: php语言开发的应用程序
blackhole: 存储引擎,多级复制时,
memcached: 缓存服务器
key: value
O(1)
MySQL: semisync_master.so, semisync_slave.so
MySQL主从复制原理、主从复制、半同步复制、基于SSL复制或主主复制;
MySQL-5.6主从复制;(GTID, 多线程复制);
MySQL-proxy实现读写分离;
MySQL: 数据库复制过滤
binlog-do-db:仅将指定数据库的相关修改操作记入二进制日志
binlog-ignore-db
从服务器
replicate-do-db= #白名单
replicate-ignore-db= #忽略
replicate-do-table=
replicate-ignore-table=
replicate-dild-do-table= #支持通配符
replicate-dild-ignore-table=
MySQL-5.6: GTID
每个数据库仅能适应一个线程
复制涉及到多个数据库时多线程复制才有意义
slave-parallel-workers=0
0: 表示禁用多线程功能;
mysqlreplicate:快速启动mysql从服务器,快速启动复制功能
mysqlrplcheck:检查复制环境是否符合需求
mysqlrplshow:显示复制关系图
mysqlfailover:提升master
mysqlrpladmin:
/etc/mysql.cnf
[mysql-proxy]