引言:在數(shù)據(jù)管理中,如果對MySQL數(shù)據(jù)庫的讀寫操作都在同一個數(shù)據(jù)庫服務(wù)器中的進行,往往是無法滿足實際需要的。因為,這樣做不僅容易造成數(shù)據(jù)的丟失和損壞,而且因為同時承擔(dān)讀寫操作,大大增加了數(shù)據(jù)庫服務(wù)器的負載,造成服務(wù)器運行效率的降低。
在數(shù)據(jù)管理中,對MySQL數(shù)據(jù)庫的讀寫操作都在同一個數(shù)據(jù)庫服務(wù)器中進行的話,往往無法滿足實際需要。
解決的方法:通過主從復(fù)制的方式同步數(shù)據(jù),通過讀寫分離提高數(shù)據(jù)庫的并發(fā)負載能力。所謂主從復(fù)制指的是同時配置多臺MySQL數(shù)據(jù)庫服務(wù)器,讓某臺服務(wù)器作為MySQL主服務(wù)器,其余的作為從服務(wù)器,讓應(yīng)用程序服務(wù)器只對MySQL主服務(wù)器進行寫操作,對從服務(wù)器只進行讀操作。
MySQL主服務(wù)器和從服務(wù)器之間通過數(shù)據(jù)同步的方式,使其存儲的數(shù)據(jù)彼此保持一致。因此說,主從復(fù)制是讀寫分離的前提條件。MySQL主從復(fù)制有三種實現(xiàn)方式,包括基于語句的復(fù)制,基于行的復(fù)制,基于類型的復(fù)制。對于基于語句的復(fù)制方式來說,當(dāng)在MySQL主服務(wù)器上執(zhí)行了修改數(shù)據(jù)庫的T-SQL語句后,再在MySQL從服務(wù)器上重復(fù)執(zhí)行相應(yīng)的語句即可,這是主從復(fù)制默認的操作方式。其優(yōu)點是執(zhí)行效率高,但缺點是數(shù)據(jù)復(fù)制不是很精準(zhǔn)。對于基于行的復(fù)制方式來說,只需將MySQL主服務(wù)器中發(fā)生改動的數(shù)據(jù)復(fù)制到MySQL從服務(wù)器中,其復(fù)制的不是具體的命令而是真實數(shù)據(jù)。優(yōu)點是精準(zhǔn)度高,缺點是效率很低。
對于混合類型的復(fù)制來說,在默認情況下,優(yōu)先采用基于語句的復(fù)制,來提高復(fù)制效率。當(dāng)發(fā)現(xiàn)使用該方法無法提高復(fù)制的精準(zhǔn)度時,就會采用基于行的復(fù)制方法來處理剩余的數(shù)據(jù)。MySQL主從復(fù)制的原理是當(dāng)在執(zhí)行更新、插入、刪除等語句時,首先對MySQL主服務(wù)器進行數(shù)據(jù)變更操作,將其寫入自己的二進制日志中。MySQL從服務(wù)器利用I/O線程讀取MySQL主服務(wù)器中的日志。當(dāng)發(fā)現(xiàn)日志中出現(xiàn)的數(shù)據(jù)變動信息,就會讓MySQL從服務(wù)器執(zhí)行復(fù)制動作。
讀寫分離的原理是只在MySQL主服務(wù)器上寫數(shù)據(jù),只在MySQL從服務(wù)器上讀取數(shù)據(jù),實現(xiàn)MySQL讀寫分離。一般來說有兩種方式:其一,是基于程序代碼來實現(xiàn),因為主從服務(wù)器的名稱和IP均不相同,因此在設(shè)計前端程序時,可以將所有的Select語句全部定位到MySQL從服務(wù)器上,而執(zhí)行Insert,Update等語句時,全部定位到MySQL主服務(wù)器上。其二,是配置中間代理層,即在MySQL服務(wù)器和客戶端之間設(shè)置代理服務(wù)器,客戶端將讀寫操作請求全部提交給代理服務(wù)器,由代理服務(wù)器來決定如何將寫操作轉(zhuǎn)交給MySQL主服務(wù)器,將讀操作轉(zhuǎn)交給MySQL從服務(wù)器。其優(yōu)點是可以優(yōu)化維護操作,缺點是需要購買和配置代理服務(wù)器,讓網(wǎng)絡(luò)結(jié)構(gòu)變得復(fù)雜。這里就后一種方式,通過實例來說明如何實現(xiàn)MySQL的主從復(fù)制和讀寫分離功能。
在代理服務(wù)器上安裝Amoeba這款軟件,其IP為192.168.0.10。 一 臺MySQL服務(wù)器作為主服務(wù)器,其IP為 192.168.0.90。另外兩臺作為從服務(wù)器,其IP分別為192.168.0.91和192.168.0.92。 應(yīng)用客戶端主機的IP為192.168.1.100,這些主機安裝的都是CentOS6.5。為了便于管理,在MySQL主服務(wù)器上打開終端界面,執(zhí)行“hostname mysqlzl”命令,對其進行更名操作。 執(zhí)行“VIM /etc/sysconfig/networkscripts/ifcfg-eth0”,將其中的“ONBOOT”的值修改為“yes”,將“BOOTPROTO”的值修改為“static”。添加“IPADDR=192.168.0.90”和“NETMASK =255.255.255.0”語句,之后保存該文件。
執(zhí)行“/etc/init.d/network resrart”命令,重啟網(wǎng)卡。執(zhí)行“bash”命令確認,執(zhí)行“cd /etc/yum.repos.d”,“vim CentOSMedia.repo”命令,在該文件中只保留“baseurl=file:///media”,將無 關(guān)的 內(nèi) 容清除,將“ebable”的值設(shè)置為“1”。之后插入CentOS 6.5光盤,執(zhí)行“mount /dev/cdrom /media/”命令,配置好YUM源。之后在代理服務(wù)器和兩臺MySQL從服務(wù)器上分別執(zhí)行修改名稱(例如“proxysrv”,“mysqlc1”和“mysqlc2”),配 置 IP 和YUM源等操作。
之后需要在MySQL主服務(wù)器和從服務(wù)器上安裝MySQL數(shù)據(jù)庫組件和Cmake。首先,必須保證這些服務(wù)器之間時間保持同步,例如在mysqlzl上執(zhí)行“yun install ntp -y” 命令,在mysqlzl上執(zhí)行“vim/etc/init.d/ntp.conf” 命令,在該配置文件后面添加“server 127.127.1.0”和“fudge 127.127.1.0 stratum 8”語句,然后執(zhí)行“/etc/init.d/ntp”命令重啟該服務(wù)。在mysqlc1和mysqlc2服務(wù)器上分別執(zhí)行“yum install ntpdate -y”命令,安裝時間同步工具,執(zhí)行“/usr/sbin/ntpdate 192.168.0.90”命令,來同步mysqlzl服務(wù)器上的時間信息。
為了便于這些MySQL服務(wù)器之間順利通訊,可以 執(zhí) 行“iptables -F”命令,來清理防火墻規(guī)則。在MySQL主從服務(wù)器上分別 執(zhí) 行“yum install gcc gcc-c++ ncurres-devel make -y”,“tar zxvf cmake-x.x.x.tar.gz”,“./configure ; gmake ;gmake install”,來安裝對應(yīng)版本的Cmake組件。執(zhí)行“tar zxvf mysql-5.x.xx.tar.gz” 命 令,解壓對應(yīng)版本的MySQL安 裝 包,執(zhí)行“cmake-DCMAKE_INSTALL_PREFIX=/usr/local/mysql&&make&&make install”命 令,對 MySQL進行編譯安裝,其中的“PREFIX=/usr/local/mysql”參數(shù)是指定其安裝位置。在“mysqlc1”和“mysqlc2”服務(wù)器上分別執(zhí)行“cd mysql-5.x.xx”命令,進入解壓路徑。
執(zhí)行“cp supportfiles/my-medium.cnf /etc/my.cnf”,“cp supportfiles/mysql.server /etc/rc.d/init.d/mysqld”,復(fù)制所需的文件。執(zhí)行“chmod +x /etc/rc.d/init.d/mysqld”命令,來設(shè)置所需的可執(zhí)行權(quán)限。執(zhí)行“chkconfig -add mysqld”命令,將MySQL添加到系統(tǒng)服務(wù)中。執(zhí)行“echo"PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile”,“source /etc/profile”,添加所需環(huán)境變量并使其立即生效。執(zhí)行“groupadd mysql”,“useradd -M -s /sbin/nologin mysql”命令,創(chuàng)建名為Mysql的組,在其中添加名為mysql的賬戶。
執(zhí)行“chown -Rmysql:mysql /u s r/local/mysql/”命令,更改mysql用戶對指定目錄的權(quán) 限。 執(zhí) 行“/usr/local/mysql/scripts/mysql_install_db --user=mysql--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data” 命 令,對MySQL數(shù)據(jù)庫進行優(yōu)化處理。執(zhí)行“/etc/init.d/mysqld start”命 令,啟動Mysql。執(zhí)行“chkconfig mysql on”命令,使其自動啟動。為了安全起見,執(zhí)行“mysqladmin–u root password "p@ssw0rd"”,為SQL管理員設(shè)置密碼,密碼為“p@ssw0rd”,當(dāng)然,您可以根據(jù)實際情況更改。這樣,就完成了對MySQL從服務(wù)器的初始化配置。
在mysqlzl上同樣執(zhí)行以上命令,來實現(xiàn)初始化操作。注意,主從服務(wù)器上的MySQL管理員密碼需要設(shè)置為一致。執(zhí)行“vim /etc/ld.so.conf”命令,對該文件中的“server-id = 1”修改為“server-id = 11”,如果保持默認值的話,該服務(wù)器就無法作為MySQL主服務(wù)器使用。將“l(fā)ogbin=mysql-bin”修 改 為“l(fā)og-bin=master-bin”,添加一行內(nèi)容“l(fā)og-slaveupdates=true”,允許從服務(wù)器從本機更新。保存該文件,執(zhí) 行“service mysqld restart”命令,重啟 MySQL服 務(wù)。 執(zhí) 行“mysql -u root -p”命令,輸入密碼后登錄到MySQL。在控制臺“mysql>”提示符下執(zhí)行“GRANT REPLICATION SLAVE ON *.* TO 'cong user'@'192.168.0.%'IDENTI FIEDBY'qwe123'”,為賬戶名為“conguser”的用戶設(shè)置“qwe123”的密碼,允許其訪問192.168.0網(wǎng)段的所有MySQL從服務(wù)器。
執(zhí)行“FLUSHPRIVILEGES”命令,執(zhí)行權(quán)限刷新操作。執(zhí)行“show master status” 命 令,記下返回信息中的“File”和“Position”的值,這其實是主MySQL的日志文件名稱和定位值。例如“masterbin.000001”和“397”。在兩臺MySQL從服務(wù)器上分別執(zhí)行“vim /etc/my.cnf”命令,對配置文件進行修改,將其中的“server-id”的值修改為22。如果保持默認為1,則無法將其作為從服務(wù)器使用。添加“relaylog=relay-log-bin” 和“relay-log-index=slaverelay-bin.index”兩行 語句,設(shè)置日志以及索引信息。執(zhí) 行“/etc/init.d/mysqld restart”命令,重啟 MySQL。
執(zhí) 行“mysql -u root-p”命令,輸入密碼后登錄到MySQL,在控制臺提示符下執(zhí)行“change master to master_host='192.168.0.90',master_user='conguser',master_password='qwe123',master_log_file='maste rbin.000001',master_log_pos=397;”命令,設(shè)置與其關(guān)聯(lián)的MySQL主服務(wù)器信息,注意,這里的各項參數(shù)需要和主服務(wù)器上的配置相同。例如賬戶名、密碼以及日志文件等。執(zhí)行“start slave;”,“show slave statusG;”命令,在返回信息中的“Slave_IO_Runnin”欄和“Slave_SQL_Running”欄中必須顯示“YES”,才表示配置成功。在MySQL主服務(wù)器上登錄到MySQL控制臺,執(zhí)行“create database dbceshi;”命令,創(chuàng)建一個用于測試的數(shù)據(jù)庫。
在某個MySQL從服務(wù)器中登錄到MySQL控制臺,執(zhí)行“show databases;”命令,可以看到上述數(shù)據(jù)庫,這就說明主從復(fù)制已經(jīng)配置完畢。
接下來在代理服務(wù)器上配置Amoeba,因為Amoeba是使用JDK開發(fā)的,所以需要安裝JDK組件。注意,不需要使用最新的JDK。執(zhí)行“chmod +x /usr/local/jdk-6u14-linux-x64.bin”命令,為其配置可執(zhí)行權(quán)限。
執(zhí)行“./jdk-6u14-linux-x64.bin”命 令,安裝JDK組 件。 執(zhí) 行“mv jdk1.6_14/ /usr/local/jdk1.6”命 令,將JDK文件復(fù)制到指定的位置。執(zhí)行“vim /etc/profile” 命令,對其配置文件進行修改,在其中的“export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL”一 行 后面 添 加“export JAVA_HOME=/usr/local/jdk1.6”,“ export CLASSPATH=$CLASSPATH:$JAVA_HOME/l i b:$JAVA_HOME/jre/lib”,“export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/bin”,“export AMOEBA_HOME=/usr/local/amoeba/”,“export PATH=$PATH:$AMOEBA_HOME/bin”等內(nèi)容,配置和JDK和AMOEBA相關(guān)的路徑信息。
執(zhí)行“source /etc/profile”語句,使上述配置生效。執(zhí)行“java -version”命令,來驗證其版本。執(zhí)行“mkdir /usr/local/amoeba”,“tar zxvf /root/amoeba-mysql-binary-x.x.x.tar.gz -C /usr/local/amoeba”,“chmod-R 755 /usr/local/amoeba”,“/usr/local/amoeba/bin/amoeba”等語句,依次執(zhí)行創(chuàng)建對應(yīng)版本的AMOEBA運行路徑,解壓AMOEBA壓縮包,為其設(shè)置可讀可寫可執(zhí)行的權(quán)限,配置AMOEBA等操作。
注意,這里的AMOEBA解壓路徑需要和上述配置文件中的內(nèi)容一致。在MySQL主從服務(wù)器上的“mysql>”控制臺下分別執(zhí)行“grant all on *.* to aduser@'192.168.0.%'identified by 'hello'”命令,創(chuàng)建名稱為“aduser”,密碼為“hello”的賬戶,使其擁有對192.168.0網(wǎng)段的訪問權(quán)限。
在代理服務(wù)器上進入“/usr/local/amoeba/conf”目錄,執(zhí)行“vim amoeba.xml”命令。在編輯界面中找 到“
找到“
保存該文件后,執(zhí)行“vimdb Servers.xml”命令,在編輯界面中找到“
將之后的“
按照同樣的方法進行同樣的修改時,不同的是修改的內(nèi)容為“
將其后的“
執(zhí)行“amoeba start &”命令,啟動AMOEBA。執(zhí)行“netstat anpt | gerp jave”命令,在端口列表中顯示8066端口,說明AMOEBA配置沒有問題。
因為在AMOEBA配置文件中設(shè)置的用戶名為“amoeba”,密碼為“qwe123”,所以為了實現(xiàn)讀寫分離,在客戶端程序中需要使用該賬戶和密碼,來操作后臺MySQL數(shù)據(jù)庫。
例如,在客戶端安裝好MySQL,配置正確的IP后,執(zhí) 行“mysql –u amoeba h 192.168.0.10 –P 8066-p”,使用預(yù)設(shè)的“amoeba”連接代理服務(wù)器,并指定連接端口,其中“-p”表示要輸入密碼。輸入上述密碼,連接成功后出現(xiàn)“mysql>”提示符,執(zhí)行“use dbceshi”命令。
使用上述用于測試的數(shù)據(jù)庫,再使用“create table”,“insert into”,“select”等指令,在該數(shù)據(jù)庫創(chuàng)建表并插入數(shù)據(jù)和查看數(shù)據(jù)。當(dāng)進入MySQL主服務(wù)器或者從服務(wù)器中,執(zhí)行查看操作時,可看到上述表及數(shù)據(jù)已存在,說明主從復(fù)制和讀寫分離正常。