1、实时灾备,用于故障切换。让主库极其接近从库,主库宕机,启动从库开展业务
2、实现读写分离,在从库设置只读参数
3、备份,避免影响业务
1、从库启动一个线程(叫做IO线程),连接主库
2、主库接受连接,主库为从库启动一个线程(dump线程),读取binlog,传输到从库
3、IO线程将接受到的binlog日志写入从库的relaylog日志中(mysql-relay-bin.xxxxx)
4、从库启动一个sql apply线程读取relay log(读取完之后,自动删除),应用binlog中的sql语句
注意:
1、主库的dump线程是因为从库的IO线程连接才产生。
2、要分离看io thread和sql thread
备份从库的时候,可以关闭sql thread,io thread正常运行
1、主库上建立一个账号,并在从库测试使用,为账号授权
create user backup@'172.16.11.11' identified by '123456'; grant replication slave,replication client on *.* to backup@'172.16.11.11'; mysql -ubackup -p123456 -h172.16.22.22 -P3306
2、在配置文件中,开启主库的binlog、设置server_id=1、重启mysql
3、使用xtrabackup对主库做备份,会有binlog恢复的起点
yum localinstall libev4-4.15-7.1.x86_64.rpm libev-devel-4.15-21.1.x86_64.rpm percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm perl -DBD-MySQL-4.013-3.el6.x86_64.rpm perl-DBI-1.609-4.el6.x86_64.rpm -y
innobackupex --user=root --password=123456 --no-timestamp /backup innobackupex --apply-log /backup
cat xtrabackup_binlog_info mysqlbinlog.000008 154
4、在从库安装和主库完全一致的mysql软件,不需要初始化从库,如果已经初始化,手工删除
5、修改从库的配置文件
server_id=2
log_bin=mysqlbinlog
binlog_format=ROW或者MIXED
read_only=1 //从库只读
binlog_rows_query_log_events=on
6、使用scp -r将主库的备份传递到从库
scp -r ./backup [email protected]:/backup
7、在从库上执行xtrabackup进行恢复,并修改权限,启动从库
yum localinstall libev4-4.15-7.1.x86_64.rpm libev-devel-4.15-21.1.x86_64.rpm percona-xtrabackup-24-2.4.4- 1.el6.x86_64.rpm perl-DBD-MySQL-4.013-3.el6.x86_64.rpm perl-DBI-1.609-4.el6.x86_64.rpm -y
innobackupex --copy_back /backup
chown -R mysql:mysql /usr/local/mysql/data
service mysql.server start
8、建立主从关系,要binlog
change master to master_host='172.16.22.22',master_port=3306,master_user='backup',master_password='123456',master_log_file='mysqlbinlog.000008',master_log_pos=154 ,master_connect_retry=5; start slave;
9、从库执行show processlist;查看是否io和sql线程启动
mysql> mysql> show processlist;
+----+-----------------+-----------+------+---------+-------+--------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------+------+---------+-------+--------------------------------------------------------+------------------+
| 1 | event_scheduler | localhost | NULL | Daemon | 1124 | Waiting on empty queue | NULL |
| 4 | root | localhost | NULL | Query | 0 | starting | show processlist |
| 5 | system user | | NULL | Connect | 102 | Waiting for master to send event | NULL |
| 6 | system user | | NULL | Connect | 86158 | Slave has read all relay log; waiting for more updates | NULL |
+----+-----------------+-----------+------+---------+-------+--------------------------------------------------------+------------------+
主库执行show processlist;查看是否dump线程
mysql> show processlist;
+----+-----------------+--------------------+------+-------------+------+---------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+--------------------+------+-------------+------+---------------------------------------------------------------+------------------+
| 1 | event_scheduler | localhost | NULL | Daemon | 2194 | Waiting on empty queue | NULL |
| 6 | root | localhost | NULL | Query | 0 | starting | show processlist |
| 7 | backup | 172.16.11.11:54058 | NULL | Binlog Dump | 137 | Master has sent all binlog to slave; waiting for more updates | NULL |
10、从库show slave status \G;查看io和sql线程是否有错误
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
11、主库上执行dml和ddl,确认从库是否会有数据同步
主库
mysql> create database ceshi character set utf8;
Query OK, 1 row affected (0.00 sec)
mysql> use ceshi;
Database changed
mysql> create table ceshi(id int);
Query OK, 0 rows affected (0.05 sec)
mysql> insert into ceshi values(1),(2),(3);
Query OK, 3 rows affected (0.05 sec)
Records: 3 Duplicates: 0 Warnings: 0
从库数据
mysql> select * from ceshi;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
1、重启数据库
2、手工设置最大值,默认是1G
3、手工去切binlog
flush logs;
1、主库binlog由许多线程产生。dump线程(单线程)来不及去读取binlog.造成主库的binlog和从库的relaylog之间的差异
有可能dump线程非常繁忙,占用大量的IO,导致主库服务器的速度变慢
2、网络延迟
3、从库的IO线程没有及时写入relaylog
提高从库的写入性能,最好的办法是使用raid卡,带有写缓存
4、可以采用mixed这种方式,row可能会导致binlog暴增
增加带宽
采用mixed方式
增加物理读的能力:使用raid卡或者磁盘阵列、使用PCIe闪卡
增加写能力
使用RAID卡+写缓存。
1、当主库大量传输binlog,sql线程不断延迟,会造成relay log不断增长.io线程和sql线程之间有延迟
2、sql有问题
通过慢查询日志来确认问题(开启查询时间和全表扫描两个选项)
通过show full processlist;来捕捉
3、从库性能问题
确认从库的性能问题的时候,要配合tps和rows去看
show global status like '%rows%';
show global status like '%tps%';
不只是查看时间差距,还要查看日志量的差距
通过线程状态去确认线程是否繁忙,是否达到100%的繁忙
时间延迟计算:传输过来的binlog时间-正在应用的binlog时间
假设在某一个时间点出现海量的dml,可能会出现主从应用延迟(Seconds_Behind_Master越来越大)。这个时候还要看Exec_Master_Log_Pos与Read_Master_Log_Pos的差距
Slave_IO_State: Waiting for master to send event
Master_Log_File: mysqlbinlog.000003
Read_Master_Log_Pos: 147451558 //表示已经读到主库的binlog的位置
Relay_Log_File: Client-relay-bin.000002 //表示relaylog已经跑的位置,是sql应用线程要看的
Relay_Log_Pos: 322
Relay_Master_Log_File: mysqlbinlog.000003 //relaylog的位置对应了主库上binlog的位置。表示从库已经应用到主库binlog的哪个文件
Slave_IO_Running: Yes //表示IO线程是否正常运行
Slave_SQL_Running: Yes //表示SQL线程是否正常运行
Replicate_Do_DB: //复制时只复制某个数据库
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 147451558 //表示从库已经应用的binlog的位置
Relay_Log_Space: 530
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Seconds_Behind_Master: 0 //表示应用延迟落后了多少秒
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0 //如果IO和SQL线程欧问题,会展示出具体原因
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400