MySQL数据库主从复制

2017年2月24日00:26:48 发表评论 2,767 ℃

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]

【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: