您好,登錄后才能下訂單哦!
mysql的主從復(fù)制和mysql的讀寫分離有著緊密的聯(lián)系,首先要部署主從復(fù)制,只有主從復(fù)制完成了,才能在此基礎(chǔ)上進(jìn)行數(shù)據(jù)的讀寫分離
1)在每個事務(wù)更新數(shù)據(jù)完成之前,Master在二進(jìn)制日志記錄這些變化。寫入二進(jìn)制日志完成后,Master通知存儲引擎提交事務(wù)
2)Slave將Master的Binary log復(fù)制到其中繼日志。首先,Slave開始一個工作線程---I/O線程,I/O線程在Master上打開一個普通的連接,然后開始Binlog dump process。Binlog dump process從Master的二進(jìn)制日志中讀取事件,如果已經(jīng)跟上Master,它會睡眠并等待Master產(chǎn)生新的事件。I/O線程將這些事件寫入中繼日志。
3)SQL slave thread(SQL從線程)處理該過程的最后一步。SQL線程從中繼日志讀取事件,并重放其中的事件而更新Slave的數(shù)據(jù),使其與Master中的數(shù)據(jù)一致。只要該線程與I/O線程保持一致,中繼日志通常會位于OS的緩存中,所以中繼日志的開銷很小
1)mysql數(shù)據(jù)庫服務(wù)器master-slave身份驗(yàn)證,設(shè)置主從同步之間的身份授權(quán)驗(yàn)證
2)amoeba--->mysql,設(shè)置amoeba代理服務(wù)訪問mysql服務(wù)的身份授權(quán)驗(yàn)證
3)client---->amoeba,設(shè)置前端客戶client訪問amoeba代理服務(wù)的身份授權(quán)驗(yàn)證
主機(jī) 操作系統(tǒng) IP地址 安裝軟件
Master CentOS7 192.168.30.55 mysql-5.5.24.tar.gz
Slave1 CentOS7 192.168.30.10 mysql-5.5.24.tar.gz
Slave2 CentOS7 192.168.30.50 mysql-5.5.24.tar.gz
Amoeba CentOS6.5 192.168.30.15 jdk-6u14-linux-x64.bin, amoeba-mysql-binary-2.2.0.tar.gz
Client CentOS6.5 192.168.30.99 使用yum安裝mysql進(jìn)行遠(yuǎn)程測試
mysql-5.5.24.tar.gz:https://pan.baidu.com/s/1T3fEFotFL9jevFIOfQpOTA
jdk-6u14-linux-x64.bin:https://pan.baidu.com/s/1Y9HAPrSg2nVKeQbA-BTYmQ
amoeba-mysql-binary-2.2.0.tar.gz:https://pan.baidu.com/s/1ymFNDm84u5k09sEBE4SMMw
建立時間同步環(huán)境,NTP時間同步協(xié)議圖解:
1)主服務(wù)器master設(shè)置
yum install ntp -y
vim /etc/ntp.conf
server 127.127.30.0 //本地是時鐘源//
fudge 127.127.30.0 stratum 8 //設(shè)置時間層級為8//service ntpd start
2)從節(jié)點(diǎn)slave上進(jìn)行時間同步
yum install ntp ntpdate -y
service ntpd start
/usr/sbin/ntpdate 192.168.30.55 //進(jìn)行時間同步//
systemctl stop firewalld.service
setenforce 0
(關(guān)于數(shù)據(jù)庫mysql-5.5.24的安裝步驟詳解可以參考之前寫過的文章”CentOS7LNMP架構(gòu)部署“,下面只提供操作步驟)
1)編譯安裝mysql
yum -y install ncurses-devel cmake gcc gcc-c++ ncurses bison libaio-devel //ncurses是字符終端下屏幕控制的基本庫//
tar xzvf mysql-5.5.24.tar.gz
cd 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
2)優(yōu)化調(diào)整
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
echo "PATH=$PATH:/usr/local/mysql/bin/" >> /etc/profile
. /etc/profile (注意:"."后面有空格)
3)初始化數(shù)據(jù)庫
useradd -s /sbin/nologin mysql
chown -R mysql.mysql /usr/local/mysql
/usr/local/mysql/scripts/mysql_install_db \
--user=mysql \
--ldata=/var/lib/mysql \
--basedir=/usr/local/mysql \
--datadir=/home/mysql
ln -s /var/lib/mysql/mysql.sock /home/mysql/mysql.sock
vi /etc/init.d/mysqld
basedir=/usr/local/mysql
datadir=/home/mysql
4)啟動mysql服務(wù),設(shè)置mysql用戶密碼
service mysqld start
mysqladmin -uroot -p password 'abc123'
在配置文件中修改或增加以下選項(xiàng)
vim /etc/my.cnf
server-id = 11 //修改id
log-bin=master-bin //增加主服務(wù)器日志文件//
log-slave-updates=true //增加從服務(wù)器更新二進(jìn)制日志//service mysqld restart
登錄mysql程序,給從服務(wù)器授權(quán)
grant replication slave on *.* to 'myslave'@'192.168.30.%' identified by 'abc123'; #進(jìn)行授權(quán)
flush privileges; //刷新授權(quán)設(shè)置
其中file列顯示日志名,position列顯示偏移量,這兩個值在后面配置從服務(wù)器的時候會用到。Slave應(yīng)從該點(diǎn)在master上進(jìn)行新的更新
在配置文件中修改或增加以下選項(xiàng)
vim /etc/my.cnf
[mysqld]
server-id = 22 #另一臺id不一樣
relay-log=relay-log-bin //從主服務(wù)器上同步日志文件記錄到本地//
relay-log-index=slave-relay-bin.index //定義relay-log的位置和名稱//
service mysqld restart
登錄mysql配置同步
按主服務(wù)器結(jié)果更改下面命令中的master_log_file和master_log_pos的參數(shù)
change master to master_host='192.168.30.55',master_user='myslave',master_password='abc123',master_log_file='mysql-bin.000011',master_log_pos=267;
start slave; //啟動同步
show slave status \G; //查看slave狀態(tài),確保以下兩個值為yes
.............
Slave_IO_Running: Yes #這兩個必須為yes
Slave_SQL_Running: Yes
1)在主,從服務(wù)器上登錄mysql,查看數(shù)據(jù)庫,
2)在 主服務(wù)器上新建數(shù)據(jù)庫school, 在主,從服務(wù)器上分別查看數(shù)據(jù)庫,都可以看到master新建的數(shù)據(jù)庫school,則主從復(fù)制成功
amoeba服務(wù)器配置
(1)在主機(jī)amoeba上安裝java環(huán)境
因?yàn)閍moeba是基于jdk1.5開發(fā)的,所以官方推薦使用jdk1.5或1.6版本,高版本不建議使用。
service iptables stop
setenforce 0
cp jdk-6u14-linux-x64.bin /usr/local/
./jdk-6u14-linux-x64.binyes
按entermv jdk1.6.0_14/ /usr/local/jdk1.6
(2)添加java環(huán)境變量
vi /etc/profile
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$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/binsource /etc/profile
(3)安裝并配置amoeba軟件
mkdir /usr/local/amoeba
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba
顯示amoeba start|stop說明安裝成功
(4)配置amoeba讀寫分離,兩個slave讀負(fù)載均衡
在master,slave1,slave2上登錄mysql添加權(quán)限開放給amoeba訪問
grant all on *.* to test@'192.168.30.%' identified by '123.com';
(5)回到amoeba服務(wù)器,編輯amoeba.xml配置文件,設(shè)置前端客戶client訪問amoeba代理服務(wù)的身份授權(quán)驗(yàn)證
cd /usr/local/amoeba修改后的內(nèi)容為帶加粗的部分,注意刪除注釋
vim conf/amoeba.xml---30行--
<property name="user">amoeba</property>
----32行---------
<property name="password">123456</property>---117-去掉注釋-
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">slaves</property>
編輯dbServers.xml 配置文件,設(shè)置amoeba代理服務(wù)訪問mysql服務(wù)的身份授權(quán)驗(yàn)證
vim conf/dbServers.xml
--26-29--去掉注釋--
<property name="user">test</property>
<property name="password">123.com</property>-----42-主服務(wù)器地址---
<dbServer name="master" parent="abstractServer">
<property name="ipAddress">192.168.30.55</property>
--52-從服務(wù)器主機(jī)名-
<dbServer name="slave1" parent="abstractServer">
--55-從服務(wù)器地址-
<property name="ipAddress">192.168.30.10</property><dbServer name="slaves" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">--末尾--
<property name="poolNames">slave1,slave2</property>
</poolConfig>配置無誤后,可以啟動amoeba軟件,其默認(rèn)端口為tcp 8066
/usr/local/amoeba/bin/amoeba start&
netstat -anpt | grep java
在Client主機(jī)上進(jìn)行測試
yum install -y mysql
mysql -u amoeba -p123456 -h 192.168.30.15 -P8066 //通過amoeba代理訪問mysql
在master上創(chuàng)建一個表info,同步到各從服務(wù)器上,然后關(guān)閉各從服務(wù)器的slave功能,再插入?yún)^(qū)別語句
在master上
mysql> use school;
mysql> create table info (id int,name char(10));
mysql> insert into info values (1,'master');
從服務(wù)器slave2
mysql> stop slave;
mysql> insert into info values (3,'slave2');
在client上第一次查詢結(jié)果
mysql> select * from info;
+------+--------+
| id | name |
+------+--------+
| 2 | slave1 |
+------+--------+
1 row in set (0.02 sec)第二次查詢結(jié)果
mysql> select * from info;
+------+--------+
| id | name |
+------+--------+
| 3 | slave2 |
+------+--------+
1 row in set (0.00 sec)第三次查詢結(jié)果
mysql> select * from info;
+------+--------+
| id | name |
+------+--------+
| 2 | slave1 |
+------+--------+
1 row in set (0.02 sec)
在client主機(jī)上插入一條語句
mysql> insert into info values (4,'client');
Query OK, 1 row affected (0.01 sec)
但在client,slave1,slave2上查詢不到,最終只有在master上才能查看到這條語句內(nèi)容,說明寫操作在master服務(wù)器上
由此驗(yàn)證,已經(jīng)實(shí)現(xiàn)了mysql讀寫分離,目前所有的寫操作全部在master主服務(wù)器上,用來避免數(shù)據(jù)的不同步;所有的讀操作都分?jǐn)偨o了slave從服務(wù)器,用來分擔(dān)數(shù)據(jù)庫的壓力。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。