1. 程式人生 > 其它 >Linux--MySQL主從複製和讀寫分離

Linux--MySQL主從複製和讀寫分離

MySQL主從複製和讀寫分離

一、案例概述

在企業應用中,成熟的業務通常資料量都比較大
單臺mysql在安全性、高可用性和高併發方面都無法滿足實際的需求
配置多臺主從資料庫伺服器以實現讀寫分離

二、案例前置知識點

1. 讀寫分離的定義

基本的原理是讓主資料庫處理事務性增、改、刪操作 (INSERT、UPDATE、DELETE),而從資料庫處理SELECT查詢操作。 資料庫複製被用來把事務性操作導致的變更同步到叢集中的從資料庫。

2. 讀寫分離的原因

因為資料庫的"寫"(寫10000條資料可能要3分鐘)操作是比較耗時的。
但是資料庫的"讀"(讀10000條資料可能只要5秒鐘)。
所以讀寫分離,解決的是,資料庫的寫入,影響了查詢的效率。

3. 讀寫分離的應用

資料庫不一定要讀寫分離, 如果程式使用資料庫較多時,而更新少,查詢多的情況下會考慮使用。利用資料庫主從同步, 再通過讀寫分離可以分擔資料庫壓力,提高效能。

4. 主從複製與讀寫分離

在實際的生產環境中, 對資料庫的讀和寫都在同一個資料庫伺服器中,是不能滿足實際需求的。無論是在安全性、高可用性還是高併發等各個方面都是完全不能滿足實際需求的。因此,通過主從複製的方式來同步資料,再通過讀寫分離來提升資料庫的併發負載能力。有點類似於rsync,但是不同的是rsync是對磁碟檔案做備份,而mysql主從複製是對資料庫中的資料、語句做備份。

5. mysql支援的複製型別

(1)STATEMENT

基於語句的複製。在伺服器上執行sql語句,在從伺服器上執行同樣的語句,mysql預設採用基於語句的複製,執行效率高。

(2)ROW

基於行的複製。把改變的內容複製過去, 而不是把命令在從伺服器上執行一遍。

(3)MIXED

混合型別的複製。預設採用基於語句的複製,一旦發現基於語句無法精確複製時, 就會採用基於行的複製。

6. 主從複製的工作過程


(1)Master節點將資料的改變記錄成二進位制日誌(bin log),當Master上的資料發生改變時,則將其改變寫入二進位制日誌中。
(2)Slave節點會在一定時間間隔內對Master的二進位制日誌進行探測其是否發生改變,如果發生改變,則開始一個I/O執行緒請求 Master的二進位制事件。
(3)同時Master節點為每個I/O執行緒啟動一個dump執行緒,用於向其傳送二進位制事件,並儲存至Slave節點本地的中繼日誌(Relay log)中,Slave節點將啟動SQL執行緒從中繼日誌中讀取二進位制日誌,在本地重放,即解析成sql語句逐一執行,使得其資料和Master節點的保持一致,最後I/O執行緒和SQL執行緒將進入睡眠狀態,等待下一次被喚醒。
注∶
●中繼日誌通常會位於OS快取中,所以中繼日誌的開銷很小。
●複製過程有一個很重要的限制,即複製在slave上是序列化的,也就是說Master上的並行更新操作不能在Slave上並行操作。

7. MySQL主從複製高延遲的原因

(1)master伺服器高併發,形成大量事務
(2)網路延遲
(3)主從硬體裝置導致 cpu主頻、記憶體io、硬碟io
(4)本來就不是同步複製、而是非同步複製

8. MySQL主從複製高延遲的解決辦法

(1)從庫優化Mysql引數。比如增大innodb_buffer_pool_size,讓更多操作在Mysql記憶體中完成,減少磁碟操作。
(2)從庫使用高效能主機。包括cpu強悍、記憶體加大。避免使用虛擬雲主機,使用物理主機,這樣提升了i/o方面效能。
(3)從庫使用SSD磁碟,避免使用低速的機械硬碟。
(4)網路優化,避免跨機房實現同步。

9. 常見的 MySQL 讀寫分離

目前較為常見的 MySQL 讀寫分離分為以下兩種:

(1)基於程式程式碼內部實現

在程式碼中根據select、insert進行路由分類,這類方法也是目前生產環境應用最廣泛的。
優點是效能較好,因為在程式程式碼中實現,不需要增加額外的裝置為硬體開支;缺點是需要開發人員來實現, 運維人 員無從下手。
但是並不是所有的應用都適合在程式程式碼中實現讀寫分離,像一些大型複雜的Java應用,如果在程式程式碼中實現讀寫分離對程式碼改動就較大。

(2)基於中間代理層實現

代理一般位於客戶端和伺服器之間,代理伺服器接到客戶端請求後通過判斷後轉發到後端資料庫,有以下代表性程式。

①MySQL-Proxy

MySQL-Proxy為MySQL開源專案,通過其自帶的lua指令碼進行SQL判斷。

②Atlas

是由奇虎360的Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的資料中間層專案。它是在mysql-proxy0.8.2版本的基礎上,對其進行了優化,增加了一些新的功能特性。360內部使用Atlas執行的mysql業務,每天承載的讀寫請求數達幾十億條,支援事物以及儲存過程。

③Amoeba

由陳思儒開發,作者曾就職於阿里巴巴。該程式由Java語言進行開發,阿里巴巴將其用於生產環境。但是它不支援事務和儲存過程。
由於使用MySQL Proxy需要寫大量的Lua指令碼,這些Lua並不是現成的,而是需要自己去寫。這對於並不熟悉MySQL Proxy內建變數和MySQL Protocol的人來說是非常困難的。
Amoeba是一個非常容易便用、可移植性非常強的軟體。因此它在生產環境中被廣泛應用於資料庫的代理層。

三、案例環境

1. 伺服器IP、軟體配置

伺服器

主機名

IP

軟體版本

Master伺服器

master

192.168.10.2

mysql 5.7

Slave伺服器

slave1

192.168.10.3

mysql 5.7

Amoeba伺服器

amoeba

192.168.10.4

jdk1.8/Amoeba3.0

客戶端伺服器

client

192.168.10.5

mysql(yum安裝mariadb)

2. 各伺服器環境配置

systemctl stop firewalld

systemctl disable firewalld

setenforce 0

四、案例實施

1. 搭建MySQL主從複製

(1)MySQL主從伺服器時間同步

Master伺服器(192.168.10.2)

[root@master ~]# yum install -y ntp

#NTP是網路時間協議(Network Time Protocol),它是用來同步網路中各個計算機的時間的協議。

[root@master ~]# vim /etc/ntp.conf

##末行新增

server 127.127.10.0##設定本地是時鐘源,10為主機所在網段

fudge 127.127.10.0 stratum 8##設定時間層級為8(一般在15以內皆可)

[root@master ~]# service ntpd start

Redirecting to /bin/systemctl start ntpd.service

Slave伺服器(192.168.10.3)

[root@slave1 ~]# yum install -y ntp ntpdate

[root@slave1 ~]# service ntpd start

Redirecting to /bin/systemctl start ntpd.service

[root@slave1 ~]# /usr/sbin/ntpdate 192.168.10.2

#進行時間同步

6 Sep 02:14:26 ntpdate[1622]: the NTP socket is in use, exiting

[root@slave1 ~]# crontab -e

#為防止時間的延遲和偏差,設定計劃任務進行定時同步

*/30 * * * * /usr/sbin/ntpdate 192.168.10.2

(2)主伺服器的MySQL配置

[root@master ~]# vim /etc/my.cnf

server-id = 1##定義server-id,每臺主機不可相同

log-bin=master-bin##新增,主伺服器開啟二進位制日誌

binlog_format = MIXED##本次使用MIXED模式

log-slave-updates=true##新增,允許從伺服器更新二進位制日誌

[root@master ~]# systemctl restart mysqld

[root@master ~]# mysql -u root -p

Enter password:

mysql> grant replication slave on *.* to 'myslave'@'192.168.10.%' identified by 'Admin@123';

##設定從伺服器賬號並授權

Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> use mysql;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

mysql> select user,host,authentication_string from user;

+---------+---------------+-------------------------------------------+

| user | host | authentication_string |

+---------+---------------+-------------------------------------------+

| root | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |

| myslave | 192.168.10.% | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |

+---------+---------------+-------------------------------------------+

2 rows in set (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

mysql> show master status;

##檢視主伺服器狀態,file列顯示日誌名,Position列顯示偏移量

mysql> show master status;

+-------------------+----------+--------------+------------------+-------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+-------------------+----------+--------------+------------------+-------------------+

| master-bin.000001 | 154 | | | |

+-------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

(3)從伺服器的MySQL配置

Slave1伺服器(192.168.10.3)

[root@slave1 ~]# vim /etc/my.cnf

server-id = 2##修改,注意id與其他主機都不能相同

relay-log=relay-log-bin##新增,開啟中繼日誌,從主伺服器上同步日誌檔案記錄到本地

relay-log-index=slave-relay-bin.index##新增,定義中繼日誌檔案的位置和名稱

[root@slave1 ~]# systemctl restart mysqld

[root@slave1 ~]# mysql -u root -p

Enter password:

mysql> change master to

-> master_host='192.168.10.2',

-> master_user='myslave',

-> master_password='Admin@123',

-> master_log_file='master-bin.000001',

-> master_log_pos=154;

##配置同步,注意master_log_file和master_log_pos的值要與Master查詢的一致

Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;

##啟動同步,如有報錯執行reset slave;

Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G

##檢視Slave狀態,確保IO和SQL執行緒都是Yes,代表同步正常。

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.122.10

Master_User: myslave

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: master-bin.000001

Read_Master_Log_Pos: 154

Relay_Log_File: relay-log-bin.000002

Relay_Log_Pos: 321

Relay_Master_Log_File: master-bin.000001

Slave_IO_Running: Yes

##負責與主機的IO通訊

Slave_SQL_Running: Yes

##負責自己的slave mysql程序

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 154

Relay_Log_Space: 526

Until_Condition: None

Until_Log_File:

Until_Log_Pos: 0

Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno: 0

Last_IO_Error:

Last_SQL_Errno: 0

Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id: 1

Master_UUID: 026cf8f0-09e1-11ec-8ae9-000c2959bebe

Master_Info_File: /usr/local/mysql/data/master.info

SQL_Delay: 0

SQL_Remaining_Delay: NULL

Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates

Master_Retry_Count: 86400

Master_Bind:

Last_IO_Error_Timestamp:

Last_SQL_Error_Timestamp:

Master_SSL_Crl:

Master_SSL_Crlpath:

Retrieved_Gtid_Set:

Executed_Gtid_Set:

Auto_Position: 0

Replicate_Rewrite_DB:

Channel_Name:

Master_TLS_Version:

1 row in set (0.00 sec)

注意:

一般Slave_IO_Running:No 的可能性有:

  1. 網路不通
  2. my.cnf配置有問題
  3. 密碼、file檔名、pos偏移量不對
  4. 防火牆沒有關閉

(4)驗證主從複製效果

Master伺服器(192.168.10.2)

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| performance_schema |

| sys |

+--------------------+

4 rows in set (0.00 sec)

mysql> create database test;

Query OK, 1 row affected (0.01 sec)

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| performance_schema |

| sys |

| test |

+--------------------+

5 rows in set (0.00 sec)

Slave伺服器(192.168.10.3)

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| performance_schema |

| sys |

| test |

+--------------------+

5 rows in set (0.00 sec)

2. 搭建MySQL讀寫分離

(1)Amoeba伺服器配置

jdk1.6和amoeba2.2.0

①安裝Java環境

因為Amoeba是基於jdk1.5開發的,所以官方推薦使用jdk1.5或1.6版本,高版本不建議使用。

[root@amoeba ~]# cd /opt

##將jdk1.6以及amoeba安裝包上傳至/opt目錄中

[root@amoeba opt]# cp jdk-6u14-linux-x64.bin /usr/local

[root@amoeba opt]# cd /usr/local/

[root@amoeba local]# chmod +x jdk-6u14-linux-x64.bin

[root@amoeba local]# ./jdk-6u14-linux-x64.bin

##回車至使用者選項,yes後再回車

[root@amoeba local]# mv jdk1.6.0_14/ /usr/local/jdk1.6

[root@amoeba local]# 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@amoeba local]# source /etc/profile

[root@amoeba local]# 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)

②安裝Amoeba軟體

[root@amoeba local]# mkdir /usr/local/amoeba

[root@amoeba local]# cd /opt

[root@amoeba opt]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/

[root@amoeba opt]# chmod -R 755 /usr/local/amoeba/

[root@amoeba opt]# /usr/local/amoeba/bin/amoeba

amoeba start|stop

##如顯示amoeba start|stop說明安裝成功

jdk1.8和amoeba3.0.5

①安裝Java環境

tar xf jdk-8u144-linux-x64.tar.gz

cp -rv jdk1.8.0_144/ /usr/local/java

vi /etc/profile

export JAVA_HOME=/usr/local/java

export JRE_HOME=/usr/local/java/jre

export PATH=$PATH:/usr/local/java/bin

export CLASSPATH=./:/usr/local/java/lib:/usr/local/java/jre/lib

source /etc/profile

java -version

java version "1.8.0_144"

……

……

②安裝amoeba

官方網站:https://sourceforge.net/projects/amoeba/files/

unzip amoeba-mysql-3.0.5-RC-distribution.zip -d /usr/local/

mv /usr/local/amoeba-mysql-3.0.5-RC/ /usr/local/amoeba

chmod -R 755 /usr/local/amoeba/

vi /usr/local/amoeba/jvm.properties

32行下新增:#JVM_OPTIONS="-server -Xms256m -Xmx1024m -Xss196k -XX:PermSize=16m -XX:MaxPermSize=96m"

新增此行:JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k"

製作amoeba管理指令碼

vim /etc/init.d/amoeba

#!/bin/bash

#chkconfig: 5 62 62

#

export JAVA_HOME=/usr/local/java

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

NAME=Amoeba

AMOEBA_BIN=/usr/local/amoeba/bin/launcher

SHUTDOWN_BIN=/usr/local/amoeba/bin/shutdown

PIDFILE=/usr/local/amoeba/Amoeba-MySQL.pid

SCRIPTNAME=/etc/init.d/amoeba

case "$1" in

start)

echo -n "Starting $NAME... "

$AMOEBA_BIN

echo " done"

;;

stop)

echo -n "Stoping $NAME... "

$SHUTDOWN_BIN

echo " done"

;;

restart)

$SHUTDOWN_BIN

sleep 1

$AMOEBA_BIN

;;

*)

echo "Usage: $SCRIPTNAME {start|stop|restart}"

exit 1

;;

esac

chmod +x /etc/init.d/amoeba

chkconfig --add amoeba

service amoeba start

netstat -anpt | grep 8066 //預設監聽在8066埠

  1. 配置Amoeba讀寫分離,兩個Slave讀負載均衡

1.先在Master、Slave的MySQL上開放許可權給Amoeba訪問

Master伺服器(192.168.10.2)

mysql> grant all on *.* to test@'192.168.10.%' identified by 'Admin@123';

Query OK, 0 rows affected, 1 warning (0.00 sec)

Slave伺服器(192.168.10.3)

mysql> grant all on *.* to test@'192.168.10.%' identified by 'Admin@123';

Query OK, 0 rows affected, 1 warning (0.00 sec)

2.再回到amoeba伺服器配置amoeba服務

一定要注意,修改主機名時,主機名一定要和主伺服器和從伺服器一樣,否則拒絕登入

[root@amoeba opt]# cd /usr/local/amoeba/conf

[root@amoeba conf]# cp amoeba.xml amoeba.xml.bak

##修改amoeba配置檔案前,先做備份

[root@amoeba conf]# vim amoeba.xml

##30行,修改

<property name="user">amoeba</property>

##32行,修改

<property name="password">Admin@123</property>

##115行,修改

<property name="defaultPool">master</property>

##117行-120行,取消註釋並修改

<property name="writePool">master</property>

<property name="readPool">slaves</property>

[root@amoeba conf]# cp dbServers.xml dbServers.xml.bak

##修改資料庫配置檔案前,先做備份

##23行,註釋掉,作用:預設進入test庫,以防mysql中沒有test庫,會報錯。

<!-- property name="schema">test</property -->

##26行,修改,使用之前建立的授權使用者

<property name="user">test</property>

##28行-30行,取消註釋並修改,密碼為之前建立的授權使用者密碼

<!-- mysql password -->

<property name="password">Admin@123</property>

##45行,修改,設定主伺服器的名為master

<dbServer name="master" parent="abstractServer">

##48行,修改,設定主伺服器的地址

<property name="ipAddress">192.168.10.2</property>

##52行,修改,設定從伺服器的名為slave1

<dbServer name="slave1" parent="abstractServer">

##55行,修改,設定從伺服器的複製

<property name="ipAddress">192.168.10.3</property>

##59行,修改

<dbServer name="slaves" virtual="true">

##65行,修改

<property name="poolNames">slave</property>

[root@amoeba conf]# /usr/local/amoeba/bin/amoeba start&

##後臺啟動amoeba軟體,按ctrl+c返回

[2] 5554

[root@amoeba conf]# remote application= .Amoeba:25177 response OK

amoeba server is running with port=25177

^C

[2]+ 退出 255 /usr/local/amoeba/bin/amoeba start

[root@amoeba conf]# netstat -natp |grep java

##檢視8066埠是否開啟,預設埠為TCP8066

tcp6 0 0 127.0.0.1:25177 :::* LISTEN 5505/java

tcp6 0 0 :::8066 :::* LISTEN 5505/java

tcp6 0 0 192.168.10.4:41708 192.168.10.2:3306 ESTABLISHED 5505/java

tcp6 0 0 192.168.10.4:45476 192.168.10.3:3306 ESTABLISHED 5505/java

vi conf/amoeba.xml

---28行-----設定客戶端連線amoeba前端伺服器時使用的使用者名稱和密碼----

<property name="user">amoeba</property>

----30行---------

<property name="password">Admin@123</property>

------------------------------------以上配置用於客戶端連線使用者名稱密碼-------------

---83-去掉註釋-同時把預設的server1改成master,把預設的servers改成 slaves

<property name="defaultPool">Master</property>

<property name="writePool">Master</property>

<property name="readPool">slaves</property>

vi conf/dbServers.xml

--26-29--去掉註釋--

<property name="user">test</property>

<property name="password">Admin@123</property>

------主伺服器地址---

43 <dbServer name="Master" parent="abstractServer">

46 <property name="ipAddress">192.168.10.2</property>

--50-從伺服器主機名-

<dbServer name="Slave" parent="abstractServer">

--53-從伺服器地址-

<property name="ipAddress">192.168.10.3</property>

---以下兩行修改----

<dbServer name="slaves" virtual="true">

<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">

--末尾--

<property name="poolNames">slave</property>

</poolConfig>

這裡的所有主機名首字母大寫(因為我的主機名首字母就是大寫)

這裡的Slave,如果只有一個從,可以寫主機名,如果有多個,寫slaves

<property name="poolNames">a </property>中的a是從伺服器的主機名

要有schema資料庫

(3)客戶端伺服器測試讀寫分離

①測試一:客戶端建表

客戶端伺服器(192.168.10.5)

[root@client ~]# yum install -y mariadb-server mariadb

[root@client ~]# systemctl start mariadb.service

[root@client ~]# mysql -u amoeba -pAdmin@123 -h 192.168.10.4 -P8066

##通過amoeba伺服器代理訪問mysql,在通過客戶端連線mysql後寫入的資料只有主服務會記錄,然後同步給從伺服器。

##這裡通過192.168.10.41主機的8066埠使用使用者amoeba登入mysql。

Welcome to the MariaDB monitor. Commands end with ; or \g.

Your MySQL connection id is 738807903

Server version: 5.1.45-mysql-amoeba-proxy-2.2.0 Source distribution

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

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

MySQL [(none)]> show databases;

##登陸成功

+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| performance_schema |

| sys |

| test |

+--------------------+

5 rows in set (0.01 sec)

MySQL [(none)]> use test;

Database changed

MySQL [test]> show tables;

Empty set (0.01 sec)

MySQL [test]> create table test(id int,name char(20));

Query OK, 0 rows affected (0.01 sec)

MySQL [test]> show tables;

+----------------+

| Tables_in_test |

+----------------+

| test |

+----------------+

1 row in set (0.01 sec)

Master伺服器(192.168.10.2)

mysql> use test;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

mysql> show tables;

+----------------+

| Tables_in_test |

+----------------+

| test |

+----------------+

1 row in set (0.01 sec)

Slave伺服器(192.168.10.3)

mysql> use 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;

+----------------+

| Tables_in_test |

+----------------+

| test |

+----------------+

1 row in set (0.00 sec)

測試結果:客戶端中做出的修改,在所有伺服器上都能看到。

②測試二:關閉slave功能後,在主從伺服器插入資料

Slave伺服器(192.168.10.3)

mysql> stop slave;

Query OK, 0 rows affected (0.00 sec)

mysql> insert into test values(1,'slave');

Query OK, 1 row affected (0.00 sec)

mysql> select * from test;

+------+--------+

| id | name |

+------+--------+

| 1 | slave |

+------+--------+

1 row in set (0.00 sec)

Master伺服器(192.168.10.2)

mysql> insert into test values(3,'master');

Query OK, 1 row affected (0.00 sec)

mysql> select * from test;

+------+--------+

| id | name |

+------+--------+

| 3 | master |

+------+--------+

1 row in set (0.00 sec)

客戶端伺服器(192.168.10.5)

MySQL [test]> select * from test;

+------+--------+

| id | name |

+------+--------+

| 1 | slave |

+------+--------+

1 row in set (0.01 sec)

測試結果:客戶端在slave中輪詢檢視資料。由於從伺服器都關閉了slave功能,因此無法檢視Master伺服器中的修改。(由於我的電腦帶不動5臺centos只能勉強帶動4臺,所以slave就搞了1臺)

③關閉slave功能後,客戶端伺服器寫入資料

客戶端伺服器(192.168.10.5)

MySQL [test]> insert into test values(4,'client1');

Query OK, 1 row affected (0.00 sec)

MySQL [test]> select * from test;

+------+--------+

| id | name |

+------+--------+

| 1 | slave |

+------+--------+

1 row in set (0.00 sec)

Master伺服器(192.168.10.2)

mysql> select * from test;

+------+---------+

| id | name |

+------+---------+

| 3 | master |

| 4 | client1 |

+------+---------+

2 rows in set (0.00 sec)

Slave伺服器(192.168.10.3)

mysql> select * from test;

+------+--------+

| id | name |

+------+--------+

| 1 | slave |

+------+--------+

1 row in set (0.00 sec)

測試結果:客戶端伺服器的修改操作是對於Master伺服器進行的,因此Master伺服器上可以看到客戶端伺服器所做的insert操作。由於客戶端伺服器的select操作是對從伺服器進行的,而從伺服器關閉了slave功能,無法獲取更新,因此客戶端伺服器本身以及從伺服器都無法檢視更新操作。

④從伺服器開啟slave服務

Slave伺服器(192.168.10.3)

mysql> start slave;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from test;

+------+---------+

| id | name |

+------+---------+

| 1 | slave |

| 3 | master |

| 4 | client1 |

+------+---------+

3 rows in set (0.00 sec)

Master伺服器(192.168.10.2)

mysql> select * from test;

+------+---------+

| id | name |

+------+---------+

| 3 | master |

| 4 | client1 |

+------+---------+

2 rows in set (0.00 sec)

客戶端伺服器(192.168.10.5)

MySQL [test]> select * from test;

+------+---------+

| id | name |

+------+---------+

| 1 | slave |

| 3 | master |

| 4 | client1 |

+------+---------+

3 rows in set (0.01 sec)

測試結果:從伺服器開啟slave服務後可以從Master伺服器上獲取更新,但是從伺服器上的更新不會被Master伺服器看到。

⑤客戶端伺服器再次插入資料

客戶端伺服器(192.168.10.5)

MySQL [test]> insert into test values(5,'client2');

Query OK, 1 row affected (0.00 sec

MySQL [test]> select * from test;

+------+---------+

| id | name |

+------+---------+

| 1 | slave1 |

| 3 | master |

| 4 | client1 |

| 5 | client2 |

+------+---------+

4 rows in set (0.00 sec)

Master伺服器(192.168.10.2)

mysql> select * from test;

+------+---------+

| id | name |

+------+---------+

| 3 | master |

| 4 | client1 |

| 5 | client2 |

+------+---------+

3 rows in set (0.00 sec)

Slave伺服器(192.168.10.3)

mysql> select * from test;

+------+---------+

| id | name |

+------+---------+

| 1 | slave |

| 3 | master |

| 4 | client1 |

| 5 | client2 |

+------+---------+

4 rows in set (0.00 sec)

測試結果:客戶端伺服器上的資料修改,會同步到所有伺服器中。