123
 123

Tip: 看不到本站引用 Flickr 的图片? 下载 Firefox Access Flickr 插件 | AD: 订阅 DBA notes --

2018-05-25 Fri

21:01 Show parameter (1 Bytes) » Oracle Scratchpad
A
08:26 浅谈如何才能购买宇舶高仿手表 (1466 Bytes) » dba on unix

目前市场上关于宇舶高仿手表有很多,如何购买它也成为了很多人比较苦恼的话题。我们一般在选择高仿手表的时候会有两种购买方式一种是实地购买一种是网上购买,由于实地购买根据不同的地方可以说会有较大的差异,购买时需要自己去根据当地情况选择,所以不做介绍。

既然如此如何通过网络购买宇舶高仿手表自然也就成了一个话题。我们在选择网购高仿手表的时候一定要注意一下几个方面,一是时间,这是时间是指这个高仿公司存在的时间,尽量找那些时间比较久的高仿公司,否则质量恐怕没有太大保证。二就是价格上,一般价格在800以下的高仿表都不是高仿表只能算是仿制表,达不到高仿的程度。三是看售后,看看有没有售后抱退换修之类的服务项目,也是选择高仿手表的必备考虑条件之一。

很多人都在抱怨高仿手表的质量不行,其实并不是质量不行而是大多数人买的都是冒充高仿表的普通仿制表,一个是瑞士日本机芯,一个是国产机芯差别自然比较大了,所以如何选择高仿手表才是关键。

01:15 All Secondary die, Primary hang? – SQL Server 2017 on Linux (13310 Bytes) » Channel [K]

关于AVAILABILITY_MODE

需要注意的是,与Oracle Data Guard不尽相同的概念是,在Always On AG中每个replica上都可以设置自己的AVAILABILITY_MODE。
AVAILABILITY_MODE参数有三个可选值,分别是SYNCHRONOUS_COMMIT、ASYNCHRONOUS_COMMIT和CONFIGURATION_ONLY。

  • SYNCHRONOUS_COMMIT:同步提交,意味着主replica的事务必须等到备replica将变更日志写入磁盘中才可以提交。可以设置包括主replica在内的最多三个replica处于同步提交状态。
  • ASYNCHRONOUS_COMMIT:异步提交,意味着replica无需等待备replica的动作而可以直接提交成功。
  • CONFIGURATION_ONLY:仅同步AG配置元数据。设置为该值的replica仅会从主replica中将AF配置的元数据同步过来,不会同步任何用户表数据。

在一个多节点replica的AG环境中,如果:

  • 主库和其中任何一个备库设置为SYNCHRONOUS_COMMIT,则主库的日志提交必须等待该备库完成日志写入;
  • 主库设置为SYNCHRONOUS_COMMIT,而所有备库都设置为ASYNCHRONOUS_COMMIT,则主库无需等待;
  • 主库设置为ASYNCHRONOUS_COMMIT,则无视备库上该参数的设置,主库均无需等待。

在多节点的AG环境中,假设一个主库配置了两个同步的secondary,那么是不是要等待这两个secondary都完成日志写入才能提交事务呢?此时又引入了required_synchronized_secondaries_to_commit参数。

关于required_synchronized_secondaries_to_commit

required_synchronized_secondaries_to_commit参数是在SQL Server 2017中引入的,这个参数从直观意义上就可以看得出是指定当commit的时候需要有个几个同步的secondary replica存活。

这个参数在三节点的AG集群中,默认值为1,也就是如果至少要存活一个secondary replica,主库上的事务才可以提交,否则commit就会一直等待。这很好理解。
但是不好理解的是,该参数可以手工修改为0,从字面上看应该是说,即使所有secondary replica都不同步了,也是可以允许commit的。

但是实际情况却并非如此,修改为0是不起作用的。通过以下测试可以知道。

首先,设置required_synchronized_secondaries_to_commit参数为0

sudo pcs resource update ag_cluster required_synchronized_secondaries_to_commit=0

[Kamus@centos1 ~]$ sql
1> select name,required_synchronized_secondaries_to_commit from sys.availability_groups;
2> GO
name                           required_synchronized_secondaries_to_commit
------------------------------ -------------------------------------------
ag1                                                                      0

(1 rows affected)

现在三个节点都是正常状态。

1> select r.replica_server_name,r.availability_mode_desc,r.session_timeout ,rs.connected_state_desc
2> from sys.availability_replicas r,sys.dm_hadr_availability_replica_states rs
3> where r.replica_id=rs.replica_id;
4> GO
replica_server_name            availability_mode_desc         session_timeout connected_state_desc
------------------------------ ------------------------------ --------------- ------------------------------
centos1                        SYNCHRONOUS_COMMIT                          10 CONNECTED
centos2                        SYNCHRONOUS_COMMIT                          10 CONNECTED
centos3                        SYNCHRONOUS_COMMIT                          10 CONNECTED

(3 rows affected)

在主节点上进行Insert,可以成功,这很好。

1> insert into t1 select * from sys.databases;
2> GO

(6 rows affected)

停掉一个secodary replica。显示第二个节点已经DISCONNECTED。

1> select r.replica_server_name,r.availability_mode_desc,r.session_timeout ,rs.connected_state_desc
2> from sys.availability_replicas r,sys.dm_hadr_availability_replica_states rs
3> where r.replica_id=rs.replica_id;
4> GO
replica_server_name            availability_mode_desc         session_timeout connected_state_desc
------------------------------ ------------------------------ --------------- ------------------------------
centos1                        SYNCHRONOUS_COMMIT                          10 CONNECTED
centos2                        SYNCHRONOUS_COMMIT                          10 DISCONNECTED
centos3                        SYNCHRONOUS_COMMIT                          10 CONNECTED

(3 rows affected)

在主库上进行Insert,还是可以成功,这很好。

1> insert into t1 select * from sys.databases;
2> GO

(6 rows affected)

再停掉一个secodary replica。显示2、3节点都已经DISCONNECTED。

1> select r.replica_server_name,r.availability_mode_desc,r.session_timeout ,rs.connected_state_desc
2> from sys.availability_replicas r,sys.dm_hadr_availability_replica_states rs
3> where r.replica_id=rs.replica_id;
4> GO
replica_server_name            availability_mode_desc         session_timeout connected_state_desc
------------------------------ ------------------------------ --------------- ------------------------------
centos1                        SYNCHRONOUS_COMMIT                          10 CONNECTED
centos2                        SYNCHRONOUS_COMMIT                          10 DISCONNECTED
centos3                        SYNCHRONOUS_COMMIT                          10 DISCONNECTED

(3 rows affected)

在主库上执行Insert,此时hang住,这很不好。

1> insert into t1 select * from sys.databases;
2> GO

更讨厌的是,对于该表的查询也会hang住,这就更不好了。

2> select count(*) from t1;
3> GO

现在数据库中的等待是什么呢?确实是HADR_SYNC_COMMIT。

1> select STATUS,COMMAND,DATABASE_ID,WAIT_TYPE,WAIT_TIME from sys.dm_exec_requests where command='INSERT';
2> GO
STATUS                         COMMAND                        DATABASE_ID WAIT_TYPE                      WAIT_TIME
------------------------------ ------------------------------ ----------- ------------------------------ -----------
suspended                      INSERT                                   5 HADR_SYNC_COMMIT                      1670

(1 rows affected)

如果我们更进一步做一个session的xevent trace,可以看到等待的是WaitForHarden,而Harden的意思即是remote replica的日志写入。现在主库在等待一个备库的日志完成写入,然后自己才能提交成功。在正常情况下,当主库不再需要等待备库而可以自行commit的情况下,在xevent trace中应该出现将备库的commit_policy标志为donothing状态,也就是在xevent中应该要出现hadr_db_partner_set_policy事件才是正常的,然而这里并没有出现。

Picture1.png

但是我们明明把required_synchronized_secondaries_to_commit参数设置为0了,这很违反常识,不是吗?

结论

在SQL on Linux中如果设置了availability_mode为SYNCHRONOUS_COMMIT,那么必须至少有一个secondary replica(或者一个config node)是存活的,否则priamry replica中就不再允许任何DML操作,而尝试对于某表进行DML之后,还会进一步阻塞对于该表的查询。即使设置了required_synchronized_secondaries_to_commit=0也是无效的。也许微软需要更新一下文档,明确说明在多个sync的secondary存在的情况下,该参数即使修改为0也仍然按照1来处理。
这是一个很奇怪的design,因为这强制去掉了当一个集群中所有备库都崩溃时,主库能够自动转为异步提交模式的功能,从而造成了所有备库失效则会影响主库业务正常进行这样一个大问题。
实际上这个design是在SQL on Linux 2017 CU1之后才修改的,在CU1之前还是允许当所有备库都失效以后,主库仍然是可以正常读写的。甚至在现在的文档中仍然保留了这样的描述。

Picture2.png
以上文档描述来自:High availability and data protection for availability group configurations

这意味着在SQL Server 2017 CU 1之后,不再支持单纯的read-scale功能的AG了。虽然不太理解微软的SQL Server程序员是怎么考虑这个问题的,但是现状就是如此。

相比起Oracle的Data Guard而言,也就是现在SQL Server的AG只有同步(等同于DG的Maximum protection),异步(等同于DG的Maximum performance)这样两种方式,而缺少了DG的Maximum availability模式。
我只能认为这是一个设计理念的问题,微软的程序员更倾向于关注数据一致性,但是我期望在未来SQL Server可以对此进行改进。

Share

2018-05-24 Thu

17:27 Missing Audit (1 Bytes) » Oracle Scratchpad
A
10:31 帝舵高仿手表日常养护很重要 (1584 Bytes) » dba on unix

很多人或许会认为只有昂贵的高端手表才需要格外的养护,其实哪怕只是售价为几千元的帝舵精仿手表,同样也是需要大家精心养护的,这样才能使用更长的时间。但是对于许多不经常接触手表,或者说并未深入手表相关养护知识的人来说,不清楚其日常的养护倒也是很正常的,这里我们就来详细的介绍了解一下。

如果说长时间佩戴,这时候是需要注意一个防水问题的。哪怕是再好的手表,虽然商家是承诺可以防水的,但是如果长时间出于温水当中,也是很容易导致密封圈老化,进而影响到手表的正常使用的。另外就是现如今夏季的使用,人体长时间的出汗也是会对帝舵高仿手表造成一定腐蚀的,这一点大家也要注意。如果说是平常不怎么佩戴,这时候其实也需要养护。一般是建议大家放置在干燥的位置,减少手表受潮的情况。这时候的受潮不仅仅是可能导致机芯受潮,其实也是很容易造成皮革变形的,这一点大家同样需要注意一些才是。另外就是一个磁场的问题了,其实磁场过强的话也是会影响到手表机芯的,进而导致手表出现慢分或者是不准等等情况,这些大家也都是需要注意避免才行的。

2018-05-23 Wed

12:42 沛纳海高仿手表保养很重要 (1464 Bytes) » dba on unix

在很多人的眼中,一块好的手表是需要具备防水功能的,并且还能保证时间的精准。其实现如今很多手表也都是可以达到这样的要求的,但是也有不少是追求品牌的,就像沛纳海手表,有的人会认为佩戴之后整个人的精神都格外不同了。虽然向往的人很多,但是真正能够拥有的人却并不多,因为这一品牌的手表价格并不低,也不是一般人能够承受的。或许沛纳海高仿手表是更好的选择,好的保养也是可以使用更长时间的。

虽然现在的手表几乎都是具有了防水功能的,但还是建议大家使用当中要尽量避免长时间浸泡在水中。另外还有磁场等等问题是会影响到指针精准度的,因此大家在使用沛纳海高仿手表的时候也是需要注意这一问题的。一般高仿的手表只要是价位适中的情况,对应的质量还是不错的,这时候大家要注意平常减少磕碰这一类情况的发生,是更有利于手表保养的。尤其是在夏季炎热易出汗的情况下,建议大家一定要多多注意保养手表,减少汗渍对手表的侵蚀才行,这样手表才可以使用更长时间。