1. 程式人生 > 資訊 >微軟 Edge Canary 更新:現可直接點選連結開啟 PWA 應用

微軟 Edge Canary 更新:現可直接點選連結開啟 PWA 應用

MYSQL主從複製與讀寫分離

一,主從複製

1.原理

主從複製原理:
首先主庫傳送更新事件到從庫;
然後從庫讀取更新記錄,並執行更新記錄;
最後使得從庫的內容與主庫保持一致。

2.複製型別

基於語句的複製(STATEMENT)∶在主伺服器上執行的SQL語句,在從伺服器上執行同樣的語句。MySQL預設採用基於語句的複製,效率比較高;
基於行的複製(ROW)︰把改變的內容複製過去,而不是把命令在從伺服器上執行一遍;
混合型別的複製(MIXED)︰預設採用基於語句的複製,一旦發現基於語句無法精確複製時,就會採用基於行的複製。

3.工作流程

1) Master 伺服器儲存記錄到二進位制日誌
每個事務更新資料完成之前,Master伺服器在二進位制日誌(Binary log)記錄變更的資料,寫入二進位制日誌完成後,Master伺服器通知儲存引擎提交事務;

2) Slave伺服器複製Master伺服器的日誌
SLAVE節點會開啟I/o執行緒,用於監聽master的二進位制日誌的更新,一旦發生更新內容,則向master的dump執行緒發出同步請求;
master的dump執行緒在接收到SLAVE的I/o請求後,會讀取二進位制日誌檔案中更新的資料,併發送給slave的I/o執行緒;
SLAVE的I/o執行緒接收到資料後,Slave伺服器將Master伺服器的二進位制日誌複製到其中繼日誌;

3) Slave伺服器重放複製過來的日誌
SQL slave thread處理該過程的最後一步,SQL執行緒從中繼日誌讀取事件,並重放其中的事件而更新Slave伺服器的資料,使其與Master伺服器中的資料一致。

核心部分:
二個日誌:二進位制日誌和中繼日誌
三個執行緒: master的dump和slave的I/O,SQL.

二,讀寫分離

1.原理

讀寫分離就是隻在主伺服器上寫,只在從伺服器上讀。基本的原理是讓主資料庫處理事務性(insert,update,delete)查詢,而從資料庫處理 select 查詢。
資料庫複製被用來把主資料庫上事務性查詢導致的變更,同步到叢集中的從資料庫。

2.讀寫分離存在的意義

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

3.使用場景

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

4.常見的mysql讀寫分離

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

2.基於中間代理層實現
代理一般位於客戶端和伺服器之間,代理伺服器接到客戶端請求後通過判斷後轉發到後端資料庫,有以下代表性程式。
(1)MySQL-Proxy。MySQL-Proxy 為 MySQL 開源專案,通過其自帶的 lua指令碼進行SQL 判斷。
(2)Atlas是由奇虎360的Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的資料中間層專案。
它是在mysql-proxy 0.8.2版本的基礎上,對其進行了優化,增加了一些新的功能特性。
360內部使用Atlas執行的mysql業務,每天承載的讀寫請求數達幾十億條。支援事物以及儲存過程。
(3)Amoeba:由陳思儒開發,作者曾就職於阿里巴巴。該程式由Java語言進行開發,阿里巴巴將其用於生產環境。但是它不支援事務和儲存過程。
Amoeba:是一個以MySql為底層資料儲存,並對應提供MySQL協議介面的proxy(代理),外號變形蟲,讀取請求傳送給從伺服器,並採用輪詢排程演算法
amoeba使用的java語言編寫,配置檔案為xml,
amoeba主要負責對外的一個代理IP,
訪問這個IP時,傳送的請求為“寫”請求,則會轉給主伺服器
當傳送的請求為“讀”時,會通過排程轉發給從伺服器,使用輪詢演算法,輪流分配給兩臺從伺服器。

三,主從複製配置

實驗環境:
master伺服器:192.168.118.11
slave1伺服器:192.168.118.13
slave2伺服器:192.168.118.14
amoeba伺服器:192.168.118.128
client:192.168.118.132

1.master伺服器配置

vim /etc/my.cnf
server-id = 1
log-bin=master-bin      #新增,主伺服器開啟二進位制日誌
log-slave-updates=true  #新增,允許從伺服器更新二進位制日誌

systemctl restart mysqld

mysql -u root -p
#給從伺服器授權
grant replication slave on *.* to 'myslave'@'192.168.118.%' identified by '123456';
flush privileges;

show master status;
#File 列顯示日誌名,Position 列顯示偏移量

2.從伺服器slave配置

vim /etc/my.cnf
#修改,注意id與Master的不同,兩個Slave的id也要不同
server-id = 2
#新增,開啟中繼日誌,從主伺服器上同步日誌檔案記錄到本地
relay-log=relay-log-bin
#新增,定義中繼日誌檔案的位置和名稱
relay-log-index=slave-relay-bin.index

systemctl restart mysqld

mysql -u root -p
#配置同步,注意 master_log_file 和 master_log_pos 的值要與Master查詢的一致,
change master to master_host='192.168.118.11' , master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=604;

start slave;					#啟動同步,如有報錯執行 reset slave;
show slave status\G				#檢視 Slave 狀態
//確保 IO 和 SQL 執行緒都是 Yes,代表同步正常。
Slave_IO_Running: Yes			#負責與主機的io通訊
Slave_SQL_Running: Yes			#負責自己的slave mysql程序

Slave_IO_Running: No 的可能性:
網路不通;
防火牆沒有關閉;
my.cnf配置有誤;
密碼、file檔名、position偏移量與master不符。

3.驗證(主伺服器建立,從伺服器檢視)

四,讀寫分離配置

1.安裝JAVA環境

Amoeba伺服器配置

cd /opt/
cp jdk-6u14-linux-x64.bin /usr/local/

cd /usr/local/
chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
按空格到最後一行
按yes,按enter

mv jdk1.6.0_14/ /usr/local/jdk1.6

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

source /etc/profile
java -version

2.安裝AMOEBA

mkdir /usr/local/amoeba
tar zxvf /opt/amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba
//如顯示amoeba start|stop 說明安裝成功

3.主從伺服器授權

在Master、Slave1、Slave2 的mysql上開放許可權給 Amoeba 訪問
grant all on *.* to 'test'@'192.168.118.%' identified by '123456';

4.配置amoeba讀寫分離

(1)修改amoeba配置檔案
cd /usr/local/amoeba/conf/
cp amoeba.xml amoeba.xml.bak
vim amoeba.xml           #修改amoeba配置檔案

#30行修改
<property name="user">amoeba</property>
#32行修改
<property name="password">123</property>
#115行修改
<property name="defaultPool">master</property>
#117行去掉註釋
<property name="writePool">master</property>
<property name="readPool">slaves</property>

(2)修改資料庫配置檔案
cp dbServers.xml dbServers.xml.bak

vim dbServers.xml
#23行註釋掉
作用:預設進入test庫 以防mysql中沒有test庫時,會報錯
<!-- mysql schema
<property name="schema">test</property>
-->
#26行修改
<!-- mysql user -->
<property name="user">test</property>
#---------28-30去掉註釋----------------------------------
<property name="password">123456</property>
#---------45修改,設定主伺服器的名Master------------------
<dbServer name="master"  parent="abstractServer">
#---------48修改,設定主伺服器的地址----------------------
<property name="ipAddress">192.168.118.11</property>
#---------52修改,設定從伺服器的名slave1-----------------
<dbServer name="slave1"  parent="abstractServer">
#---------55修改,設定從伺服器1的地址---------------------
<property name="ipAddress">192.168.118.13</property>
#---------58複製上面6行貼上,設定從伺服器2的名slave2和地址---
<dbServer name="slave2"  parent="abstractServer">
<property name="ipAddress">192.168.118.14</property>
#---------修改後的65或66修改-------------------------------------
<dbServer name="slaves" virtual="true">
#---------71修改----------------------------------------
<property name="poolNames">slave1,slave2</property>

/usr/local/amoeba/bin/amoeba start&	 
netstat -anpt | grep java		#檢視8066埠是否開啟,預設埠為TCP 8066
netstat -anpt | grep 8066


5.測試

client上測試:
安裝MySQL虛擬客戶端
yum -y install mysql mysql-server

登入AMOEBA代理伺服器:
mysql -u amoeba -p123 -h 192.168.118.128 -P8066

在master主伺服器上
use ceshi;
create table test (id int(10),name varchar(10),address varchar(20));

兩臺從伺服器上
stop slave;			#關閉同步
use test;

在slave1上
insert into test values('1','slave1','this_is_slave1');
在slave2上
insert into test values('2','slave2','this_is_slave2');
在master主伺服器上
insert into test values('3','master','this_is_master');

主伺服器上:



客戶端上:

主伺服器上:

從伺服器開啟同步:


client上:

總結

mysql主從複製,slave角色複製master角色的資料,以此來保證資料的完整性;
主從複製裡二進位制日誌與中繼日誌是為了:區分master與slave的關係;
通過amoeba代理伺服器,實現只在主伺服器上寫,只在從服務上讀,主資料庫處理事務性查詢,從資料庫處理 select 查詢;
主從複製主要是為了解決mysql單點故障,沒有冗餘備份的問題;
讀寫分離主要是為了解決mysql的I/O讀寫壓力不均衡的問題。
主從複製慢(延遲)有哪些可能:
網路延遲;
慢SQL語句過多;
從庫硬體比主庫差,導致複製延遲;
主伺服器的負載過大,被多個睡眠或者殭屍執行緒佔用,導致系統負載過大;
主從複製單執行緒,如果主庫寫併發太大,來不及傳送到從庫,就會導致延遲;