玩玩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 這些東西。
讀寫分離有優點,也有缺點,比如多台資料庫可能造成程式比較複雜(負載均衡問題),最致命的就是複製延遲(比如下訂單時,用戶明明已經下了單,可是到用戶中心後卻找不到,過一會就出來了)
鄙人才疏學淺,有不足之處,歡迎補足