聊聊Mysql主從同步讀寫分離配置實現


Hi,各位熱愛技術的小伙伴您們好,好久沒有寫點東西了,今天寫點關於mysql主從同步配置的操作日志同大家一起分享。最近自己在全新搭建一個mysql主從同步讀寫分離數據庫簡單集群,我講實際操作步驟整理分享處理,希望對在學習路上的你有所以幫助,當然如果是你是老鳥,寫的不好的地方,多多包涵。廢話不多說,言歸正傳,直入主題。

一、背景介紹

Mysql數據庫主從同步,數據集群其實大家一點都不陌生,但是實際操作的估計就不一定了。至於為什么要使用主從同步策略,在此我就不必多說了,你懂我知大家曉。說實話原來的項目一直都在用戶主從同步讀寫分離,我並沒有實際操作過,都是其他小伙伴在搭建。但是最近一個項目,從服務器環境搭建,部署都必須要自己親手去做,所以也就借此機會來練一練手。嘿嘿,其實我就是一個菜鳥…

本次的數據庫搭建是基於centos7、docker容器部署的。

二、mysql復制原理

原理:

(1)master服務器將數據的改變記錄二進制binlog日志,當master上的數據發生改變時,則將其改變寫入二進制日志中;

(2)slave服務器會在一定時間間隔內對master二進制日志進行探測其是否發生改變,如果發生改變,則開始一個I/OThread請求master二進制事件

(3)同時主節點為每個I/O線程啟動一個dump線程,用於向其發送二進制事件,並保存至從節點本地的中繼日志中,從節點將啟動SQL線程從中繼日志中讀取二進制日志,在本地重放,使得其數據和主節點的保持一致,最后I/OThread和SQLThread將進入睡眠狀態,等待下一次被喚醒。

也就是說:

從庫會生成兩個線程,一個I/O線程,一個SQL線程;

I/O線程會去請求主庫的binlog,並將得到的binlog寫到本地的relay-log(中繼日志)文件中;

主庫會生成一個log dump線程,用來給從庫I/O線程傳binlog;

SQL線程,會讀取relay log文件中的日志,並解析成sql語句逐一執行;

三、前期配置文件准備

主從同步很關鍵的一個配置就是my.cnf。由於本次所有服務都是運行在docker容器上,所以在my.cof配置文件,采用在磁盤文件創建對應的文件,在mysql運行時講相應的配置文件掛載到對應的物理磁盤,方便后期維護。

主從數據庫都需要對my.cnf進行配置。

my.cnf在docker容器的相對位置是:/etc/mysql/my.cnf

假設配置文件在物理磁盤的存放位置為:/home/mysql/my.cnf

1、主數據庫(Mastermy.cnf配置文件

[mysqld]

pid-file        = /var/run/mysqld/mysqld.pid

socket          = /var/run/mysqld/mysqld.sock

datadir         = /var/lib/mysql

secure-file-priv= NULL

server-id=31 #設置主服務器的ID,可以任意配置但是多個主從之間不能重復

innodb_flush_log_at_trx_commit=2  # 寫入磁盤策略

sync_binlog=1  #開啟binlog日志同步功能

expire_logs_days=180, # 二進制日志保留天數

log-bin=mysql-bin-1 #binlog日志文件名(可以任意命名)

#binlog-do-db=test  # 這個表示只同步某個庫 (如果沒有此項,表示同步所有的庫)

#binlog-ignore-db=xxxx # 二進制日志中忽略數據庫

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0


# Custom config should go here

!includedir /etc/mysql/conf.d/

  

具體的配置信息,我都做了簡單的說明,大家可以根據自己的實際需要進行配置。

2、 從數據庫(Slavemy.cnf配置文件

[mysqld]

pid-file        = /var/run/mysqld/mysqld.pid

socket          = /var/run/mysqld/mysqld.sock

datadir         = /var/lib/mysql

secure-file-priv= NULL

read-only=1 #是否只讀,0 代表非只讀 1:代表只讀

server-id=32 #設置主服務器的ID,可以任意配置但是多個主從之間不能重復

innodb_flush_log_at_trx_commit=2  #

sync_binlog=1  #開啟binlog日志同步功能

expire_logs_days=180, # 二進制日志保留天數

log-bin=mysql-bin-1 #binlog日志文件名(可以任意命名)

# binlog-do-db=test  # 這個表示只同步某個庫 (如果沒有此項,表示同步所有的庫)

# 還有一個參數是指定不同步哪些庫,這里不再贅述

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0


# Custom config should go here

!includedir /etc/mysql/conf.d/

  

具體的配置信息,其實和主大同小異。read-only=1 將從數據庫作為讀庫處理

四、主從數據庫容器運行

1、 創建運行主數據庫容器: 

docker run --name mysqlMasterMic-d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql/data:/var/lib/mysql -v /home/mysql/my.cnf:/etc/mysql/my.cnf mysql

  

2、 創建運行從數據庫容器:

docker run --name mysqlSlaveMic-d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql/data:/var/lib/mysql -v /home/mysql/my.cnf:/etc/mysql/my.cnf mysql

  

五、主從數據同步配置

1、主數據庫設置

// 第一步:進入master容器

docker exec -it mysqlMasterMic bash

// 第二步:登錄到mysql

mysql -u root –p

// 在輸入框輸入對應的root密碼:123456

// 第三步:創建數據同步登錄賬號

假設創建賬號為:slavesynchro。同時需要賦值上:REPLICATION SLAVE 權限

改賬號主要用於從數據庫訪問主數據庫使用。

CREATE USER 'slavesynchro'@ '%' IDENTIFIED BY '123456';

GRANT REPLICATION SLAVE ON *.* to 'slavesynchro'@'%' identified by '123456';

// 第四步:查看主數據庫狀態

查看主數據庫狀態,其主要目的是查看數據庫的日志文件名稱和日志記錄行號,從數據庫在配置同步開始節點就是來之此處:

show master status

  

 

 

2、從數據庫設置

// 第一步:進入slaver容器

docker exec -it mysqlSlaveMic bash

// 第二步:登錄到mysql

mysql -u root –p

// 在輸入框輸入對應的root密碼:123456

 // 第三步:設置主數據庫連接

Change master to master_host='主數據地址',master_user=' slavesynchro ',master_password='123456!',get_master_public_key=1,master_log_file='mysql-bin-1.000004 ',master_log_pos= 209210719,master_port=3306;

參數說明:

master_host:主數據庫IP地址

master_user:主數據庫連接用戶名

master_password:主數據量連接密碼

master_port:主數據端口

master_log_file:開始同步的主數據庫日志名稱,主數據庫show master status

隊列的Flie列數據

master_log_pos:開始同步的主數據庫日志開始位置,主數據庫show master status

隊列的Position列數據

      
// 第四步:啟動主從同步

start slave;
// 第五步:查看主從同步狀態

show slave status\G;
      

只有Slave_IO_Running: Yes

 Slave_SQL_Running: Yes

都為yes,才代表主從同步正常運行,否則都需要根據實際情況做對於的調整處理。

  

六、sql同步執行失敗后不在同步處理

主從同步在實際使用過程中,如果處理的不好,可能會導致同步失敗,比如:從數據庫也在做新增操作,如果有自增主鍵約束,那么就可能導致同步失敗。因為主從同步最終目的是實現數據的一致性,所有當某一項同步失敗,那么就不會再做后同步處理。那么如果出現同步失敗后又該如何處理呢?

在實際處理過程中,大概有兩種處理方式:

1、主從數據差異小,並且不關最終數據的一致性,那么可以設置直接跳過同步出差的日志,繼續同步后續數據,具體操作命令如下:

第一步:停止主從同步

stop slave;
第二步:跳過錯誤的日志位置,繼續后續同步,后面的數字可變
set global sql_slave_skip_counter =1;

第三步:繼續開啟主從同步
start slave;

2、如果主從數據差異大,並且要求主從數據完全一致,那么需要:重新做主從,完全同步。

第一步:刪除從數據庫,講主數據庫備份到從數據庫(確保主從數據完全一致)

第二步:按照上面的流程,重新配置主從同步

七、自我一些總結

1、 主從同步數據庫,一定要注意讀寫分離。從數據庫做讀操作,不要做寫操作,最好直接只給從數據庫讀權限,不給寫權限

2、 數據庫設置主從同步賬號時,最好創建專門的賬號用來做主從同步

 

END
為了更高的交流,歡迎大家關注我的公眾號,掃描下面二維碼即可關注,謝謝:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM