簡介
1.Replication可以實現將數據從一臺數據庫服務器(master)複製到一或多臺數據庫服務器(slave)
2.默認情況下屬於異步複製,無需維持長連接
3.通過配置,可以複製所有的庫或者幾個庫,甚至庫中的一些表
4.是MySQL內建的,本身自帶的
作用
1.Fail Over 故障切換
2.Backup Server 備份服務,無法對SQL語句執行產生的故障恢復,有限的備份
3.High Performance高性能,可以多臺slave,實現讀寫分離
原理
簡單的說就是master將數據庫的改變寫入二進制日誌,slave同步這些二進制日誌,並根據這些二進制日誌進行數據操作
步驟
第一步:master記錄二進制日誌。在每個事務更新數據完成之前,master在二進制日誌記錄這些改變。MySQL將事務寫入二進制日誌,即使事務中的語句都是交叉執行的。在事件寫入二進制日誌完成後,master通知存儲引擎提交事務。
第二步:slave將master的binary log拷貝到它自己的中繼日誌。首先,slave開始一個工作線程——I/O線程。I/O線程在master上打開一個普通的連接,然後開始binlog dump process。Binlog dump process從master的二進制日誌中讀取事件,如果已經執行完master產生的所有文件,它會睡眠並等待master產生新的事件。I/O線程將這些事件寫入中繼日誌。
第三步:SQL slave thread(SQL從線程)處理該過程的最後一步。SQL線程從中繼日誌讀取事件,並重新執行其中的事件而更新slave的數據,使其與master中的數據一致。
常見方案
1.一主多從。一般用來做讀寫分離的,master寫,其他slave讀,這種架構最大問題I/O壓力集中
2.M-S-S。使用一臺slave作爲中繼,分擔Master的壓力,slave中繼需要開啓bin-log,並配置log-slave-updates
M-S 講解
環境
master mysql5.7.20 10.10.10.63
slave mysql5. 7.20 10.10.10.64
部署Master
創建同步數據庫
mysql> create database HA;
修改配置文件
service mysqld stop #要先停服務
vim /etc/my.cnf
log-bin=mysql-bin-master #二進制日誌前綴
server-id=1 #本機數據庫ID 標示
binlog-do-db=HA #可以被從服務器複製的庫, 二進制需要同步的數據庫名
binlog-ignore-db=mysql #不可以被從服務器複製的庫
Systemctl restart mysqld #重啓mysql
授權
mysql> grant replication slave on *.* to [email protected] identified by "123456";
mysql> flush privileges;
查看狀態信息
mysql> show master status;
+-------------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------------+----------+--------------+------------------+
| mysql-bin-master.000001 | 259 | HA | mysql |
+-------------------------+----------+--------------+------------------+
查看二進制文件
ls /usr/local/mysql/data/
mysql> show binlog events\G
數據一致
複製前要保證同步的數據庫一致, 將導出的數據庫傳給從服務器
mysqldump -uroot -p123456 HA >HA.sql #可以導出數據庫
部署slave
兩臺數據庫服務器mysql版本要一致
mysql> show variables like '%version%';
測試連接到主服務器
mysql -uslave -p123456 -h 10.10.10.63
只有複製的權限, 是看不到其他庫的。導入數據庫,和主數據庫服務器保持一致
mysql> create database HA;
mysql -uroot -p123456 HA<HA.sql
修改從服務器配置文件
service mysqld stop
vim /etc/my.cnf
server-id = 2 #從服務器ID號,不要和主ID相同 ,如果設置多個從服務器,每個從服務器必須有一個唯一的server-id值,必須與主服務器的以及其它從服務器的不相同。可以認爲server-id值類似於IP地址:這些ID值能唯一識別複製服務器羣集中的每個服務器實例。
文本框是mysql 5.1的配置
mysql>stop slave; #停止slave
mysql> change master to master_host='10.10.10.63',master_user='slave',master_password='123456'; #配置master相關信息
mysql> start slave; #啓動slave
mysql> show slave status\G 查看狀態
Slave_IO_Running :一個負責與主機的io通信
Slave_SQL_Running:負責自己的slave mysql進程
兩個爲YES 就成功了!
再到主服務器上查看狀態:
mysql> show processlist \G
排錯
如果遇到主從不同步,看一下主從bin-log的位置,然後再同步。
在主服務器上看二進制日誌事件列表
mysql> show binlog events \G
從服務器執行MySQL命令下
mysql> stop slave; #先停止slave服務
mysql> change master to master_log_file='mysql-bin-master.000001',master_log_pos=1164;
#根據上面主服務器的show master status的結果,進行從服務器的二進制數據庫記錄迴歸,達到同步的效果
mysql>slave start; #啓動從服務器同步服務
mysql> show slave status\G; #用show slave status\G;看一下從服務器的同步情況
Slave_IO_Running: Yes
Slave_SQL_Running: Yes #如果都是yes,那代表已經在同步
重啓從服務器,再查看狀態:
slave stop;
slave start;
排錯思路:
1、二進制日誌沒有開啓
2、IPTABLES 沒有放開端口
3、對應的主機 IP地址寫錯了
M-S-S 講解
環境
master mysql5.7.20 10.10.10.68
slave中繼 mysql5. 7.20 10.10.10.69
slave mysql5. 7.20 10.10.10.70
master服務器
mysql> grant replication slave on *.* to repl@'10.10.10.%' identified by '123456';
mysql> flush privileges;
vim /etc/my.cnf #修改配置 增加以下選項
server-id=1
binlog-do-db=HA
log-bin=mysql-bin-master
binlog-ignore-db=mysql
sync-binlog=1
binlog-format=row
systemctl restart mysqld #重啓服務
#### 中繼服務器
導入數據庫
配置my.cnf
vim /etc/my.cnf
server-id= 2 #修改主配置文件也要開啓bin-log:
log-bin=mysql-bin-slave1
log-slave-updates=1 #把它從relay-log當中讀取出來的二進制日誌並且這本機上執行的操作也記錄這自己的二進制日誌裏面,這樣才能使第三臺slave通過中繼slave讀取到相應數據變化
binlog-format=row #以行方式
systemctl restart mysqld
授權
mysql> stop slave;
mysql> change master to master_host=‘10.10.10.68’,master_user=‘repl’,master_password=‘123456’;
mysql> start slave; #查看中繼服務的狀態
mysql> show slave status \G
再授權一個用戶給slave(70):
mysql> grant replication slave on *.* to 'repl'@'10.10.10.70' identified by '123456';
mysql> flush privileges;
slave服務器
導入數據庫
配置my.cnf
vim /etc/my.cnf
server-id = 3
log-bin=mysql-bini-slave2
binlog-format=row
systemctl restart mysqld #重啓
指定slave中繼服務作爲70的主
mysql> stop slave;
mysql> change master to master_host='10.10.10.69',master_user='repl',master_password='123456';
mysql> start slave;
mysql> show slave status \G #查看從服務的狀態