天天看點

MySQL的主從複制與讀寫分離

MySQL主從複制

MySQL的複制類型

1,基于語句的複制(STATEMENT,MySQL預設類型)

2,基于行的複制(POW)

3,混合類型的複制(MIXED)

MySQL主從複制的工作過程

當主資料庫的資料更新時,會将資料寫入自己的二進制檔案,而這時,從資料庫會生成一個I/O線程連接配接到主資料庫。I/O線程會讀取主資料庫二進制檔案中更新的資料到從資料庫中的中繼日志檔案中。從資料庫在得到資料後會生成一個SQL線程,SQL線程會将資料進行重放,已達到将主資料庫的資料複制到從資料庫中的目的。

MySQL主從複制延遲

1,master伺服器高并發,形成大量事務

2,網絡延遲

3,主從硬體裝置導緻(cpu,記憶體,磁盤等)

4,本來就不是同步複制,而是異步複制

解決主從複制延遲

1,從資料庫優化MySQL參數,如增大innodb_buffer_pool_size

2,從資料庫提高性能主機,如cpu,記憶體

3,從資料庫使用SSD磁盤,加大存儲速度

4,網絡優化,避免跨機房實作同步

主從複制執行個體

master:192.168.226.70 mysql5.7 ntp(時間同步裝置)

slave1:192.168.226.80 mysql5.7 ntp(時間同步裝置)

slave2:192.168.226.90 mysql5.7 ntp(時間同步裝置)

1,主伺服器配置

yum install -y ntp #安裝時間同步裝置
vim /etc/ntp.conf
--在底部添加--
server 127.127.226.0 #設定本地為時鐘源
fudge 127.127.226.0 stratum 8  #設定時間層級為8
           

2,從伺服器配置

yum install -y ntp ntpdaye 
service ntpd start
/usr/sbin/ntpdate 192.168.226.70  #進行時間同步
crontab -e  #開啟周期性任務
*/30 * * * * /usr/sbin/ntpdate 192.168.226.70 #每30分鐘同步一次
           

3,主伺服器mysql配置

vim /etc/my.cof
server-id = 11
log-bin=master-bin #添加,主伺服器開啟二進制日志
binlog_format = MIXED
log-slave-updates=true #添加,允許從伺服器更新二進制檔案

systemctl restart mysqld

mysql -uroot -p123456

grant replication slave on *.* to 'zzy'@'192.168.226.%' identified by '123456';
#給同網段所有主機授予所有庫所有表的全部權限。

flush privileges;
show maser status;
           
MySQL的主從複制與讀寫分離

4,從伺服器mysql配置

從伺服器1:

vim /etc/my.cnf
server-id = 22
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
systemctl restart mysqld
mysql -uroot -p123456

change master to master_host='192.168.226.70',master_user='zzy',master_password='123456',master_log_file='master-bin.000002',master_log_pos=1952;
start slave;
show slave status\G;
           
MySQL的主從複制與讀寫分離

從伺服器2:

server-id = 33
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
systemctl restart mysqld
mysql -uroot -p123456

change master to master_host='192.168.226.70',master_user='zzy',master_password='123456',master_log_file='master-bin.000002',master_log_pos=1952;
start slave;
show slave status\G;
           
MySQL的主從複制與讀寫分離

注:出現IO與SQL為yes即可。IO負責與主伺服器通信,SQL負責自己的slave mysql程序

驗證主從複制

主伺服器上建立資料庫

create database jmi;

在從資料庫上檢視即可

show databases;

MySQL讀寫分離

1,什麼是讀寫分離

讓主資料庫處理增,删,改操作,讓從資料庫處理select查詢操作

2,為什麼要讀寫分離

因為寫的操作十分耗時,而讀則很快速。這樣的話,寫入的操作會影響到查詢的效率

3,什麼時候要讀寫

當程式使用的資料庫較多,更新少,查詢多是會做讀寫分離。

4,MySQL讀寫分離原理

在主伺服器上進行寫的操作,在從伺服器上進行讀的操作,再利用資料複制将主伺服器上的寫入的資料更新到從伺服器上,這樣用戶端在讀取從伺服器時,也能讀取到寫在主伺服器上的資料。

常見的兩種讀寫分離

1,基于程式代碼内部實作

在代碼中根據select,insert進行路由分類,這是目前運用最廣泛的。

優點是性能好,在代碼中實作,是以不用增加額外的裝置開支。

2,基于中間代理層實作

代理一般位于用戶端與伺服器之間,代理伺服器接到用戶端的請求後,通過判斷是讀還是寫,轉發給後端的主或從伺服器。

(1)MySQL-Proxy。為mysql開源項目,通過其自帶的lua腳本進行SQL的判斷

(2)Atlas。由奇虎360開發的web平台部基礎架構團隊開發維護的一個基于mysql協定的資料中間層項目。

(3)Amoeba。由陳思儒開發,由Java語言開發。

使用amoeba部署讀寫分離

master :192.168.226.70

slave1:192.168.226.80

slave2:192.168.226.90

amoeba:192.168.226.40

client:192.168.226.50

systemctl stop firewalld

systemctl disable firewalld

setenforce 0

1,amoeda服務配置

安裝jdk環境

cd /opt/
cp jdk-6u14-linux-x64.bin /usr/local/
cd /usr/local/
chmod +x jdk-6u14-linux-x64
./jdk-6u14-linux-x64.bin
按回車即可,出現選擇輸入yes

mv jdk.6.0_14/ /usr/local/jdk1.6
vim /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
java -version
           

安裝amoeba

mkdir /usr/local/amoeba
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
chomd -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba
##顯示 amoeba start|stop 即安裝成功
在主和從資料庫開放權限給amoeba通路
grant all on *.* to 'test'@'192.168.226.%' identified by '123456';
           

在amoeba伺服器配置amoeba服務

cd /usr/local/amoeba/conf

vim amoeba.xml

MySQL的主從複制與讀寫分離
MySQL的主從複制與讀寫分離

vim dbServers.xml

MySQL的主從複制與讀寫分離
MySQL的主從複制與讀寫分離
MySQL的主從複制與讀寫分離
MySQL的主從複制與讀寫分離

/usr/local/amoeba/bin/amoeba start & #啟動amoeba軟體可以按ctrl+c傳回,但不會退出軟體

netstat -natp | grep java #出現8066端口即成功

MySQL的主從複制與讀寫分離
MySQL讀寫分離測試

在用戶端

yum install mariadb-server mariadb

systemctl start mariadb.server

mysql -u amoeba -p123456 -h 192.168.226.50 -P8066

MySQL的主從複制與讀寫分離

連接配接成功

測試

在主伺服器上建立一個資料庫和表

并寫入字段及字段類型

在兩台從伺服器上關閉同步功能

MySQL的主從複制與讀寫分離
MySQL的主從複制與讀寫分離

并在兩台從伺服器上分别向在主伺服器中建立的表中插入資料

MySQL的主從複制與讀寫分離
MySQL的主從複制與讀寫分離

接着在主伺服器上向建立的表中插入一條資料

MySQL的主從複制與讀寫分離

在用戶端伺服器上檢視表資訊

MySQL的主從複制與讀寫分離

檢視到的資訊會是兩台從伺服器上的資訊,因為是輪詢模式,是以會相繼顯示兩台從伺服器上的資訊。

因為,關閉了同步功能,而又部署了讀寫分離,所有,在主伺服器上寫入的資訊,不會顯示。在從伺服器上寫入的因為是可讀的是以會輪詢顯示。

(用戶端上的寫操作會給到主伺服器,查詢則會給到從伺服器,關閉了同步功能,主從複制也關閉,是以,資料不會得到更新)

在用戶端上寫入一條資料

MySQL的主從複制與讀寫分離

在主伺服器上查詢表資訊,隻能看到在用戶端寫入的資訊,看不到從伺服器上的。

MySQL的主從複制與讀寫分離

再開啟同步功能

進行查詢

MySQL的主從複制與讀寫分離

可以發現,已同步過來,但因為1和2兩條資料是分别在兩台從資料庫上插入的,是以不會出現在一起。

繼續閱讀