MySQL主從復制
二進制日志
事務日志
錯誤日志
一般查詢?nèi)罩?/span>
中繼日志
慢查詢?nèi)罩?/span>
二進制日志:
數(shù)據(jù)目錄
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
復制的作用:
輔助實現(xiàn)備份
高可用
異地容災
scale out:分攤負載
主從架構中,不使用MySQL代理,如何讓主的負責寫,從的負責讀?
雙主:無法減輕寫操作;
雙主模型:
讀寫分離:
mysql-proxy
amoeba
數(shù)據(jù)拆分:
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、創(chuàng)建具有復制權限的用戶
REPLICATION SLAVE
REPLICATION CLIENT
二、slave
1、啟用中繼日志
relay-log = relay-log
relay-log-index =
2、選擇一個惟一的server-id
server-id = {0-2^32}
3、連接至主服務器,并開始復制數(shù)據(jù);
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、從服務器能不能執(zhí)行“寫”操作?
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、數(shù)據(jù)庫復制過濾
在主服務器上實現(xiàn):
binlog-do-db=testdb
binlog-do-db=mydb
binlog-ignore-db=mysql
主服務器
[mysqld]
binlog-do-db=
OR
binlog-ignore-db=
在主服務器過濾:任何不涉及到數(shù)據(jù)庫相關的寫操作都不會被記錄到二進制日志當中;
從服務器:
replicate_do_db
rpplicate_ignore_db
replicate_do_table
replicate_ignore_table
replicate_wild_do_table
replicate_wild_ignore_table
在從服務器上只復制mageedu一個數(shù)據(jù)庫:
[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 變?yōu)? ,證明主從半同步復制連接成功:
mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';
6、主服務器崩潰,事務已經(jīng)提交-->寫入二進制日志;
在主-從架構上建議使用的配置:
主服務器:
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語言開發(fā)的應用程序
blackhole: 存儲引擎,多級復制時,
memcached: 緩存服務器
key: value
O(1)
MySQL: semisync_master.so, semisync_slave.so
MySQL主從復制原理、主從復制、半同步復制、基于SSL復制或主主復制;
MySQL-5.6主從復制;(GTID, 多線程復制);
MySQL-proxy實現(xiàn)讀寫分離;
MySQL: 數(shù)據(jù)庫復制過濾
binlog-do-db:僅將指定數(shù)據(jù)庫的相關修改操作記入二進制日志
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
每個數(shù)據(jù)庫僅能適應一個線程
復制涉及到多個數(shù)據(jù)庫時多線程復制才有意義
slave-parallel-workers=0
0: 表示禁用多線程功能;
mysqlreplicate:快速啟動mysql從服務器,快速啟動復制功能
mysqlrplcheck:檢查復制環(huán)境是否符合需求
mysqlrplshow:顯示復制關系圖
mysqlfailover:提升master
mysqlrpladmin:
/etc/mysql.cnf
[mysql-proxy]