一凿歼、現(xiàn)狀
我們將一個(gè)大而全的系統(tǒng)一拆為三改基,容器既琴,發(fā)布城瞎,測(cè)試都已經(jīng)獨(dú)立出去城榛,但是原始的數(shù)據(jù)庫(kù)還是一套抄沮,現(xiàn)在需要將數(shù)據(jù)庫(kù)做一個(gè)拆分壮池,A峦朗、B禁偎、C三個(gè)系統(tǒng)有各自的數(shù)據(jù)庫(kù)之后荡含,我們的微服務(wù)化在現(xiàn)有部署、測(cè)試等已經(jīng)獨(dú)立的基礎(chǔ)上才算最終完成届垫,形成三個(gè)各自獨(dú)立的單元释液。因此本篇文章敘述的不是數(shù)據(jù)庫(kù)的水平拆分也不是垂直拆分,不是講述分庫(kù)分表装处,而是講述從業(yè)務(wù)系統(tǒng)去拆分?jǐn)?shù)據(jù)庫(kù)误债,把業(yè)務(wù)最終微服務(wù)化。
二妄迁、方法
2.1寝蹈、SOA
通過(guò)提供RPC接口,將原先共用的表有一方系統(tǒng)提供接口服務(wù)登淘,另一方系統(tǒng)來(lái)調(diào)用該接口箫老。這種情況下系統(tǒng)之間是解耦了,但是數(shù)據(jù)調(diào)用的時(shí)候一方還是要強(qiáng)依賴另一方黔州。這個(gè)時(shí)候要重新關(guān)注接口服務(wù)方如果down掉或者延時(shí)發(fā)生耍鬓,需要有容錯(cuò)機(jī)制阔籽,比如熔斷、降級(jí)等牲蜀。同時(shí)要考慮好數(shù)據(jù)的托底展示笆制,比如本機(jī)緩存,remote緩存涣达。詳細(xì)可參看《微服務(wù)下的網(wǎng)關(guān)與容錯(cuò)》里面有專項(xiàng)介紹在辆。
2.2、數(shù)據(jù)異構(gòu)
通過(guò)數(shù)據(jù)異構(gòu)的方式度苔,比如B系統(tǒng)與C系統(tǒng)原來(lái)是一張表匆篓,數(shù)據(jù)庫(kù)拆分之后這張表的數(shù)據(jù)放在了C系統(tǒng),但是B系統(tǒng)只需要這張表的部分字段寇窑,這個(gè)時(shí)候可以通過(guò)異構(gòu)平臺(tái)把C系統(tǒng)的表按需異構(gòu)到B系統(tǒng)中的一張表鸦概。這樣兩個(gè)系統(tǒng)之間徹底解耦,各自微服務(wù)化疗认,也沒(méi)有了SOA方式的強(qiáng)依賴問(wèn)題。關(guān)于數(shù)據(jù)異構(gòu)的詳細(xì)介紹可以參看這篇文章
《數(shù)據(jù)異構(gòu)的武器-BINLOG+MQ》
三伏钠、拆庫(kù)的步驟(mysql)
集群A(源庫(kù))
集群B(新搭建)
集群C(新搭建)
注意此方案需要停寫(xiě)横漏!
步驟一、搭建集群B熟掂、C
將集群B缎浇、C以從庫(kù)形式掛載到集群A
步驟二、將如下集群A主庫(kù)設(shè)置為只讀模式
192.168.x.x xx.mysql.xxx.com
命令:set global read_only=on;
步驟三赴肚、待從庫(kù)無(wú)延遲后素跺,集群B、C停止復(fù)制誉券,執(zhí)行如下操作
命令:stop slave;
此時(shí)A指厌、B、C三套集群均為只讀模式
步驟四踊跟、研發(fā)人員修改應(yīng)用url指向到正確的數(shù)據(jù)庫(kù)集群踩验,待確認(rèn)無(wú)誤后,(此時(shí)可回退商玫,打開(kāi)寫(xiě)后不可回退)
通知DBA將集群A箕憾、B、C三套打開(kāi)讀寫(xiě)
命令:set global read_only=off;
步驟五拳昌、拆分完成
步驟六
觀察一段時(shí)間后drop冗余表袭异,DBA在復(fù)制的時(shí)候?qū)嶋H上是全量復(fù)制,因此后續(xù)我們需要drop掉各自系統(tǒng)內(nèi)不需要的表炬藤∮澹可以用rename的方式先行標(biāo)出碴里,一段時(shí)間后再drop掉。
===================================================================
回退方案
步驟一畅买、集群B并闲、C打開(kāi)復(fù)制
命令:start slave;
步驟二、打開(kāi)集群A的讀寫(xiě)
命令:set global read_only=on;
四谷羞、SOA和微服務(wù)
SOA面向服務(wù)架構(gòu)帝火,是一種粗粒度、松耦合服務(wù)架構(gòu)湃缎,服務(wù)之間通過(guò)簡(jiǎn)單犀填、精確定義接口進(jìn)行通訊,不涉及底層編程接口和通訊模型嗓违。關(guān)鍵點(diǎn)是接口調(diào)用九巡,這是目前分布式系統(tǒng)中常用的方法。目前開(kāi)源的RPC框架也有很多比如知名的DUBBO服務(wù)等蹂季。
微服務(wù)的重點(diǎn)是業(yè)務(wù)系統(tǒng)要徹底組件化和服務(wù)化冕广,原有的單體應(yīng)用系統(tǒng)會(huì)拆分為多個(gè)可以獨(dú)立開(kāi)發(fā)、運(yùn)行偿洁、部署和運(yùn)維的小應(yīng)用撒汉。這些小的應(yīng)用之間如果需要交互就通過(guò)服務(wù)來(lái)完成,比如提供DUBBO接口服務(wù)涕滋。每個(gè)小應(yīng)用內(nèi)部從前端WEB到業(yè)務(wù)邏輯處理睬辐,到數(shù)據(jù)庫(kù)訪問(wèn),以及數(shù)據(jù)庫(kù)都是獨(dú)立的宾肺。
五溯饵、總結(jié)
業(yè)務(wù)簡(jiǎn)單,團(tuán)隊(duì)組織規(guī)模較小的時(shí)候一個(gè)單體應(yīng)用就可以支持當(dāng)時(shí)的業(yè)務(wù)發(fā)展锨用。隨著業(yè)務(wù)的發(fā)展規(guī)模越來(lái)越大丰刊,過(guò)程中如果技術(shù)架構(gòu)升級(jí)沒(méi)有跟上,就會(huì)面臨后期拆系統(tǒng)增拥,拆庫(kù)的的階段藻三。本篇文章結(jié)合我工作中自身的經(jīng)歷集中對(duì)數(shù)據(jù)庫(kù)的業(yè)務(wù)拆分做了描述,拆庫(kù)的原則以及數(shù)據(jù)庫(kù)新集群的創(chuàng)建方法跪者。對(duì)于拆分棵帽,我們要拆的粒度有多大,或者多小渣玲,沒(méi)有一個(gè)標(biāo)準(zhǔn)逗概,關(guān)于這方面,推薦大家閱讀一本書(shū)《恰如其分的軟件架構(gòu)》忘衍。
轉(zhuǎn)載請(qǐng)注明作者及出處逾苫,并附上鏈接http://www.reibang.com/p/590037e67162