MySQL數據庫自身提供的主從複製功能能夠方便的實現數據的多處自動備份,實現數據庫的拓展。多個數據備份不只能夠增強數據的安全性,經過實現讀寫分離還能進一步提高數據庫的負載性能。mysql
下圖就描述了一個多個數據庫間主從複製與讀寫分離的模型(來源網絡):sql
在一主多從的數據庫體系中,多個從服務器採用異步的方式更新主數據庫的變化,業務服務器在執行寫或者相關修改數據庫的操做是在主服務器上進行的,讀操做則是在各從服務器上進行。若是配置了多個從服務器或者多個主服務器又涉及到相應的負載均衡問題,關於負載均衡具體的技術細節尚未研究過,今天就先簡單的實現一主一從的主從複製功能。數據庫
Mysql主從複製的實現原理圖大體以下(來源網絡):安全
MySQL之間數據複製的基礎是二進制日誌文件(binary log file)。一臺MySQL數據庫一旦啓用二進制日誌後,其做爲master,它的數據庫中全部操做都會以「事件」的方式記錄在二進制日誌中,其餘數據庫做爲slave經過一個I/O線程與主服務器保持通訊,並監控master的二進制日誌文件的變化,若是發現master二進制日誌文件發生變化,則會把變化複製到本身的中繼日誌中,而後slave的一個SQL線程會把相關的「事件」執行到本身的數據庫中,以此實現從數據庫和主數據庫的一致性,也就實現了主從複製。bash
實現MySQL主從複製須要進行的配置:服務器
具體實現過程以下:網絡
1、準備工做:負載均衡
1.主從數據庫版本最好一致異步
2.主從數據庫內數據保持一致性能
1.修改mysql配置
找到主數據庫的配置文件my.cnf,個人在/etc/mysql/my.cnf,(一些版本中my.cnf爲一個綜合的配置文件,他包含了其餘兩個配置文件,「/etc/mysql/mysql.conf.d/mysqld.cnf」 和 「/etc/mysql/conf.d/mysqld.cnf」另兩個文件,[mysqld]在「/etc/mysql/mysql.conf.d/mysqld.cnf」中)在[mysqld]部分插入以下兩行:
[mysqld] log-bin=mysql-bin #開啓二進制日誌 server-id=1 #設置server-id character_set_server=utf8 init_connect='SET NAMES utf8'
2.重啓mysql,建立用於同步的用戶帳號
打開mysql會話 建立用於同步數據庫的用戶並受權:用戶:rel1密碼:slavepass
mysql> CREATE USER 'repl'@'從數據庫ip地址' IDENTIFIED BY 'slavepass';#建立用戶 mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'從數據庫ip地址';#分配權限 mysql>flush privileges; #刷新權限
3.查看master狀態,記錄二進制文件名(此處爲mysql-bin.000003)和位置(此處爲73):
mysql > SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 73 | test | manual,mysql | +------------------+----------+--------------+------------------+
2、從服務器slave修改:
1.修改mysql配置
一樣找到my.cnf配置文件,添加server-id
[mysqld] server-id=2 #設置server-id character_set_server=utf8 init_connect='SET NAMES utf8'
2.重啓mysql,打開mysql會話,執行同步SQL語句(須要主服務器主機名,登錄憑據,二進制文件的名稱和位置):
mysql> CHANGE MASTER TO -> MASTER_HOST='182.92.172.80', -> MASTER_USER='rep1', -> MASTER_PASSWORD='slavepass', -> MASTER_LOG_FILE='mysql-bin.000003', -> MASTER_LOG_POS=73;
3.啓動slave同步進程:
mysql>start slave;
4.查看slave狀態:
mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.107.132 Master_User: hao Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 1404 Relay_Log_File: hao_server-relay-bin.000002 Relay_Log_Pos: 320 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 1404 Relay_Log_Space: 532 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: 1c39c627-b37e-11e8-a916-000c29216089 Master_Info_File: /var/lib/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 1 row in set (0.00 sec)
當地4步中有如下兩項輸出時說明主從同步設置成功
Slave_IO_Running: Yes Slave_SQL_Running: Yes
接下來就能夠進行一些驗證了,好比在主master數據庫的test數據庫的一張表中插入一條數據,在slave的test庫的相同數據表中查看是否有新增的數據便可驗證主從複製功能是否有效,還能夠關閉slave(mysql>stop slave;),而後再修改master,看slave是否也相應修改(中止slave後,master的修改不會同步到slave),就能夠完成主從複製功能的驗證了。
還能夠用到的其餘相關參數:
master開啓二進制日誌後默認記錄全部庫全部表的操做,能夠經過配置來指定只記錄指定的數據庫甚至指定的表的操做,具體在mysql配置文件的[mysqld]可添加修改以下選項:
# 不一樣步哪些數據庫 binlog-ignore-db = mysql binlog-ignore-db = test binlog-ignore-db = information_schema # 只同步哪些數據庫,除此以外,其餘不一樣步 binlog-do-db = game