mirrorlink如何使用与trans怎样才能同时使用了?谢谢!

GPDB · 特性分析 · Segment事务一致性与异常处理
事务一致性
这篇月报讲了Primary和Mirror之间各种数据和文件的同步过程。这些数据和文件的同步,看似彼此独立。那么如何保证某个时间点Mirror的所有数据是一致的,即任何时间点发生HA切换,Mirror都能达到一致性状态并对外提供服务?正如我们前面提到的,这主要靠同步的顺序来保证:
AO表的同步是个强同步的过程,数据在更新发生时即同步到Mirror,Primary和Mirror时刻保持着数据一致性。另一方面,事务提交时会更新AO表文件的尾指针信息,并同步到备库。这样事务提交后,Mirror肯定可以看到所有已提交的数据。所以Primary failover切换后AO表数据不会丢失,不影响事务的一致性。
Heap表的数据的更新会写入相应的Xlog,同时确保Heap表数据页的同步必须在对应的Xlog同步完成后才能进行。
你可能有疑问:Heap表的数据更新同步到Mirror是个异步的过程,那么会不会出现一个事务提交了,Heap表数据更新还没有来得及同步到Mirror,这时候Primary failover切换到Mirror,导致Heap表数据丢失?当然不会的,虽然Heap表数据同步是一个异步的过程,但是Xlog的同步却是一个强同步的过程。Primary failover切换到Mirror之后,Mirror上面的Xlog和Primary的Xlog完全一致,这时候Mirror会启动startup进程,进入Recovery模式,应用Xlog,所以即便Heap表数据没有同步过来,Mirror也会通过Xlog将这些没有过来的数据恢复。
其他文件的更新,其实不需要实时同步。切换时Mirror会回放Xlog,恢复这些文件的内容。
这样,如果Primary与Mirror保持同步,上述顺序保证了任何时间点Mirror节点的数据都能达到一致。但是,假如出现了网络阻塞或者Mirror宕机的情况,数据就无法及时同步到Mirror。此时,如果Primary在更新数据时,等待数据被同步到Mirror,就会被阻塞,而无法继续提供服务。为解决这个问题,Greenplum提供了异常处理机制。
此处所说的对网络阻塞或Mirror宕机异常情况的处理,其实就是Greenplum所谓的Change Tracking机制。在Primary向Mirror同步数据的时候,如果Mirror长时间没有回应Primary,那么Primary将会认为Mirror挂掉,这个时候Master将会把系统表gp_segment_configuration里面的Mirror状态(status)置为’d’,同时把Primary的模式(mode)置为’c’,而这个’c’模式就是ChangeTracing Mode。Primary进入Change Tracking状态后,不会再试图同步数据到Mirror(每次有数据更改时会调用FileRepPrimary_IsMirroringRequired进行检查是否需要同步)。
Primary进入ChangeTracing Mode之后,每次更新数据产生的Xlog,会被立即解析成数据更新记录,放入到Change log文件里面(参见ChangeTracking_AddRecordFromXlog函数)。Change log文件在pg_changetracking/目录下:
-rw------- 1 bgadmin bgadmin
196608 Apr 10 18:22 CT_LOG_FULL
-rw------- 1 bgadmin bgadmin
403991 Apr 10 18:22 FILEREP_CONFIG_LOG
-rw------- 1 bgadmin bgadmin
Apr 10 18:22 FILEREP_LOG
ChangeTracing信息具体记录在CT_LOG_FULL文件里面,文件记录的核心信息是当前的数据更新在Xlog中的位置,文件内容经过解析之后如下:
postgres=# select * from gp_changetracking_log(0) limit 3;
segment_id | dbid | space |
| blocknum | persistent_tid | persistent_sn
------------+------+-------+-------+------+--------------+----------+----------------+---------------
1663 | 10893 | 5043 | (0/) |
0 | (2,36)
1663 | 10893 | 5043 | (0/) |
0 | (2,36)
1663 | 10893 | 5043 | (0/) |
0 | (2,36)
Change log里面只存放Heap表的修改信息。AO表的更新信息存放在特定的表中,无需另外记录。而Xlog和普通文件,都完整保存在Primary的数据目录下,无需记录修改信息(具体原因在异常恢复的说明中有介绍)。
Change log其实是存放的Heap表更改页的元数据信息,并未存放更改的实际内容。所以它并不占用太多存储空间,另外它还可以对相同页上的修改进行合并,进一步压缩大小,减少恢复时间(参见FileRepPrimary_RunChangeTrackingCompacting函数)。
那么,Mirror在宕机后重启或网络拥塞发生后恢复正常了,重新连接到Primary后,如何通过Change log恢复同步呢?
在异常情况消失后,需要通过执行gprecoverseg -a命令来恢复同步。下面我们还是把数据分成4类来说明这个过程总数据同步恢复的过程。
Heap表恢复
当我们执行gprecoverseg -a命令恢复Mirror时,Primary的Resync进程通过Change log信息,再结合Xlog,将积累的数据变更再次同步给Mirror。
具体步骤如下:
Resync manager进程通过调用一系列函数FileRepResyncManager_InResyncTransition-&PersistentFileSysObj_MarkPageIncrementalFromChangeLog-&PersistentFileSysObj_MarkPageIncremental-&PersistentFileSysObj_UpdateTuplePageIncremental,将需要更新的Page的信息加入到ResyncEntry同步队列中。
Resync worker进程从ResyncEntry队列中取出需要恢复到Mirror的任务,通过调用一系列函数FileRepPrimary_ResyncBufferPoolIncrementalWrite-&smgrwrite将Page写到缓冲区中,再通过上面的方法构造消息发送到Mirror。
因为AO表不写Xlog,所以Change log中并没有记录AO表更新操作。那么Mirror是如何将AO表恢复到和Primary数据一致呢?其实在GP catalog中有一张gp_persistent_relation_node表,里面记录了AO表同步到Mirror的最后一次文件位置(mirror_append_only_loss_eof),以及当前文件位置(mirror_append_only_loss_eof)。AO表文件位置的更新是在FinishPreparedTransaction函数完成的(执行COMMIT PREPARED or ROLLBACK PREPARED)。最后Resync worker进程将会把未同步到Mirror的增量数据再次通过消息同步给它,最终达到Primary和Mirror的数据一致性。
postgres=# select * from gp_persistent_relation_node where relfilenode_oid=25386;
-[ RECORD 1 ]-------------------------------------+----------
tablespace_oid
database_oid
relfilenode_oid
segment_file_num
relation_storage_manager
persistent_state
create_mirror_data_loss_tracking_session_num
mirror_existence_state
mirror_data_synchronization_state
mirror_bufpool_marked_for_scan_incremental_resync | f
mirror_bufpool_resync_changed_page_count
mirror_bufpool_resync_ckpt_loc
mirror_bufpool_resync_ckpt_block_num
mirror_append_only_loss_eof
mirror_append_only_new_eof
relation_bufpool_kind
parent_xid
persistent_serial_num
previous_free_tid
Xlog文件的恢复
我们知道,Xlog文件其实都保存在Primary的pg_xlog目录下。在异常恢复时,把改目录下的文件直接发送到Mirror即可。需要注意的是,异常期间是可以正常删除或规定Xlog文件的,这是因为,所有的Heap表和AO表的修改都已经被保存下来了,无需另外保留一份Xlog来恢复数据。
其他文件的恢复
其他文件(pg_control, pg_clog, pg_mutitrans等文件)也和Xlog文件一样,在恢复时直接全部发送到Mirror,具体参见FileRepResyncManager_ResyncFlatFiles函数。
本作品采用进行许可。PHP CURLOPT_RETURNTRANSFER选项,该如何理解 ?_百度知道OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(1)
图像的几何变换是在不改变图像内容的前提下对图像像素的进行空间几何变换,主要包括了图像的平移变换、镜像变换、缩放和旋转等。本文首先介绍了图像几何变换的一些基本概念,然后再OpenCV2下实现了图像的平移变换、镜像变换、缩放以及旋转,最后介绍几何的组合变换(平移+缩放+旋转)。
1.几何变换的基本概念
1.1 坐标映射关系
图像的几何变换改变了像素的空间位置,建立一种原图像像素与变换后图像像素之间的映射关系,通过这种映射关系能够实现下面两种计算:
原图像任意像素计算该像素在变换后图像的坐标位置
变换后图像的任意像素在原图像的坐标位置
对于第一种计算,只要给出原图像上的任意像素坐标,都能通过对应的映射关系获得到该像素在变换后图像的坐标位置。将这种输入图像坐标映射到输出的过程称为&向前映射&。反过来,知道任意变换后图像上的像素坐标,计算其在原图像的像素坐标,将输出图像映射到输入的过程称为&向后映射&。但是,在使用向前映射处理几何变换时却有一些不足,通常会产生两个问题:映射不完全,映射重叠
映射不完全 输入图像的像素总数小于输出图像,这样输出图像中的一些像素找不到在原图像中的映射。
上图只有(0,0),(0,2),(2,0),(2,2)四个坐标根据映射关系在原图像中找到了相对应的像素,其余的12个坐标没有有效值。
根据映射关系,输入图像的多个像素映射到输出图像的同一个像素上。
上图的四个像素(0,0),(0,1),(1,0),(1,1)都会映射到输出图像的(0,0)上,那么(0,0)究竟取那个像素值呢?
要解决上述两个问题可以使用&向后映射&,使用输出图像的坐标反过来推算改坐标对应于原图像中的坐标位置。这样,输出图像的每个像素都可以通过映射关系在原图像找到唯一对应的像素,而不会出现映射不完全和映射重叠。所以,一般使用向后映射来处理图像的几何变换。从上面也可以看出,向前映射之所以会出现问题,主要是由于图像像素的总数发生了变化,也就是图像的大小改变了。在一些图像大小不会发生变化的变换中,向前映射还是很有效的。
1.2.插值算法
对于数字图像而言,像素的坐标是离散型非负整数,但是在进行变换的过程中有可能产生浮点坐标值。例如,原图像坐标(9,9)在缩小一倍时会变成(4.5,4.5),这显然是一个无效的坐标。插值算法就是用来处理这些浮点坐标的。常见的插值算法有最邻近插值法、双线性插值法,二次立方插值法,三次立方插值法等。本文主要介绍最邻近插值和双线性插值,其他一些高阶的插值算法,以后再做研究。
最邻近插值
也被称为零阶插值法,最简单插值算法,当然效果也是最差的。它的思想相当简单,就是四舍五入,浮点坐标的像素值等于距离该点最近的输入图像的像素值。
上面的代码可以求得(x,y)的最邻近插值坐标(u,v)。
最邻近插值几乎没有多余的运算,速度相当快。但是这种邻近取值的方法是很粗糙的,会造成图像的马赛克、锯齿等现象。
双线性插值
它的插值效果比最邻近插值要好很多,相应的计算速度也要慢上不少。双线性插值的主要思想是计算出浮点坐标像素近似值。那么要如何计算浮点坐标的近似值呢。一个浮点坐标必定会被四个整数坐标所包围,将这个四个整数坐标的像素值按照一定的比例混合就可以求出浮点坐标的像素值。混合比例为距离浮点坐标的距离。
假设要求坐标为(2.4,3)的像素值P,该点在(2,3)和(3,3)之间,如下图
u和v分别是距离浮点坐标最近两个整数坐标像素在浮点坐标像素所占的比例
P(2.4,3) = u * P(2,3) + v * P(3,3),混合的比例是以距离为依据的,那么u = 0.4,v = 0.6。
上面是只在一条直线的插值,称为线性插值。双线性插值就是分别在X轴和Y轴做线性插值运算。
下面利用三次的线性插值进行双相信插值运算
(2.4,3)的像素值 F1 = m * T1 + (1 & m) * T2
(2.4,4)的像素值 F2 = m * T3 + (1 & m ) * T4
(2.4,3.5)的像素值 F = n * F1 + (1 & n) * F2
这样就可以求得浮点坐标(2.4,3.5)的像素值了。
求浮点坐标像素F,设该浮点坐标周围的4个像素值分别为T1,T2,T3,T4,并且浮点坐标距离其的横坐标的差为m,纵坐标的差为n。
F1 = m * T1 + (1 & m) * T2
F2 = m * T3 +& (1 & m) *T4
F = n * F1 + (1 & n) * F2
上面就是双线性插值的基本公式,可以看出,计算每个像素像素值需要进行6次浮点运算。而且,由于浮点坐标有4个坐标近似求得,如果这个四个坐标的像素值差别较大,插值后,会使得图像在颜色分界较为明显的地方变得比较模糊。
2.图像平移
图像的平移变换就是将图像所有的像素坐标分别加上指定的水平偏移量和垂直偏移量。平移变换根据是否改变图像大小分为两种
左边平移图像的大小发生了,在保证图像平移的同时,也保存了完整的图像信息。右边的平移图像大小没有变化,故图像的部分被截除了。
2.1平移变换原理
设dx为水平偏移量,dy为垂直偏移量,(x0,y0)为原图像坐标,(x,y)为变换后图像坐标,则平移变换的坐标映射为
这是向前映射,即将原图像的坐标映射到变换后的图像上。
其逆变换为
,向后映射,即将变换后的图像坐标映射到原图像上。在图像的几何变换中,一般使用向后映射。
2.2 基于OpenCV的实现
图像的平移变换实现还是很简单的,这里不再赘述.
平移后图像的大小不变
void GeometricTrans::translateTransform(cv::Mat const& src, cv::Mat& dst, int dx, int dy)
CV_Assert(src.depth() == CV_8U);
const int rows = src.
const int cols = src.
dst.create(rows, cols, src.type());
for (int i = 0; i & i++)
p = dst.ptr&Vec3b&(i);
for (int j = 0; j & j++)
//平移后坐标映射到原图像
int x = j -
int y = i -
//保证映射后的坐标在原图像范围内
if (x &= 0 && y &= 0 && x & cols && y & rows)
p[j] = src.ptr&Vec3b&(y)[x];
平移后图像的大小变化
void GeometricTrans::translateTransformSize(cv::Mat const& src, cv::Mat& dst, int dx, int dy)
CV_Assert(src.depth() == CV_8U);
const int rows = src.rows + abs(dy); //输出图像的大小
const int cols = src.cols + abs(dx);
dst.create(rows, cols, src.type());
for (int i = 0; i & i++)
p = dst.ptr&Vec3b&(i);
for (int j = 0; j & j++)
int x = j -
int y = i -
if (x &= 0 && y &= 0 && x & src.cols && y & src.rows)
p[j] = src.ptr&Vec3b&(y)[x];
ps:这里图像变换的代码以三通道图像为例,单通道的于此类似,代码中没有做处理。
3.图像的镜像变换
图像的镜像变换分为两种:水平镜像和垂直镜像。水平镜像以图像垂直中线为轴,将图像的像素进行对换,也就是将图像的左半部和右半部对调。垂直镜像则是以图像的水平中线为轴,将图像的上半部分和下班部分对调。效果如下:
3.1变换原理
设图像的宽度为width,长度为height。(x,y)为变换后的坐标,(x0,y0)为原图像的坐标
水平镜像变换
其逆变换为
垂直镜像变换
其逆变换为
3.2基于OpenCV的实现
水平镜像的实现
void GeometricTrans::hMirrorTrans(const Mat &src, Mat &dst)
CV_Assert(src.depth() == CV_8U);
dst.create(src.rows, src.cols, src.type());
int rows = src.
int cols = src.
switch (src.channels())
const uchar *
for (int i = 0; i & i++){
origal = src.ptr&uchar&(i);
p = dst.ptr&uchar&(i);
for (int j = 0; j & j++){
p[j] = origal[cols - 1 - j];
const Vec3b *origal3;
Vec3b *p3;
for (int i = 0; i & i++) {
origal3 = src.ptr&Vec3b&(i);
p3 = dst.ptr&Vec3b&(i);
for(int j = 0; j & j++){
p3[j] = origal3[cols - 1 - j];
分别对三通道图像和单通道图像做了处理,由于比较类似以后的代码只处理三通道图像,不再做特别说明。
在水平镜像变换时,遍历了整个图像,然后根据映射关系对每个像素都做了处理。实际上,水平镜像变换就是将图像坐标的列换到右边,右边的列换到左边,是可以以列为单位做变换的。同样垂直镜像变换也如此,可以以行为单位进行变换。
垂直镜像变换
void GeometricTrans::vMirrorTrans(const Mat &src, Mat &dst)
CV_Assert(src.depth() == CV_8U);
dst.create(src.rows, src.cols, src.type());
int rows = src.
for (int i = 0; i & i++)
src.row(rows - i - 1).copyTo(dst.row(i));
src.row(rows - i - 1).copyTo(dst.row(i));
上面一行代码是变换的核心代码,从原图像中取出第i行,并将其到目标图像。
顶不住了啊,写理论部分太痛苦了啊,明天继续几何变换的后续几种:转置、缩放、旋转以及组合变换。
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
在OpenCV2:图像的几何变换,平移.镜像.缩放.旋转(1)主要介绍了图像变换中的向前映射.向后映射.处理变换过程中浮点坐标像素值的插值算法,并且基于OpenCV2实现了两个简单的几何变换:平移和镜像变换.本文主要稍微复杂点的两个几何变换:缩放和旋转. 1.图像缩放 图像的缩放主要用于改变图像的大小,缩放后图像的图像的宽度和高度会发生变化.水平缩放系数,控 ...
转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/),请尊重他人的辛勤劳动成果,谢谢!相信大家使用多点对图片进行缩放,平移的操作很熟悉了,大部分大图的浏览都具有此功能,有些app还可以对图片进行旋转操作,QQ的大图浏览就可以对图片进行旋转操作,大家都知道对 ...
关注javalearns
随时随地学Java 或扫一扫 随时随地学Java 相信大家使用多点对图片进行缩放,平移的操作很熟悉了,大部分大图的浏览都具有此功能,有些app还可以对图片进行旋转操作,QQ的大图浏览就可以对图片进行旋转操作,大家都知道对图片进行缩放,平移,旋转等操作可以使用Matrix来实现,Matrix就是一个3X3的矩阵,对图片的处理可分为 ...
本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程&数字图像处理&及课件进行讲解,主要通过MFC单文档视图实现显示BMP图片空间几何变换,包括图像平移.图形旋转.图像反转倒置镜像和图像缩放的知识.同时文章比较详细基础,没有采用GDI+获取矩阵,而是通过读取BMP图片信息头和矩阵像素实现变换,希望该篇文 ...
16:38 转载自 huangwen2003 最终编辑 huangwen2003 声明:本文原创于yafeilinux的百度博客,/yafeilinux 转载请注明出处. 现在我们来实现在窗口上显示图片,并学习怎样将图片进行平移,缩放,旋转和扭曲.这里我们是利用QPixmap类来实现图片显示的. 一 ...
仿射变换的原理 在条形码识别软件中有图像预览的功能.有时预览的图像需要进行转置(旋转180度或者90度).缩放.镜像(左右反转)等操作.OpenCV提供了相应的函数进行以上操作.例如: 转置:cv::WarpAffine() 缩放:cv::resize() 镜像:cv::remap() 如果同时要转置,缩放和镜像,就需要进行三次图像运算.其实以上三个操作都是 ...
#region 设置分辨率 using (Graphics g = pictureBox2.CreateGraphics()) { g.Clear(pictureBox2.BackColor);//清空 Bitmap bmp = new Bitmap(pictureBox1.Image);//创建bitmap对象 ///设置分辨率 bmp.SetResolu ...
图像的一些操作,可以通过矩阵进行简化,例如,旋转,平移,缩放,切边等,下面看如果简化. 还记得过去中学时代学的旋转公式嘛? 可以让x,y绕坐标原点顺时针旋转一个θ角度,当然,如果你希望,不是绕坐标原点旋转,而是自定义的一个点的话,那么可以平移坐标后,再旋转: 平移坐标公式是, x = x - a y = y - b
简单的上面两个操作,我们可以一个一个进行 ...3图像的镜像变换_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
3图像的镜像变换
上传于||暂无简介
阅读已结束,如果下载本文需要使用2下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢TransIP Mirror
TransIP MIRROR
MIRROR.TRANSIP.NET
This mirror is hosted in our datacenter located in Amsterdam, The Netherlands.
All files are available over http, ftp and rsync.
Arch Linux
Debian-archive
Debian-backports
Debian-volatile
Fedora-epel
Gentoo-portage
Linux Mint ISO
Linux Mint Packages
OpenIndiana
TurnkeyLinux
Ubuntu releases
Ubuntu cdimages
Disclaimer
TransIP is not liable for any use, storage or transmission of any files stored on this archive.
This archive is provided as a free service to the public and all files are provided as is.
& 2016 TransIP B.V.

我要回帖

更多关于 mirrorlink怎么使用 的文章

 

随机推荐