文章目錄
1,概述主從介紹
Mysql主從又叫Replication、AB複製。簡單講就是A與B兩臺機器做主從後,在A上寫數據,另外一臺B也會跟着寫數據,實現數據實時同步
mysql主從是基於binlog,主上需開啓binlog才能進行主從
主從過程大概有3個步驟
主將更改操作記錄到binlog裏
從將主的binlog事件(sql語句) 同步本機上並記錄在relaylog裏
從根據relaylog裏面的sql語句按順序執行
2,主從作用
實時災備,用於故障切換
讀寫分離,提供查詢服務
備份,避免影響業務
主從形式
-
一主一從
-
主主複製
-
一主多從—擴展系統讀取的性能,因爲讀是在從庫讀取的
-
多主一從—5.7版本開始支持
-
聯級複製
3,主從複製原理
4,主從複製步驟
主庫將所有的寫操作記錄在binlog日誌中,並生成log dump線程,將binlog日誌傳給從庫的I/O線程
從庫生成兩個線程,一個是I/O線程,另一個是SQL線程
I/O線程去請求主庫的binlog日誌,並將binlog日誌中的文件寫入relay log(中繼日誌)中
SQL線程會讀取relay loy中的內容,並解析成具體的操作,來實現主從的操作一致,達到最終數據一致的目的
5,主從複製配置步驟
確保從數據庫與主數據庫裏的數據一致
在主數據庫裏創建一個同步賬戶授權給從數據庫使用
配合主數據庫(修改配置文件)
配置從數據庫(修改配置文件)
需求
搭建兩臺MYSQL服務器,一臺作爲主服務器,一臺作爲從服務器,主服務器進行寫操作,從服務器進行讀操作
6,環境說明【使用docker啓動兩個】
名稱 | Ip | Port |
---|---|---|
M1 | 192.168.149.128 | 3307 |
M1S1 | 192.168.149.128 | 3308 |
docker run --name M1 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
docker run --name M1S1 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
7,修改配置文件
將容器裏面的配置文件複製出來,主要修改服務器的配置
在root目錄下創建一個mysqlms的目錄存放從docker容器裏面複製過來的配置文件
docker cp M1:/etc/mysql/conf.d/docker.cnf m1.cnf
docker cp M1S1:/etc/mysql/conf.d/docker.cnf m1s1.cnf
7.1,主機的配置m1.cnf
主機裏面要記錄sql 語句,以後從機會把該sql 語句偷過去
7.2,從機的配置m1s1.cnf
7.3,配置文件修改後,複製到容器裏面
docker cp m1.cnf M1:/etc/mysql/conf.d/docker.cnf
docker cp m1s1.cnf M1S1:/etc/mysql/conf.d/docker.cnf
重啓mysql(m1,m1s1)
docker restart M1 M1S1
8,執行sql語句
8.1進入主機
docker exec -it M1 bash
mysql -uroot -p123456
創建用戶
create user ‘rep’@’%’ identified by ‘123456’;
給該用戶授予權限:
grant replication slave on . to ‘rep’@’%’;
刷新權限
flush privileges;
至此:M1 裏面已經創建了一個用戶:rep 123456 擁有所以庫,所有表replication slave
嘗試使用M1 裏面的rep 用戶登錄:
8.2進入從機裏面執行相關配置
docker exec -it M1S1 bash
mysql -u root -p123456
change master to master_host="",master_port=,master_user="",master_password="",master_log_file="",master_log_pos=
master_log_file:該文件具體叫什麼名稱,需要從主機裏面去看看:
進入M1 裏面使用root 用戶登錄M1,執行下面的sql:
show master status;
修改上面的SQL執行
change master to master_host=“117.48.203.125”,master_port=3307,master_user=“rep”,master_password=“123456”,master_log_file=“master.000001”,master_log_pos=745;
啓動主從:(在M1S1裏面執行)
start slave ;
查詢主從的狀態(M1S1)
show slave status \G;
成功的標誌:
9,搭建失敗的原因
9.1,第一個不是yes,是connecting
是因爲從機使用你配置的主機信息沒有登陸到主機裏面!
修改(從機裏面)
stop slave;
change master to master_host="192.168.149.128",master_port=3307,master_user="rep",master_password="123456",master_log_file="master.000001",master_log_pos=745;
start slave;
9.2,第二個不是yes ,是no
從機會複製主機裏面的sql 語句,來自己執行!
實驗時先把從機裏面的db3 刪除
再把主機裏面的db3 刪除->從機裏面複製該刪除的命令->從機執行刪除的命令(db3),事務無法提交,將一直阻塞!
現在從機裏面要刪除db3 ,但是沒有db3,導致一直阻塞,以後的主從複製不會進行了
解決:在從機新建一個db3:
然後停止主從,啓動主從:
9.3,第一個不是yes,是no
就是你的server-id 沒有配置成功的原因,需要重新修改配置文件,複製配置文件到容器裏面,然後重啓就ok
9.4,mysql主從的操作規範
-
只能在主機裏面執行DML 語句,不能在從機裏面執行DML語句
-
在從機裏面可以執行查詢語句
-
主機只有一臺,但是從機可以有多臺
10,測試
在M1 裏面創建數據庫
看M1S1 有沒有複製過去