MySQL主從複製+讀寫分離原理及配置實例

博文大綱:
1、MySQL主從複製原理
2、MySQL讀寫分離原理
3、搭建MySQL主從複製及讀寫分離html

1、MySQL主從複製原理:java

MySQL的主從複製和MySQL的讀寫分離二者不分家,基於主從複製的架構纔可實現數據的讀寫分離。mysql

一、MySQL支持的複製類型:
(1)基於語句的複製。顧名思義就是在主服務器上執行的SQL語句,在從服務器上執行一樣的語句。MySQL默認採用這種方式的複製,效率比較高。
(2)基於行的複製。把改變的內容複製過去,而不是把命令再從主服務器上執行一遍。
(3)混合類型的複製。默認採用基於語句的複製,一旦發現基於語句沒法精確複製時,就會採用基於行的複製。linux

以上三種複製類型,不須要人爲干預,MySQL數據庫會自動控制。sql

二、複製的工做過程,以下圖所示:數據庫

MySQL主從複製+讀寫分離原理及配置實例

(1)在每一個事物更新數據完成以前,master在二進制日誌記錄這些改變。寫入二進制日誌完成後,master通知存儲引擎提交事務。vim

(2)slave將master的Binary log複製到其中繼日誌。首先slave開始一個工做線程——I/O線程,I/O線程在master上打開一個普通的鏈接,而後開始Binlog dump process(Binlog轉儲過程),Binlog dump process從master的二進制日誌中讀取事件,若是已經跟上master,它會睡眠並等待master產生新的事件。I/O線程將這些事件寫入中繼日誌。後端

(3)SQL slave thread(SQL從線程)處理該過程的最後一步。SQL線程從中繼日誌讀取事件,並重放其中的事件而更新slave的數據,使其與master中的數據一致。只要該線程與I/O現場曾保持一致,中繼日誌一般存在系統的緩存中,因此中繼日誌的開銷很小。centos

複製過程有一個很重要的限制,就是在slave上的複製是串行化的,master上時並行化的。說白了就是,有可能一些數據更新是多條SQL語句同時在master上進行的,但slave進行復制時,只能一條一條的執行SQL語句進行數據同步。緩存

2、MySQL讀寫分離原理:

簡單來講,就以下圖同樣,就是隻在主服務器上寫,只在從服務器上讀。基本的原理是讓主數據庫處理數據寫入、更新操做,而從數據庫處理select查詢操做。

MySQL主從複製+讀寫分離原理及配置實例

較爲常見的MySQL讀寫分離分爲兩種:

一、基於程序代碼內部實現:在代碼中根據select、insert語句進行路由分類,這類方法目前在生產環境中應用最普遍。優勢是性能較好,由於在程序代碼中實現,不須要增長額外的設備做爲硬件開支;缺點是須要開發人員來實現,咱們運維無從下手。

二、基於中間代理實現:代理位於客戶端和MySQL服務器之間,代理服務器接到客戶端的請求後經過判斷後轉發到後端數據庫。中間代理有兩個表明性程序:MySQL-Proxy和amoeba(變形蟲)。

兩者區別以下:

MySQL-Proxy是MySQL開源項目,經過自帶的lua腳本進行SQL判斷,雖然是MySQL官方產品,可是MySQL官方並不建議將其應用到生產環境。

amoeba使用Java語言進行開發,阿里巴巴將其用於生產環境,它不支持事務和存儲過程。

雖然經過程序代碼實現MySQL讀寫分離是一個很好的選擇,但並非全部的應用都適合在程序代碼中實現讀寫分離,一些大型複雜的Java應用,若是在程序代碼中實現讀寫分離對代碼的改動就比較大。因此,大型複雜的應用通常都會考慮使用代理層來實現。

3、搭建MySQL主從複製及讀寫分離

環境以下:

MySQL主從複製+讀寫分離原理及配置實例

一、部署前準備:

(1)我這裏全部服務器均使用centos 7。
(2)下載部署MySQL所需軟件包:下載連接,提取碼:2z5k
(3)準備系統映像,自行配置本地yum倉庫。下載搭建讀寫分離所需軟件:下載amoeba及JDK連接,提取碼:ulz3 。
(4)應用客戶端爲了測試效果,必須可使用mysql命令,因此也須要安裝mysql,爲了方便,安裝系統映像自帶的mysql便可。
(5)自行配置網絡環境,確保網絡互通,防火牆放行相關端口的流量,我這裏爲了方便,直接關閉了防火牆。

二、部署MySQL數據庫(在主/從節點共三臺服務器上都須要部署MySQL數據庫,將如下部署過程分別在三臺服務器上執行一遍)

(1)爲了不發生程序衝突、端口衝突等問題,能夠先執行如下命令,進行刪除系統自帶的mysql程序:

[root@localhost ~]# yum -y erase mysql

(2)掛載centos系統盤,安裝ncurses-devel包:

[root@localhost ~]# mount /dev/cdrom /media
[root@localhost ~]# cd /media/Packages/
[root@localhost Packages]# rpm -ivh ncurses-devel-5.9-14.20130511.el7_4.x86_64.rpm

(3)因爲mysql 5.x系列版本須要cmake編譯安裝,因此繼續安裝cmake包:

[root@localhost media]# tar zxf cmake-2.8.6.tar.gz -C /tmp                 #解包
[root@localhost media]# cd /tmp/cmake-2.8.6/
[root@localhost cmake-2.8.6]# ./configure && gmake && gmake install      #配置,編譯安裝

(4)建立專門用來運行mysql服務的用戶,此用戶不須要直接登陸到系統:

[root@localhost cmake-2.8.6]# groupadd mysql
[root@localhost cmake-2.8.6]# useradd -M -s /sbin/nologin mysql -g mysql

(5)將下載的mysql源碼包解壓,並進行配置,編譯及安裝(千萬要注意大小寫,不要打錯配置項,就算錯誤也能夠繼續後續的安裝,可是,最後服務是沒法啓動的,千萬不要打錯字母,千萬不要打錯字母,千萬不要打錯字母,重要的事情說三遍):

[root@localhost media]#tar zxf mysql-5.6.36.tar.gz -C /tmp              #解壓至/tmp目錄
[root@localhost cmake-2.8.6]# cd /tmp/mysql-5.6.36             #切換至展開後的源碼目錄
[root@localhost mysql-5.6.36]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql 
-DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8 
-DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all
[root@localhost mysql-5.6.36]# make && make install          #編譯並安裝

(6)對數據庫目錄進行權限設置:

[root@localhost mysql-5.6.36]# chown -R mysql:mysql /usr/local/mysql

(7)創建配置文件:

centos 7系統下默認支持MariaDB數據庫,所以系統默認的/etc/my.cnf配置文件中是MariaDB的配置文件,而在mysql的源碼目錄中提供了mysql數據庫默認的樣本配置文件,在啓動mysql數據庫以前,須要先將原有的my.cnf文件替換爲mysql提供的配置文件內容。

[root@localhost mysql-5.6.36]# rm -rf /etc/my.cnf              #刪除原有配置文件
[root@localhost mysql-5.6.36]# cp support-files/my-default.cnf /etc/my.cnf     
#複製源碼包中的配置文件到/etc/下

(8)初始化數據庫(若數據庫初始化時配置錯誤的話,將mysql安裝目錄中的data目錄刪掉後從新初始化便可):

[root@localhost mysql-5.6.36]# /usr/local/mysql/scripts/mysql_install_db --user=mysql 
--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

(9)設置環境變量(爲了方便在任何目錄下使用mysql命令):

[root@localhost mysql-5.6.36]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
[root@localhost mysql-5.6.36]# .  /etc/profile             #當即生效

(10)當對/usr/local/mysql/bin/mysqld.sh 賦予執行權限後,繼續如下操做:

[root@localhost mysql-5.6.36]# cp support-files/mysql.server /usr/local/mysql/bin/mysqld.sh   
#複製到安裝目錄中
[root@localhost mysql-5.6.36]# chmod +x /usr/local/mysql/bin/mysqld.sh         
#賦予執行權限
[root@localhost mysql-5.6.36]# cp /usr/local/mysql/bin/mysqld.sh /etc/init.d/mysqld
[root@localhost mysql-5.6.36]# vim /etc/init.d/mysqld

MySQL主從複製+讀寫分離原理及配置實例

修改後,保存退出。繼續執行以下命令:

[root@localhost mysql-5.6.36]# chkconfig --add mysqld            #添加爲系統服務

十一、啓動服務並查看mysql服務器狀態:

[root@localhost mysql-5.6.36]# systemctl start mysqld                #啓動服務
[root@localhost mysql-5.6.36]# systemctl status mysqld             #查看服務狀態是否正常

三、開始搭建MySQL主從複製:

(1)創建時間同步環境:

①在MySQL主服務器上搭建時間同步服務器(關於ntp時間同步,安裝系統時,通常都安裝了該服務,能夠在執行下面的yum操做以前,主服務器使用rpm -qa | grep ntp進行查詢,從服務器使用rpm -qa | grep ntpdate查詢,若已安裝,則可省略下面的yum安裝步驟)。

[root@master ~]# yum -y install ntp            #安裝ntp
#若服務器可鏈接Internet,直接yum安裝便可;
#若沒法鏈接,自行配置本地yum倉庫,系統盤有相關軟件包。
[root@master ~]# vim /etc/ntp.conf     #添加下面兩行配置,從而設置時區。
server 127.127.1.0            #添加到任意位置便可
fudge 127.127.1.0 stratum 8
#添加後,保存退出便可。
[root@master ~]# systemctl restart ntpd                   #重啓服務
[root@master ~]# systemctl enable ntpd                  #設置開機自啓動

②在slave1和slave2分別執行如下操做,從而配置時間同步。(因爲兩臺從節點有不少相同的配置,爲了方便,我會將兩臺從節點同樣的配置,只寫一遍,自行在兩臺服務器上分別配置便可)。

[root@slave1 ~]# yum -y install ntpdate           #安裝ntpdate。
[root@slave1 ~]# ntpdate 192.168.1.1

(2)配置MySQL master主服務器:

[root@master ~]# vim /etc/my.cnf       #編輯MySQL主配置文件,修改或增長下面配置
log_bin = master-bin           #修改
log-slave-updates = true     #增長
server_id = 11              #修改
[root@master ~]# systemctl restart mysqld
[root@master ~]# mysql -u root -p                 #登陸MySQL
Enter password:               #輸入密碼
mysql> grant replication slave on *.* to 'myslave'@'192.168.1.%' identified by '123456';
#受權一個帳戶,以便從服務器鏈接使用
mysql> flush privileges;
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      410 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

#其中file列顯示日誌名,Position列顯示偏移量,這兩個值在後面配置從服務器時使用。
#這兩個值還需根據本身查詢出來的實際來變,大家可能和我這裏查詢出的不同。

(3)分別配置slave1和slave2從服務器(兩臺slave服務器都執行一遍如下的操做):

[root@slave1 ~]# vim /etc/my.cnf                #更改或增長如下內容
server_id = 22 #修改,該id號不可和其餘主/從服務器重複,另外一從服務器我配置成「33」了
relay-log=relay-log-bin                #增長
relay-log-index=slave-relay-bin.index               #增長
#編輯好上面三號,保存退出便可。
[root@slave1 ~]# systemctl restart mysqld           #重啓MySQL
[root@slave1 ~]# mysql -u root -p            #登陸到數據庫
Enter password:          #輸入密碼
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.01 sec)
mysql> start slave;               #啓動同步
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status\G               #查看slave狀態,確保下面兩個值爲「yes」。
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.1
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 410
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 284
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes            #這個值要爲「yes」。
            Slave_SQL_Running: Yes           #這個值也要爲「yes」。
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
                           ...........................  #省略部份內容

至此,主從複製已經完成了,如今測試下主從複製的效果:

(1)登陸MySQL主服務器建立一個庫:

mysql> create database db_test;         #建立db_test庫
Query OK, 1 row affected (0.00 sec)

(2)在主、從服務器上分別查看數據庫,顯示的數據庫相同,則主從複製沒有問題。

mysql> show databases;                 #查看全部庫
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_test            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

四、開始搭建MySQL讀寫分離:

(1)接着上面配置好主從複製的環境,如今須要配置amoeba服務器(將下載的相關軟件上傳到amoeba服務器):

[root@localhost ~]# mount amoeba.iso /mnt              #掛載下載的.iso文件
mount: /dev/loop0 寫保護,將以只讀方式掛載
[root@localhost ~]# cd /mnt
[root@localhost mnt]# cp * /usr/src/                   #將文件內的全部安裝包複製到指定目錄
[root@localhost mnt]# cd /usr/src/
#接下來的操做是在配置java環境,因爲amoeba是基於jdk1.5開發的,
#因此官方推薦使用jdk1.5或1.6版本,高版本不建議使用
[root@localhost src]# chmod +x jdk-6u14-linux-x64.bin             #添加執行權限
[root@localhost src]# ./jdk-6u14-linux-x64.bin   #執行該文件,執行後,按空格進行翻頁
     ....................#省略部份內容,該內容像是Windows安裝軟件時的協議條款,無論它
Do you agree to the above license terms? [yes or no]
yes                     #輸入「yes」
Press Enter to continue.....           #按回車鍵

Done.                 #完成
[root@localhost src]# mv jdk1.6.0_14/ /usr/local/jdk1.6
[root@localhost src]# 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
#寫完保存退出便可。
[root@localhost src]# source /etc/profile       #更新環境變量
[root@localhost src]# java -version       #查詢Java版本,顯示以下說明Java安裝成功。
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)
[root@localhost src]# mkdir /usr/local/amoeba
[root@localhost src]# tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
#解包
[root@localhost src]# chmod -R 755 /usr/local/amoeba/      #調整amoeba目錄權限
[root@localhost src]# /usr/local/amoeba/bin/amoeba      #執行
amoeba start|stop                 #顯示此內容說明amoeba安裝成功

(2)如今配置amoeba讀寫分離,兩個slave讀負載均衡。

①master、slave一、slave2數據庫中分別執行如下語句,以便開放權限給amoeba訪問。

#三臺數據庫服務器都執行該語句。
mysql> grant all on *.* to test@'192.168.1.%' identified by '123.com';
Query OK, 0 rows affected (0.00 sec)

②編輯amoeba服務器的amoeba.xml配置文件(如下改動比較零散,仔細看下面的註釋,根據註釋提示進行操做):

[root@localhost src]# cd /usr/local/amoeba/
[root@localhost amoeba]# vim conf/amoeba.xml         <!--編輯amoeba.xml文件-->
          .......................<!--省略部份內容-->
 <!--在末行模式執行「/user」,以便定位到下面內容-->
<property name="authenticator">
      <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">

      <property name="user">amoeba</property> 
       <!--將上面配置默認的「root」改成amoeba,這是客戶端鏈接時使用的用戶名-->
   <property name="password">123456</property> 
                  <!--「123456」是用戶名amoeba對應的密碼-->
                   <property name="filter">
                   <bean class="com.meidusa.amoeba.server.IPAccessController">
              <property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
                        </bean>
                   </property>
               </bean>
           </property>

               .....................#省略部份內容
 <!--繼續在末行模式執行「/defaultPool」,以便定位到下面位置-->                                
<property name="LRUMapSize">1500</property>

                <property name="defaultPool">master</property>
<!--將下面兩項中默認的「server1」分別改成「master」和「slaves」,以下:-->
               <property name="writePool">master</property>
                <property name="readPool">slaves</property>
<!--默認上面兩行是被註釋掉的,記得把註釋符號刪除,以便配置生效。-->
<!--改完之後,保存退出便可。-->

③編輯dbServers.xml配置文件:

[root@localhost amoeba]# vim conf/dbServers.xml          #編輯該配置文件
                ...............<!--省略部份內容-->
<!--在末行模式執行「/user」,以便定位到下面內容-->
 <!-- mysql user -->
<!--將下面配置默認的「root」改成test,這是amoeba鏈接時數據庫時使用的用戶名-->
                        <property name="user">test</property>

<!--「將默認的「password」改成「123.com」,這是剛纔在數據庫上建立的用戶密碼-->
                        <property name="password">123.com</property>
<!--默認上面的密碼配置項是被註釋的,記得刪除註釋符號。-->
                ...............<!--省略部份內容-->
    <!--在末行模式下執行「/ipAddress」來定位到如下部分-->
    <!--將下面的name值改成「master」,以下所示-->
    <dbServer name="master"  parent="abstractServer">
                <factoryConfig>
                        <!-- mysql ip -->
                        <property name="ipAddress">192.168.1.1</property>
            <!--上面的IP地址192.168.1.1,爲主服務器的IP地址-->
                </factoryConfig>
        </dbServer>
<!--將下面的name值改成「slave1」,以下所示-->
        <dbServer name="slave1"  parent="abstractServer">
                <factoryConfig>
                        <!-- mysql ip -->
                        <property name="ipAddress">192.168.1.2</property>
<!--上面的IP地址192.168.1.2,爲從服務器的IP地址-->
                </factoryConfig>
        </dbServer>
  <!--
默認配置文件中只有上面兩段配置模板,因此要複製一下上面slave1的配置,
我這裏是複製了上面6行內容,粘貼到了下面
           -->
<!--將下面的name值改成「slave2」,以下所示-->
        <dbServer name="slave2"  parent="abstractServer">
                <factoryConfig>
                        <!-- mysql ip -->
                        <property name="ipAddress">192.168.1.3</property>
        <!--上面的IP地址192.168.1.3,爲從服務器的IP地址-->
                </factoryConfig>
        </dbServer>
<!--將下面的name值改成「slaves」,以下所示-->                        
        <dbServer name="slaves" virtual="true">
                <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
                        <!-- Load ......ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
                        <property name="loadbalance">1</property>
<!-- Separated by commas,such as: server1,server2,server1 -->
   <!--
將下面默認的內容改成「slave1,slave2」,以下所示:
這裏引用的是上面兩個定義的slave1/2的配置項
        -->
                        <property name="poolNames">slave1,slave2</property>
                </poolConfig>
        </dbServer>
    <!--更改完成後,保存退出便可。-->

④配置無誤後,能夠啓動amoeba軟件,其默認監聽端口爲tcp 8066。

[root@localhost amoeba]# bin/amoeba start & 
#啓動服務,必定要加「&」符號,到後臺執行,不然將一直佔用前臺命令行
[1] 5384
[root@localhost amoeba]# log4j:WARN log4j config load ............
        ...............#省略一部分提示信息,再按一下回車鍵便可。
[root@localhost init.d]# netstat -anpt | grep java     #查詢端口8066是否在監聽
tcp6       0      0 127.0.0.1:49276         :::*            LISTEN      5384/java           
tcp6       0      0 :::8066  #OK,在監聽  :::*            LISTEN      5384/java           
tcp6       0      0 192.168.1.4:41938  192.168.1.2:3306   ESTABLISHED 5384/java           
tcp6       0      0 192.168.1.4:34712  192.168.1.3:3306   ESTABLISHED 5384/java           
tcp6       0      0 192.168.1.4:34002  192.168.1.1:3306   ESTABLISHED 5384/java

五、如今已經主從複製+讀寫分離配置完畢了,開始在應用客戶端鏈接amoeba服務器進行測試:

①應用客戶端鏈接amoeba服務器:

[root@client ~]# yum -y install mysql         
#安裝系統映像中的MySQL便可,以即可以使用mysql命令
[root@client ~]# mysql -u amoeba -p 123456 -h 192.168.1.4 -P 8066
#鏈接amoeba服務器的8066端口
Enter password:           
#輸入在amoeba服務器的amoeba.xml文件配置中「amoeba」用戶對應的密碼
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 494299142
Server version: 5.1.45-mysql-amoeba-proxy-2.2.0

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [123456]>                       #鏈接成功
MySQL [123456]> use db_test;             #切換至以前測試主從複製時建立的庫
No connection. Trying to reconnect...
Connection id:    494299142
Current database: *** NONE ***

Database changed
MySQL [db_test]> create  table test (id int(10),name varchar(10));   #新建一個表
Query OK, 0 rows affected (0.04 sec)

②分別在三臺數據庫服務器上查看是否有剛纔建立的表:

mysql> use db_test;             #切換至db_test庫
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;         #查看全部表,能夠看到剛纔建立的表,OK。
+-------------------+
| Tables_in_db_test |
+-------------------+
| test              |
+-------------------+
1 row in set (0.00 sec)

③關閉兩臺從服務器上的同步功能:

mysql> stop slave;              #兩臺slave服務器上都需執行一下該命令
Query OK, 0 rows affected (0.00 sec)

④在主服務器上寫入如下數據:

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

⑤在從服務器上分別寫入如下數據:

slave1:
mysql> insert into test values('2','lisi');
Query OK, 1 row affected (0.00 sec)

slave2:
mysql> insert into test values('3','wangwu');
Query OK, 1 row affected (0.01 sec)

⑥在應用客戶端測試讀操做:

MySQL [db_test]> select * from test;             #第一次讀test表
+------+------+
| id   | name |
+------+------+
|    2 | lisi |
+------+------+
1 row in set (0.00 sec)

MySQL [db_test]> select * from test;              #第二次讀test表
+------+--------+
| id   | name   |
+------+--------+
|    3 | wangwu |
+------+--------+
1 row in set (0.01 sec)
MySQL [db_test]> select * from test;             #第三次讀test表
+------+------+
| id   | name |
+------+------+
|    2 | lisi |
+------+------+
1 row in set (0.03 sec)

無論進行讀多少次,都不會讀到主服務器上的數據,說明讀操做是在slave1/2上進行的。

⑦測試寫操做:

MySQL [db_test]> insert into test values('666','lvjianzhao');      
Query OK, 1 row affected (0.01 sec)
#在應用服務器寫入一條數據

可是在應用客戶端上繼續查詢該表,是查不到上面剛剛寫入的數據的,說明寫到了主服務器上,去主服務器查詢就能夠查到剛纔寫入的數據了,以下:

#在主服務器上再查詢test表
mysql> mysql> select * from test;
+------+------------+
| id   | name       |
+------+------------+
|    1 | zhangsan   |
|  666 | lvjianzhao |
+------+------------+
2 rows in set (0.00 sec)

主服務器能查到剛纔在應用客戶端寫入的數據,可是兩個從服務器是查不到的:

mysql> mysql> select * from test;              #在slave1進行查詢
+------+------+
| id   | name |
+------+------+
|    2 | lisi |
+------+------+
1 row in set (0.00 sec)
mysql> mysql> select * from test;              #在slave2進行查詢
+------+--------+
| id   | name   |
+------+--------+
|    3 | wangwu |
+------+--------+
1 row in set (0.00 sec)

由此反覆驗證,已經實現了MySQL的讀寫分離,目前全部的寫操做都會在master(主服務器)上,用來避免數據的不一樣步;全部的讀操做都分攤給了slave(從服務器),用來分擔數據庫壓力,固然,在這個案例環境中還有一個問題:負責寫入數據的服務器只有一臺,那麼這臺服務器一旦宕掉了呢?不就是完蛋了麼?關於這個問題,我將在之後的博文寫出解決辦法,暫時先從網上搜羅一篇關於MySQL高可用方案的文章,有須要的話能夠參考一下:MySQL高可用方案

終於寫完了這篇博文,但願能夠給更多的人作一下參考吧!!!

相關文章
相關標籤/搜索