溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

CentOS7上部署Mysql主從復(fù)制與讀寫分離

發(fā)布時間:2020-06-10 10:46:36 來源:網(wǎng)絡(luò) 閱讀:7431 作者:明月幽谷 欄目:MySQL數(shù)據(jù)庫

在實(shí)際生產(chǎn)環(huán)境中,如果對數(shù)據(jù)庫的讀和寫都在同一個數(shù)據(jù)庫服務(wù)器中操作,無論是在安全性,高可用性,還是高并發(fā)等各方面都是完全不能滿足實(shí)際需求的,因此一般來說都是通過主從復(fù)制(Master-Slave)的方式來同步數(shù)據(jù),再通過讀寫分離來提升數(shù)據(jù)庫的并發(fā)負(fù)載能力這樣的方案來進(jìn)行部署與實(shí)施。

CentOS7上部署Mysql主從復(fù)制與讀寫分離

CentOS7上部署Mysql主從復(fù)制與讀寫分離

 

如下圖所示, 一臺 主mysql帶兩臺從mysql進(jìn)行了數(shù)據(jù)復(fù)制,前端應(yīng)用在進(jìn)行數(shù)據(jù)庫寫操作時,對主設(shè)備進(jìn)行操作,在進(jìn)行數(shù)據(jù)庫讀操作時,對兩臺從設(shè)備進(jìn)行操作,這樣大量減輕了對主設(shè)備的壓力。

CentOS7上部署Mysql主從復(fù)制與讀寫分離

mysql主從復(fù)制原理

mysql的主從復(fù)制和mysql的讀寫分離有著緊密的聯(lián)系,首先要部署主從復(fù)制,只有主從復(fù)制完成了,才能在此基礎(chǔ)上進(jìn)行數(shù)據(jù)的讀寫分離

CentOS7上部署Mysql主從復(fù)制與讀寫分離

mysql復(fù)制的工作過程詳解

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的緩存中,所以中繼日志的開銷很小

 

mysql讀寫分離原理

CentOS7上部署Mysql主從復(fù)制與讀寫分離

mysql讀寫分離的實(shí)現(xiàn)方式:

CentOS7上部署Mysql主從復(fù)制與讀寫分離

CentOS7上部署Mysql主從復(fù)制與讀寫分離

主從復(fù)制與讀寫分離實(shí)驗(yàn)拓?fù)洌@里有三個身份授權(quán)驗(yàn)證的地方需要搞清楚

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)證

CentOS7上部署Mysql主從復(fù)制與讀寫分離

案例環(huá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)程測試

百度云盤免費(fèi)提供安裝包:

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

搭建mysql主從復(fù)制

建立時間同步環(huán)境,NTP時間同步協(xié)議圖解:

CentOS7上部署Mysql主從復(fù)制與讀寫分離

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)行時間同步//

所有的主機(jī)都關(guān)閉防火墻,關(guān)閉增強(qiáng)型功能

systemctl stop firewalld.service
setenforce 0

手工編譯安裝mysql數(shù)據(jù)庫。在Master,Slave1,Slave2上安裝。步驟如下:

(關(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'

mysql主服務(wù)器配置

在配置文件中修改或增加以下選項(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)行新的更新

CentOS7上部署Mysql主從復(fù)制與讀寫分離

mysql從服務(wù)器配置

在配置文件中修改或增加以下選項(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

CentOS7上部署Mysql主從復(fù)制與讀寫分離

驗(yàn)證主從復(fù)制效果

1)在主,從服務(wù)器上登錄mysql,查看數(shù)據(jù)庫,

CentOS7上部署Mysql主從復(fù)制與讀寫分離CentOS7上部署Mysql主從復(fù)制與讀寫分離

CentOS7上部署Mysql主從復(fù)制與讀寫分離

 

2)在 主服務(wù)器上新建數(shù)據(jù)庫school, 在主,從服務(wù)器上分別查看數(shù)據(jù)庫,都可以看到master新建的數(shù)據(jù)庫school,則主從復(fù)制成功

CentOS7上部署Mysql主從復(fù)制與讀寫分離CentOS7上部署Mysql主從復(fù)制與讀寫分離

CentOS7上部署Mysql主從復(fù)制與讀寫分離

搭建mysql讀寫分離

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.bin

yes
按enter

mv 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/bin

source /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

CentOS7上部署Mysql主從復(fù)制與讀寫分離

測試實(shí)驗(yàn)結(jié)果

在Client主機(jī)上進(jìn)行測試

yum install -y mysql


 

mysql -u amoeba -p123456 -h 192.168.30.15 -P8066        //通過amoeba代理訪問mysql

CentOS7上部署Mysql主從復(fù)制與讀寫分離  

在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');

CentOS7上部署Mysql主從復(fù)制與讀寫分離 

從服務(wù)器slave2

mysql> stop slave;

mysql> insert into info values (3,'slave2');

 CentOS7上部署Mysql主從復(fù)制與讀寫分離

從服務(wù)器slave1

mysql> stop slave;

mysql> insert into info values (2,'slave1');

CentOS7上部署Mysql主從復(fù)制與讀寫分離

  測試讀操作

在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)

CentOS7上部署Mysql主從復(fù)制與讀寫分離

但在client,slave1,slave2上查詢不到,最終只有在master上才能查看到這條語句內(nèi)容,說明寫操作在master服務(wù)器上

CentOS7上部署Mysql主從復(fù)制與讀寫分離

CentOS7上部署Mysql主從復(fù)制與讀寫分離

CentOS7上部署Mysql主從復(fù)制與讀寫分離

由此驗(yàn)證,已經(jīng)實(shí)現(xiàn)了mysql讀寫分離,目前所有的寫操作全部在master主服務(wù)器上,用來避免數(shù)據(jù)的不同步;所有的讀操作都分?jǐn)偨o了slave從服務(wù)器,用來分擔(dān)數(shù)據(jù)庫的壓力。

向AI問一下細(xì)節(jié)

免責(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)容。

AI