MySQL複製:
綜合來講就是對於數據庫服務器,爲了擴展其性能,但是又不消耗太多資金的實現數據庫性能提升的一個機制;
複製其目的就是將一臺服務器上的數據拷貝到另外一臺服務器上,以達到兩臺服務器數據相同的效果,對於用戶請求的數據,可以通過一臺服務器寫,一臺服務器讀來提升服務器整體性能,以達到可以處理多併發請求的效果;
MySQL複製的工作模式:
對於MySQL服務器,任何影響其數據改變的請求都會被記錄在其二進制日誌文件中,從服務器可以監控主服務器的二進制日誌文件中產生的每個二進制日誌事件,並向主服務器發出複製請求,主服務器接收到從服務器的請求,會通過一個dump thread將新的事件讀取併發送至從服務器,從服務器接收,將主服務器中的所改變的事件複製到本地的中繼日誌中來,並在本地拿來應用,以使自己的數據和主服務器數據保持同步;
複製過程中啓用的三個線程:
dump thread:是主服務器上的線程,用來接收從服務器發起的複製請求;
I/O thread:位於從服務器,用於向主服務器發起複製請求,並接收主服務器發送的新的事件,將其存放到本地的中繼日誌中;
sql thread:位於從服務器,它負責將中繼日誌中的事件讀取,並在本地數據庫中一一執行;
下面演示下簡單的mysql主從複製(
主服務器中沒有任何數據文件)
環境:
Red Hat Enterprise Linux Server release 5.8
主服務器:IP:172.16.9.1
從服務器:IP:172.16.9.2
mysql版本:mysql-5.5.28
mysql的安裝過程這裏不再提供
主服務器配置:
- vim /etc/my.cnf
- datadir = /data/mydata #數據所在目錄
- server-id = 1 #用於唯一標示自己
- log-bin=/binlog/mysql-bin #二進制日誌所在目錄,將其和數據分開存放
- sync_binlog=1 #同步二進制日誌
啓動mysqld
- service mysqld start
進入數據庫,給從服務器複製權限
- mysql> grant replication client,replication slave on *.* to 'reuser'@'172.16.9.2' identified by 'reuser';
- mysql> flush privileges;
- mysql> show master status;
- +------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +------------------+----------+--------------+------------------+
- | mysql-bin.000001 | 354 | | |
- +------------------+----------+--------------+------------------+
- 1 row in set (0.00 sec)
- ##記錄二進制日誌事件發生所在位置
從服務器配置:
- vim /etc/my.cnf
- datadir = /data/mydata
- #log-bin=mysql-bin #二進制日誌開啓功能註釋掉
- server-id = 2 #自己的ID號
- relay-log = /relaylog/mysql-relay #開啓中繼日誌
- relay-log-index = mysql-relay.index #中繼日誌索引
- read-only=1 #從服務器只提供讀的功能,設定爲只讀
啓動服務
- service mysqld start
進入數據庫,設定主服務器
- mysql>change master to master_host='172.16.9.1', master_user='reuser', master_password='reuser', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=354;
- ######################################################################
- master_log_file='mysql-bin.000001' #指定從哪個二進制日誌文件開始複製
- master_log_pos=354 #從二進制日誌複製的位置
- 這兩項是根據主服務器中'show master status'中獲取的
啓動從服務器
- mysql> start slave; #(默認是兩個線程都啓動的,如果想要啓動一個線程,可以手動指定)
查看從服務器是否啓動成功;
上面2項顯示yes,說明已經啓動成功,如果顯示爲No,就需要你排錯了。。
查看各服務器中變量是否成功啓用
Maser
Slave
驗證效果:
在主服務器中新建一個數據庫
查看主服務器狀態
查看從服務器是否同步
顯示數據一致並且從服務器中有新建的數據庫,說明主從複製構建成功!!
以上是主服務器中沒有數據的情況,假如說從服務器同步主服務器中數據時主服務器中已經存在有數據:
則在同步之前要將主服務器中之前的數據導入到從服務器
Master
- mysqldump --all-databases --lock-all-tables --flush-logs --master-data=2 >/tmp/data.sql
- scp /tmp/data.sql node2:/tmp
並記錄下主服務器現在的二進制日誌及所在位置
- mysql> flush tables with read lock;
- Query OK, 0 rows affected (0.06 sec)
- mysql> show master status;
- +------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +------------------+----------+--------------+------------------+
- | mysql-bin.000003 | 107 | | |
- +------------------+----------+--------------+------------------+
- 1 row in set (0.00 sec)
- mysql> unlock tables;
- Query OK, 0 rows affected (0.00 sec)
Slave
導入主服務器中原有數據
- mysql < /tmp/data.sql
- mysql>change master to master_host='172.16.9.1', master_user='reuser', master_password='reuser', master_port=3306, master_log_file='mysql-bin.000003', master_log_pos=107;
啓動從服務器即可
- mysql>start slave;
- mysql> show slave status\G;
- *************************** 1. row ***************************
- Slave_IO_State: Waiting for master to send event
- Master_Host: 172.16.9.1
- Master_User: reuser
- Master_Port: 3306
- Connect_Retry: 60
- Master_Log_File: mysql-bin.000003
- Read_Master_Log_Pos: 107
- Relay_Log_File: mysql-relay.000007
- Relay_Log_Pos: 253
- Relay_Master_Log_File: mysql-bin.000003
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
到此,主從複製完成!!