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

jopen 8年前發布 | 11K 次閱讀 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=1log_bin=mysql_bin

然后重新啟動mysql

然后為主庫添加一個用戶,用于同步數據

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

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

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

log_bin=mysql_binserver-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 這些東西。

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

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

來自: http://www.cnblogs.com/painsOnline/p/5144662.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!