實現mysql數據庫主從/主主心得

參考文章:https://www.jianshu.com/p/b0cf461451fb

 

需求:爲了無縫上線小程序,需要兩個同構的數據庫來做支撐(一個線上,一個預備上線)。

問題:兩個數據庫在同一臺服務器的mysql服務下。

解決問題的方案:

1.在同一臺服務器下安裝兩個mysql服務(從服務器版本可以比主服務器版本高),進行主從/主主配置(這種方式不建議,以免服務器宕機)

2.將同構數據庫分別部署在兩臺服務器上。(這種實現方式比較主流,還能防備宕機)。

着手實現:

服務器(將單機拆成多機):

master:xxx.xxx.xxx.1          mysql版本:5.6.43

slave:     xxx.xxx.xxx.2          mysql版本:5.6.43

配置步驟:

看到網上大多都是先鎖庫,備份,解鎖庫,在進行配置主從(疑問:如果解鎖後數據變動怎麼辦?)。

所以我個人理解應該先配置master的my.cnf,在進行先鎖庫,備份,解鎖庫,在進行配置slave。

1.先配置master服務器的/etc/my.cnf

server_id = 1
binlog-do-db = db  (主從複製需要的數據庫)
#binlog-ignore-db=db(主從複製需要忽略的數據庫,和上面二選一進行配置)
#log-slave-updates=true (雙主需要開啓,同步slave中binlog日誌)
#sync_binlog = 0
#sync-master-info=1
#auto_increment_offset = 1
#auto_increment_increment = 2
#expire_logs_days = 7
#log_bin_trust_function_creators = 1

配置完成重啓數據庫服務,讓配置生效

2.拷貝master服務器上的數據庫備份到slave上

mysql>use db;
mysql>flush tables with read lock;  // 鎖庫,防止這段時間有寫入。

[root@master~]# mysqldump -uroot -pxxxx db > /root/db.sql; 
// 只是導出數據結構+數據 如果需要導出函數和存儲過程自行查看

mysql>show master status; // 查看主庫binlog的pos位置。
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |   4      | db           |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql>unlock tables;   // 解鎖數據庫

3.創建replication用戶,使slave通過I/O線程以該用戶名連接到master,並讀取binlog二進制日誌。

mysql>grant replication slave on *.* to 'replicate'@'%' identified by 'replicate'; 
myqsl>flush privileges;(刷新緩存,使用戶生效)
mysql>show processlist \G;(查看是否已有生效的master的I/O線程)
//state=Master has sent all binlog to slave; waiting for binlog to be updated;user=replicate

4.將db.sql文件發送到slave服務器,然後進行數據導入

[root@slave ~]scp [email protected]:/root/db.sql /root/db.sql(同一網絡下使用scp拷貝)
mysql>create datebase db;
mysql>source /root/db.sql;(拷貝成功)

5.配置slave服務器中的/etc/my.cnf

server_id=2
replicate-do-db=db(需要同步主庫的從庫名稱)
#replicate-ignore-db=xxx(忽略不需要進行主從的數據庫)

同樣重啓slave服務器的mysql服務,讓配置生效。

6.此時slave應該要知道如何連接到master,並重訪其二進制日誌。

不需要去修改數據庫配置了,而是需要在mysql服務裏面執行下面語句就能連接到master服務,獲取到二進制日誌

mysql>CHANGE MASTER TO
mysql>MASTER_HOST='xxx.xxx.xxx.1',
mysql>MASTER_USER='replicate',
mysql>MASTER_PASSWORD='replicate',
mysql>MASTER_LOG_FILE='mysql-bin.000001',
mysql>MASTER_LOG_POS=4;

mysql>show slave status \G;(查看slave的運行狀態,此時應該是尚未運行)
// slave_io_state爲空slave_io_running、slave_sql_running爲no

mysql>start slave;(開啓slave服務)
// slave_io_state =Waiting for master to send event
// slave_io_running = yes
// slave_sql_running = yes

當我們看到slave_io_running和slave_sql_running爲雙yes的時候,我們配置已經完成,接下來我們可以開始進行測試了。

7.查看二進制日誌文件,由於二進制日誌格式比較特殊,我們不能用tail指令去查看日誌。

[root@slave ~]# mysqlbinlog mysql-bin.000001 | tail -500

8.重點:確定你分配的mysql用戶的權限問題,當權限不可達的時候同步數據會失敗。

我遇到一個問題,至今還沒考慮清楚。如果有大佬遇到過想明白了,還想不吝賜教:

使用root@%用戶的時候,用來測試主從同步數據不成功(主庫用binlog日誌,從庫有relay-bin日誌;master的I/O線程正常,slave的I/O線程和sql線程都正常,卡了好久)。

後來使用root@localhost用戶登錄數據庫才測試成功的。現在莫名其妙的root@%用戶一切正常了。期間沒做任何改動,不知道原因。看服務器history,也沒有看到其他人修改過其他地方,滿臉的懵逼。

 

寫得不好,還在初級階段,還望大家多多指教。

 

 

發佈了30 篇原創文章 · 獲贊 21 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章