您好,登錄后才能下訂單哦!
復制中的線程及文件
2.1、主庫
Dump(IO) thread:在復制過程中,主庫發送二進制日志的線程
2.2、從庫
IO thread:向主庫請求二進制日志,并且接受二進制日志的線程
SQL thread:執行請求過來的二進制的線程
2.3、主庫
binlog文件:主庫的二進制日志
2.4、從庫
relaylog:中繼日志,存儲請求過來的二進制日志
master.info:
1、從庫連接主庫的重要參數(user,passwd,ip,port)
2、上次獲取過的主庫二進制日志的位置
relay-log.info
存儲從庫SQL線程已經執行過的relaylog日志位置
主從復制前提
1、兩臺以上MySQL實例(可以是多臺物理機,也可是mysql實例)
2、主庫要開啟二進制日志
3、主庫要提供復制相關的用戶需要用到 replication slave一個比較特殊的權限
4、從庫需要將和主庫相差的數據進行追加,一般情況下認為備份數據庫,恢復到從庫上
5、從庫應該從恢復后的時間點開始自動從主庫獲取二進制日志開始自動同步主庫數據,我們需要告訴從庫,從哪兒開始復制二進制日志進行學習
(1)不需要追加的情況
主和從同時搭建的新環境,就不需要備份主庫數據,恢復到從庫了,直接從第一個binlog(mysql-bin.000001)開頭位置(120)
(2)如果主庫已經工作了很長時間了,我們一般需要備份主庫數據,恢復到從庫,然后從庫從備份的時間點起自動進行復制
mysqldump -S /data/3307/mysql.sock -A -R --triggers --master-data=2 --single-transaction >/tmp/full.sql
sed -n '22p' /tmp/full.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=325
恢復到從庫:
mysql -S /data/3308/mysql.sock
mysql> set sql_log_bin=0;
mysql> source /tmp/full.sql
8、從庫開啟主庫
mysql -S /data/3308/mysql.sock
help change master to
CHANGE MASTER TO
MASTER_HOST='10.0.0.52',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_PORT=3307,
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=325;
開啟主從(開啟IO/SOL線程)
start slave
9、查看主從狀態
show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
10、主從重要狀態信息介紹
show slave status\G
Slave_IO_Running: Yes(io線程狀態)
Slave_SQL_Running: Yes(sql線程狀態)
Last_IO_Errno: 0(io線程異常狀態碼)
Last_IO_Error: (io線程異常詳細信息)
Last_SQL_Errno: 0(sql線程狀態碼)
Last_SQL_Error: (sql線程異常詳細信息)
2、主庫二進制文件丟失或損壞
解決方案;
stop slave;
reset slave all;
從新備份恢復
change master to
start slave;
處理方法跳過這個錯誤
stop slave;
set global sql_slave_skip_counter=1;
start slave;
/etc/my.cnf
slave-skip-errors=1032,1062,1007
但是,以上操作有的時候時候是有風險的,最安全的方法是從新構建新的主從
如何預防?
修改從庫為只讀庫
set global read_only=1;
vim /etc/my.cnf
read_only=1(這個參數只能控制普通用戶)
默認的主從復制是異步的過程
主庫原因
1、主庫做修改操作之后,才會記錄二進制日志
2、主庫的壓力特別大(大事務,多事物)
3、從庫數量多,導致domp線程繁忙
從庫原因:
1、relay-log寫入慢
2、sql線程慢(主從硬件差異較大)
解決思路
主庫
1、sync_binlog=1(1表示只要主庫做了一次commit,二進制日志就會立刻刷新到磁盤,如果等于0要根據系統binlog決定)
2、大事物拆分成小事物,多事物進行分離
3、使用多級主從,分庫分表架構
4、將binlog放在ssd或者flash上,高性能存儲
從庫
1、將relay放到ssd或者flash上
2、盡量選擇和主庫一樣的硬件配置
加載插件
主:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
從:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
查看是否加載成功:
show plugins;
啟動:
主:
SET GLOBAL rpl_semi_sync_master_enabled = 1;
從:
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
重啟從庫上的IO線程
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
補充:
rpl_semi_sync_master_timeout | 10000
默認情況先,到達10秒鐘還沒有ack,主從關系自動切換為普通復制
如果是1主多從的半同步復制,只要有一臺落地relaylog,返回ack,這次半同步就完成了。
從庫延時
防止數據庫的邏輯損壞,假設在主庫不小心誤刪除了一個表,這個事件會同樣記錄到二進制日志當中發送到從庫,這時候從庫不會立即執行這個 操作,比如配置了延時3小時,從庫會在3小時后才執行刪除表的操作,這樣就給我們運維人員一些緩沖的時間,延時從庫是對sql線程的延時
會專門找一個節點,配置成延時節點,盡可能防止邏輯損壞,一般情況下這個節點會被用備份
mysql>stop slave;
mysql>CHANGE MASTER TO MASTER_DELAY = 60;
mysql>start slave;
mysql> show slave status \G
SQL_Delay: 300
取消延時:
mysql> stop slave;
mysql> CHANGE MASTER TO MASTER_DELAY = 0;
mysql> start slave;
從庫方面控制:
白名單:只執行白名單中列出的庫或者表的中繼日志
--replicate-do-db=test (哪個庫)
--replicate-do-table=test.t1 (哪個庫的哪個表)
--replicate-wild-do-table=test.x* (模糊的匹配)
黑名單:不執行黑名單中列出的庫或者表的中繼日志
--replicate-ignore-db
--replicate-ignore-table
--replicate-wild-ignore-table
只復制world數據庫的數據
在從庫配置
vi /etc/my.cnf
replicate-do-db=world
重啟從庫
查詢:show slave status \G
replicate-do-db = world
GTID是從5.6之后新的復制特性,以前的復制模式是當主庫發生了任何方式的變化,會已事件的形式記錄到binlog日志當中,每個事件生成一個position號,然后從庫去獲取這些二進制事件,而GTID是把每個完整的事物單獨的生成一個全局唯一的編號,這樣就簡化了主從復制的配置,實現過程相對也簡單寫
它的官方定義如下:
GTID = source_id :transaction_id
7E11FA47-31CA-19E1-9E56-C43AA21293967:29
前半段為UUID,后半段為事物的編號,存放在auto.cnf下
db01:10.0.0.51/24
vim /etc/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/application/mysql/data
socket=/tmp/mysql.sock
log-error=/var/log/mysql.log
log_bin=/data/binlog/mysql-bin
binlog_format=row
skip-name-resolve
server-id=51
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[client]
socket=/tmp/mysql.sock
slave1:
db02:10.0.0.52/24
vim /etc/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/application/mysql/data
socket=/tmp/mysql.sock
log-error=/var/log/mysql.log
log_bin=/data/binlog/mysql-bin
binlog_format=row
skip-name-resolve
server-id=52
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[client]
socket=/tmp/mysql.sock
slave2:
db02:10.0.0.53/24
vim /etc/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/application/mysql/data
socket=/tmp/mysql.sock
log-error=/var/log/mysql.log
log_bin=/data/binlog/mysql-bin
binlog_format=row
skip-name-resolve
server-id=53
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[client]
socket=/tmp/mysql.sock
三臺節點分別初始化數據:
/application/mysql/scripts/mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/application/mysql/data/
分別啟動三個節點mysql:
/etc/init.d/mysqld start
測試啟動情況:
mysql -e "show variables like 'server_id'"
master:51
slave:52,53
51:
grant replication slave on . to repl@'10.0.0.%' identified by '123';
52\53:
change master to master_host='10.0.0.51',master_user='repl',master_password='123' ,MASTER_AUTO_POSITION=1;
start slave;
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。