mysql主從複製

要實現主從複製,首先得打開主服務器binlog功能,工作原理其實就是從庫向主庫獲取binlog日誌,記錄sql操作。
mysql的主從複製是一個異步的複製過程,將數據從一個主數據庫複製到另一個從數據庫,在主和從之間實現複製的過程是由3個線程參與完成的,主庫IO線程從庫IO和SQL線程。i/o線程去請求主庫 的binlog,得到的binlog日誌寫到relay log(中繼日誌) 文件中;
主庫會生成一個 log dump 線程,用來給從庫 i/o線程傳binlog
SQL 線程,會讀取relay log文件中的日誌,並解析成具體操作,來實現主從的操作一致,而最終數據一致;

#讀寫分離軟件
maxscale,MyCat,atlas

mysql主從複製原理介紹
1)master服務器上開啓二進制日誌,每個事務更新數據完成之前,master都會把數據變化記錄到二進制日誌文件中(串行寫入)
2)slave上配置change master to,將master的binary日誌拷貝到它自己的中繼日誌(I/O線程)
3)SQL線程從中繼日誌中讀取事件,並重放其中的事件更新slave的數據,使得和master的數據一樣

A:在主服務器上配置如下
1、在master上創建一個備份賬戶,每個slave使用標準的mysql用戶名和密碼連接master,進行復制操作的用戶會授予replication slave權限。
命令:
mariaDB [jiaoyu]> grant replication slave,reload on . to 'backup'@'192.168.119.%' identified by '1234'
2、master上開啓log-bin
配置my.cnf(啓用log-bin,配置server-id)
3、備份master服務器上的數據(/server/backup)
[root@db backup]# mysqldump -uroot -pLsf@8816 -A -x > /server/backup/mysql_date +%F.sql
4、通過SCP把主服務器上的數據拷貝到從服務器上,在從服務器上執行一遍,以便在主從同步之前,數據是一致的
5、記錄master服務器上master_log_file和master_log_pos
MariaDB [jiaoyu]> show master status;

B、在從服務器上配置如下(slave)
1、配置change master(master.info)
mariaDB [jiaoyu]>change master to master_host='192.168.119.128',master_port=3306,master_user='backup',master_password='1234',master_file_log='mysql-bin.000009',master_file_pos=643;
2、配置my.cnf開啓
log_bin = mysql-bin
server_id = 2
relay_log = mysql-relay-bin
log_slave_updates = 1
read_only = 1
(server-id必須唯一,relay_log中繼日誌,log_slave_updates表示slave將複製事件寫進自己的二進制日誌(後面會看到它的用處))
3、把從主服務器拷貝過來的備份數據,還原數據庫
4、開啓start slave
MariaDB [(none)]> show slave status\G
1. row
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.119.129
Master_User: req
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000009
Read_Master_Log_Pos: 643
Relay_Log_File: test-relay-bin.000012
Relay_Log_Pos: 537
Relay_Master_Log_File: mysql-bin.000009
Slave_IO_Running: Yes #這個爲yes
Slave_SQL_Running: Yes #這個爲yes
...
Seconds_Behind_Master: 0
你可查看master和slave上線程的狀態。在master上,你可以看到slave的I/O線程創建的連接

小結:
1、主從複製是異步的邏輯的sql語句級的複製
2、複製時,主庫有一個I/O線程,從庫有倆個線程I/O和sql

=======================主從複製實例===============================
主從複製實例

#關閉單實例
/etc/init.d/mysqld stop
#查看進程
lsof -i:3306
#開啓多實例
/data/3306/mysql start
/data/3307/mysql start
#查看進程
ss -lntup|grep 330

主從複製實踐:
1、準備
主庫log_bin
主從server-id不同
2、主庫準備
mysql -uroot -poldboy123 -S /data/3306/mysql.sock
grant replication slave on . to 'rep'@'172.16.1.%' identified by 'oldboy123';
flush privileges;

3、把數據從主庫搞到從庫。
複製前 讓從和主一致。
mysql -S /data/3306/mysql.sock
mysql> flush table with read lock; 不能關窗口
mysql> show master status;
+-------------------+----------+
| File | Position |
+-------------------+----------+
| oldboy-bin.000002 | 405 |
單開窗口
mysqldump -A -B --master-data=2 -S /data/3306/mysql.sock|gzip >/opt/3306.sql.gz
原窗口
mysql> unlock table;
從庫恢復:
gzip -d /opt/3306.sql.gz
mysql -uroot -poldboy123 -S /data/3307/mysql.sock </opt/3306.sql

5、指定主機、用戶、位置點同步
mysql> CHANGE MASTER TO
MASTER_HOST='172.16.1.51',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='oldboy123',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=656166;

6、開啓同步開關,檢查是否同步。
mysql> start slave;
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0

#測試
create database ddd;
drop database ddd;

數據庫主從複製原理

要實現主從複製,首先得打開主服務器binlog功能,工作原理其實就是從庫向主庫獲取binlog日誌,記錄sql操作。
mysql的主從複製是一個異步的複製過程,將數據從一個主數據庫複製到另一個從數據庫,在主和從之間實現複製的過程是由3個線程參與完成的,主庫IO線程從庫IO和SQL線程。

工作中錯誤。
stop slave; #<==臨時停止同步開關。
set global sql_slave_skip_counter =1 ; #<==將同步指針向下移動一個,如果多次不同步,可以重複操作。
start slave;

32期mysql主從複製
1、部署主從複製時不正常問題彙總
1、server-id相同導致
2、userver-uuid相同導致(帶着數據庫克隆虛擬機)
[root@oldboyedu ~]# cat /data/3306/data/auto.cnf
[auto]
server-uuid=5f61a6ed-0950-11e7-94ed-000c29210a05
3、change master錯誤。

(2)快速主從複製
mysqldump -A -B --master-data=1 -S /data/3306/mysql.sock >/opt/3306.sql
從庫:
CHANGE MASTER TO
MASTER_HOST='172.16.1.51',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='oldboy123';

(3)5.6 GTID複製特性:

(4)監控主從複製:
兩個yes一個0 必要條件
關鍵:模擬用戶訪問,主寫時間戳,從讀。
(5)主從複製故障排除
stop slave; #<==臨時停止同步開關。
set global sql_slave_skip_counter =1 ; #<==將同步指針向下移動一個,如果多次不同步,可以重複操作。
start slave;
配置文件:
[root@MySQL ~]# grep slave-skip /data/3306/my.cnf
slave-skip-errors = 1032,1062,1007
(6)從庫記錄binlog
log-slave-updates #<==必須要有這個參數
log-bin = /data/3307/oldboy-bin
expire_logs_days = 7
從庫記binlog: 1、從庫備份。2、從庫再做主庫(級聯)。
A--->B-->C-->D
(7)MySQL主從複製延遲問題原因及解決方案
講了6點。
(8)級聯複製與主主複製
A--->B-->C-->D
(9)從庫只讀read-only
M--->S
從庫配置read-only:具有SUPER權限的用戶不受read-only參數影響,例如:管理員root。
授權Web連接用戶,儘量不要有all。create。
(10)生產讀寫分離情況如何授權網站用戶
oldboy授權Web連接用戶select。
主庫:oldboy 123456 3306 172.16.1.51 W
從庫:oldboy 123456 3306 172.16.1.52 W
a.主庫 增刪改查,從庫:查(revoke增刪改)
b.主庫 增刪改查,從庫:read-only
c.忽略mysql同步(不記錄binlog),主庫從庫分別授權oldboy.主庫 增刪改查,從庫:查
replicate-ignore-db = mysql
binlog-ignore-db = mysql

=========================================================
導致lave_IO_Running 爲connecting 的原因主要有以下 3 個方面:
1、網絡不通
2、密碼不對
3、pos不對

==============================================
主主複製常見方法
解決數據寫入衝突方法

實現的具體參數:
解決主鍵自增長變量衝突:
Master1:
auto_increment_increment = 2 #自增ID的間隔,如 1 3 5間隔爲2。
auto_increment_offset = 1 #ID的初始位置
(將形成 1,3,5,7...序列)

Master2:
auto_increment_increment = 2 #自增ID的間隔,如 2 4 6間隔爲2。
auto_increment_offset = 2 #ID的初始位置
(將形成 2,4,6,8 ...序列)
缺點:ID號不連續
優點:前端網站程序不需要任何修改。
應用:儘量不要雙寫,而是單寫,作用可作爲主宕機後備用選擇


第二種主主複製
使用序號服務器
優點:ID號連續
缺點:前端網站程序需要修改。

測試單個主庫
create database oldboy CHARACTER SET utf8 COLLATE utf8_general_ci;
use oldboy;
CREATE TABLE student (
id bigint(12) NOT NULL auto_increment COMMENT '主鍵',
name varchar(12) NOT NULL COMMENT '姓名',
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

主庫:
auto_increment_increment = 2
auto_increment_offset = 1
log-slave-updates

從庫:
auto_increment_increment = 2
auto_increment_offset = 2
log-slave-updates

===========================================================
半同步 +++++++++++++++++++++++++++++++++++++++++++++++++++++

1、分別在主從節點上安裝相關的插件

master> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
slave> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

2、啓用半同步複製

在master上的配置文件中,添加
rpl_semi_sync_master_enabled=ON

在至少一個slave節點的配置文件中添加
rpl_semi_sync_slave_enabled=ON

而後重新啓動mysql服務即可生效。

或者,也可以mysql服務上動態啓動其相關功能:

master> SET GLOBAL rpl_semi_sync_master_enabled = ON;
slave> SET GLOBAL rpl_semi_sync_slave_enabled = ON;
slave> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;

3、確認半同步功能已經啓用

master> CREATE DATABASE magedudb;
master> SHOW STATUS LIKE 'Rpl_semi_sync_master_yes_tx';

slave> SHOW DATABASES;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章