月度归档:2017年02月

分布式基础通信协议:paxos,totem和gossip

在分布式中,最难解决的一个问题就是多个节点间数据同步问题。为了解决这样的问题,涌现出了各种奇思妙想。只有在解决了如何进行信息同步的基础之上才衍生出形形色色的应用。这里开始介绍几种分布式通信协议。

简单即有效——totem协议:

totem协议也许你还比较陌生,但是corosync就是totem协议的一个开源实现。比较火的HA软件pacemaker就是基于corosync来提供各种服务的。说起totem协议,最简单的形象就是,他将多个节点组成一个令牌环。多个节点手拉手形成一个圈,大家依次的传递token。只有获取到token的节点才有发送消息的权利。简单有效的解决了在分布式系统中各个节点的同步问题,因为只有一个节点会在一个时刻发送消息,不会出现冲突。当然,如果有节点发生意外时,令牌环就会断掉,此时大家不能够通信,而是重新组建出一个新的令牌环。

进化的二段提交——paxos协议:

说起paxos,需要稍微提提二段提交。简单来说,二阶段提交就是1.一个节点询问其他节点,我是不是可以进行消息提交。2.如果收到所有人的同意,则告诉大家,开始提交吧。这个协议在实际中并不能很好的解决分布式中信息同步问题。例如只要有节点失效,就会发生得不到所有人同意的结果,在超时后,这一次提交失败,等一系列问题。但是paxos在对二段提交进行了优化后,得到了一个比较好的解决办法。
paxos协议引入了多数派,以及消息编号的概念。在1准备时,询问2/n+1的参与者,要求他们保证不会接受小于编号n的提交。
2.如果得到了2/n+1的回复,则可以开始告诉2/n+1的参与者进行消息的提交。
可以明显的看出,这就是对二段提交的一个优化版。就是这么一个比较巧妙的思想,解决了一些二阶段提交带来的问题。
顺便说一句,这个协议的作者Leslie Lamport。他刚刚获得2013年图灵奖。

奇思妙想——gossip协议:

gossip协议是一个神奇的协议。它常用于P2P的通信协议,这个协议就是模拟人类中传播谣言的行为而来。简单的描述下这个协议,首先要传播谣言就要有种子节点。种子节点每秒都会随机向其他节点发送自己所拥有的节点列表,以及需要传播的消息。任何新加入的节点,就在这种传播方式下很快地被全网所知道。这个协议的神奇就在于它从设计开始就没想到信息一定要传递给所有的节点,但是随着时间的增长,在最终的某一时刻,全网会得到相同的信息。当然这个时刻可能仅仅存在于理论,永远不可达。

基础协议的对比:

简单的介绍了这几种协议,下面我们来看看他们的对比:
基础协议paxostotemgossip
数据同步第一阶段:
proposer 选择一个提案编号 n 并将 prepare 请求发送给acceptors 中的一个多数派;acceptor 收到 prepare 消息后,如果提案的编号大于它已经回复的所有 prepare 消息,则 acceptor 将自己上次的批准回复给 proposer并承诺不再批准小于 n 的提案。
第二阶段:
当一个 proposor 收到了多数 acceptors 对 prepare 的回复后,就进入批准阶段。它要向回复 prepare 请求的acceptors 发送 accept 请求,包括编号 n 和根据 P2c 决定的 value(如果根据 P2c 没有决定 value,那么它可以自由决定 value)。在不违背自己向其他 proposer 的承诺的前提下,acceptor 收到 accept 请求后即批准这个请求。
1.通信方式。
当集群有节点要发起通信时,需要等待token。当拿到token后,先广播这次需要发送的数据,然后传递token来确认所有人都接收到消息。
如果确认成功,释放token。2.节点的加入和退出。
当集群中有节点加入时,加入的节点广播一个加入信息,所有人都开始广播自己的信息,当所有人都获得同伴信息,开始由id最小的人提交一个token,交由所有节点确认。
如果都确认后,则节点正式加入,开始正常运行。
当集群有节点退出时,由于令牌环断链,触发token超时,则同样开始广播信息,然后由最小id提交token,经过确认后恢复正常。
gossip协议有多种实现,这里说一个例子当节点启动时,读配置文件,然后向一个seed发送信息,进行信息同步,然后开始没秒都随机选择一个seed节点来同步信息1、随机取一个当前活着的节点,并向它发送同步请求
2、向随机一台不可达的机器发送同步请求
3、如果第一步中所选择的节点不是seed,或者当前活着的节点数少于seed数,则向随意一台seed发送同步请求
数据一致性强一致性强一致性最终一致性
相关应用zookeepercorosyncCassandra
优点可以很好的解决通信一致性问题,在集群规模上比corosync要略大一些简单方便,按照协议实现后就可以直接使用协议本身简单,组网规模几乎不受限制,通信性能好
缺点理论性太强,如果要实际使用,还是需要进行优化使用了广播包,对于跨域传送有影响,而且令牌环本身带来的问题使得组网规模不大不能提供传统的数据一致性服务,在传输中占用较多的网络流量

参考资料

totem协议:http://blog.csdn.net/zuokong/article/details/7548152
paxos协议:http://en.wikipedia.org/wiki/Paxos_algorithm
gossip协议:http://en.wikipedia.org/wiki/Gossip_protocol

Apache Log4j 2.0值得升级吗

Apache软件基金会最近发布了Log4j 2.0通用版本,相比之前Log4j的1.x版本有了很大的性能提升。本版本的灵感来自于诸如Log4j 1.x和java.util.logging之类的已有日志解决方案,它是经过了数年的努力从头开始编写完成的。

Log4j 2.0引入了新的插件系统、对properties的支持、对基于 JSON配置的支持和配置的自动化重载。它支持很多已有的日志框架,包括SLF4J、Commons Logging、Apache Flum、Log4j 1.x,并提供了新的程序员API。

Apache Logging PMC成员Christian Grobmeier 在2012年12月率先报道了新的Log4j 2.0。他是这样描述流行的API的:

在以前,大家是这么写的:

if (logger.isDebugEnabled()) {
logger.debug("Hi, " + u.getA() + " " + u.getB()); 
}

log4j 2.0的团队对这种写法进行了思考和改进。现在你可以这么写了:

logger.debug("Hi, {} {}", u.getA(), u.getB());

Grobmeier接着阐述了API方面更多的改进,包括Markers和Flow Tracing。他还提到了插件架构的改进,配置的增强(使用热重载、JSON和properties),还有Log4j 2.0如何处理了Log4j 1.x的许多死锁问题。

在Hacker News上,有许多针对JVM日志框架的抱怨。Ceki Gülcü(许多Java日志框架的作者,其作品包括Log4j、SLF4J和Logback)表达了他不喜欢Apache模型的原因。Gülcü仍然是一名社区成员,并持续从事着Apache Logging的PMC的工作。

在2013年7月,Grobmeier发表了另一篇标题为《Log4j 2:性能几近于疯狂》的文章。在这篇文章里,他对Remko Popma的“AsyncLoggers”产生的日志吞吐量大加赞赏,并讨论了它的日志吞吐量如何能够比其他框架多出了12倍。

我们谈到每秒超过18,000,000条的消息,而其他框架在同样的环境中只能达到1,500,000或者更少。

我看到下面这张图表,简直不敢相信。一定是哪里搞错了吧。我反复地检查。我亲自来测试。的确像图中一样,Log4j 2有着疯狂的速度。

你可以在Log4j的异步文档中找到更多的信息。

然而,并非所有人都觉得Log4j的异步特性有多么地了不起。FullContact的高级平台工程师Michael Rose写过一篇博客,名为《过度设计:Log4j2的AsyncAppender》。他总结说,这个特性并不值得使用:

我认为Log4j2的AsyncAppender虽然看上去很优雅,但不过是个好看的玩具,对于任何合理的应用来说它实际上并不像评估的那么突出。Log4j2的团队非常令人尊敬,但我真诚的希望他们更加专注于简单的、内聚的下一代Java日志框架,而不是把主要精力放在添加另外的日志框架上。

无论如何,Logback是SLF4J(构建类路径日志的实事标准)的原生实现,性能也完全合乎要求(特别是打开本地设置时)。它仍然是我对日志框架的第一选择。它使用起来很方便,而且我在使用过程中也从没有发现过什么问题。

如果没有其他方面的考虑,那就要像躲瘟疫那样躲着Log4j 1.x。在任何具有负载的系统中,你最终都会发现它会导致竞争问题。

Log4 1.x迁移到2.0

我最近把我的AppFuse应用从Log4j 1.x升级到了2.0,发现它很难从Maven dependencies上直接获取。至少,你得需要log4j-core JAR(它依赖于log4j-api)。如果你要用于网络应用,还需要依赖log4j-web。如果集成Velocity 1.7,还必须增加log4j-1.2-api。如果集成Spring,还必须增加log4j-jcl(因为它使用了commons-logging)。对于那些依赖了SLF4J的类库,必须包括log4j-slf4j-impl。如果集成Hibernate,还必须升级 JBoss Logging到3.2.0.Beta1。

你可能需要把某些依赖中以前的Log4j依赖排除掉。如果你使用Maven,下面有个不错的命令,可以显示你可能需要排除的依赖。

mvn dependency:tree | grep log

我最后要做的一步是把log4j.xml文件重命名为log4j2.xml,并重构它们以匹配它新的配置。

总结

新的Log4j 2.0版本有了大幅的性能提升、新的插件系统,以及配置设置方面的很多改善。是否需要把当前Log4j升级到2.0或者将已有的日志解决方案换成Log4j 2.0呢?有的用户可能会找到充分的理由,有的也可能还找不到。

mBlock教程

 简介
Scratch是一款由麻省理工学院(MIT)设计开发的一款面向少年的简易编程工具。它不仅易于孩子们使用,又能寓教于乐,让孩子们获得创作中的乐趣。 Scratch的下载和使用是完全免费的。

mBlock由深圳市创客工场科技有限公司基于开源Scaratch2.0软件研发出来。为了提高同学们的编程兴趣以及更加广泛地学习电子知识,mBlock在这基础上添加了电子模块指令,将学生从电脑的虚拟世界带到了现实的物理世界。极大的扩展了学生的编程领域。



1、最新版本的mBlock,哪里可以下载?答:http://www.mblock.cc/index.php?c=index&a=download


2、刚接触mBlock ,有什么入门教程吗?


答:优酷视频上搜索mBlock,使用教程持续更新中,敬请关注....


http://www.soku.com/search_video/q_mBlock?f=1&kb=040200000000000__mBlock&_rp=14421613246850vFME9&_rp=14421613246850vFME9

下面介绍怎么操作mBlock来控制电子模块。

● USB连接步骤
第一步:安装并打开mBlock软件。
                                                              软件主界面

 

 

第二步:主控板接上USB,选择板型和串口,以Orion为例子。
                                                                选择串口和板型



第三步:安装固件
                                                                 安装固件



第四步:接上电机和电池,编程控制电机正反转,点击绿旗运行程序。
                                                            点击绿旗能运行



● 蓝牙连接步骤
第一步:USB连接主控板,确保主控板已经下载固件。



第二步:拔掉USB线,5口接蓝牙模块(以Orion主控板为例),接上两个电机和电池供电,然后编程控制小车行进。

 

 

第三步:主控板上电后,点击工具栏的蓝牙连接,选择Makeblock蓝牙模块。
                                                            蓝牙连接过程


                                                            蓝牙连接成功标志

 

 

第四步:连上后可以通过键盘控制小车行进啦。



● 脱机下载步骤

第一步:将原来的绿旗触发换成Makeblock触发。



第二步:右键“Makeblock主程序”指令,选择上传到Arduino,这样就完成脱机啦。

selenium中https时安全证书认证失败的错误

在使用selenium做测试的时候,如果使用不同的浏览器模式,比如说*pifirefox 就会遇到,安全证书认证失败的错误,必须要手动去处理。不然测试就进行不下去。如下图所示。

 

我们要做的就是设置好firefox让它自动去处理。

1.       保存证书。我们点击View certificate 然后出现下面的界面。

然后选择Export保存在你想要的位置。

2.       现在你要做的是,导入证书然后做相应的设置。

a)         导入证书:打开firefox的certificate manager,然后点击导入

 

b)导入证书后做一下设置,选择信任证书。然后点击ok保存。

 

解决Selenium测试Https(IE)证书错误

访问Https的的网站,你一定遇到过“停止访问”、“继续前往”这样的选择题吧。。我们人很好处理它,可以工具Selenium就犯愁了。。伙计不如这样试试(在IE8中)

driver.get(url); //下面的这句js脚本就会帮你点击“继续前往”连接,我们通过driver.get执行这句脚本。 driver.get("javascript:document.getElementById('overridelink').click();");

DNS BIND 搭建域名智能解析DNS服务器之动态添加解析

本节我们将通过脚本来实现动态添加域名及解析记录。

1.安装bind

请参考:http://blog.csdn.net/zhu_tianwei/article/details/45045431

2.管理脚本

脚本都放在chroot/bin目录下

管理脚本./bin/slim-bind

  1. ./bin/slim-bind
  2. Usage:./bin/slim-bind start | stop | restart |reload |status

管理bind的启动、关闭、重启、重新加载配置、状态。
3.检查脚本

1)检查zone文件是否有效

  1. ./bin/slim-checkzone -h
  2. usage: ./bin/slim-checkzone [-z zone -f zonefile] [-h]
  3.     z   zone name
  4.     f   zone file
  5.     h   output this help and exit

说明:z 指定zone名称

f 指定zone的文件

2)检查named.conf是否正确

  1. ./bin/slim-checkconf -h
  2. usage: ./bin/slim-checkconf named.conf [-h]
  3.     h   Output this help and exit
  4. The named.conf file is relatvie to "chroot",such as /etc/named.conf.
  5. By using chroot, you must use the root user.

由于使用了chroot,使用该脚本必须使用root权限,指定的named.conf是chroot的相对路径。
如:./bin/slim-checkconf /etc/named.conf4.添加删除域名脚本

  1. ./bin/slim-zone-randfs -h
  2. usage: ./bin/slim-zone-randfs  [-s server -p port -o [r|a|n|d|f|s] -v view -z zone -f zonefile] [-h]
  3. command is one of the following:
  4.     s   bind server ip(default:127.0.0.1)
  5.     p   bind server port(default:953)
  6.     o   operation type
  7.         r       reload configuration file and zones.
  8.         a       add zone to given view. Requires new-zone-file option.
  9.         n       resend NOTIFY messages for the zone.
  10.         d       removes zone from given view.
  11.         f       flushes the server's caches for a view or zone.
  12.         s       display status of the server.
  13.     v   view name
  14.     z   zone name
  15.     f   zone file
  16.     h   Output this help and exit
  17. when the zone doesn't exit,we can call the rndc to add the zone dynamicly,which 'view' 'zone' 'zonefile' must be used.
  18. the zonefile is relatvie to "chroot",such as /var/named/zone/test.com.zone.

该脚本可以动态添加、删除域名、加载配置、刷新缓存,以及查看bind状态说明:

s  指定bind服务器IP地址,默认是127.0.0.1

p  指定rndc启动端口,默认是953

o  执行操作类型,主要有如下几种类型:

r 加载配置

a 添加域名

n 重新发送notify消息

d 删除域名

f 刷新缓存

s 查看状态
v  所操作的视图

z  所操作的zone 名称

f  所操作的zone文件

5.添加删除解析记录脚本

  1. ./bin/slim-rdata-ad -h
  2. usage: ./bin/slim-rdata-ad [-s server -p port -o [a|d] -v view -r rdata ] [-h]
  3.     s   bind server ip(default:127.0.0.1)
  4.     p   bind server port(default:53)
  5.     o   operation type
  6.         a  add zone record
  7.         d  delete zone record
  8.     v   view name
  9.     r   zone rdata string,such as "www.slimsmart.cn 3600 IN A 1.1.1.1"
  10.     h   output this help and exit

该脚本动态向每个视图添加域名的解析记录。说明:

s  指定bind服务器IP地址,默认是127.0.0.1

p  指定rndc启动端口,默认是953

o  执行操作类型,主要有如下几种类型:

a 添加解析记录   d 删除解析记录

v  所操作的视图

r  解析记录值rdata

脚本地址:https://github.com/slimina/slim-bind

大家可以利用这些脚本,动态添加域名解析,也可以开发web管理页面,方便维护管理。