溫馨提示×

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

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

MySQL 主從復(fù)制與讀寫(xiě)分離詳解

發(fā)布時(shí)間:2020-07-01 17:42:21 來(lái)源:網(wǎng)絡(luò) 閱讀:268 作者:筱振 欄目:系統(tǒng)運(yùn)維

在實(shí)際生產(chǎn)環(huán)境中,如果對(duì)數(shù)據(jù)庫(kù)的讀、寫(xiě)都在同一個(gè)數(shù)據(jù)庫(kù)服務(wù)器中操作,無(wú)論是在安全性、高可用性還是高并發(fā)等各個(gè)方面都是完全不能滿(mǎn)足實(shí)際需求的。那么在實(shí)際生產(chǎn)環(huán)境中是如何解決這個(gè)問(wèn)題?這就需要提到兩個(gè)對(duì)于mysql數(shù)據(jù)庫(kù)特別重要的技術(shù)——主從復(fù)制和讀寫(xiě)分離

實(shí)際環(huán)境中,一臺(tái)MySQL主服務(wù)器帶兩臺(tái)MySQL從服務(wù)器做數(shù)據(jù)復(fù)制,前端應(yīng)用在進(jìn)行數(shù)據(jù)庫(kù)寫(xiě)操作時(shí),對(duì)主服務(wù)器進(jìn)行操作;在進(jìn)行數(shù)據(jù)庫(kù)讀操作時(shí),對(duì)兩臺(tái)從服務(wù)器進(jìn)行操作,這樣大大減輕了主服務(wù)器的壓力。如圖所示:
MySQL 主從復(fù)制與讀寫(xiě)分離詳解

一、MySQL主從復(fù)制原理

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

1)MySQL支持的復(fù)制類(lèi)型

(1)基于語(yǔ)句的復(fù)制:在主服務(wù)器上執(zhí)行的SQL語(yǔ)句,在從服務(wù)器上執(zhí)行同樣的語(yǔ)句。MySQL默認(rèn)采用基于語(yǔ)句的復(fù)制,效率比較高。但是必須開(kāi)啟二進(jìn)制日志功能;
(2)基于行的復(fù)制:把改變的內(nèi)容復(fù)制過(guò)去,而不是把命令在從服務(wù)器上執(zhí)行一遍;
(3)混合類(lèi)型的復(fù)制:默認(rèn)采用基于語(yǔ)句的復(fù)制,一旦發(fā)現(xiàn)基于語(yǔ)句無(wú)法精確復(fù)制時(shí),就會(huì)采用基于行的復(fù)制;

2)復(fù)制的工作過(guò)程

MySQL復(fù)制的工作過(guò)程如圖所示:
MySQL 主從復(fù)制與讀寫(xiě)分離詳解

MySQL復(fù)制的工作過(guò)程詳細(xì)介紹:
1.在每個(gè)事物更新數(shù)據(jù)完成之前,Master在二進(jìn)制日志記錄這些變化。寫(xiě)入二進(jìn)制日志完成后,Master通知存儲(chǔ)引擎提交事務(wù);
2.Slave將Master的Binary log(二進(jìn)制日志)復(fù)制到其Relay log(中繼日志)。首先Slave開(kāi)始一個(gè)工作進(jìn)程——I/O線(xiàn)程,I/O線(xiàn)程在Master上打開(kāi)一個(gè)普通的連接,然后開(kāi)始Binlog dump process(二進(jìn)制日志轉(zhuǎn)儲(chǔ)過(guò)程)。Binlog dump process從Master的二進(jìn)制日志中讀取事件,如果已經(jīng)跟上Master,它就會(huì)睡眠并等待Master產(chǎn)生新的事件。I/O線(xiàn)程將這些時(shí)間寫(xiě)入中繼日志;
3.SQL slave thread(SQL從線(xiàn)程)處理該過(guò)程的最后一步。SQL線(xiàn)程從中繼日志中讀取事件,并重放其中的事件而更新Slave的數(shù)據(jù),使其與Master中的數(shù)據(jù)一致,只要該線(xiàn)程與I/O線(xiàn)程保持一致,中繼日志通常會(huì)位于OS的緩存中,所以中繼日志的開(kāi)銷(xiāo)很?。?/p>

復(fù)制過(guò)程有一個(gè)很重要的限制,即復(fù)制在Slave上是串行化的,也就是說(shuō)Master上的并行更新操作不能在Slave上并行操作。

二、MySQL讀寫(xiě)分離原理

簡(jiǎn)單來(lái)說(shuō),讀寫(xiě)分離就是只在主服務(wù)器上寫(xiě)、只在從服務(wù)器上讀?;镜脑硎亲屩鲾?shù)據(jù)庫(kù)處理事務(wù)性查詢(xún),而從數(shù)據(jù)庫(kù)處理select查詢(xún)。數(shù)據(jù)庫(kù)復(fù)制被用來(lái)把事務(wù)性查詢(xún)導(dǎo)致的變更同步到群集中的從數(shù)據(jù)庫(kù)。如圖所示:
MySQL 主從復(fù)制與讀寫(xiě)分離詳解
目前常見(jiàn)的MySQL讀寫(xiě)分離分為兩種:

1)基于程序代碼內(nèi)部實(shí)現(xiàn)

在代碼中根據(jù)select、insert進(jìn)行路由分類(lèi),這類(lèi)方法也是目前生產(chǎn)環(huán)境應(yīng)用最廣泛的。優(yōu)點(diǎn)是性能較好,因?yàn)樵诔绦虼a中實(shí)現(xiàn),不需要增加額外的設(shè)備作為硬件開(kāi)發(fā),缺點(diǎn)是需要開(kāi)發(fā)人員來(lái)實(shí)現(xiàn),運(yùn)維人員無(wú)從下手;

2)基于中間代理層實(shí)現(xiàn)

代理一般位于客戶(hù)端和服務(wù)器之間,代理服務(wù)器接到客戶(hù)端的請(qǐng)求后通過(guò)判斷后轉(zhuǎn)發(fā)到后端數(shù)據(jù)庫(kù),有兩個(gè)代表性程序:
(1)MySQL—Proxy:為MySQL開(kāi)源項(xiàng)目,通過(guò)其自帶的lua腳本進(jìn)行SQL判斷,雖然是MySQL官方產(chǎn)品。但是MySQL官方并不建議將MySQL—Proxy用到生產(chǎn)環(huán)境中;
(2)Amoeba(變形蟲(chóng)):由陳思儒開(kāi)發(fā),其層就職于阿里巴巴。該程序用Java語(yǔ)言進(jìn)行開(kāi)發(fā),阿里巴巴將其用于生產(chǎn)環(huán)境。它不支持事務(wù)和存儲(chǔ)過(guò)程;

經(jīng)過(guò)上述簡(jiǎn)單的比較,通過(guò)程序代碼實(shí)現(xiàn)MySQL讀寫(xiě)分離自然是一個(gè)不錯(cuò)的選擇,但是并不是所有的應(yīng)用都適合在程序代碼中實(shí)現(xiàn)讀寫(xiě)分離。例如:一些大型復(fù)雜Java應(yīng)用,如果在程序代碼中實(shí)現(xiàn)分離對(duì)代碼改動(dòng)較大。所以,像這種代行復(fù)雜的應(yīng)用一般會(huì)考慮使用代理層來(lái)實(shí)現(xiàn)。

三、搭建MySQL主從復(fù)制

實(shí)驗(yàn)拓補(bǔ)如下:
MySQL 主從復(fù)制與讀寫(xiě)分離詳解

大致步驟分為:
(1)MySQL主服務(wù)器建立時(shí)間同步;
(2)MySQL從服務(wù)器進(jìn)行時(shí)間同步;
(3)關(guān)閉防火墻;
(4)安裝MySQL數(shù)據(jù)庫(kù);
(5)配置MySQL主服務(wù)器;
(6)配置MySQL從服務(wù)器;
(7)驗(yàn)證主從復(fù)制效果;

(1)MySQL主服務(wù)器建立時(shí)間同步

[root@localhost ~]# yum -y install ntp             
//安裝NTP
[root@localhost ~]# vim /etc/ntp.conf              
//編寫(xiě)ntp服務(wù)的配置文件
                     ……………………                     //省略部分內(nèi)容,填寫(xiě)以下內(nèi)容
server 127.127.1.0                                        
//需要同步上層服務(wù)器(本身)
fudge 127.127.1.0 stratum 8                         
//同步上層服務(wù)器的層數(shù)(大小不能超過(guò)或等于16)
[root@localhost ~]# systemctl restart ntpd   
//重啟ntp服務(wù)

(2)MySQL從服務(wù)器進(jìn)行時(shí)間同步

兩臺(tái)從服務(wù)器上都要進(jìn)行時(shí)間同步!

[root@localhost ~]# yum -y install ntpdate
[root@localhost ~]# ntpdate 192.168.1.1
//安裝ntpdate工具,并指定ntp服務(wù)器實(shí)現(xiàn)同步

(3)關(guān)閉防火墻(或開(kāi)啟相應(yīng)端口)

由于實(shí)驗(yàn)環(huán)境,這里就采用強(qiáng)制關(guān)閉防火墻了。每臺(tái)服務(wù)器上都關(guān)閉防火墻!

[root@localhost ~]# systemctl stop firewalld
//關(guān)閉防火墻

(4)安裝MySQL數(shù)據(jù)庫(kù)

安裝MySQL數(shù)據(jù)庫(kù)可以參考博文:編譯安裝MySQL數(shù)據(jù)庫(kù)系統(tǒng)

安裝完成之后,啟動(dòng)MySQL數(shù)據(jù)庫(kù)

[root@localhost ~]# systemctl start mysqld
//啟動(dòng)MySQL數(shù)據(jù)庫(kù)
[root@localhost ~]# netstat -anpt | grep mysqld
tcp6       0      0 :::3306                 :::*                    LISTEN      3263/mysqld       
//mysql數(shù)據(jù)庫(kù)的監(jiān)聽(tīng)端口是TCP/3306,確認(rèn)一下!  
[root@localhost ~]# mysqladmin -u root password '123456'
//給MySQL數(shù)據(jù)庫(kù)管理員“root”設(shè)置密碼

主、從服務(wù)器都需要安裝MySQL數(shù)據(jù)庫(kù)、并啟動(dòng)、設(shè)置密碼 !??!

(5)配置MySQL主服務(wù)器

[root@localhost ~]# vim /etc/my.cnf
//編寫(xiě)MySQL數(shù)據(jù)庫(kù)的配置文件
                        ……………………                     //省略部分內(nèi)容,填寫(xiě)以下內(nèi)容
server_id = 11
//服務(wù)器ID號(hào),自定義但不可以與別的MySQL服務(wù)器沖突
log_bin = master-bin
//定義bin-log的文件名(默認(rèn)保存在數(shù)據(jù)目錄下)
log-slave-updates = true
//開(kāi)啟從服務(wù)器自動(dòng)備份
[root@localhost ~]# systemctl restart mysqld
//重啟MySQL數(shù)據(jù)庫(kù)
[root@localhost ~]# mysql -u root -p
Enter password: 
//登錄MySQL數(shù)據(jù)庫(kù)
mysql> grant replication slave on *.* to 'myslave'@'192.168.1.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
//授權(quán)用戶(hù)myslave,密碼是123456,在192.168.1.0網(wǎng)段的所有MySQL服務(wù)器上對(duì)所有數(shù)據(jù)庫(kù)、表具有復(fù)制的權(quán)限
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
//刷新權(quán)限
mysql> show master status;
//查看主服務(wù)器的狀態(tài)
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      410 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
//File列顯示日志名,Position列顯示偏移量

(6)配置MySQL從服務(wù)器

兩臺(tái)從服務(wù)器的配置幾乎一樣!

[root@localhost ~]# vim /etc/my.cnf
//編寫(xiě)MySQL數(shù)據(jù)庫(kù)的配置文件
                            ……………………                     //省略部分內(nèi)容,填寫(xiě)以下內(nèi)容
server_id = 22
//服務(wù)器ID號(hào),自定義但不可以與別的MySQL服務(wù)器沖突
relay-log = relay-log-bin
//定義中繼日志文件名稱(chēng)和路徑(默認(rèn)保存在數(shù)據(jù)目錄下)
relay-log-index = slave-relay-bin.index
//定義中繼日志索引文件名(記錄很多的中繼日志文件)
//默認(rèn)情況,中繼日志使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是從服務(wù)器主機(jī)名,nnnnnn是序 列號(hào)。
//用連續(xù)序列號(hào)來(lái)創(chuàng)建連續(xù)中繼日志文件,從000001開(kāi)始。從服務(wù)器跟蹤索引文件中目前正使用的中繼日志。 默認(rèn)中繼日志索引文件名為host_name-relay-bin.index。
//默認(rèn)情況,在從服務(wù)器的數(shù)據(jù)目錄中創(chuàng)建這些文件。
[root@localhost ~]# systemctl restart mysqld
//重啟MySQL數(shù)據(jù)庫(kù)
[root@localhost ~]# mysql -u root -p
Enter password: 
//登錄MySQL數(shù)據(jù)庫(kù)
 mysql> change master to master_host='192.168.1.1',master_user='myslave',
-> master_password='123456',master_log_file='master-bin.000001',master_log_pos=410;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
//指定主服務(wù)的IP地址、登錄主服務(wù)器的用戶(hù)名、密碼、指定同步的日志、偏移量
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
//啟動(dòng)同步
mysql> show slave status\G;
//查看Slave狀態(tài),確保以下兩項(xiàng)為“Yes”
                            ……………………                     //省略部分內(nèi)容,填寫(xiě)以下內(nèi)容
             Slave_IO_Running: Yes                                          //I/O線(xiàn)程啟動(dòng)
            Slave_SQL_Running: Yes                                       //SQL線(xiàn)程啟動(dòng)     
                            ……………………                     //省略部分內(nèi)容,填寫(xiě)以下內(nèi)容

兩臺(tái)從服務(wù)器配置完畢后!即可進(jìn)行測(cè)試!

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

①在主、從服務(wù)器上登錄MySQL數(shù)據(jù)庫(kù),查看數(shù)據(jù)庫(kù);

[root@localhost ~]# mysql -u root -p
Enter password: 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.10 sec)

②在主服務(wù)器上創(chuàng)建新的數(shù)據(jù)庫(kù);

mysql> create database qq;
Query OK, 1 row affected (0.00 sec)

③在主、從服務(wù)器上分別查看數(shù)據(jù)庫(kù)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| qq                 |
| test               |
+--------------------+
5 rows in set (0.00 sec)

顯示數(shù)據(jù)庫(kù)相同,則表示主從復(fù)制成功!

四、搭建MySQL讀寫(xiě)分離

搭建MySQL讀寫(xiě)分離的基礎(chǔ)就是MySQL主從復(fù)制,以下所有操作都是基于mysql主從復(fù)制的基礎(chǔ)上。

搭建MySQL讀寫(xiě)分離使用的軟件是——Amoeba軟件。簡(jiǎn)單介紹一下:

Amoeba項(xiàng)目開(kāi)源框架于2008年發(fā)布一款A(yù)moeba for MySQL軟件。這個(gè)軟件致力于MySQL的分布式數(shù)據(jù)庫(kù)的前端代理曾,它主要為應(yīng)用層訪(fǎng)問(wèn)MySQL的時(shí)候充當(dāng)SQL路由功能,并且具有負(fù)載均衡、高可用性、SQL過(guò)濾、讀寫(xiě)分離、可路由相關(guān)到目標(biāo)數(shù)據(jù)庫(kù),可并發(fā)請(qǐng)求多臺(tái)數(shù)據(jù)庫(kù)。通過(guò)Amoeba能夠完成多數(shù)據(jù)源的高可用、負(fù)載均衡、數(shù)據(jù)切片的功能,目前Amoeba已在很多企業(yè)的生產(chǎn)線(xiàn)上使用,其版本可在官網(wǎng)上自行下載。

(1)在Amoeba服務(wù)器上安裝Java環(huán)境

注意:Amoeba軟件千萬(wàn)不要安裝在任意mysql服務(wù)器上!

因?yàn)锳moeba是基于jdk1.5開(kāi)發(fā)的,所以官方推薦使用jdk1.5或1.6版本。高版本不建議使用!查看Centos 7系統(tǒng)默認(rèn)的Java環(huán)境:

[root@localhost ~]# java -version
openjdk version "1.8.0_102"
OpenJDK Runtime Environment (build 1.8.0_102-b14)
OpenJDK 64-Bit Server VM (build 25.102-b14, mixed mode)

所以,還需要重新部署一下java環(huán)境,使用的軟件包網(wǎng)盤(pán)鏈接:https://pan.baidu.com/s/1sHwbvlIZ2VDLb_qw-b_z4w
提取碼:rs1x
操作如下:

[root@localhost ~]# cp jdk-6u14-linux-x64.bin /usr/local
[root@localhost ~]# chmod +x /usr/local/jdk-6u14-linux-x64.bin 
[root@localhost ~]# cd /usr/local
[root@localhost local]# ./jdk-6u14-linux-x64.bin                  //根據(jù)提示輸入yes和回車(chē)鍵
[root@localhost local]# mv jdk1.6.0_14/ jdk1.6                   //對(duì)jdk的安裝目錄進(jìn)行重命名
[root@localhost ~]# vim /etc/profile                                     //編寫(xiě)全局環(huán)境變量配置文件
                                ……………………                               //省略部分內(nèi)容,填寫(xiě)以下內(nèi)容
export  JAVA_HOME=/usr/local/jdk1.6
export 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
[root@localhost ~]# source /etc/profile
[root@localhost ~]# java -version
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)
//目前系統(tǒng)的Java環(huán)境是1.6版本的,可以使用!

(2)安裝并配置Amoeba軟件

Amoeba軟件的網(wǎng)盤(pán)鏈接:https://pan.baidu.com/s/1m-gBbCW4SxTt4b5NvQngQQ
提取碼:w93m
操作如下:

[root@localhost ~]# mkdir /usr/local/amoeba
[root@localhost ~]# tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
[root@localhost ~]# chmod -R 755 /usr/local/amoeba/
[root@localhost ~]# /usr/local/amoeba/bin/amoeba
amoeba start|stop
//出現(xiàn)這些內(nèi)容,則表示安裝amoeba安裝成功

(3)配置Amoeba讀寫(xiě)分離,兩個(gè)Slave實(shí)現(xiàn)讀負(fù)載均衡

①M(fèi)aster、Slave1、Slave2中都要開(kāi)放權(quán)限給Amoeba訪(fǎng)問(wèn),命令如下:

mysql> grant all on *.* to 'test'@'192.168.1.%' identified by '123.com';
Query OK, 0 rows affected (0.00 sec)

②編輯amoeba.xml配置文件。此配置文件主要定義主從服務(wù)器地址池。

[root@localhost ~]# vim /usr/local/amoeba/conf/amoeba.xml
                     ……………………                 //由于內(nèi)容較多,編輯的每條內(nèi)容都添加了實(shí)際的行號(hào)
30                                         <property name="user">amoeba</property>
31                                         
32                                         <property name="password">123456</property>
//指定客戶(hù)機(jī)訪(fǎng)問(wèn)amoeba服務(wù)器時(shí)的賬號(hào)、密碼!
115                 <property name="defaultPool">master</property>
116 
117                 <property name="writePool">master</property>
118                 <property name="readPool">slaves</property>
//注意取消原本的注釋信息                 

③編輯dbServer.xml配置文件

[root@localhost ~]# vim /usr/local/amoeba/conf/dbServers.xml 
                         ……………………                 //由于內(nèi)容較多,編輯的每條內(nèi)容都添加了實(shí)際的行號(hào)
 26                         <property name="user">test</property>
 27 
 28                         <property name="password">123.com</property>
   //指定amoeba服務(wù)器訪(fǎng)問(wèn)mysql數(shù)據(jù)庫(kù)使用的賬號(hào)密碼
 43         <dbServer name="master"  parent="abstractServer">
 44                 <factoryConfig>
 45                         <!-- mysql ip -->
 46                         <property name="ipAddress">i192.168.1.1</property>
 47                 </factoryConfig>
 48         </dbServer>
 49         
 50         <dbServer name="slave1"  parent="abstractServer">
 51                 <factoryConfig>
 52                         <!-- mysql ip -->
 53                         <property name="ipAddress">192.168.1.2</property>
 54                 </factoryConfig>
 55         </dbServer>
 56         <dbServer name="slave2"  parent="abstractServer">
 57                 <factoryConfig>
 58                         <!-- mysql ip -->
 59                         <property name="ipAddress">192.168.1.3</property>
 60                 </factoryConfig>
 61         </dbServer>
 //slave2配置需要復(fù)制salve1的配置信息(行號(hào)可能與實(shí)際不符)                        
 62 
 63         <dbServer name="slaves" virtual="true">
 64                 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
 65                         <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
 66                         <property name="loadbalance">1</property>
 67 
 68                         <!-- Separated by commas,such as: server1,server2,server1 -->
 69                         <property name="poolNames">slave1,slave2</property>
 70                 </poolConfig>
 71         </dbServer>

④確認(rèn)無(wú)誤后,啟動(dòng)Amoeba軟件,其默認(rèn)端口為T(mén)CP 8066

[root@localhost ~]# /usr/local/amoeba/bin/amoeba start &
[root@localhost ~]# netstat -anpt | grep 8066
tcp6       0      0 :::8066                 :::*                    LISTEN      3799/java         

(5)測(cè)試

由于實(shí)驗(yàn)環(huán)境,我們測(cè)試一下讀寫(xiě)分離的效果,實(shí)際環(huán)境,輕易不要測(cè)試?。?!

①在客戶(hù)端安裝mysql工具,并通過(guò)代理訪(fǎng)問(wèn)mysql,命令如下:

[root@localhost ~]# yum -y install mariadb
//注意,Centos 7系統(tǒng)開(kāi)始,自帶的數(shù)據(jù)庫(kù)叫mariadb,不再是mysql
[root@localhost ~]# mysql -u amoeba -h 192.168.1.4 -P 8066 -p
Enter password: 
  MySQL [(none)]> 
//表示訪(fǎng)問(wèn)成功

②在MySQL主服務(wù)器上創(chuàng)建一個(gè)表同步到從服務(wù)器上

mysql> use qq;
Database changed
mysql> create table q1 (id int);
Query OK, 0 rows affected (0.10 sec)

分別在兩臺(tái)從服務(wù)器上停止同步,執(zhí)行如下命令:

mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

在主服務(wù)器上插入數(shù)據(jù):

mysql> insert into q1 values ('1');
Query OK, 1 row affected (0.00 sec)

③兩臺(tái)從服務(wù)器上同步了表,手動(dòng)分別插入一條數(shù)據(jù)
第一臺(tái)從服務(wù)器

mysql> use qq;
Database changed
mysql>  insert into q1 values ('2');
Query OK, 1 row affected (0.00 sec)

第二臺(tái)從服務(wù)器

mysql> use qq;
Database changed
mysql>  insert into q1 values ('3');
Query OK, 1 row affected (0.00 sec)

④測(cè)試讀操作
在客戶(hù)機(jī)上第一次查詢(xún)結(jié)果:

MySQL [(none)]> select * from qq.q1;
+------+
| id   |
+------+
|    3 |
+------+
1 row in set (0.00 sec)

在客戶(hù)機(jī)上第二次查詢(xún)結(jié)果:

MySQL [(none)]> select * from qq.q1;
+------+
| id   |
+------+
|    2 |
+------+
1 row in set (0.00 sec)

永遠(yuǎn)是這兩種結(jié)果!?。?br/>這樣實(shí)現(xiàn)了讀數(shù)據(jù)的負(fù)載均衡,而且效果很明顯!

⑤測(cè)試寫(xiě)操作
在客戶(hù)端上插入一條數(shù)據(jù),但是在客戶(hù)端查詢(xún)不到!

MySQL [qq]> insert into q1 values ('4');
    Query OK, 1 row affected (0.00 sec)

但在主服務(wù)器上可以查詢(xún)到!

mysql> select * from q1;
+------+
| id   |
+------+
|    1 |
|    4 |
+------+
2 rows in set (0.00 sec)

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

———————— 本文至此結(jié)束,感謝閱讀 ————————

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

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI