MySQL5.6 實現主從複製,讀寫分離,分散單台伺服器壓力

来源:http://www.cnblogs.com/painsOnline/archive/2016/01/20/5144662.html
-Advertisement-
Play Games

玩玩mysql最新版本,體驗源碼安裝,教你進行主從配置,實現讀寫分離


閑來無事,在本地搭建幾台虛擬機,準備配一個mysql讀寫分離的主從配置,版本選用最新版的,mysql.5.6.28 版本,本處使用源碼安裝(鄙人一向喜歡源碼安裝,因為centos中鄙人不知道yum安裝怎麼指定安裝目錄,還有怎麼指定各種配置,不過有些依賴的庫之類的反正鄙人不直接用,使用源碼安裝到時還得指定安裝目錄,而且有時各種不匹配也是醉了)

安裝環境:Centos 6.4

Mysql版本: 主從都使用MySQL5.6.28

機器情況:使用三台,分別為centos1/centos3/centos4 (為啥沒有centos2呢,因為centos2被我弄壞了,再也開不起來了), 其中centos4作為主庫,其他兩台作為從庫, 當然這幾台hostname 都以centos1/centos3/centos4 命名, IP 分別為 192.168.138.4 192.168.138.3 192.168.138.1  

使用 ifconfig 可以查看我的配置

細心同學會發現,我這裡有兩塊網卡,這主要是和我公司的環境有關,因為網管把IP和MAC地址綁定了,因此我的電腦只能使用固定IP,虛擬機沒法得到一個IP,就無法上網。因此我就增加了一塊網卡,一個用於內網使用 使用 Host-only 的方式為其指定固定IP,一個使用NAT的方式共用主機IP用於上網。

這個配置也不是很複雜,在目錄'/etc/sysconfig/network-scripts/'下有一個'ifcfg-eth0' 的網卡配置,然後執行(註意要把HWADDR和你虛擬機的實際MAC地址對應起來)

cp ifcfg-eth0 ifcfg-eth1

賦值一份配置文件,然後 'ifcfg-eth0'的配置如下

這塊網卡對應的是使用HOST-ONLY方式連接的網卡,使用靜態IP

'ifcfg-eth1'的配置如下

這塊網卡對應的是使用NAT網路的網卡,用於連接外網,動態獲取IP

兩個弄好後,重新啟動網路

service network restart

註意,如果不通,看你的機器上是否已經有兩個網卡

沒有的話加上,然後在你的虛擬機上 'Edit'->'Virtual Network Editor' 中查看

 

這兩個網路分別屬於 192.168.15.0 和 192.168.77.0 這兩個網路,因此你本地的VMnet8 是要作為網關的,要保持和虛擬機中和NAT配置的在一個網路才能通信,因此VMnet8配置如下

如此才能保證虛擬機能夠上網 (剩下幾台機器使用一樣的步驟配置網路)

 

好了,上面屬於題外話,不過筆者弄了很久才弄通,相信不少同學都會遇到以上問題,既要指定固定IP,又要上網,但是公司又做了限制

首先要安裝mysql

先解壓文件

 tar -zxvf mysql-5.6.28.tar.gz

不過這個東西在安裝之前還有一些依賴文件,分別為 'make gcc-c++ cmake bison-devel ncurses-devel' 此處使用yum安裝

yum -y install make gcc-c++ cmake bison-devel  ncurses-devel

一切就緒,進入解壓後的源碼安裝包,這裡你會發現很驚奇,沒有'configure'文件,不造咋編譯,這個是因為新版的使用了'cmake'進行編譯,因此要確保是否安裝了cmake

rpm -q cmake

如果沒有安裝就安裝上去,然後輸入以下指令進行配置

cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DSYSCONFDIR=/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci

上面幾個重要的地方

'-DCMAKE_INSTALL_PREFIX' 是安裝目錄

'-DMYSQL_DATADIR' 是數據文件存放目錄

'-DSYSCONFDIR' 配置文件目錄

'-DMYSQL_UNIX_ADDR' SOCK文件存放目錄

'-DMYSQL_TCP_PORT' 埠號

沒有問題然後編譯

make && make install

經過30分鐘漫長等待...

等一切就緒後,我們需要確保存在 mysql組和mysql用戶

cat /etc/group|grep 'mysql'
cat /etc/passwd|grep 'mysql'

如果不存在則需要添加組合用戶

groupadd mysql
useradd -g mysql mysql

然後將目錄'/usr/local/mysql'的所有者改為mysql

chown -R mysql:mysql /usr/local/mysql

這時算是已經安裝完成了,但是mysql中是沒有數據的(即使系統自帶的數據都沒有),這時需要執行自帶腳本,初始化mysql數據

/usr/local/mysql/scripts/mysql_install_db \
--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql

執行完成後,你會發現/usr/local/mysql/data 目錄下多了一些文件,這些就是mysql的數據文件了

然後啟動mysql,這時要註意,我們上面指定配置文件位於'/etc'目錄下,但是我們為了方便,想把mysql配置文件放到'/usr/local/mysql/',這時我們需要把'/etc/my.conf'更改一下名稱

mv /etc/my.cnf  /etc/my.cnf.bak

這時mysql 在'/etc'目錄下找不到,就會到'$basedir'下去找,也就是'/usr/local/mysql/'目錄

此時mysql的安裝工作算是完了,下麵就要啟動了,你會發現使用使用

/usr/local/mysql/bin/mysql start

無法啟動,報錯為

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

 

之前筆者怎麼弄都不行,即使建立'/var/lib/mysql/mysql.sock' 後來終於知道,原來不是怎麼啟動的,而是

/usr/local/mysql/support-files/mysql.server start

OK,現在可以正常啟動了,但是一些懶惰的讀者發現敲命令時 都要加上 '/usr/local/mysql/bin' 及其的麻煩,我能不能直接使用 'mysql xxx'這種

這下就要把mysql的命令目錄加入到環境變數中了

cp /etc/profile /root/backup/profile
vim /etc/profile

編輯'/etc/profile' 即可,上面一句是備份以免弄錯了,系統崩潰無法恢復

在尾部加上 

export PATH=/usr/local/mysql/bin:$PATH

如果已經有了這句,只需要在$PATH 前面加個'/usr/local/mysql/bin:' 即可,然後使配置立即生效

source /etc/profile

使用

mysql -u root

進入mysql命令行,這些就算爽了,把剩下的按照這個配完整就OK了

然後就要開始主從配置了,首先在centos4上配置主庫,修改'/usr/local/mysql/my.cnf'

server_id=1
log_bin=mysql_bin

然後重新啟動mysql

然後為主庫添加一個用戶,用於同步數據

GRANT REPLICATION SLAVE ON *.* TO 'copier'@'%' IDENTIFIED BY '12345678'

這個用戶叫'copier' 密碼為 '12345678' 運行外網訪問

剩下的配置從庫,添加下麵幾句配置

log_bin=mysql_bin
server-id=3

剩下的從庫配置相同

 

好了,下麵我們就開始連接主庫

在mysql命令行下輸入

CHANGE MASTER TO
MASTER_HOST='192.168.138.4',
MASTER_USER='copier',
MASTER_PASSWORD='12345678',
MASTER_LOG_FILE='mysql_bin.000004',
MASTER_LOG_POS=120;

裡面有兩個參數 MASTER_LOG_FILE 和 MASTER_LOG_POS 要到主庫中獲取,在主庫mysql命令行下輸入

show master status\G

結果中 File 和 Position 分別代表 MASTER_LOG_FILE 和 MASTER_LOG_POS的值,千萬記住上面單引號和逗號,最後一個是數字沒有單引號

然後在從庫mysql命令行下運行

start slave

然後查看狀態

show slave stauts\G

可以看到

一定要是這個狀態,如果是 'Connecting to master' 這樣的字眼,那就有問題,問題就出現在四個方面

1、網路不通

2、用戶名密碼不對

3、MASTER_LOG_FILE 和  MASTER_LOG_POS 的值不對(主庫每次啟動,這兩個值都可能發生變化)

4、主庫防火牆規則限制(相信很多同學找不到原因,可能就是這條,這裡實驗環境把防火牆關閉就OK了 'service iptables stop')

 

OK,以上就是鄙人的實踐,過程中遇到的問題主要是防火牆沒關,從庫狀態一直是"Connecting to master",關閉後就基本解決了

我在找上面的問題時發現網上有人問,這怎麼就就叫做讀寫分離了?

其實讀寫分離是一種架構,只能從主庫寫入,從庫關閉寫入功能,程式在讀取的時候可以選擇從主庫或主庫讀取(一般從從庫讀取),寫入只能選擇主庫,因為功能大多都是讀取,多台從庫分散壓力。如果要考慮高可用性,可以弄兩台主庫,一臺主庫用於熱備,加上心跳監控和實效轉移,當常用的主庫發生故障時,自動切換到另一臺備用主庫上面,平時這兩台主庫保持數據一致就OK了。當然這個東西牽扯到其他一些東西,比如hearbeat/DRBD/Keepalived 這些東西。

讀寫分離有優點,也有缺點,比如多台資料庫可能造成程式比較複雜(負載均衡問題),最致命的就是複製延遲(比如下訂單時,用戶明明已經下了單,可是到用戶中心後卻找不到,過一會就出來了)

 

鄙人才疏學淺,有不足之處,歡迎補足

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先要玩 BBB,你需要買一臺 BBB,淘寶 Element14 Beaglebone Black,我購入價 RMB 310,帶數據線,沒電源適配器的。Seeedstudio 有台叫 Beaglebone Green,由於價格偏高,我連看都沒看。 題外話,淘了個適配器寫著是 5V 萬用表測卻是 2V...
  • Linux進程操作簡單小結 linux上進程有5種狀態: 1.運行(正在運行或在運行隊列中等待) 2.中斷(休眠中,受阻,在等待某個條件的形成或接受到信號) 3.不可中斷(收到信號不喚醒和不可運行,進程必須等待直到有中斷發生) 4.僵死(進程已終止,但進程描述符存在,直到父...
  • 最近在折騰linux。因為咱是搞安卓開發的,所以少不了需要搭建Android開發環境,就此小記,希望能給向我一樣的開發者一點幫助!開乾! 1.安裝JDK下載JDK包,得到的是類似於jdk-8u65-linux-x64.tar.gz的壓縮包,所以下載完成後,我們需要解壓;解壓JDK包:1 tar...
  • Mac OS X 下基於 Java 的程式(如 IntelliJ IDEA、jEdit 等)會出現中文標點輸入無效的問題,在中文輸入法狀態,可以輸入中文字,但輸入中文標點最後上去的是英文標點。查閱了相關資料,原來這是 Java 自己的 bug。從 Java 8u51 版本開始就出現了這個 bug,一...
  • pxe無人值守安裝linux配置這裡就不說了,直接看這篇博客http://www.cnblogs.com/mchina/p/centos-pxe-kickstart-auto-install-os.html,寫的很詳細。 我這裡主要做一個補充,多網卡時候有時會出現以下問題,見圖 這個時候就會卡在這....
  • 安裝步驟如下: 1、yum install subversion 2、輸入rpm -ql subversion查看安裝位置,如下圖: 可以看到svn在bin目錄下生成了幾個二進位文件。 再輸入/usr/bin/svnversion --version 就可以查看svn的版本,...
  • linux下掛載(mount)光碟映像文檔、移動硬碟、U盤、Windows和NFS網路共用. linux是個優秀的開放源碼的操作系統,能夠運行在大到巨型小到掌上型各類電腦系統上,隨著linux系統的日漸成熟和穩定連同他開放源代碼特有的優越 性,linux在全世界得到了越來越廣泛的應用。現在許多企業....
  • 我不是創客。我買了個 Beaglebone Black 來玩,主要是拿來學習。 入手前,看過好幾個樹莓派 (Raspi - 2 Model B)和 Beaglebone Black (BBB) 比較,網上很多都是翻譯自某一篇國外博文。事實上用起來之後,看了一點 BBB 的書之後,兩者的區別似乎不止博...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...