1. 程式人生 > >ORACLE讀寫分離(注:根據網上資料搭建完成步奏總結)

ORACLE讀寫分離(注:根據網上資料搭建完成步奏總結)

研究問題:                                            

1.      

什麼是讀寫分離?

2.      為什麼要做讀寫分離?

3.      ORACLE讀寫分離的方式,各有優缺點?

4.      詳解其中一種ORACLE讀寫分離方式。

一、 什麼是讀寫分離?

如圖:

       

Ø  官方定義

               

了確保資料庫產品的穩定性,很多資料庫擁有雙機熱備功能。也就是,第一臺     資料庫伺服器,是對外提供增刪改業務的生產伺服器;第二臺資料庫伺服器,主要進         行讀的操作。

Ø  我的理解

                2臺數據庫伺服器,其中一臺資料庫伺服器進行資料寫入操作,另一臺資料庫服     

務器進行資料的讀取。2臺數據庫之間資料要進去快速的資料同步。

二、 為什麼要做讀寫分離?

        因為資料庫的“寫”(寫10000條資料到oracle可能要3分鐘)操作是比較耗時的。

但是資料庫的“讀”(從oracle10000條資料可能只要5秒鐘)。

所以讀寫分離,解決的是,資料庫的寫入,影響了查詢的效率。

a、讀寫分離的好處

1)      增加冗餘

2)      增加了機器的處理能力

3)      對於讀操作為主的應用,使用讀寫分離是最好的場景,因為可以確保寫的伺服器壓力更小,而讀又可以接受點時間上的延遲。

b、讀寫分離提高效能之原因

1)     物理伺服器增加,負荷增加

2)     主從只負責各自的寫和讀,極大程度的緩解X鎖和S鎖爭用

3)     從庫同步主庫的資料和主庫直接寫還是有區別的,通過主庫傳送來的binlog恢復資料,但是,最重要區別在於主庫向從庫傳送binlog是非同步的,從庫恢復資料也是非同步的

4)     讀寫分離適用與讀遠大於寫的場景,如果只有一臺伺服器,當select很多時,updatedelete會被這些select訪問中的資料堵塞,等待select結束,併發效能不高。 對於寫和讀比例相近的應用,應該部署雙主相互複製

5)     可以在從庫啟動是增加一些引數來提高其讀的效能,當然這些設定也是需要根據具體業務需求來定得,不一定能用上

6)     分攤讀取。假如我們有13從,不考慮上述1中提到的從庫單方面設定,假設現在1 分鐘內有10條寫入,150條讀取。那麼,13從相當於共計40條寫入,而讀取總數沒變,因此平均下來每臺伺服器承擔了10條寫入和50條讀取(主庫不 承擔讀取操作)。因此,雖然寫入沒變,但是讀取大大分攤了,提高了系統性能。另外,當讀取被分攤後,又間接提高了寫入的效能。所以,總體效能提高了,說白了就是拿機器和頻寬換效能。

7)     複製另外一大功能是增加冗餘,提高可用性,當一臺資料庫伺服器宕機後能通過調整另外一臺從庫來以最快的速度恢復服務,因此不能光看效能,也就是說11從也是可以的。

三、 ORACLE讀寫分離的方式,各有優缺點?

        讀寫分離的重點其實就是資料同步,能實現資料實時同步的技術很多,基於OS(例如VERITAS VVR),基於儲存複製(中高階儲存大多都支援),基於應用分發或者基於資料庫層的技術。因為資料同步可能並不是單一的DB整庫同步,會涉及到業務資料選擇以及多源整合等問題,因此OS複製和儲存複製多數情況並不適合做讀寫分離的技術首選。

        基於日誌的Oracle複製技術,Oracle自身元件可以實現,同時也有成熟的商業軟體。選商業的獨立產品還是Oracle自身的元件功能,這取決於多方面的因素。比如團隊的相應技術運維能力、專案投入成本、業務系統的負載程度等。

a、主從同步

a.1、採用Oracle自身元件功能

        無外乎Logical StandbyStream以及11gPhysical Standby(Active Data Guard),對比來說,Stream最靈活,但最不穩定,11g Physical Standby支援恢復與只讀並行,但由於並不是日誌的邏輯應用機制,在讀寫分離的場景中最為侷限。如果技術團隊對相關技術掌握足夠充分,而選型方案的處理能力又能支撐資料同步的要求,採用Oracle自身的元件完全可行。

a.1.1DG方案

        DG方案也叫ADG方案,英語全稱Physical Standby(Active DataGuard)。支援恢復與只讀並行,但由於並不是日誌的邏輯應用機制,在讀寫分離的場景中最為侷限 ,將生產機的logfiles傳遞給容災機,通過Redo Apply技術來保障資料映象能力,物理上提供了與生產資料庫在資料塊級的一致性映象,也叫physical方式。Physical方式支援非同步傳輸方式,但容災機處在恢復狀態,不可用;

a.1.2Logical Standby

        通過SQL Apply(即Log Miner)技術,將接收到的日誌檔案還原成SQL語句,並在邏輯備份資料庫上執行,從而達到資料一致性的目的,也叫logical 方式。logical方式只支援同步傳輸方式,但容災機可以處在read-only狀態

a.1.3Stream

        最靈活,但最不穩定

a.2、選擇商業化的產品

        更多出於穩定性、處理能力等考慮。市面上成熟的Oracle複製軟體也無外乎幾種,無論是老牌的Shareplex,還是本土DSG公司的RealSync和九橋公司的DDS,或是Oracle新貴GoldenGate,都是可供選擇的目標。隨著GoldenGateOracle收購和推廣,個人認為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 jdkbin目錄下的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

啟動報錯,匯入ojdbc7mycatlib目錄下


 

b.1.8、測試

        navicat客戶端連線mycat (ipmycat所在的伺服器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、軟體環境準備

        2oracle資料庫伺服器,做單例資料庫的讀寫分離。安裝配置略

        2rac資料庫伺服器。做叢集環境的讀寫分離。安裝配置略

b、安裝配置前檢查

        單例資料庫的讀寫分離,檢測2oracle伺服器宿主機是否安裝oracle資料庫,是否配置和版本等等一致。安裝配置略

        Rac叢集資料庫的讀寫分離,分別檢測2rac叢集資料庫是環境配置、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,所以至少需要建立4Standby 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所以至少需要建立4Standby 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專案,這裡面我們需要多個數據源。 在此之前,我們在專案中一般會使用一