功能需求
外網服務器,有獨立IP;內網服務器,無獨立IP;外網服務器的MYSQL數據庫實時更新,並要求同步到內網服務器中。
該需求可使用MYSQL的主從備份實現,其中外網服務器爲主服務器(Master),內網服務器爲從服務器(Slave)。
實現方式
MYSQL主從同步是在MySQL主從複製(Master-Slave Replication
)基礎上實現的,通過設置在Master
上的binlog
,使其處於打開狀態;Slave
通過一個I/O
線程從Master
上讀取binlog
,然後傳輸到Slave
的中繼日誌中,然後使用SQL
線程讀取中繼日誌,並應用到自身數據庫中,從而實現主從數據同步功能。
如下圖所示:
具體操作
1、主服務器(Master)配置
首先應該保證從服務器對主服務器數據庫的訪問,即開啓MySQL的遠程訪問,grant和flush以下就行了。
然後需要修改Master的數據庫配置,MySQL默認配置文件在/etc/my.cnf
,打開後在[mysqld]
之後加入如下條目:
log_bin = /var/log/mariadb/mariadb-bin.log
server-id = 1
binlog_do_db = testmirror
也可以進行更詳細的設置:
max_binlog_size = 500M
binlog_cache_size = 128K
binlog-ignore-db = mysql
expire_logs_day=2
binlog_format="MIXED"
設置完後重啓MYSQL服務。
各參數意義:
參數 | 意義 |
---|---|
server-id | 數據庫唯一ID,一組主從中此標識號不能重複。其中1 代表主數據庫(源) 2代表輔數據庫(目的) |
log_bin | 開啓bin-log,並指定文件目錄和文件名前綴 |
binlog_do_db | 需要同步的數據庫名字,可以是多個,之間用分號分割 |
binlog_ignore_db | 不需要同步的數據庫名字 |
max_binlog_size | 每個bin-log最大大小,當此大小等於500M時會自動生成一個新的日誌文件。一條記錄不會寫在2個日誌文件中,所以有時日誌文件會超過此大小。 |
binlog_cache_size | 日誌緩存大小 |
binlog-do-db | 需要同步的數據庫名字,如果是多個,就以此格式在寫一行即可。 |
binlog-ignore-db | 不需要同步的數據庫名字,如果是多個,就以此格式在寫一行即可。 |
expire_logs_day | 設置bin-log日誌文件保存的天數,此參數mysql5.0以下版本不支持。 |
binlog_format | bin-log日誌文件格式,設置爲MIXED可以防止主鍵重複。 |
如果需要有選擇性地進行同步,可以在Master端進行(使用binlog_do_db或binlog_Ignore_DB),也可以在Slave端進行(使用下面會說到的Replicate_Ignore_DB)。
2、從服務器(Slave)配置
修改slave
的配置文件,同樣在/etc/my.cnf
下
server-id = 2
read_only = 1
relay_log = /var/log/mariadb/relay.log
當然也可以開啓bin_log使它同時作爲其它從服務器的Master。
設置完後重啓MYSQL服務。
參數 | 意義 |
---|---|
relay_log | 配置中繼日誌 |
log-slave-updates | 表示slave將複製事件寫進自己的二進制日誌,簡單地說,如果從庫同時作爲其它庫的主庫,那麼需要添加該參數,否則不需要 |
read_only | 它防止改變數據 |
針對log-slave-updates參數,如果從庫也開啓了log-bin參數,此時直接往從庫寫數據,是可以記錄log-bin日誌的。但是從庫通過I0線程讀取主庫二進制日誌文件,然後通過SQL線程寫入的數據,則是不會記錄log-bin日誌的,也就是說從庫從主庫上覆制的數據無法記錄到從庫的log-bin日誌上,也無法被從庫的從庫捕捉到更新。所以從庫做爲其他從庫的主庫時需要在配置文件中添加log-slave-updates參數。
前面說了利用Master的binlog_do_db
和binlog_Ignore_DB
可以實現過濾,只同步特定的數據庫,該功能也可以在Slave端實現。
參數 | 意義 |
---|---|
replicate_do_db | 數據庫白名單列表 |
replicate_ignore_db | 數據庫黑名單列表 |
replicate_do_table | 表白名單列表 |
replicate_ignore_table | 表黑名單列表 |
replicate_wild_do_table | 使用通配符定義表白名單列表 |
replicate_wild_ignore_table | 使用通配符定義表黑名單列表 |
3、賬號權限設置
在Slave上,使用Master上的root@%帳戶登陸Master與其通信。
GRANT REPLICATION SLAVE ON . TO root@’%’ IDENTIFIED BY ‘password’;
如果使用的是非root賬號,該賬號除了在Master上真實存在外,還應該擁有REPLICATION SLAVE 和 READ屬性。
4、查看Master狀態
在Master的MySQL命令符下,查看Master狀態:
MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb_bin.000001 | 245 | testmirror | |
+--------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
這裏需要記住兩個參數,一個File,一個Position。
5、在Slave上開啓同步
MySQL從5.1.7以後開始就不支持在my.cnf中對master-host
等參數進行配置,而是使用了CHANGE MASTER TO
語句。
mysql> CHANGE MASTER TO MASTER_HOST='server1',
-> MASTER_USER='user_name',
-> MASTER_PASSWORD='p4ssword',
-> MASTER_LOG_FILE='mariadb_bin.000001',
-> MASTER_LOG_POS=245;
這裏最後填的兩個就是第3步看到的File和position。
然後就可以開始同步了:
mysql> START SLAVE;
可以看一看Slave的運行狀態
mysql> SHOW SLAVE STATUS\G
結果很長,主要關注以下幾個:
Slave_IO_Running=Yes
Slave_SQL_Running=Yes
……
Exec_Master_Log_Pos: 537
這幾句表示slave的I/O和SQL線程都已經開始運行。每次日誌的位置(Exec_Master_Log_Pos)增加了,意味着一些事件被獲取並執行了。如果你在master上進行修改,可以在slave上看到各種日誌文件的位置的變化,同樣,也可以看到數據庫中數據的變化。