主從簡介 在現代企業中,數據顯得尤為重要,而存儲數據的資料庫選擇又五花八門,但無論是何種資料庫,均存在著一種隱患。 當數據規模非常大,讀寫量也很高時,一臺資料庫已經無法負擔全部讀寫任務,就需要多台資料庫同時運作分擔負載。 主從作用 實時災備,用於故障切換 讀寫分離,提供查詢服務 備份,避免影響業務 ...
主從簡介
在現代企業中,數據顯得尤為重要,而存儲數據的資料庫選擇又五花八門,但無論是何種資料庫,均存在著一種隱患。
當數據規模非常大,讀寫量也很高時,一臺資料庫已經無法負擔全部讀寫任務,就需要多台資料庫同時運作分擔負載。
主從作用
- 實時災備,用於故障切換
- 讀寫分離,提供查詢服務
- 備份,避免影響業務
主從形式
- 一主一從
- 主主複製
- 一主多從(擴展系統讀取的性能,讀在從庫,寫在主庫)
- 多主一從(5.7開始支持)
- 聯級複製
主從複製原理
主從複製步驟:
- 主庫將所有的寫操作記錄到binlog日誌中並生成一個log dump線程,將binlog日誌傳給從庫的I/O線程
- 從庫生成兩個線程,一個I/O線程,一個SQL線程
- I/O線程去請求主庫的binlog,並將得到的binlog日誌寫到relay log(中繼日誌) 文件中
- SQL線程,會讀取relay log文件中的日誌,並解析成具體操作,來實現主從的操作一致,達到最終數據一致的目的
主從配置
需求:
搭建兩台MySQL伺服器,一臺作為主伺服器,一臺作為從伺服器,主伺服器進行寫操作,從伺服器進行讀操作
環境:
- 主資料庫
- CentOS7/RedHat7
- IP-192.168.233.129
- Hostname-Lynk
- 有數據
- 副資料庫
- CentOS7/RedHat7
- IP-192.168.233.247
- Hostname-Hyrule
- 無數據
主從複製配置步驟:
- 確保從資料庫與主資料庫里的數據一樣
- 在主資料庫里創建一個同步賬號授權給從資料庫使用
- 配置主資料庫(修改配置文件)
- 配置從資料庫(修改配置文件)
安裝資料庫
詳情請參考Mysql安裝
給從庫授權
#以下操作在主庫進行
mysql> CREATE USER 'repl'@'192.168.233.247' IDENTIFIED BY 'repl123';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.233.247';
Query OK, 0 rows affected (0.00 sec)
確保數據一致
#新開一個終端,對主庫鎖表,防止配置期間有其他人寫入,鎖表期間不能關閉終端或退出mysql互動式命令行
mysql> FLUSH TABLES WITH READ LOCK;
#全備主庫
[root@lynk ~]# mysqldump -uroot -plynk123~ --all-databases > /opt/all-201902271419.sql
#複製備份文件到從庫
[root@lynk ~]# scp /opt/all-201902271419.sql [email protected]:/opt/
#在從庫恢復主庫的備份
[root@Hyrule ~]# mysql -uroot -plynk123~ < /opt/all-201902271419.sql
配置主庫
[root@lynk ~]# vim /etc/my.cnf
#在[mysqld]後添加如下內容(已有的內容不要改變)
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
#啟用binlog日誌
log-bin=mysql-bin
#資料庫伺服器唯一標識符,主庫的server-id值必須比從庫的大
server-id=1
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#結束主庫鎖表狀態,只要退出另一個終端中mysql互動式命令行就行了
mysql> quit
#重啟mysql服務
[root@lynk ~]# systemctl restart mysqld
#查看主庫狀態
[root@lynk ~]# mysql -uroot -plynk123~ -e 'show master status;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 23912 | | | |
+------------------+----------+--------------+------------------+-------------------+
配置從庫
[root@Hyrule ~]# vim /etc/my.cnf
#添加如下內容
server-id=2
relay-log=mysql-relay-bin
#重啟從庫
[root@Hyrule ~]# systemctl restart mysqld
#配置主從複製
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.233.129',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='repl123',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=23912;
Query OK, 0 rows affected, 2 warnings (0.04 sec)
mysql> start slave;
Query OK, 0 rows affected (0.02 sec)
測試驗證
#在主庫中新建一個庫或表,在從庫中查看是否有主庫中新建的表