聊聊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、主資料庫(Master)my.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、 從資料庫(Slave)my.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
為了更高的交流,歡迎大家關注我的公眾號,掃描下面二維碼即可關注,謝謝:
相關推薦
聊聊Mysql主從同步讀寫分離配置實現
Hi,各位熱愛技術的小夥伴您們好,好久沒有寫點東西了,今天寫點關於mysql主從同步配置的操作日誌同大家一起分享。最近自己在全新搭建一個mysql主從同步讀寫分離資料庫簡單叢集,我講實際操作步驟整理分享處理,希望對在學習路上的你有所以幫助,當然如果是你是老鳥,寫的不好的地方,多多包涵。廢話不多說,言歸正傳,直
使用amoeba配置mysql主從同步讀寫分離
mysql主從同步 mysql讀寫分離 amoeba搭建 使用amoeba配置mysql主從同步讀寫分離 實驗環境:需要三臺手工編譯安裝的mysql,一臺主,兩臺從主: 192.168.88.100從1: 192.168.88.10
配置mysql主從同步讀寫分離,amoeba做中間代理服務
前言 最近自己利用課餘時間研究了MySQL的的主從同步,讀寫分離的配置過程,期間遇到了很多的問題,在這篇博文中我把自己的配置過程遇到的問題和配置流程總結一下。 環境 我的伺服器叢集使用自己電腦上的虛擬機器虛擬機器模擬的,虛擬機器裝的是centos的系統 系統:三臺裝的CentOS的伺
mysql 主從同步-讀寫分離
mat mariadb tar 從庫 log sta ble form lock 一、 實驗環境 Master centos 7.3 192.168.138.13 Slave
MySQL主從同步+讀寫分離
Mysql主從同步+讀寫分離 學習 分享 數據庫主從同步+讀寫分離 MySQL主從同步+讀寫分離 實驗拓撲:三臺mysql數據庫:192.168.80.101 主服務器 mysql192.168.80.102 從1服務器 mysql
基於MYCAT的MYSQL主從與讀寫分離配置詳解與示例
第三版_基於Mycat的MySQL主從讀寫分離配置詳解與示例 1、不使用Mycat託管MySQL主從伺服器,簡單使用如下配置: <dataNodename="dn1" dataHost="localhost1" database="db1"/&
使用docker搭建高併發網站架構實踐7--Mysql主從同步+讀寫分離+讀負載均衡
6. Mysql主從同步+讀寫分離+讀負載均衡 目標: 搭建mysql一主兩從同步 搭建從mysql讀負載均衡 結合web工程實現mysql讀寫分離 整體示意圖: 如圖所示: 192.168.238.129:負載均衡伺服器 192.168.238.128:
mysql主從同步讀寫分離
relay_log address ria size ask mysql數據庫 done date kconfig https://pan.baidu.com/s/1tm_FQ4C8heQqzx01URr85A //軟件連接百度網盤 三臺mysql數據庫:主數據庫服務器:
Mysql 分散式叢集 主從同步 讀寫分離 amoeba 中介軟體配置
首先說明一下amoeba 跟 MySQL proxy在讀寫分離的使用上面的區別: 在MySQL proxy 6.0版本 上面如果想要讀寫分離並且 讀叢集、寫叢集 機器比較多情況下,用mysql proxy 需要相當大的工作量,目前mysql proxy沒有現
搭建Mysql-proxy實現主從同步讀寫分離
Mysql代理服務器 Wg61 192.168.0.180 (Mysql-proxy)主服務器 Wg62 192.168.0.142 (負責寫入數據)從服務器 Wg63 192.168.0.156 (負責只讀數據) 實驗思路: 下載Mysql-proxy,在代理服務器Wg61上安
CentOS7,MySQL主從配置和讀寫分離(MySQL主從、讀寫分離、分散式、資料庫讀寫分離、主從配置)
一、實驗目標搭建兩臺MySQL伺服器,一臺作為主伺服器,一臺作為從伺服器,主伺服器進行寫操作,從伺服器進行讀操作。二、測試環境主資料庫: CentOS7, MySQL15.1 , 192.168.1.233從資料庫: CentOS7, MySQL15.1 , 192.168.
docker-compose.yml樣例(mysql主從+mycat讀寫分離)
mysqld 系統 環境變量 服務端 nbsp dock 自定義 host expose Docker-compose.yml文件示例 1、mysql主從復制的docker-compose.yml文件 # cat docker-compose.yml version: ‘2
mysql主從及讀寫分離
主從與讀寫分離 主從同步1 主配置把237配置為主數據庫服務器 授權用戶從42數據庫服務器連接自己的時候有拷貝數據的權限grant replication slave on *.* to [email protected]"172.40.7.42" identified
MYSQL主從複製+讀寫分離
案例 搭建MYSQL主從複製 這裡mysql伺服器都裝好了的 yum -y install ntp #裝ntp時間同步 vim /etc/ntp.conf #配置檔案 server 127.127.1.0 fudge 127.127.1.0 strat
mysql主從複製讀寫分離之——proxysql應用
一、說明ProxySQL是一個開源的MySQL代理伺服器,這意味著它充當MySQL伺服器和訪問其資料庫的應用程式之間的中介。ProxySQL可以通過在多個數據庫伺服器池之間分配流量來提高效能,並且如果一個或多個數據庫伺服器發生故障,還可以通過自動故障切換到備用資料庫來提高可用性。 系統環境:master1:
Docker Mysql 主從複製+讀寫分離
整體規劃 host ----------- ip--------------------port---------------------說明 -----------------192.168.100.30 10088 Keepalived-VIP Proxysql-21 192.168
MySQL主從複製讀寫分離與Yii2實現
關於 MySQL的主從複製的配置以及MySQL proxy的配置 在以下這篇文章當中會詳細講到: 或者可以參考這個 接下來我們要說的是在Yii2中是如何實現這個程式碼層級的讀寫分離. Yii2中主從複製和讀寫分離 這裡主要圍繞最新的Yii2英文文件中的一小節“主從複製與讀寫分離”展開進行介紹。為什麼
MYSQL 主從複製讀寫分離
參考:http://www.cnblogs.com/gl-developer/p/6170423.html https://www.cnblogs.com/luckcs/articles/2543607.html 通過主從複製的方式來同步資料,再通過讀寫分離來提升資料庫的併
thinkphp laravel 主從複製讀寫分離配置
首先我們需要兩個mysql伺服器,考慮到像小編這樣,電腦有不可關閉的防火牆,外網各種埠被限制,空餘時間只能在本地玩玩。。。這型別的人還是有很多的!為了大家都能體驗,本教程就教大家在本地安裝兩個mysql服務,模擬不同的mysql伺服器 1、小編使用的是ph
Mysql中間件Proxysql實現mysql主從架構讀寫分離
指標 yum源 check 查看 app 數據庫 進行 sql mysq 實驗主機 Master: 192.168.0.17 Slave: 192.168.0.20 Proxysql:192.168.0.30建議關閉防火墻建立Master: 192.168.0.17與Sl