MySQL 數據庫 -- 主從複製、讀寫分離
文章目錄
一、主從複製
** 1、原理**
** 2、二進制日誌的保存方式**
** 3、主從複製策略**
** 4、搭建 MySQL 主從複製**
二、讀寫分離
** 1、原理**
** 2、讀寫分離**
** 3、讀寫分離的好處**
** 4、實現方式**
** 4.1、Amoeba 簡介**
五、搭建 MySQL 讀寫分離
** 1、實驗準備**
** 2、amoeba(192.168.35.30) 安裝**
** 3、配置 amoeba 讀寫分離,兩個 slave 讀負載均衡**
** 4、修改 amoeba 主配置文件和數據庫文件**
** 5、 開啓 amoeba**
** 6、客戶端遠程登錄 amoeba**
** 7、測試**
一、主從複製
1、原理
-
主從複製的核心:2 個日誌、3 個線程
-
二進制通過哪種方式寫入日誌(基於行、基於 sql、基於混合)
-
master 線程:bin-log 二進制日誌、dump 線程
-
master 上的 dump 線程會監控 binlog 二進制日誌的更新,若有更新會通知 slave 的 I/O 線程
-
slave:relay-log 中繼日誌、I/O 線程、sql 線程
-
線程 1:
-
slave 上的 I/O 線程會向 master 申請同步 bin-log 二進制日誌的更新內容
-
slave 的 I/O 線程把更新內容寫入自己的中繼日誌
-
線程 2:
-
slave 的 sql 線程把日誌中的更新語句同步執行到內容
已達到和 master 數據庫趨於一致
2、二進制日誌的保存方式
-
STATEMENT(基於 SQL 語句):
-
每一條涉及到被修改的 sql 都會記錄在 binlog 中
-
缺點:日誌量過大,如 sleep() 函數,last_insert_id()>,以及 user-defined fuctions(udf)、主從複製等架構記錄日誌時會出現問題
-
ROW(基於行)
-
只記錄變動的記錄,不記錄 sql 的上下文環境
-
缺點: 如果遇到 update…set…where true 那麼 binlog 的數據量會越來越大
-
MIXED 推薦使用
-
一般的語句使用 statement,函數使用 ROW 方式存儲
3、主從複製策略
-
全同步:master 請求服務時,等待 slave 全部同步之後纔會迴應 client 端
-
半同步:master 請求服務時,只要任意一個 slave 同步
-
異步:master 請求服務時,只要 master 同步即迴應請求,不管 slave 的狀態;默認的狀態
因爲主從複製的默認策略是異步,導致的結果就是主從二進制日誌和中繼日誌的保存內存會越來越大
4、搭建 MySQL 主從複製
- 實驗準備(虛擬機):
- 主從服務器時間同步
三臺服務器配置
- 三臺服務器安裝 mysql
此處就不再詳細描述,看之前文字 LNMP 即可
MySQL 安裝完成確認下是否有 mysql 用戶
- msater 服務器開啓二進制日誌
- master 配置:給從服務器提權 grant;用於主從對接
以上可見產生了 master- bin.000001 日誌文件,定位爲 603
從服務器需要定位到此處進行復制
- slave1:開啓從服務器功能
im /etc/my.cnf
server-id = 2 ##設置server_id爲2,slave2爲3
log-bin=master-bin ##開啓二進制日誌文件
relay-log=relay-log-bin
##從主服務器上同步日誌文件記錄到本地
relay-log-index=slave-relay-bin.index
##定義relay_log的位置和名稱(index索引)
--->wq保存
systemctl restart mysqld
--------------------->slave1數據庫操作<---------------------
change master to master_host='192.168.35.40',master_user='myslave',
master_password='123',master_log_file='master-bin.000001',
master_log_pos=603;
start slave;
show slave status\G ##查看主從服務是否成功
- 通用的方法開啓 slave2 的從服務功能
vim /etc/my.cnf
server-id = 3 ##設置server_id爲3,slave1爲2
log-bin=master-bin ##開啓二進制日誌文件
relay-log=relay-log-bin
##從主服務器上同步日誌文件記錄到本地
relay-log-index=slave-relay-bin.index
##定義relay_log的位置和名稱(index索引)
--->wq保存
change master to master_host='192.168.35.40',master_user='myslave',
master_password='123',master_log_file='master-bin.000001',
master_log_pos=603;
mysql> start slave;
mysql> show slave status\G ##查看主從服務是否成功
若查詢主從是否同步時顯示:connecting,可以稍等一會再重新查看
- 測試主從複製
主服務器上創建一個數據庫
slave1:已同步
slave2:已同步
若是在 slave1 服務器上面更改,master 主服務器與 slave2 並沒有同步更改
二、讀寫分離
1、原理
讀寫分離就是隻在主服務器上寫,只在從服務器上讀
基本的原理是讓主數據庫處理事務性查詢,
而從數據庫處理 select 查詢。數據庫複製被用來把主數據庫上事務性查詢導致的變更同步到集羣中的從數據庫
2、讀寫分離
因爲數據庫的 “寫”(寫 10000 條數據可能要 3 分鐘) 操作是比較耗時的。
但是數據庫的 “讀”(讀 10000 條數據可能只要 5 秒鐘)。
所以讀寫分離,解決的是,數據庫的寫入,影響了查詢的效率
3、讀寫分離的好處
-
數據庫不一定要讀寫分離,如果程序使用數據庫較多時,而更新少,查詢多的情況下會考慮使用。
-
利用數據庫主從同步,再通過讀寫分離可以分擔數據庫壓力,提高性能
4、實現方式
常見的 MySQL 讀寫分離分爲以下兩種:
-
基於程序代碼內部實現
在代碼中根據 select、insert 進行路由分類,這類方法也是目前生產環境應用最廣泛的。
優點是性能較好,因爲在程序代碼中實現,不需要增加額外的設備爲硬件開支;
缺點是需要開發人員來實現,運維人員無從下手。
但是並不是所有的應用都適合在程序代碼中實現讀寫分離,像一些大型複雜的 Java 應用,如果在程序代碼中實現讀寫分離對代碼改動就較大。
-
基於中間代理層實現
代理一般位於客戶端和服務器之間,代理服務器接到客戶端請求後通過判斷後轉發到後端數據庫;
有以下代表性程序:
-
MySQL-Proxy:MySQL-Proxy 爲 MySQL 開源項目,通過其自帶的 lua 腳本 (腳本語言) 進 行 SQL 判斷。
-
Atlas:由奇虎 360 的 Web 平臺部基礎架構團隊開發維護的一個基於 MySQL 協議的數據中間層項目。它是在 mysql-proxy0.8.2 版本的基礎上,對其進行了優化,增加了一些新的功能特性。360 內部使用 Atlas 運行的 mysql 業務,每天承載的讀寫請求數達幾十億條。支持事物以及存儲過程。
-
Amoeba:由陳思儒開發,作者曾就職於阿里巴巴。該程序由 Java 語言進行開發,阿里巴巴將其用於生產環境。但是它不支持事務和存儲過程。
4.1、Amoeba 簡介
-
Amoeba: 是一 個以 MySQL 爲底層數據存儲,並對應提供 MySQL 協議接口的 proxy(代理),外號變形蟲
-
讀取請求發送給從服務器是,採用輪詢調度算法
-
amoeba 使用的 java 語言編寫,配置文件爲 xml
-
amoeba 主要負責對外的一個代理 IP
· 訪問這個 IP 時,發送的請求爲 “寫 " 請求,則會轉給主服務器
· 當發送的請求爲 “讀 " 時,會通過調度轉發給從服務器,使用輪詢算法,輪流分配給兩臺從服務器
-
amoeba 可以視爲調度器,如果主服務器掛掉 (單點故障),則會有 MHA 解決這個問題
五、搭建 MySQL 讀寫分離
1、實驗準備
2、amoeba(192.168.35.30) 安裝
- 安裝 java 環境,安裝 jdk(因爲 amoeba 是基於 jdk1.5 開發的,所以官方推薦使用 jkd1.5/jdk1.6,高版本不建議使用)
將amoeba-mysql-binary-2.2.0.tar.gz和jdk-6u
14-linux-x64.bin上傳到opt目錄下
[root@amoeba opt]# cp jdk-6u14-linux-x64.bin /usr/local/
[root@amoeba opt]# chmod +x jdk-6u14-linux-x64.bin
[root@amoeba opt]# ./jdk-6u14-linux-x64.bin
##enter往下翻頁--yes--enter
mv jdk1.6.0_14/ /usr/local/jdk1.6
##重命名爲了便於環境變量的設置
vim /etc/profile
unset i
unset -f pathmunge
export JAVA_HOME=/usr/local/jdk1.6
##指定jdk的位置
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
##amoeba文件的位置
export PATH=$PATH:$AMOEBA_HOME/bin
##調用家目錄識別amoeba的bin文件
source /etc/profile
java -version
- 安裝 amoeba 軟件
3、配置 amoeba 讀寫分離,兩個 slave 讀負載均衡
4、修改 amoeba 主配置文件和數據庫文件
- 配置 amoeba 服務
cp amoeba.xml amoeba.xml.bak
##備份amoeba的主配置文件
vim amoeba.xml
##修改主配置文件,即配置第三個賬戶(客戶端找amoeba的用戶身份)
30 <property >amoeba</property>
##root改爲amoeba;修改賬戶名(這裏是client訪問amoeba服務器時使用的賬號)
32 <property >123123</property>
##修改賬戶密碼(這裏是數據庫訪問amoeba服務器時使用賬號時用的密碼)
115 <property >master</property>
##修改默認池
117 取消註釋/,取消下面的註釋符號-->,改到這裏
118 <property >master</property>
119 <property >slaves</property>
cp dbServers.xml dbServers.xml.bak
##備份數據庫配置文件
vim dbServers. xml ##修改數據庫配置文件
23 <property >mysql</property>
##將text修改爲mysql;Mysql所有數據庫信息( show databases )
26 <property >test</property>
##amoeba訪 問三臺mysql數據庫的賬戶和密碼(賬戶爲test)
29 <property >123456</property>
##取消註釋,修改訪問數據庫的密碼
45 <dbServer >
##修改數據庫主服務器名/地址
48 <property >192.168.35.40</property>
##修改master服務器ip
52 <dbServer >
##修改從服務器名slave1
55 <property >192.168.35.10</property>
##修改從服務器地址
緊接複製52-57行,粘貼,添加第二臺服務器名
59 <dbServer >
##修改從服務器名爲slave2
62 <property >192.168.35.20</property>
##修改第二臺服務器IP
66 <dbServer >
這時可以複製會話另開一個頁面查看一下配置文件 (因爲 amoeba 需要一直開啓才能查詢到端口)
5、 開啓 amoeba
6、客戶端遠程登錄 amoeba
yum -y install mariadb
##下載mariadb客戶端;mairadb比MySQL更輕量級的版本
mysql -uamoeba -p123123 -h 192.168.35.30 -P8066
##遠程登錄amoeba服務器;amoeba會做代理,
所以指向的地址是amoeba的ip的端口8066
mariadb 的作用:
提供命令庫
提供連接數據的驅動
提供 tcp 的端口 3306
7、測試
測試一
client 端遠程訪問 amoeba 的地址,並進入數據庫創建新的數據庫,驗證 master 和 slaves 是否同步
client 端進入數據庫創建表 aa,發現 master+slave1+slave2 已同步創建數據表 aa
測試二:
測試 mysql 的讀寫分離,2 臺從服務器關閉主從同步,在客戶端數據庫的數據表內插入數據驗證 amoeba 讀寫分離
master 處理寫的任務,可以查詢到數據表 aa
從服務器處理讀的任務,查詢看不到數據
3. 測試三:
在從服務器上更改表數據,使用客戶端驗證從服務器讀,和輪詢的方式讀
來源:
https://blog.csdn.net/weixin_56667320/article/details/118911525?utm_medium=distribute.pc_feed.none-task-blog-short_term_tag-6.nonecase&depth_1-utm_source=distribute.pc_feed.none-task-blog-short_term_tag-6.nonecase
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/KXkytu7FUJXT1RH28WFYBA