sqlserver讀寫分離--事務釋出
一、背景
在複製的運用場景中,事務釋出是使用最為廣泛的,我遇到這樣一個場景:在YangJiaLeClub資料庫中有表、儲存過程、檢視、使用者定義函式,需要提供給其它程式讀取放入快取,程式需要比較及時的獲取到這些資料,需要從許可權和效能控制的角度出發,我採用了SQL Server的事務複製技術和timestamp,下面只講述事務複製的搭建過程;
二、實現過程
(一) 環境資訊
作業系統 | IP | 伺服器名稱 | 資料庫版本 | 資料庫名稱 | 資料庫帳號資訊 | |||||||
釋出伺服器 | Windows 10 企業版 | 192.168.2.100 | DESKTOP-SDIK64J | SQL Server 2008 R2 | YangJiaLeClub | sa/bwl reg/bwl |
||||||
分發伺服器 | 與釋出伺服器同一臺機器 | |||||||||||
訂閱伺服器1 | Windows Server 2008r2 Enterprise | 192.168.2.117 | Win-DB-Slave1 | SQL Server 2008 R2 | YangJiaLeClub | sa/bwl |
||||||
訂閱伺服器2 | Windows Server 2008r2 Enterprise | 192.168.2.118 | Win-DB-Slave2 | SQL Server 2008 R2 | YangJiaLeClub | sa/bwl |
1.釋出伺服器:
1.1 在防火牆中設定入棧規則,開放1433和1434埠
2.訂閱伺服器:
2.1.Sql Native Client 10配置(32位)新建別名:
2.Host 伺服器名與IP對映(由於釋出訂閱伺服器名稱必須是:伺服器+“\”+例項名訪問)
目錄: C:\Windows\System32\drivers\etc
3.控制面板\使用者帳戶\憑據管理器
建立憑據
(二) 搭建步驟
A. 釋出伺服器配置
首先在釋出資料庫和訂閱資料庫上建立相同的帳號和密碼(reg/bwl),並且設定YangJiaLeClub資料庫的安全物件,設定這樣的帳號的目的就是為了和程式連線到資料庫的帳號區分開,可以做許可權上的控制,方便問題的排查;
--更改安全物件的所有權
ALTER AUTHORIZATION ON DATABASE::[YangJiaLeClub] TO [reg]
在F盤目錄下建立資料夾:F:\DB\Net\ReplData,並設定這個資料夾為共享目錄,共享使用者為biwl
(Figure1_1:資料夾許可權)
這裡需要設定SQL Server Agent登陸帳號為上面資料夾訪問使用者biwl(釋出伺服器和訂閱伺服器都需要建立biwl相同帳號和密碼設定SQLServer代理服務)
(Figure1_2:SQL Server Agent登陸帳號)
(Figure2:配置分發-分發伺服器)
如果你設定快照資料夾路徑為:F:\DB\Net\ReplData,即使你的釋出伺服器本身就是分發伺服器,如果訂閱伺服器是另外一臺機器,那麼在請求(Pull)訂閱(如果是推送(Push)訂閱就沒有這個限制)模式下訂閱代理是無法訪問到這個快照檔案的;除非你釋出伺服器、分發伺服器和訂閱伺服器都是同一臺機器;你應該設定快照資料夾路徑為:\\DESKTOP-SDIK64J\ReplData;
(Figure3:快照資料夾)
(Figure4:資料庫)
- 快照發布:隔一段時間會覆蓋訂閱伺服器的資料庫,在訂閱伺服器上做的修改同樣被覆蓋;
- 事務釋出:是一種接近實時地從源到目標分發資料的方法;
- 具有可更新訂閱的事務釋出:訂閱伺服器可更新發布伺服器的資料;
- 合併釋出:釋出伺服器和訂閱伺服器的更新都會同步到對方,注意ID在合併釋出上的衝突
(Figure5:事務釋出)
注意表必須有主鍵才能進行復制,選擇你必要的欄位,這樣可以減輕快照檔案的大小和傳輸時間,而且在業務邏輯上更加安全,如果有需要,你還可以對記錄進行過濾;
(Figure6_1:表字段)
(Figure6_2:儲存過程)
(Figure6_3:檢視)
(Figure6_4:使用者定義函式)
(Figure7:快照代理)
(Figure8:安全設定)
使用上面建立好的ReplicationUser帳號作為連線到釋出伺服器的帳號和密碼;
(Figure9:使用剛剛建立的帳號密碼)
(Figure10:建立釋出)
(Figure11:釋出名稱)
(Figure12:檢視複製情況)
B. 訂閱伺服器配置
建立完釋出伺服器(分發伺服器也一起建立了),接下來就可以建立訂閱伺服器了,下面是具體的步驟:
(Figure13:查詢釋出伺服器)
(Figure14:查詢釋出伺服器)
(Figure15:選擇釋出)
(Figure16:請求訂閱)
(Figure17:訂閱資料庫)
(Figure18:訂閱連線)
(Figure19:帳號密碼)
(Figure20:代理計劃)
(Figure21:初始化訂閱)
(Figure22:建立訂閱)
(Figure23:訂閱)
(Figure24:釋出伺服器上的訂閱)
(Figure25:複製監視器)
(Figure26:訂閱資料庫新增的表)
(Figure27:表資料)
三、注意事項
1. 在SQL SERVER下實現釋出伺服器和訂閱伺服器的通訊正常(即可以互訪),開啟1433埠,在防火牆中設定入站規則;
2. 釋出伺服器與訂閱伺服器的SQL Server Agent代理帳號必須設定的一樣,否則不能互訪;
3. 如果你希望在複製的過程中一併複製非聚集索引,可以對釋出屬性-專案進行如下設定,修改完之後需要重新生成快照;
(Figure28:非聚集索引複製)
4. 複製代理:快照代理(snapshot agent) 分散式代理(Distribution agent)日誌讀代理(log Reader agent) 合併代理(Merge agent) 佇列讀代理(Queue Reader Agent)
5. 適合使用複製的一些場景包括:
1) 負載均衡:通過將資料複製到其它資料庫伺服器來減少當前伺服器的負載,比如說最典型的應用就是分發資料來分離OLTP和OLAP環境;
2) 分割槽:將經常使用的資料和歷史資料隔離,將歷史資料複製到其它資料庫中;
3) 授權:將一部分資料提供給需要使用資料的人,以供其使用;
4) 資料合併:每個區域都有其各自的資料,將其資料進行合併。比如一個大公司,每個地區都有其各自的銷售資料,總部需要彙總這些資料;
5) 故障轉移:複製所有資料,以便故障時進行轉移;
6. 快照複製或事務複製生成快照檔案的型別有:
架構 (.sch)、資料 (.bcp)、約束和索引 (.dri)、約束 (.idx)、觸發器 (.trg)(只用於更新訂閱伺服器)、壓縮的快照檔案 (.cab)。
四、疑問
1. SQL Server 只有在完整日誌模式下才能使用複製嘛?
解惑:在簡單模式下一樣可以使用複製;
2. 如果是跨網段(跨機房)的釋出與訂閱,有沒辦法實現?需要注意什麼?
解惑:可以通過修改host檔案的方式搭建複製,請參考:SQL Server跨網段(跨機房)複製
3. 如果說上面的情況可以在host設定,但是如果有埠對映的,host也無法設定吧?
解惑:在SQL Server配置管理器裡建立別名,同樣可參考:SQL Server跨網段(跨機房)複製
4. 訂閱的形式可以選擇推送訂閱或者請求訂閱,請求訂閱降低分發伺服器處理工作的開銷,這個開銷有多大呢?怎麼計算影響?
解惑:只有在有很多訂閱伺服器的時候才比較明顯,推送訂閱與請求訂閱更大的區別是在管理方面的不同;