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

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

安裝環境:Centos 6.4c++

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

機器狀況:使用三臺,分別爲centos1/centos3/centos4 (爲啥沒有centos2呢,由於centos2被我弄壞了,再也開不起來了), 其中centos4做爲主庫,其餘兩臺做爲從庫, 固然這幾臺hostname 都以centos1/centos3/centos4 命名, IP 分別爲 192.168.138.4 192.168.138.3 192.168.138.1  數據庫

使用 ifconfig 能夠查看個人配置vim

細心同窗會發現,我這裏有兩塊網卡,這主要是和我公司的環境有關,由於網管把IP和MAC地址綁定了,所以個人電腦只能使用固定IP,虛擬機無法獲得一個IP,就沒法上網。所以我就增長了一塊網卡,一個用於內網使用 使用 Host-only 的方式爲其指定固定IP,一個使用NAT的方式共享主機IP用於上網。centos

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

cp ifcfg-eth0 ifcfg-eth1

賦值一份配置文件,而後 'ifcfg-eth0'的配置以下架構

這塊網卡對應的是使用HOST-ONLY方式鏈接的網卡,使用靜態IP負載均衡

'ifcfg-eth1'的配置以下socket

這塊網卡對應的是使用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' 這樣的字眼,那就有問題,問題就出如今四個方面

一、網絡不通

二、用戶名密碼不對

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

四、主庫防火牆規則限制(相信不少同窗找不到緣由,可能就是這條,這裏實驗環境把防火牆關閉就OK了 'service iptables stop')

 

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

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

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

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

 

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

相關文章
相關標籤/搜索