MySQL5.6主從復制(讀寫分離)方案

?

MySQL5.6主從復制(讀寫分離)方案

https://yq.aliyun.com/articles/24255

?

摘要:?一、前言:為什么MySQL要做主從復制(讀寫分離)? 通俗來講,如果對數據庫的讀和寫都在同一個數據庫服務器中操作,業務系統性能會降低。 為了提升業務系統性能,優化用戶體驗,可以通過做主從復制(讀寫分離)來減輕主數據庫的負載。

一、前言:為什么MySQL要做主從復制(讀寫分離)?

通俗來講,如果對數據庫的讀和寫都在同一個數據庫服務器中操作,業務系統性能會降低。

為了提升業務系統性能,優化用戶體驗,可以通過做主從復制(讀寫分離)來減輕主數據庫的負載。

而且如果主數據庫宕機,可快速將業務系統切換到從數據庫上,可避免數據丟失。

二、MySQL主從復制(讀寫分離)和集群的區別:

我對MySQL也是剛開始研究,不是很專業。我的理解是:

1、主從復制(讀寫分離):一般需要兩臺及以上數據庫服務器即可(一臺用于寫入數據,一臺用于同步主的數據并用于數據查詢操作)。

局限性:

(1)配置好主從復制之后,同一張表,只能對一個服務器寫操作。如果在從上執行了寫操作,而之后主也操作了這張表,或導致主從不同步;據說可以配置成主主方式,但我還沒有研究到。

(2)主數據庫服務器宕機,需要手動將業務系統切換到從數據庫服務器。無法做到高可用性(除非再通過部署keepalive做成高可用方案)。

2、集群是由N臺數據庫服務器組成,數據的寫入和查詢是隨機到任意一臺數據庫服務器的,其他數據庫服務器會自動同步數據庫的操作。

任何一臺數據庫宕機,不會對整個集群造成大的影響。

局限性:我經過測試才知道目前mysql集群版本(MySQL Cluster)只能對NDB存儲引擎的數據進行集群同步,如果是INNODB或其他的MySQL存儲引擎是不行的。這個也導致了我放棄了在業務系統中應用這種方案。

三、回歸正題,接下來開始MySQL5.6.12的主從復制教程:

1、MySQL5.6開始主從復制有兩種方式:基于日志(binlog);基于GTID(全局事務標示符)。

需要注意的是:GTID方式不支持臨時表!所以如果你的業務系統要用到臨時表的話就不要考慮這種方式了,至少目前最新版本MySQL5.6.12的GTID復制還是不支持臨時表的。

所以此篇教程主要是告訴大家如何通過日志(binlog)方式做主從復制!

2、MySQL官方提供的MySQL Replication教程:

http://dev.mysql.com/doc/refman/5.6/en/replication.html

這個官方教程強烈建議大家閱讀(需要一定的英語閱讀能力哦!不行就google翻譯后再閱讀吧~)。

3、準備工作:

(1)配置MySQL主從復制(讀寫分離)之前,需要在主從兩臺服務器先安裝好MySQL5.6。

(2)目前最新的MySQL5.6 GA版本是MySQL5.6.12(點此下載MySQL5.6.12源碼包)。

個人推薦Linux(RedHat/CentOS 6.4)源碼編譯安裝,具體可以看本站這篇教程:RedHat/CentOS源碼編譯安裝MySQL5.6.12

(3)注意:

(a)如果你需要用于生產環境,安教程安裝MySQL時不要急著做mysql啟動操作。建議把mysql初始化生成的/usr/local/mysql/mysql.cnf刪除,然后把你優化好的mysql配置文件my.cnf放到/etc下。

(b)建議主備兩臺服務器在同一局域網,主備兩臺數據庫網絡需要互通。

(4)我的環境:

主數據庫IP:192.168.100.2

從數據庫IP:192.168.100.3

4、修改主數據庫的的配置文件:

1?????[mysqld]?
2?????server-id=1?
3?????log-bin=mysqlmaster-bin.log?
4?????sync_binlog=1?
5?????#注意:下面這個參數需要修改為服務器內存的70%左右?
6?????innodb_buffer_pool_size?=?512M?
7?????innodb_flush_log_at_trx_commit=1?
8?????sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_AUTO_VALUE_ON_ZERO?
9?????lower_case_table_names=1?
10?????log_bin_trust_function_creators=1

修改之后要重啟mysql:

#?/etc/init.d/mysql?restart

附一個我已優化過的主數據庫配置文件:點此下載

5、修改從數據庫的的配置文件(server-id配置為大于1的數字即可):

1?????[mysqld]?
2?????server-id=2?
3?????log-bin=mysqlslave-bin.log?
4?????sync_binlog=1?
5?????#注意:下面這個參數需要修改為服務器內存的70%左右?
6?????innodb_buffer_pool_size?=?512M?
7?????innodb_flush_log_at_trx_commit=1?
8?????sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_AUTO_VALUE_ON_ZERO?
9?????lower_case_table_names=1?
10?????log_bin_trust_function_creators=1

修改之后要重啟mysql:

?#?/etc/init.d/mysql?restart

附一個我已優化過的從數據庫配置文件:點此下載

6、SSH登錄到主數據庫:

(1)在主數據庫上創建用于主從復制的賬戶(192.168.100.3換成你的從數據庫IP):

1?????#?mysql?-uroot?-p?
2?????mysql>?GRANT?REPLICATION?SLAVE?ON?*.*?TO?'repl'@'192.168.100.3'?IDENTIFIED?BY?'repl';

(2)主數據庫鎖表(禁止再插入數據以獲取主數據庫的的二進制日志坐標):

mysql>?FLUSH?TABLES?WITH?READ?LOCK;

(3)然后克隆一個SSH會話窗口,在這個窗口打開MySQL命令行:

1?????#?mysql?-uroot?-p?
2?????mysql>?SHOW?MASTER?STATUS;?
3?????+------------------------+----------+--------------+------------------+-------------------+?
4?????|?File???????????????????|?Position?|?Binlog_Do_DB?|?Binlog_Ignore_DB?|?Executed_Gtid_Set?|?
5?????+------------------------+----------+--------------+------------------+-------------------+?
6?????|?mysqlmaster-bin.000001?|??????332?|??????????????|??????????????????|???????????????????|?
7?????+------------------------+----------+--------------+------------------+-------------------+?
8?????1?row?in?set?(0.00?sec)?
9?????mysql>?exit;

在這個例子中,二進制日志文件是mysqlmaster-bin.000001,位置是332,記錄下這兩個值,稍后要用到。

(4)在主數據庫上使用mysqldump命令創建一個數據快照:

#mysqldump?-uroot?-p?-h127.0.0.1?-P3306?--all-databases??--triggers?--routines?--events?>all.sql?
#?接下來會提示你輸入mysql數據庫的root密碼,輸入完成后,如果當前數據庫不大,很快就能導出完成。

(5)解鎖第(2)步主數據的鎖表操作:

mysql>?UNLOCK?TABLES;

7、SSH登錄到從數據庫:

(1)通過FTP、SFTP或其他方式,將上一步備份的主數據庫快照all.sql上傳到從數據庫某個路徑,例如我放在了/home/yimiju/目錄下;

(2)從導入主的快照:

#?cd?/home/yimiju?
#?mysql?-uroot?-p?-h127.0.0.1?-P3306?<?all.sql?
#?接下來會提示你輸入mysql數據庫的root密碼,輸入完成后,如果當前數據庫不大,很快就能導入完成。

(3)給從數據庫設置復制的主數據庫信息(注意修改MASTER_LOG_FILE和MASTER_LOG_POS的值):

#?mysql?-uroot?-p?
mysql>?CHANGE?MASTER?TO?MASTER_HOST='192.168.100.2',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysqlmaster-bin.000001',MASTER_LOG_POS=332;?
#?然后啟動從數據庫的復制線程:?
mysql>?START?slave;?
#?接著查詢數據庫的slave狀態:?
mysql>??SHOW?slave?STATUS?\G?
#?如果下面兩個參數都是Yes,則說明主從配置成功!?
Slave_IO_Running:?Yes?
Slave_SQL_Running:?Yes

(4)接下來你可以在主數據庫上創建數據庫、表、插入數據,然后看從數據庫是否同步了這些操作

版權聲明:本文內容由互聯網用戶自發貢獻,本社區不擁有所有權,也不承擔相關法律責任。如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至:yqgroup@service.aliyun.com?進行舉報,并提供相關證據,一經查實,本社區將立刻刪除涉嫌侵權內容。

轉載于:https://www.cnblogs.com/handsome1013/p/7570061.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454596.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454596.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454596.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python 內置模塊之 os

os.walk os.walk() 方法是一個簡單易用的文件、目錄遍歷器&#xff0c;可以幫助我們高效的處理文件、目錄方面的事情。簡單來說&#xff0c;就是挨個遍歷指定路徑下的目錄&#xff08;文件夾&#xff09;和文件。用于通過在目錄樹中游走輸出在目錄中的目錄名&#xff0c;文件名…

[arm驅動]linux內核時鐘

《[arm驅動]linux內核時鐘》涉及內核驅動函數四個&#xff0c;內核結構體一個&#xff0c;分析了內核驅動函數一個&#xff1b;可參考的相關應用程序模板或內核驅動模板一個&#xff0c;可參考的相關應用程序模板或內核驅動一個 一、內核定時器 意義:內核定時器是軟件意義上…

企業網站 源碼 服務郵箱:_公司企業郵箱購買,外貿企業郵箱用哪家服務好?

企業日常辦公&#xff0c;經常會用到各種辦公軟件&#xff0c;而企業郵箱便是最常用的產品。公司在購買企業郵箱時需要考慮哪些方面&#xff0c;尤其是對于外貿行業的企業郵箱&#xff0c;應該如何選擇呢&#xff1f;1. 安全保障公司企業郵箱購買時&#xff0c;首先要關注的就是…

微軟公司等數據結構+算法面試100題2010版全部出爐

微軟等公司數據結構算法面試100題2010版首次完整亮相 作者:July、2010年12月6日。 更新&#xff1a;現今&#xff0c;這100題的答案已經全部整理出來了&#xff0c;微軟面試100題2010年版全部答案集錦&#xff1a;http://blog.csdn.net/v_july_v/arti…

android橫豎屏切換布局閃退,Android-Activity橫豎屏切換不殺死Activity 并監聽橫豎屏切換...

在上一篇博客&#xff0c;Android-Activity臨時數據的保存&#xff0c;中講解到&#xff0c;當發生橫豎屏切換的時候&#xff0c;系統會殺死Activity并重新啟動Activity系統會殺死Activity12-12 08:11:50.441 3347-3347/liudeli.activity D/TempDataActivity: onPause12-12 08:…

基于web的新聞發布系統_終極Linux系統ExTiX 19.8發布,基于深度操作系統deepin15.11...

近日&#xff0c;GNU/Linux開發人員Arne Exton發布了他的ExTiX 終極Linux系統的新版本&#xff0c;帶有全新的底層和更新的組件。ExTiX Deepin 19.8基于Deepin Linux操作系統&#xff0c;更具體地說&#xff0c;ExTiX Deepin 19.8基于最新的Deepin 15.11版本&#xff0c;它增加…

Python 之內置函數和匿名函數

內置函數 截止到python3.6.2&#xff0c;python一共為我們提供了68個內置函數。它們就是python提供可以直接拿來使用的所有函數 Built-in Functions abs()dict()help()min()setattr()all()dir()hex()next()slice()any()divmod()id()object()sorted()ascii()enumerate()input(…

個人作業1

Deadline&#xff1a; 2017-9-30 10:00PM&#xff0c;以博客發表日期為準。 評分基準: 按時交 - 有分&#xff08;滿分10分&#xff09;&#xff0c;檢查的項目包括后文的三個方面 按題目要求完成個人博客注冊、碼云賬號注冊&#xff08;1分&#xff09;完成閱讀作業和提問&…

“西郵漫記”--自由照耀中國

"西郵漫記"&#xff0d;&#xff0d;自由照耀中國九月初在北京linuxWorld大會上我遇見了久違的陳莉君教授&#xff0c;陳教授是西安郵電學院計算機系教授Linux內核的老師&#xff0c;上次相識是在廣州參加廣東Linux推進中心舉辦的“Linux文化節”&#xff0c;當時陳教…

numpy 是否為零_如果不懂 numpy,請別說自己是 python 程序員

(給Python開發者加星標&#xff0c;提升Python技能)作者&#xff1a;牧馬人 (本文來自作者投稿)0. 前言大約七八年前&#xff0c;我曾經用 pyOpenGL 畫過地球磁層頂的三維模型&#xff0c;這段代碼至今仍然還運行在某科研機構里。在那之前&#xff0c;我一直覺得自己是一個合(y…

Python 第三方模塊之 ElementTree(ET)- 解析XML文件

ElementTree是Python常用的處理XML文件的類。下面將介紹使用ElementTree解析、查找、修改XML的方法。 1、引用方法 import xml.etree.ElementTree as ET 2、一個XML例子 下面所有的操作都將下面這段XML為例&#xff0c;我們將它保存為sample.xml。 <?xml version"…

android 編譯luajit,Android 嵌入 LuaJIT 的曲折道路

相關鏈接&#xff1a;Windows 下編譯 LuaJIT懶人與伸手黨可以直接看最底部。為什么使用 LuaJITLua 官方版的編譯嵌入相對簡單&#xff0c;但是為什么要用 LuaJIT 呢&#xff1f;我所了解到的優勢有&#xff1a;更高的運行效率。支持運行 Lua 編譯后的機器碼。雖然 Lua 也支持編…

運維自動化之使用PHP+MYSQL+SHELL打造私有監控系統(一)

前言 記得剛來這家公司的時候&#xff0c;我部門就我一個運維工程師&#xff0c;然后就是經理&#xff0c;剛開始公司平臺什么監控都沒有&#xff0c;在我與經理的努力下&#xff0c;先搭建nagioscacti監控平臺&#xff0c;后來隨著公司業務的增加&#xff0c;平臺的功能與服務…

面試風云錄(01) - 怎樣回答這兩個問題?

由于工作經歷的緣故&#xff0c;使我有一些面試別人的機會&#xff0c;所以應該還有一些經驗可以跟大家聊聊。 當我們提到“面試” 這個詞&#xff0c;總是讓人有種階級感&#xff0c;好像面試官就是高高在上&#xff0c;而面試者則是屈居于下&#xff0c;其實并非如此&#xf…

Redis Python

Python操作Redis 安裝Python使用Redis的庫 sudo pip install redis or sudo easy_install redis or 源碼安裝 詳見&#xff1a;https://github.com/WoLpH/redis-py 1.1 操作模式 redis-py提供兩個類Redis和StrictRedis用于實現Redis的命令&#xff0c;StrictRedis用于實現大…

android 代碼寫命令,monkey基本命令及腳本編寫(示例代碼)

Monkey 是Android自帶的黑盒測試工具&#xff0c;一般通過隨機觸發界面事件&#xff0c;來確定應用是否會發生異常&#xff0c;多用于android應用的穩定性、壓力測試基本命令&#xff1a;adb shell monkey [options] usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] .…

js更新數組對象_7 種Vue 數據已更新而頁面沒有更新的情況及深化總結(收藏)

作者&#xff1a;前端1943鏈接&#xff1a;https://segmentfault.com/a/1190000022772025如果你發現你自己需要在 Vue 中做一次強制更新&#xff0c;99.9% 的情況&#xff0c;是你在某個地方做錯了事。1. Vue 無法檢測實例被創建時不存在于 data 中的 property原因&#xff1a;…

從P560小型機B181201B故障代碼識別手把手詳解

背景&#xff1a;生產小型機發生宕機事件&#xff0c;現場發現液晶面板存在B181201B代碼&#xff0c;可是查看網絡&#xff0c;未見有權威的參考文章&#xff0c;通過管理口登錄HMC管理界面&#xff0c;發現錯誤代碼B181201B&#xff0c;同時提示可能是電源故障&#xff0c;后登…

Java反射中method.isBridge() 橋接方法

橋接方法是 JDK 1.5 引入泛型后&#xff0c;為了使Java的泛型方法生成的字節碼和 1.5 版本前的字節碼相兼容&#xff0c;由編譯器自動生成的方法。我們可以通過Method.isBridge()方法來判斷一個方法是否是橋接方法。 假定接口 public interface SuperClass<T> {void met…

python 利用pexpect進行多機遠程命令執行

在安裝之前&#xff0c;確認你的機器安裝了python,和easy_install.通常python是自動安裝的&#xff0c;如果沒有安裝easy_install&#xff0c;那么wget -q http://peak.telecommunity.com/dist/ez_setup.py 獲取一下python ez_setup.pypexpect是python一個模塊&#xff0c;可以…