Mysql 的主從複製至少是需要兩個 Mysql 的服務,當然 Mysql 的服務是可以分佈在不同的伺服器上,也可以在一臺伺服器上啟動多個服務。
首先確保主從伺服器上的 Mysql 版本相同。
主從複製
複製功能
- 資料分佈
- 負載均衡(讀)
- 備份
- 高可用和故障切換
- MySQL 升級測試
複製原理
Mysql 中有一種日誌叫做 bin 日誌(二進位制日誌)。這個日誌會記錄下所有修改了資料庫的 SQL 語句(insert,update,delete,ALTER TABLE,grant 等等)。
主從複製的原理其實就是把主伺服器上的 BIN 日誌複製到從伺服器上執行一遍,這樣從伺服器上的資料就和主伺服器上的資料相同了。
複製流程圖
複製過程
- 主節點必須啟用二進位制日誌,記錄任何修改資料庫資料的事件。
- 從節點開啟一個執行緒 (I/O Thread) 把自己扮演成 mysql 的客戶端,通過 mysql 協議,請求主節點的二進位制日誌檔案中的事件
- 主節點啟動一個執行緒 (dump Thread),檢查自己二進位制日誌中的事件,跟對方請求的位置對比,如果不帶請求位置引數,則主節點就會從第一個日誌檔案中的第一個事件一個一個傳送給從節點。
- 從節點接收到主節點傳送過來的資料把它放置到中繼日誌 (Relay log) 檔案中。並記錄該次請求到主節點的具哪個二進位制日誌檔案的哪個位置。
- 從節點啟動另外一個執行緒 (sql Thread ),把 replaylog 中的事件讀取出來,並在本地再執行一次。
複製中執行緒的作用
主節點:
- Dump Thread:為每個 Slave 的 I/O Thread啟動一個 dump 執行緒,用於向從節點傳送二進位制事件。
從節點:
- I/O Thread:從 Master 請求二進位制日誌事件,並儲存於中繼日誌中。
- Sql Thread:從中繼日誌中讀取日誌事件,在本地完成重放。
MySQL 安裝部署
部署環境
本專案使用 Centos6.5 虛擬機器作為 linux 伺服器,並使用 Xshell 作為 ssh 客戶端連線虛擬機器進行安裝部署和功能測試。
安裝 mysql
安裝伺服器端:
yum install mysql-server
yum install mysql-devel
複製程式碼
安裝客戶端:
yum install mysql
複製程式碼
啟動服務並允許遠端連線到該 mysql 伺服器
啟動服務
service mysqld start
複製程式碼
獲取初始密碼
grep "password" /var/log/mysqld.log
複製程式碼
設定新密碼
set password for 'root'@'localhost' = password('test123');
複製程式碼
登陸到 mysql: mysql -uroot -ptest123
[root@localhost ~]# mysql -uroot -ptest123 #賬號 root,密碼 test123
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 5.5.35-log MySQL Community Server (GPL) by Remi
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
複製程式碼
這時通過 SQLyog 連線是是失敗的。需要設定下 mysql 庫下面的 user 表,允許任意主機連線
update mysql.user set host='%' where user='root' and host='localhost';
複製程式碼
若是進入 mysql 報這個錯:Access denied for user (using password: YES)
則如下解決:
- 關閉 mysql
service mysqld stop
複製程式碼
- 遮蔽許可權
mysqld_safe --skip-grant-table
複製程式碼
- 另起一個終端執行如下:
[root@localhost ~]# mysql -u root
mysql>delete from user where user='';
mysql>flush privileges; #這個一定要執行,否則關閉之前的終端錯誤會重現
mysql>\q
複製程式碼
配置主從複製
開啟兩個 mysql 服務
主 master:192.168.8.10
從 slave:192.168.8.11
複製程式碼
配置主節點:
授權給從資料庫伺服器
mysql>GRANT REPLICATION SLAVE ON *.* to 'rep1'@'192.168.8.11' identified by 'test123456';
mysql>FLUSH PRIVILEGES;
複製程式碼
修改主庫配置檔案,開啟 binlog,並設定 server-id,每次修改配置檔案後都要重啟 mysql 服務才會生效
vim /etc/my.cnf
複製程式碼
在該配置檔案 [mysqld] 下面新增下面內容:
[mysqld]
log-bin=/var/lib/mysql/binlog
server-id=1
binlog-do-db = cmdb
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
......
複製程式碼
修改配置檔案後,重啟服務:
service mysqld restart
複製程式碼
檢視主伺服器當前二進位制日誌名和偏移量,這個操作的目的是為了在從資料庫啟動後,從這個點開始進行資料的恢復
mysql> show master status;
+---------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| binlog.000001 | 1304 | cmdb | |
+---------------+----------+--------------+------------------+
row in set (0.00 sec)
複製程式碼
主節點已配置好。
配置從節點
在 /etc/my.cnf 新增下面配置:
[mysqld]
server-id=2
master-host=192.168.8.10
master-user=rep1
master-password=test123456
master-port=3306
replicate-do-db=cmdb
......
複製程式碼
mysql5.5+ 版本主從複製不支援這些變數,需要在從庫上用命令來設定:
mysql> CHANGE MASTER TO MASTER_HOST='192.168.8.10',
  MASTER_PORT=3306,
  MASTER_USER='rep1',
  MASTER_PASSWORD='test123456',
  MASTER_LOG_FILE='binlog.000001',
  MASTER_LOG_POS=1304; #後面兩個引數的值與主庫保持一致
複製程式碼
啟動 slave 程式
mysql> slave start;
Query OK, 0 rows affected (0.04 sec)
複製程式碼
檢視從節點的狀態,如果下面兩項值為 YES,則表示配置正確:
從庫正在等待主庫更新資料。。。
同步主庫已有資料到從庫
主庫操作:
- 停止主庫的資料更新操作
mysql>flush tables with read lock;
複製程式碼
- 新開終端,生成主資料庫的備份(匯出資料庫)
[root@localhost ~]# mysqldump -uroot -ptest123 cmdb > cmdb.sql
複製程式碼
- 將備份檔案傳到從庫
[root@localhost ~]# scp cmdb.sql root@192.168.8.11:/root/
複製程式碼
- 主庫解鎖
mysql>unlock tables;
複製程式碼
從庫操作:
- 停止從庫 slave
mysql>slave stop;
複製程式碼
- 新建資料庫 cmdb
mysql> create database cmdb default charset utf8;
複製程式碼
- 匯入資料
[root@ops-dev ~]# mysql -uroot -ptest123 cmdb<cmdb.sql
複製程式碼
- 檢視從庫已有該資料庫和資料
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| cmdb |
| mysql |
| performance_schema |
| test |
+--------------------+
複製程式碼
此時主從庫的資料完全一致,如果對主庫進行增刪改操作,從庫會自動同步進行操作。