實(shí)驗(yàn)?zāi)康模?/strong>
在實(shí)際生產(chǎn)環(huán)境中,如果對(duì)數(shù)據(jù)庫(kù)的讀和寫都在同一個(gè)數(shù)據(jù)庫(kù)服務(wù)器中操作,無論在安全性、高可用性,還是高并發(fā)等各個(gè)方面都是完全不能滿足實(shí)際需求的,因此,一般需要通過主從復(fù)制(master-slave)的方式來同步數(shù)據(jù),再通過讀寫分離提升數(shù)據(jù)庫(kù)的并發(fā)負(fù)載能力。
主從復(fù)制
(一)原理
復(fù)制過程中一個(gè)服務(wù)器充當(dāng)主服務(wù)器,而一個(gè)或多個(gè)其它服務(wù)器充當(dāng)從服務(wù)器。主服務(wù)器將更新寫入二進(jìn)制日志文件,并維護(hù)文件的一個(gè)索引以跟蹤日志循環(huán)。從服務(wù)器連接主服務(wù)器時(shí),它通知主服務(wù)器從服務(wù)器在日志中讀取的最后一次成功更新的位置。從服務(wù)器接收從那時(shí)起發(fā)生的任何更新,然后封鎖并等待主服務(wù)器通知新的更新。
(二)MySQL支持的復(fù)制類型
創(chuàng)新互聯(lián)公司成立于2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元烏拉特前做網(wǎng)站,已為上家服務(wù),為烏拉特前各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792
(1)基于語(yǔ)句的復(fù)制: 在主服務(wù)器上執(zhí)行的SQL語(yǔ)句,在從服務(wù)器上執(zhí)行同樣的語(yǔ)句。MySQL默認(rèn)采用基于語(yǔ)句的復(fù)制,效率比較高。一旦發(fā)現(xiàn)沒法精確復(fù)制時(shí), 會(huì)自動(dòng)選著基于行的復(fù)制。
(2)基于行的復(fù)制:把改變的內(nèi)容復(fù)制過去,而不是把命令在從服務(wù)器上執(zhí)行一遍. 從mysql5.0開始支持
(3)混合類型的復(fù)制: 默認(rèn)采用基于語(yǔ)句的復(fù)制,一旦發(fā)現(xiàn)基于語(yǔ)句的無法精確的復(fù)制時(shí),就會(huì)采用基于行的復(fù)制。
(三)復(fù)制工作過程
(1) master將改變記錄到二進(jìn)制日志(binary log)中(這些記錄叫做二進(jìn)制日志事件,binary log events);
(2) slave將master的binary log events拷貝到它的中繼日志(relay log);
(3) slave重做中繼日志中的事件,將更改應(yīng)用到自己的數(shù)據(jù)上。
此外,在master中也有一個(gè)工作線程:和其它MySQL的連接一樣,slave在master中打開一個(gè)連接也會(huì)使得master開始一個(gè)線程。復(fù)制過程有一個(gè)很重要的限制——復(fù)制在slave上是串行化的,也就是說master上的并行更新操作不能在slave上并行操作。
讀寫分離
(一)原理
簡(jiǎn)單來說,讀寫分離就是只在主服務(wù)器上寫,只在從服務(wù)器上讀?;驹硎亲屩鲾?shù)據(jù)庫(kù)處理事務(wù)性查詢,而從數(shù)據(jù)庫(kù)處理select查詢。數(shù)據(jù)庫(kù)復(fù)制被用來把事務(wù)性查詢導(dǎo)致的變更同步到群集中的從數(shù)據(jù)庫(kù)中。
(二)讀寫分離工作過程
基于中間代理層實(shí)現(xiàn):Mysql-Proxy Amoeba'
本實(shí)驗(yàn)中用amoeba實(shí)現(xiàn)
實(shí)驗(yàn)拓?fù)洌?/strong>
實(shí)驗(yàn)環(huán)境:
主機(jī) | 操作系統(tǒng) | IP地址 | 主要軟件 |
---|---|---|---|
master | CentOS-7-x86_64 | 192.168.37.128 | mysql-5.5.24 |
slave1 | CentOS-7-x86_64 | 192.168.37.131 | mysql-5.5.24 |
slave2 | CentOS-7-x86_64 | 192.168.37.132 | mysql-5.5.24 |
amoeba | CentOS-7-x86_64 | 192.168.37.130 | jdk-6u14-linux-x64.bin ;amoeba-mysql-binary-2.2.0. |
client | CentOS-7-x86_64 | 192.168.37.130 | --- |
實(shí)驗(yàn)安裝包:
鏈接:https://pan.baidu.com/s/1bHbR0fPzmVrZf5rGB3UNCA 密碼:8tho
實(shí)驗(yàn)過程:
一、時(shí)間同步
主服務(wù)器:
1、安裝ntp,編輯配置文件
yum install ntp -y #如果已安裝忽略此步驟
vim /etc/ntp.conf #末尾添加
server 127.127.37.0 #本地是時(shí)鐘源
fudge 127.127.37.0 stratum 8 #設(shè)置時(shí)間層級(jí)為8/時(shí)鐘可以擴(kuò)散8層
2、開啟服務(wù)
systemctl start ntpd.service #開啟服務(wù)
systemctl stop firewalld.service
setenforce 0
從服務(wù)器:
3、安裝ntp、ntpdate,開啟服務(wù)
yum install ntp ntpdate -y #如果已安裝忽略此步驟
systemctl start ntpd.service
systemctl stop firewalld.service
setenforce 0
4、開啟時(shí)間同步
/usr/sbin/ntpdate 192.168.37.128
二、主從復(fù)制
5、在三臺(tái)服務(wù)器上手工編譯安裝mysql5.5(操作過程概述如下)
//安裝環(huán)境
yum install gcc gcc-c++ make cmake ncurses-devel bison libaio-devel
//解壓安裝包
mkdir /opt/abc
mount.cifs //192.168.37.1/SHARE /opt/abc
tar zxvf /opt/abc/mysql-5.5.24.tar.gz -C /opt/
//編譯安裝
cd /opt/mysql-5.5.24
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DSYSCONFDIR=/etc \
-DMYSQL_DATADIR=/home/mysql/ \
-DMYSQL_UNIX_ADDR=/home/mysql/mysql.sock \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_SSL=system \
-DMYSQL_TCP_PORT=3306 \
-DENABLE_DOWNLOADS=1 \
-DWITH_SSL=bundled
make && make install
//mysql配置文件復(fù)制
cp support-files/my-medium.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig --level 35 mysqld on
//環(huán)境變量設(shè)置
echo "PATH=$PATH:/usr/local/mysql/bin/" >> /etc/profile
. /etc/profile #(注意:"."后面有空格)//創(chuàng)建管理用戶mysql
useradd -s /sbin/nologin mysql
chown -R mysql.mysql /usr/local/mysql
//數(shù)據(jù)初始化
/usr/local/mysql/scripts/mysql_install_db \
--user=mysql \
--ldata=/var/lib/mysql \
--basedir=/usr/local/mysql \
--datadir=/home/mysql
//讓系統(tǒng)識(shí)別mysql
ln -s /var/lib/mysql/mysql.sock /home/mysql/mysql.sock
vi /etc/init.d/mysqld
basedir=/usr/local/mysql
datadir=/home/mysql
//開啟服務(wù)
service mysqld start
6、主服務(wù)器:
//編輯配置文件
vim /etc/my.cnf
service mysqld restart
mysql
//給從服務(wù)器授權(quán)
mysql>grant replication slave on . to 'myslave'@'192.168.37.%' identified by '123456'; #授權(quán)給myslave用戶
#replication 復(fù)制
mysql>flush privileges; #刷新權(quán)限
mysql>show master status; #查看主服務(wù)器日志文件
7、從服務(wù)器:
//編輯配置文件
vim /etc/my.cnf
service mysqld restart
注意:此處啟動(dòng)失敗,可重新加載環(huán)境變量,或者查看進(jìn)程是否被占用,重新啟動(dòng)即可
mysql
//從服務(wù)器同步主服務(wù)器
slave1:
注意:指定主服務(wù)器(操作前查看主服務(wù)器日志文件位置,會(huì)不斷變化)
change master to master_host='192.168.37.128',master_user='myslave',master_password='123456',master_log_file='master-bin.000005',master_log_pos=107;
start slave; #開啟主從復(fù)制
show slave status \G; #看到兩個(gè)yes
slave2:
change master to master_host='192.168.37.128',master_user='myslave',master_password='123456',master_log_file='master-bin.000005',master_log_pos=828;
start slave; #開啟主從復(fù)制
show slave status \G; #看到兩個(gè)yes
8、測(cè)試主從復(fù)制:主服務(wù)器上create database aaa,查看從服務(wù)器上是否存在數(shù)據(jù)庫(kù)aaa
三、Amoeba安裝(識(shí)別java語(yǔ)言)與配置
9、首先關(guān)閉防火墻
systemctl stop firewalld.service
setenforce 0
10、共享jdk安裝包,復(fù)制到/usr/local目錄下
mkdir /opt/abc
mount.cifs //192.168.37.1/SHARE /opt/abc
cd /opt/abc
cp jdk-6u14-linux-x64.bin /usr/local
11、執(zhí)行jdk文件
./jdk-6u14-linux-x64.bin
12、使系統(tǒng)識(shí)別jdk文件,其工作目錄全部放到/usr/local下
mv jdk1.6.0_14/ /usr/local/jdk1.6
13、環(huán)境變量修改,系統(tǒng)可以運(yùn)用安裝文件的命令
vim /etc/profile
source /etc/profile #刷新,使環(huán)境變量生效
14、安裝amoeba
mkdir /usr/local/amoeba #新建目錄
cd /opt/abc
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/ #解壓安裝包到新建目錄下
chmod -R 755 /usr/local/amoeba/ #保證755權(quán)限
15、開啟amoeba
/usr/local/amoeba/bin/amoeba
16、在三臺(tái)服務(wù)器上添加權(quán)限,開放給amoeba訪問
mysql>grant all on . to test@'192.168.37.%' identified by '123.com';
mysql>flush privileges;
17、配置代理服務(wù)器amoeba
vim /usr/local/amoeba/conf/amoeba.xml #配置文件
vim conf/dbServers.xml #數(shù)據(jù)庫(kù)配置文件
26行"test" 用test身份讀取mysql數(shù)據(jù)
29行123.com
42--主服務(wù)器地址192.168.37.128
50--從服務(wù)器192.168.37.131
64行--服務(wù)器池slave1,slave2
18、開啟amoeba,查看端口
/usr/local/amoeba/bin/amoeba start&
netstat -ntap | grep java
四、客戶機(jī)測(cè)試(此處客戶機(jī)與amoeba同用一臺(tái)虛擬機(jī))
19、簡(jiǎn)易安裝mysql
yum install mysql -y
20、登錄mysql,進(jìn)行如下操作
mysql -u amoeba -p123456 -h 192.168.37.130 -P8066
21、從服務(wù)器:(作測(cè)試使用,實(shí)際生產(chǎn)環(huán)境不會(huì)停掉)
stop slave;
主服務(wù)器:只負(fù)責(zé)寫入,amoeba讀不到
insert into info values(1,'zhangsan',99);
slave1:
insert into info values(2,'lisi',88);
slave2:
insert into info values(3,'wangwu',77);
在客戶機(jī)查看:
至此,實(shí)驗(yàn)已全部完成!