主從復制的概念
主從復制是一種在數據庫系統中常用的數據備份和讀取擴展技術,通過將一個數據庫服務器(主服務器)上的數據變更自動同步到一個或多個數據庫服務器(從服務器)上,以此來實現數據的冗余備份、讀寫分離以及負載均衡等目的。
主從復制的原理
- 首先在Master上開啟二進制日志。
- 當Master上數據發生變化,進行DML操作時,會產生二進制日志。
- Master上dump線程會通知Slave上的I/O線程來拿二進制日志。
- I/O線程拿到日志后會寫入到Slave上的中繼日志。
- 然后SQL線程會去讀取新產生的中繼日志,重演二進制日志里的操作,從而達到Slave和Master上的數據一模一樣,實現數據的一致性
主從復制的原理如上,在Slave服務器上還存在master-info文件和relay-log.info文件。master-info文件記錄I/O線程從Master服務器上獲取二進制日志結束的pos位置號和日志文件的名字。relay-log.info文件記錄當前中繼日志的文件名和位置點。
主從復制的操作
1、環境準備
準備兩臺服務器,一臺作為master服務器(192.168.2.117),一臺作為slave服務器(192.168.2.118),確保兩臺服務器上的mysql服務是啟動的,mysql版本為5.x。
修改主機名,便于辨識:
// master服務器上
[root@localhost ~] hostnamectl set-hostname master// slave服務器上
[root@localhost ~] hostnamectl set-hostname slave
2、修改mysql配置文件
在master服務器上開啟二進制日志,server_id=1,在slave服務器上也可以開啟二進制日志,server_id=2
// master服務器上
[root@master ~] vim /etc/my.cnf
# 找到[mysqld]位置添加以下內容
[mysqld]
log_bin
server_id=1// 重啟服務
[root@master ~] service mysqld restart// slave服務器上
[root@slave ~] vim /etc/my.cnf
# 找到[mysqld]位置添加以下內容
[mysqld]
log_bin
server_id=2// 重啟服務
[root@slave ~] service mysqld restart
3、統一兩臺服務器的基礎數據
// master服務器導出所有數據
[root@master ~] mysqldump -uroot -p'123456' --all-databases >all_db.SQL// 上傳slave服務器
[root@master ~] scp all_db.SQL root@192.168.2.118:/root// slave服務器執行SQL文件
[root@slave ~] mysql -uroot -p'123456' <all_db.SQL
4、master服務器初始化二進制日志
清除master服務器上所有的二進制日志,因為上一步已經做了一次全部備份了。
root@(none) mysql> reset master;// 查看二進制文件名和位置點POS
root@(none) mysql> show master status;
5、新建授權用戶
在master服務器上新建一個授權用戶,給slave來復制二進制日志。
// master服務器上操作
root@(none) mysql> reset master;
root@(none) mysql> grant replication slave on *.* to 'slave-1'@'192.168.2.118';
6、配置master-info信息
在slave服務器上配置master-info信息,master-info文件記錄I/O線程從master服務器上獲取二進制日志結束的pos位置號和日志文件的名字。當master服務器通知slave服務器來讀取二進制日志時,slave服務器通過master-info信息才能得知從哪里開始讀取。
// slave服務器上操作
root@(none) mysql> CHANGE MATER TO MASTER_HOST='192.168.2.137',
> MASTER_USER='slave-1',
> MASTER_PASSWORD='123456',
> MASTER_PORT=3306,
> MASTER_LOG_FILE='master-bin.000001',
> MASTER_LOG_POS=154;
7、查看slave是否配置成功
// slave服務器上操作
// 啟動slave
root@(none) mysql> start slave;root@(none) mysql> show slave status\G;// 下面這兩個為yes則表示啟動成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
常見問題
- 查看服務器防火墻3306端口是否開放。
- 配置時是否出現拼寫錯誤。
- 兩天服務器是否為克隆產生,是克隆產生則需要修改uuid。修改mysql數據目錄下auto.cnf文件(vim /data/mysql/auto.cnf)中server-uuid的值,隨便修改幾個字符即可。