
Redo Log/archived log -->Capture process -->capure queue-->Read Process-->Export queue-->NETWORK--
>Import process-->Post queue-->Post Process-->target DB
我的测试环境:ndb1:XE ----->ndb3:DEMO
2 源端进程
sp_cop -->sp_ocap, sp_ordr, sp_xport
Cature Process(sp_ocap)
从redo logs/arch logs中读取active config中变化的数据,写到capture queue
每个data source有个capure process
Reader Process(sp_ordr)
从capture queue读取数据,加上路由信息写到export queue
每个data source有个read process
Export Process(sp_xport)
跟每个target建立一个TCP/IP连接,并从export queue读取数据,把数据传到目的端
每个source-target对都有一个Export Process
3目的端进程
ps -fu qust
sp_cop -->sp_pst_mt, sp_mport 0xc0a86e66+PI+ndb1+sp_mport+0xc0a86e65 R
Import Process(sp_mport)
与每个source建立一个TCP/IP连接,接受数据写到post queue中
每个source-target对都有一个Import Process
Post Process(sp_post_mt)
从post queue中读取数据,apply到目标数据库中
每个post queue都有一个Post Processs
4网络端口
lsof -i :2100
源端:
sp_cop TCP ndb1.test:2100 (LISTEN)
sp_xport TCP ndb1.test:34347->ndb3.test:2100 (ESTABLISHED)
目的端:
sp_cop TCP ndb3.test:2100 (LISTEN)
sp_mport TCP ndb3.test:2100->ndb1.test:34347 (ESTABLISHED)
sp_mport TCP ndb3.test:2100->ndb1.test:34347 (ESTABLISHED)
sp_cop在2端都监听2100端口
sp_xport连接到源端2100端口,只有一个连接
sp_mport连接到目的端 2100端口, 有2个连接
5 Oracle的连接(正常工作状态)
SQL>select username,module from v$session where username is not null order by 1,2
源端:
QUEST sp_ocap@ndb1.test (TNS V1-V3)
QUEST sp_ordr@ndb1.test (TNS V1-V3)
QUEST sp_ordr@ndb1.test (TNS V1-V3)
QUEST sp_ordr@ndb1.test (TNS V1-V3)
QUEST sp_ordr@ndb1.test (TNS V1-V3)
QUEST sp_ordr@ndb1.test (TNS V1-V3)
QUEST sp_ordr@ndb1.test (TNS V1-V3)
QUEST sp_ordr@ndb1.test (TNS V1-V3)
QUEST sp_ordr@ndb1.test (TNS V1-V3)
目的端:
QUEST Post-2100-ndb1-XE
QUEST sp_opst_mt@ndb3.test (TNS V1-V3)
6 queue的情况
qview list
源端:
o.XE+C
WRITER +PA+o.XE+sp_ocap+o.XE
READER +PR+o.XE+sp_ordr+o.XE
ndb1+X
WRITER +PR+o.XE+sp_ordr+o.XE
READER +PX+ndb1+sp_xport+0xc0a86e66 (192.168.110.102)
Capture Queue(+C)
用于快速存放捕捉道德变化数据
每个Oracle实例只有一个cature queue,用Oracle_SID命名:O.{ORACLE_SID}
Export Queue(+X)
用于存放加上路由的数据
缺省,一个Host/Server只有一个Export queue(多个Oracle实例共用),用hostname命名:{hostname}
用named export queue来实行每个实例用独立的queue
目的端:
ndb1+P+o.XE-o.DEMO
subqueues range from 0 to 3
WRITER +PI+ndb1+sp_mport+0xc0a86e65 (192.168.110.101)
READER +PP+ndb1+sp_opst_mt+o.XE-o.DEMO
PostQueue(+P)
用于存放收到的数据
每个source-target对都有一个Post Queue,以两个Oracle实例来命名:O.{SRC_SID}-O.{DEST_SID}
再看目的端post进程的参数
sp_mport 0xc0a86e66+PI+ndb1+sp_mport+0xc0a86e65 R
queue是源端export queue的reader+目的端post queue的writer
数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库。对于大访问量的网站,一般会采用读写分离,比如ebay的读写比率是260:1,也就是大型的电子商务网站的。网上看到说采用读写分离有如下工具:1,oracle的logical standby2, Quest公司的SharePlex3, DSG公司的RealSyncMySQLReplication可以将master的数据复制分布到多个slave上,然后可以利用slave来分担master的读压力。那么对于前台应用来说,就要考虑如何将读的压力分布到多个slave上。如果每个应用都需要来实现读写分离的算法,一则成本太高,二来如果slave增加更多的机器,应用就要随之修改。明显的,如果在应用和数据库间加一个专门用于实现读写分离的中间层,则整个系统的架构拥有更好的扩展性。MySQLProxy就是这么一个中间层代理,简单的说,MySQLProxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。对于应用来说,MySQLProxy是完全透明的,应用则只需要连接到MySQLProxy的监听端口即可。欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)