(2)基于行的復制:把改變的內容復制過去,而不是把命令在從服務器上執行一遍;
(3)混合類型的復制:默認采用基于語句的復制,一旦發現基于語句無法精確復制時,就會采用基于行的復制;

2)復制的工作過程

MySQL復制的工作過程如圖所示:

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

復制過程有一個很重要的限制,即復制在Slave上是串行化的,也就是說Master上的并行更新操作不能在Slave上并行操作。

二、MySQL讀寫分離原理

簡單來說,讀寫分離就是只在主服務器上寫、只在從服務器上讀。基本的原理是讓主數據庫處理事務性查詢,而從數據庫處理select查詢。數據庫復制被用來把事務性查詢導致的變更同步到群集中的從數據庫。如圖所示:

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

1)基于程序代碼內部實現

在代碼中根據select、insert進行路由分類,這類方法也是目前生產環境應用最廣泛的。優點是性能較好,因為在程序代碼中實現,不需要增加額外的設備作為硬件開發,缺點是需要開發人員來實現,運維人員無從下手;

2)基于中間代理層實現

代理一般位于客戶端和服務器之間,代理服務器接到客戶端的請求后通過判斷后轉發到后端數據庫,有兩個代表性程序:
(1)MySQL—Proxy:為MySQL開源項目,通過其自帶的lua腳本進行SQL判斷,雖然是MySQL官方產品。但是MySQL官方并不建議將MySQL—Proxy用到生產環境中;
(2)Amoeba(變形蟲):由陳思儒開發,其層就職于阿里巴巴。該程序用Java語言進行開發,阿里巴巴將其用于生產環境。它不支持事務和存儲過程;

經過上述簡單的比較,通過程序代碼實現MySQL讀寫分離自然是一個不錯的選擇,但是并不是所有的應用都適合在程序代碼中實現讀寫分離。例如:一些大型復雜Java應用,如果在程序代碼中實現分離對代碼改動較大。所以,像這種代行復雜的應用一般會考慮使用代理層來實現。

三、搭建MySQL主從復制

實驗拓補如下:

大致步驟分為:
(1)MySQL主服務器建立時間同步;
(2)MySQL從服務器進行時間同步;
(3)關閉防火墻;
(4)安裝MySQL數據庫;
(5)配置MySQL主服務器;
(6)配置MySQL從服務器;
(7)驗證主從復制效果;

(1)MySQL主服務器建立時間同步

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

(2)MySQL從服務器進行時間同步

兩臺從服務器上都要進行時間同步!

[root@localhost ~]# yum -y install ntpdate
[root@localhost ~]# ntpdate 192.168.1.1
//安裝ntpdate工具,并指定ntp服務器實現同步

(3)關閉防火墻(或開啟相應端口)

由于實驗環境,這里就采用強制關閉防火墻了。每臺服務器上都關閉防火墻!

[root@localhost ~]# systemctl stop firewalld
//關閉防火墻

(4)安裝MySQL數據庫

安裝MySQL數據庫可以參考博文:編譯安裝MySQL數據庫系統

安裝完成之后,啟動MySQL數據庫

[root@localhost ~]# systemctl start mysqld
//啟動MySQL數據庫
[root@localhost ~]# netstat -anpt | grep mysqld
tcp6       0      0 :::3306                 :::*                    LISTEN      3263/mysqld       
//mysql數據庫的監聽端口是TCP/3306,確認一下!  
[root@localhost ~]# mysqladmin -u root password \\\'123456\\\'
//給MySQL數據庫管理員“root”設置密碼

主、從服務器都需要安裝MySQL數據庫、并啟動、設置密碼 !!!

(5)配置MySQL主服務器

[root@localhost ~]# vim /etc/my.cnf
//編寫MySQL數據庫的配置文件
                        ……………………                     //省略部分內容,填寫以下內容
server_id = 11
//服務器ID號,自定義但不可以與別的MySQL服務器沖突
log_bin = master-bin
//定義bin-log的文件名(默認保存在數據目錄下)
log-slave-updates = true
//開啟從服務器自動備份
[root@localhost ~]# systemctl restart mysqld
//重啟MySQL數據庫
[root@localhost ~]# mysql -u root -p
Enter 
//登錄MySQL數據庫
mysql> grant replication slave on *.* to \\\'myslave\\\'@\\\'192.168.1.%\\\' identified by \\\'123456\\\';
Query OK, 0 rows affected (0.00 sec)
//授權用戶myslave,密碼是123456,在192.168.1.0網段的所有MySQL服務器上對所有數據庫、表具有復制的權限
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
//刷新權限
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列顯示偏移量

(6)配置MySQL從服務器

兩臺從服務器的配置幾乎一樣!

[root@localhost ~]# vim /etc/my.cnf
//編寫MySQL數據庫的配置文件
                            ……………………                     //省略部分內容,填寫以下內容
server_id = 22
//服務器ID號,自定義但不可以與別的MySQL服務器沖突
relay-log = relay-log-bin
//定義中繼日志文件名稱和路徑(默認保存在數據目錄下)
relay-log-index = slave-relay-bin.index
//定義中繼日志索引文件名(記錄很多的中繼日志文件)
//默認情況,中繼日志使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是從服務器主機名,nnnnnn是序 列號。
//用連續序列號來創建連續中繼日志文件,從000001開始。從服務器跟蹤索引文件中目前正使用的中繼日志。 默認中繼日志索引文件名為host_name-relay-bin.index。
//默認情況,在從服務器的數據目錄中創建這些文件。
[root@localhost ~]# systemctl restart mysqld
//重啟MySQL數據庫
[root@localhost ~]# mysql -u root -p
Enter 
//登錄MySQL數據庫
 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)
//指定主服務的IP地址、登錄主服務器的用戶名、密碼、指定同步的日志、偏移量
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
//啟動同步
mysql> show slave status\\\\G;
//查看Slave狀態,確保以下兩項為“Yes”
                            ……………………                     //省略部分內容,填寫以下內容
             Slave_IO_Running: Yes                                          //I/O線程啟動
            Slave_SQL_Running: Yes                                       //SQL線程啟動     
                            ……………………                     //省略部分內容,填寫以下內容

兩臺從服務器配置完畢后!即可進行測試!

(7)驗證主從復制效果

①在主、從服務器上登錄MySQL數據庫,查看數據庫;

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

②在主服務器上創建新的數據庫;

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

③在主、從服務器上分別查看數據庫

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

顯示數據庫相同,則表示主從復制成功!

四、搭建MySQL讀寫分離

搭建MySQL讀寫分離的基礎就是MySQL主從復制,以下所有操作都是基于mysql主從復制的基礎上。

搭建MySQL讀寫分離使用的軟件是——Amoeba軟件。簡單介紹一下:

Amoeba項目開源框架于2008年發布一款Amoeba for MySQL軟件。這個軟件致力于MySQL的分布式數據庫的前端代理曾,它主要為應用層訪問MySQL的時候充當SQL路由功能,并且具有負載均衡、高可用性、SQL過濾、讀寫分離、可路由相關到目標數據庫,可并發請求多臺數據庫。通過Amoeba能夠完成多數據源的高可用、負載均衡、數據切片的功能,目前Amoeba已在很多企業的生產線上使用,其版本可在官網上自行下載。

(1)在Amoeba服務器上安裝Java環境

注意:Amoeba軟件千萬不要安裝在任意mysql服務器上!

因為Amoeba是基于jdk1.5開發的,所以官方推薦使用jdk1.5或1.6版本。高版本不建議使用!查看Centos 7系統默認的Java環境:

[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環境,使用的軟件包網盤鏈接: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                  //根據提示輸入yes和回車鍵
[root@localhost local]# mv jdk1.6.0_14/ jdk1.6                   //對jdk的安裝目錄進行重命名
[root@localhost ~]# vim /etc/profile                                     //編寫全局環境變量配置文件
                                ……………………                               //省略部分內容,填寫以下內容
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)
//目前系統的Java環境是1.6版本的,可以使用!

(2)安裝并配置Amoeba軟件

Amoeba軟件的網盤鏈接: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
//出現這些內容,則表示安裝amoeba安裝成功

(3)配置Amoeba讀寫分離,兩個Slave實現讀負載均衡

①Master、Slave1、Slave2中都要開放權限給Amoeba訪問,命令如下:

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

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

[root@localhost ~]# vim /usr/local/amoeba/conf/amoeba.xml
                     ……………………                 //由于內容較多,編輯的每條內容都添加了實際的行號
30                                         <property name=user>amoeba</property>
31                                         
32                                         <property name=password>123456</property>
//指定客戶機訪問amoeba服務器時的賬號、密碼!
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 
                         ……………………                 //由于內容較多,編輯的每條內容都添加了實際的行號
 26                         <property name=user>test</property>
 27 
 28                         <property name=password>123.com</property>
   //指定amoeba服務器訪問mysql數據庫使用的賬號密碼
 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配置需要復制salve1的配置信息(行號可能與實際不符)                        
 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>

④確認無誤后,啟動Amoeba軟件,其默認端口為TCP 8066

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

(5)測試

由于實驗環境,我們測試一下讀寫分離的效果,實際環境,輕易不要測試!!!

①在客戶端安裝mysql工具,并通過代理訪問mysql,命令如下:

[root@localhost ~]# yum -y install mariadb
//注意,Centos 7系統開始,自帶的數據庫叫mariadb,不再是mysql
[root@localhost ~]# mysql -u amoeba -h 192.168.1.4 -P 8066 -p
Enter 
  MySQL [(none)]> 
//表示訪問成功

②在MySQL主服務器上創建一個表同步到從服務器上

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

分別在兩臺從服務器上停止同步,執行如下命令:

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

在主服務器上插入數據:

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

③兩臺從服務器上同步了表,手動分別插入一條數據
第一臺從服務器

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

第二臺從服務器

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

④測試讀操作
在客戶機上第一次查詢結果:

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

在客戶機上第二次查詢結果:

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

永遠是這兩種結果!!!
這樣實現了讀數據的負載均衡,而且效果很明顯!

⑤測試寫操作
在客戶端上插入一條數據,但是在客戶端查詢不到!

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

但在主服務器上可以查詢到!

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

由此驗證,已經實現了MySQL讀寫分離,目前所有的寫在主服務器上,避免了數據的不同步;所有的讀操作都分攤給了從服務器,用來分擔數據庫的壓力!

———————— 本文至此結束,感謝閱讀 ————————

更多關于云服務器域名注冊,虛擬主機的問題,請訪問三五互聯官網:m.shinetop.cn

贊(0)
聲明:本網站發布的內容(圖片、視頻和文字)以原創、轉載和分享網絡內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。郵箱:3140448839@qq.com。本站原創內容未經允許不得轉載,或轉載時需注明出處:三五互聯知識庫 » MySQL 主從復制與讀寫分離詳解

登錄

找回密碼

注冊

主站蜘蛛池模板: av天堂亚洲天堂亚洲天堂| av老司机亚洲精品天堂| 亚洲另类无码一区二区三区 | 成人午夜视频在线| A男人的天堂久久A毛片| www久久只有这里有精品| 玩弄丰满少妇人妻视频| 肥臀浪妇太爽了快点再快点| 精品视频不卡免费观看| 苍井空浴缸大战猛男120分钟| 亚洲国产精品ⅴa在线观看| 手机无码人妻一区二区三区免费| 国产良妇出轨视频在线观看| 内射极品少妇xxxxxhd| 一区二区三区一级黄色片| 亚洲国产欧美在线看片一国产| 精品无码国产不卡在线观看| 在线 国产 欧美 专区| 精品一二三四区在线观看| 色伦专区97中文字幕| 少妇真人直播免费视频| 亚洲国产精品无码av| 亚洲天堂男人天堂女人天堂| 国产av一区二区不卡| 搡老女人老妇女老熟妇| 国产v亚洲v天堂a无码99| 国产在线精彩自拍视频| 岛国岛国免费v片在线观看| 国产精品一区中文字幕| 99精品日本二区留学生| 欧洲成人在线观看| 97成人碰碰久久人人超级碰oo| 免费国产一级 片内射老| 国产蜜臀在线一区二区三区 | 国产亚洲一在无在线观看| 国产精品无码久久久久| 91亚洲国产成人精品性色| 中文字幕日韩有码一区| 色欲国产精品一区成人精品| 黑人猛精品一区二区三区| 亚洲精品日韩在线观看|