ORACLE讀寫分離(注:根據網上資料搭建完成步奏總結)
研究問題:
1.
2. 為什麼要做讀寫分離?
3. ORACLE讀寫分離的方式,各有優缺點?
4. 詳解其中一種ORACLE讀寫分離方式。
一、 什麼是讀寫分離?
如圖:
Ø 官方定義
Ø 我的理解
2臺數據庫伺服器,其中一臺資料庫伺服器進行資料寫入操作,另一臺資料庫服
二、 為什麼要做讀寫分離?
因為資料庫的“寫”(寫10000條資料到oracle可能要3分鐘)操作是比較耗時的。
但是資料庫的“讀”(從oracle讀10000條資料可能只要5秒鐘)。
所以讀寫分離,解決的是,資料庫的寫入,影響了查詢的效率。
a、讀寫分離的好處
1) 增加冗餘
2) 增加了機器的處理能力
3) 對於讀操作為主的應用,使用讀寫分離是最好的場景,因為可以確保寫的伺服器壓力更小,而讀又可以接受點時間上的延遲。
b、讀寫分離提高效能之原因
1) 物理伺服器增加,負荷增加
2) 主從只負責各自的寫和讀,極大程度的緩解X鎖和S鎖爭用①
3) 從庫同步主庫的資料和主庫直接寫還是有區別的,通過主庫傳送來的binlog恢復資料,但是,最重要區別在於主庫向從庫傳送binlog是非同步的,從庫恢復資料也是非同步的
4) 讀寫分離適用與讀遠大於寫的場景,如果只有一臺伺服器,當select很多時,update和delete會被這些select訪問中的資料堵塞,等待select結束,併發效能不高。 對於寫和讀比例相近的應用,應該部署雙主相互複製
5) 可以在從庫啟動是增加一些引數來提高其讀的效能,當然這些設定也是需要根據具體業務需求來定得,不一定能用上
6) 分攤讀取。假如我們有1主3從,不考慮上述1中提到的從庫單方面設定,假設現在1 分鐘內有10條寫入,150條讀取。那麼,1主3從相當於共計40條寫入,而讀取總數沒變,因此平均下來每臺伺服器承擔了10條寫入和50條讀取(主庫不 承擔讀取操作)。因此,雖然寫入沒變,但是讀取大大分攤了,提高了系統性能。另外,當讀取被分攤後,又間接提高了寫入的效能。所以,總體效能提高了,說白了就是拿機器和頻寬換效能。
7) 複製另外一大功能是增加冗餘,提高可用性,當一臺資料庫伺服器宕機後能通過調整另外一臺從庫來以最快的速度恢復服務,因此不能光看效能,也就是說1主1從也是可以的。
三、 ORACLE讀寫分離的方式,各有優缺點?
讀寫分離的重點其實就是資料同步,能實現資料實時同步的技術很多,基於OS層(例如VERITAS VVR),基於儲存複製(中高階儲存大多都支援),基於應用分發或者基於資料庫層的技術。因為資料同步可能並不是單一的DB整庫同步,會涉及到業務資料選擇以及多源整合等問題,因此OS複製和儲存複製多數情況並不適合做讀寫分離的技術首選。
基於日誌的Oracle複製技術,Oracle自身元件可以實現,同時也有成熟的商業軟體。選商業的獨立產品還是Oracle自身的元件功能,這取決於多方面的因素。比如團隊的相應技術運維能力、專案投入成本、業務系統的負載程度等。
a、主從同步
a.1、採用Oracle自身元件功能
無外乎Logical Standby、Stream以及11g的Physical Standby(Active Data Guard),對比來說,Stream最靈活,但最不穩定,11g Physical Standby支援恢復與只讀並行,但由於並不是日誌的邏輯應用機制,在讀寫分離的場景中最為侷限。如果技術團隊對相關技術掌握足夠充分,而選型方案的處理能力又能支撐資料同步的要求,採用Oracle自身的元件完全可行。
a.1.1、DG方案
DG方案也叫ADG方案,英語全稱Physical Standby(Active DataGuard)。支援恢復與只讀並行,但由於並不是日誌的邏輯應用機制,在讀寫分離的場景中最為侷限 ,將生產機的logfiles傳遞給容災機,通過Redo Apply技術來保障資料映象能力,物理上提供了與生產資料庫在資料塊級的一致性映象,也叫physical方式。Physical方式支援非同步傳輸方式,但容災機處在恢復狀態,不可用;
a.1.2、Logical Standby
通過SQL Apply(即Log Miner)技術,將接收到的日誌檔案還原成SQL語句,並在邏輯備份資料庫上執行,從而達到資料一致性的目的,也叫logical 方式。logical方式只支援同步傳輸方式,但容災機可以處在read-only狀態
a.1.3、Stream
最靈活,但最不穩定
a.2、選擇商業化的產品
更多出於穩定性、處理能力等考慮。市面上成熟的Oracle複製軟體也無外乎幾種,無論是老牌的Shareplex,還是本土DSG公司的RealSync和九橋公司的DDS,或是Oracle新貴GoldenGate,都是可供選擇的目標。隨著GoldenGate被Oracle收購和推廣,個人認為GoldenGate在容災、資料分發和同步方面將大行其道。
b、讀寫分離
b.1、資料庫中間鍵mycat 實現oracle資料庫讀寫分離
b.1.1、下載mycat
wget https://github.com/MyCATApache/Mycat-download/blob/master/1.4-RELEASE/Mycat-server-1.4-release-20151019230038-linux.tar.gz |
b.1.2、解壓
tar -zxvf Mycat-server-1.4-release-20151019230038-linux.tar.gz |
b.1.3、配置環境變數:
vi /etc/profile 末尾加上 MYCAT_HOME=/MyCat/mycat //mycat安裝路徑 PATH=$PATH:$MYCAT_HOME/bin export MYCAT_HOME PATH |
b.1.4、修改配置檔案
/MyCat/mycat/conf/wrapper.conf 修改 wrapper.java.command= /usr/java/jdk1.7.0_80/bin/java //修改wrapper.java.command 為jdk的bin目錄下的java |
b.1.5、設定mycat使用者名稱和密碼
修改配置檔案/MyCat/mycat/conf/server.xml
<user name="root"> //使用者名稱和密碼隨意設定 <property name="password">root</property> <property name="schemas">ORACLEDB</property>//schemas對應schema.xml中的schema </user> <user name="admin"> <property name="password">admin</property> <property name="schemas">ORACLEDB</property> <property name="readOnly">true</property> </user> |
b.1.6、修改配置檔案/MyCat/mycat/conf/schema.xml
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://org.opencloudb/"> <schema name="ORACLEDB" checkSQLschema="false" dataNode="dn1"> // </schema> <dataNode name="dn1" dataHost="localhost1" database="db1" /> <!—database表空間名稱 --> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="oracle" dbDriver="jdbc"②> <heartbeat>select 1 from dual</heartbeat> <writeHost host="hostM1" url="jdbc:oracle:thin:@10.16.13.23:1521/orcl" user="test_user" password="test_user" > //寫入的資料庫 <readHost host="hostS1" url="jdbc:oracle:thin:@10.16.12.9:1521/orcl" user="strmadmin" password="strmadmin"/> //讀取的資料庫 </writeHost> </dataHost> </mycat:schema> |
配置結束
b.1.7、啟動mycat
mycat start |
可以檢視日誌檔案看是否報錯/MyCat/mycat/logs/mycat.log
b.1.8、測試
用navicat客戶端連線mycat (ip為mycat所在的伺服器ip,使用者名稱和密碼是在server.xml中配置的user)
navcat for mysql客戶端 可能會連線不上報2003-can't connect to mysql server on 10038
需要配置防火牆開啟8066埠
vi /etc/sysconfig/iptables #編輯防火牆配置檔案,新增以下內容 -A INPUT -m state --state NEW -m tcp -p tcp --dport 8066 -j ACCEPT /etc/init.d/iptables restart #重啟防火牆使配置生效 |
b.1.9、程式中配置如下
<hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> //驅動 我測試的mysql oracle貌似都可以 <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> <!-- <property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property> <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> --> <property name="hibernate.connection.password">root</property> <property name="hibernate.connection.url">jdbc:mysql://10.16.1.2:8066/ORACLEDB</property> //這你沒看錯 就是mysql ,換成oracle是不可以的 <property name="hibernate.connection.username">root</property>
<property name="hibernate.format_sql">true</property> <property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="org/crazyit/app/domain/Customer.hbm.xml"/>
</session-factory> </hibernate-configuration> |
b.1.10、相關命令
關閉mycat mycat stop 檢視mycat狀態 mycat status
|
四、 ADG
a、軟體環境準備
2個oracle資料庫伺服器,做單例資料庫的讀寫分離。安裝配置略
b、安裝配置前檢查
單例資料庫的讀寫分離,檢測2個oracle伺服器宿主機是否安裝oracle資料庫,是否配置和版本等等一致。安裝配置略
Rac叢集資料庫的讀寫分離,分別檢測2個rac叢集資料庫是環境配置、oracle版本等一致。安裝配置略
相關資訊
|
IP地址規劃: |
SID: |
db_name: |
db_unique_name |
主資料庫 |
192.168.11.120 |
pri |
pri |
pri |
備份資料庫 |
192.168.11.121 |
std |
pri |
std |
注意:dbname要配置成一樣的,並且關閉防火牆。
環境變數:指向oracle安裝的目錄
export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1 export ORACLE_SID=pri (備庫端設定為std) export LD_LIBRARY_PATH=$ORACLE_HOME/bin:/bin:/usr/bin:/usr/local/bin: export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib export PATH=$ORACLE_HOME/bin:$PATH
|
c、安裝配置
注意:主庫需要建好庫(執行dbca),備庫不需要。
c.1、將資料庫改為強制日誌模式 (主庫)
[[email protected] ~]$sqlplus / as sysdba
檢視當前是否強制日誌模式:
[email protected]>select name,log_mode,force_logging from v$database;
NAME LOG_MODE FOR --------- ------------ --- PRI NOARCHIVELOG NO |
[email protected]>alter database force logging;
成功後再次檢視
[email protected]> select name,log_mode,force_logging fromv$database;
NAME LOG_MODE FOR --------- ------------ --- PRI NOARCHIVELOG YES
|
c.2、建立密碼檔案 (主庫)
注意:兩端分別建立自己的密碼檔案好像有問題,備庫的密碼檔案需要跟主庫一致,否則導致日誌傳輸不到備庫,有待驗證。我最後是將主庫的密碼檔案直接copy到備庫,重新命名後使用。
[[email protected]~]$ cd $ORACLE_HOME/dbs
[[email protected]]$ ls
hc_pri.dat init.ora initpri.ora lkPRI orapwpri snapcf_pri.f spfilepri.ora |
已經有一個密碼檔案了
[[email protected]]$ orapwd file=orapwpri password=oracle force=y
這條命令可以手動生成密碼檔案,force=y的意思是強制覆蓋當前已有的密碼檔案(如果有可以不建立) file= :檔名 password=:資料庫超級管理員即sys使用者的密碼
將主庫的密碼檔案copy給備庫,並重命名
[[email protected] dbs]$ scp orapwpri192.168.11.121:$ORACLE_HOME/dbs/orapwstd
c.3、建立standby redolog日誌組 (主庫)
注意:standby redo log的檔案大小與primary 資料庫online redo log 檔案大小相同。standby redo log日誌檔案組的個數依照下面的原則進行計算:Standby redo log組數公式>=(每個instance日誌組個數+1)*instance個數,假如只有一個節點,這個節點有三組redolog,所以Standby redo log組數>=(3+1)*1 == 4,所以至少需要建立4組Standby redo log
檢視當前執行緒與日誌組的對應關係及日誌組的大小:
[email protected]>select thread#,group#,bytes/1024/1024 from v$log;
THREAD# GROUP# BYTES/1024/1024 --------------- ------------- ------------------------ 1 1 50 1 2 50 1 3 50 |
如上,我現在的環境有三組redolog,每個日誌組的大小都是50M,所以Standby redo log組 數>=(3+1)*1== 4所以至少需要建立4組Standby redo log,大小 均為50M (thread:線 程,只有在多例項資料庫才有用的引數,例如RAC環境,單 例項不考慮)
檢視當前有哪些日誌組及其成員:
[email protected]>col member for a50
[email protected]>select group#,member from v$logfile;
GROUP# MEMBER ---------- -------------------------------------------------- 3 /u01/app/oracle/oradata/pri/redo03.log 2 /u01/app/oracle/oradata/pri/redo02.log 1 /u01/app/oracle/oradata/pri/redo01.log |
先手動建立standby log日誌組所需的目錄:建立新目錄只是為了便於區分,並非必須
[[email protected]]$ cd /u01/app/oracle/oradata/
[[email protected]]$ ls
standbylog pri |
新建4個日誌組作為standby redolog日誌組,大小與原來的日誌組一致:由於已經存在 group1-3,,所以group號只能從4開始
[email protected]>alter database add standby logfile group 4'/u01/app/oracle/oradata/standbylog/std_redo04.log' size 50m;
[email protected]>alter database add standby logfile group 5 '/u01/app/oracle/oradata/standbylog/std_redo05.log'size 50m;
[email protected]>alter database add standby logfile group 6'/u01/app/oracle/oradata/standbylog/std_redo06.log' size 50m;
[email protected]>alter database add standby logfile group 7'/u01/app/oracle/oradata/standbylog/std_redo07.log' size 50m;
檢視standby 日誌組的資訊:
[email protected]>select group#,sequence#,status, bytes/1024/1024 from v$standby_log;
GROUP# SEQUENCE# STATUS BYTES/1024/1024 ---------- ------------------ ------------------- ------------------------ 4 0 UNASSIGNED 50 5 0 UNASSIGNED 50 6 0 UNASSIGNED 50 7 0 UNASSIGNED 50 |
檢視當前有哪些日誌組及其成員:
相關推薦
ORACLE讀寫分離(注:根據網上資料搭建完成步奏總結)
研究問題:  
ORACLE叢集配置(注:根據網上資料自行搭建成功步奏總結)
一、 安裝前準備 1. 2臺或多臺linux伺服器 2. 每臺伺服器一個公用ip一個私有ip 3. 公
springboot2.0.3:讀寫分離,使用AOP根據方法名動態切換數據源。
move net 流程 adl rim tis sig mov put springboot版本:2.0.3!!! springboot版本:2.0.3!!! springboot版本:2.0.3!!! 我搭好的環境是:springboot 2.0.3+mybatis 大致
ORACLE 資料同步 容災備份恢復 主從架構 讀寫分離 (OGG,ADG,DSG,高階複製,流複製,logmnr)
ORACLE 幾種同步災備手段(OGG,ADG,DSG,高階複製,流複製,logmnr) 2017年07月14日 13:45:47 小學生湯米 閱讀數:11073 目前所接觸的Oracle 的災備以及同步手段主要有ADG,OGG,DSG,高階複製,流複製以及自主開發的基於
使用spring實現讀寫分離(mysql主從複製)五:一主多從的實現
很多實際使用場景下都是採用“一主多從”的架構的,使用輪詢演算法實現,目前只需要修改DynamicDataSource即可。 1.1. 實現 import java.lang.reflect.Field; import java.util.ArrayList; impo
MySQL Proxy 讀寫分離(實戰總結)
mysql proxy;讀寫分離 規劃: 主mysql服務器:192.168.1.21 從mysql服務器: 192.168.1.22 mysql讀寫分離器:192.168.1.23 1、讀寫分離服務器上解壓安裝包,並添加對應用戶,並編輯啟動腳本; # tar xf mysql-proxy-
Mycat實現讀寫分離(一)
mycatMycat介紹Mycat是一個國產中間件產品,作用在應用層和數據庫之間架橋,使應用通過MyCat來對後端數據庫進行管理,是一款國人自主的開源的中間件產品。算是比較優秀的一款,前身是阿裏公司在維護,很多公司也慢慢的在嘗試接入這個產品,但不得不說官方文檔似乎做的不太友好。至於為什麽選擇MyCat可能只有
使用Spring實現讀寫分離( MySQL實現主從復制)
sign eve replicat win [] 做了 用戶名 指定 ati 1. 背景 我們一般應用對數據庫而言都是“讀多寫少”,也就說對數據庫讀取數據的壓力比較大,有一個思路就是說采用數據庫集群的方案, 其中一個是主庫,負責寫入數據,我們稱之為:寫庫; 其它都是從庫,
使用Spring+MySql實現讀寫分離(二)spring整合多數據庫
ont 依據 xml配置 實現 整合 配置 item 匹配 mic 緊接著上一章,因為現在做的項目還是以spring為主要的容器管理框架,所以寫以下spring如何整合多個數據源。 1. 背景 我們一般應用對數據庫而言都是“讀多寫少”,也就說對數據庫讀取數據的壓力比較大
企業 - mysql 讀寫分離(proxy)
mysql 讀寫分離(proxy) MySQL ProxyMySQL Proxy是一個處於你的client端和MySQL server端之間的簡單程序,它可以監測、分析或改變它們的通信。它
MYSQL讀寫分離解決方案:MariaDB MaxScale部署實錄
maxscaleMASTER(KING01)[root@king01 ~]# mysql -uroot -pabcd.1234 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 173 S
MYSQL讀寫分離解決方案:MYCAT部署實錄
mysql mycat 讀寫分離 MASTER (KING01)[root@king01 ~]# mysql -uroot -pabcd.1234 mysql> show master status; +------------------+----------+--------------
mycat學習02--摸打滾爬之mycat主從復制於讀寫分離(線上經驗)
方案 nac url 特殊 break user 啟動 通過 doc 上一篇文章講到了mycat的安裝和配置,相信驗證過的朋友已經知道了,上一篇的做法已經實現了主從復制與讀寫分離的效果,這裏給大家詳細說以下讀寫分離部分:我的架構還是雙主雙從架構:(試驗環境1主一從)效果一樣
MMM架構實現MySQL高可用讀寫分離(進階版,包含Amoeba)
meid _id status mysqld 服務無法啟動 flush 忽略 kit pri 前兩天逛博客偶然發現了某大神寫的關於MMM的文章,看完就迫不及待的自己試了一下,大神寫的很順暢,以為自己也能操作的很順暢,但是實際情況是手腳太不麻利,碰到很多坑,如果大神的
mysql主從復制及讀寫分離(附安裝包)
download inux libaio script 關閉防火墻 安裝包 useradd tor 數據 實驗目的:在實際生產環境中,如果對數據庫的讀和寫都在同一個數據庫服務器中操作,無論在安全性、高可用性,還是高並發等各個方面都是完全不能滿足實際需求的,因此,一般需要通過
主從庫同步與讀寫分離(百度雲教學視訊分享)
目錄 一、理論解析 二、教學視訊 一、理論解析 第一步,Master 及主伺服器將對資料的操作記錄到二進位制日誌當中(Binary log)當中。在每個事務更新資料完成之前,Master 在日誌裡記錄這些改變,MySql 將日誌序列的寫入二進位制當中,在事
Linux 使用Mycat實現讀寫分離(基於Mysql的讀寫分離)
各位同學大家好,今天給大家分享一下用Mycat進行資料庫的讀寫分離,本篇文章是基於上一篇的mysql主從複製。Linux上實現Mysql的主從複製(為Mycat讀寫分離作準備) 在上一篇文章中,我們在兩個伺服器使用同版本的作業系統和mysql: 伺服器1:centos7.3,mysql5.6 伺服器
Spring Boot2.0.3 Mybatis Sharding-jdbc3.X整合實現資料庫的讀寫分離(一)MySql的主從配置
Mysql的安裝 這個網上一大堆的教程,我這裡安裝的mysql5.7。這裡就不細說了,直接貼相應的命令 wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm yum locali
阿里雲Redis讀寫分離典型場景:如何輕鬆搭建電商秒殺系統
背景 秒殺活動是絕大部分電商選擇的低價促銷,推廣品牌的方式。不僅可以給平臺帶來使用者量,還可以提高平臺知名度。一個好的秒殺系統,可以提高平臺系統的穩定性和公平性,獲得更好的使用者體驗,提升平臺的口碑,從而提升秒殺活動的最大價值。 本次主要討論阿里云云資料庫Redis
CentOS6中MySql5.6資料庫主從複製/讀寫分離(二)
程式碼層面實現讀寫分離 在文章(一)中我們已經有了兩個資料庫而且已經實現了主從資料庫同步,接下來的問題就是在我們的業務程式碼裡面實現讀寫分離,假設我們使用的是主流的ssm的框架開發的web專案,這裡面我們需要多個數據源。 在此之前,我們在專案中一般會使用一