当前位置:  编程技术>软件工程/软件设计
本页文章导读:
    ▪Makefile之写demo时的通用Makefile写法总结      原创作品,转载时请务必以超链接形式标明文章原始出处:http://blog.csdn.net/gqb666/article/details/8956523,作者:gqb666     前面的一篇博文Makefile之大型工程项目子目录Makefile的一种通用写法介绍.........
    ▪Linux查看端口、进程情况及kill进程       查看端口: ps -aux | grep tomcat 发现并没有8080端口的Tomcat进程。 使用命令:netstat –apn 查看所有的进程和端口使用情况。发现下面的进程列表,其中最后一栏是PID/Program name  发现8080端.........
    ▪分布式选主 -- 利用Mysql ACID和Lease协议实现选主和高可用            在实际生产开发中,遇到一些多节点共存,需要选主,并且要实现HA自动容错的场景,思考了写方法拿出来和大家分享一下。 Lease协议,Mysql ACID高可用选主方案设计适用场景J.........

[1]Makefile之写demo时的通用Makefile写法总结
    来源: 互联网  发布时间: 2013-11-19
原创作品,转载时请务必以超链接形式标明文章原始出处:http://blog.csdn.net/gqb666/article/details/8956523,作者:gqb666

    前面的一篇博文Makefile之大型工程项目子目录Makefile的一种通用写法介绍了大型项目子目录Makefile的一种通用写法,然而最近在写Linux网络方面的demo,一个目录下有几个文件,如果手工输命令显得太不专业了。于是按该博文的方法改编了一下Makefile,也当学习之用。该Makefile适用于一个C文件生成一个可执行程序的场景(代码片段3适用于多个C文件生成一个可执行程序),使用该方法当工程目录内的文件有增删时无需对Makefile进行改动,可以说相当的智能。如果对patsubst、wildcard及subst函数不了解的话可参阅上述博文。同时在测试过程中,又发现了一种更简洁的写法,如代码片段2,应该是使用了某些隐式规则,由于项目较忙,还未来得及深入研究,先记录下来,等空下来再研究,还望路过大侠多多指点。

1:如果在当前目录中直接make的话使用下列代码:

#General Purpose Makefile by guoqingbo
                           
objects := $(patsubst %.c,%.o,$(wildcard *.c))  
executables := $(patsubst %.c,%,$(wildcard *.c))  
                           
all :  $(objects)
$(objects) : %.o: %.c 
    gcc -c $< -o $@
    gcc $< -o $(subst .o, ,$@) 
clean :
     @rm -rf *.o *~
     @rm -rf ${executables}
 .PHONY : clean
2:后来发现下列代码也可以有相同效果,难道使用了什么隐式规则,还不是很明白,先记录下来:

#General Purpose Makefile by guoqingbo
CC = gcc                             
executables := $(patsubst %.c,%,$(wildcard *.c))
                             
all : $(executables)

clean :  
     @rm -rf *.o *~  
     @rm -rf ${executables}  
.PHONY : clean

3:多个C文件生成一个可执行程序的情况:
#General Purpose Makefile by guoqingbo
CC = gcc
#source_file := $(wildcard *.c)
objects := $(patsubst %.c,%.o,$(wildcard *.c))
#executables := $(patsubst %.c,%,$(wildcard *.c))

target := client
#%.o : %.c
#    gcc -c $< -o $@

all: $(target) 
$(target): $(objects)
    gcc $^ -o $@

clean:
    rm -f *.o 
    rm -rf $(target)
.PHONY: clean

作者:gqb666 发表于2013-5-21 18:52:22 原文链接
阅读:263 评论:0 查看评论

    
[2]Linux查看端口、进程情况及kill进程
    来源: 互联网  发布时间: 2013-11-19

查看端口:

ps -aux | grep tomcat

发现并没有8080端口的Tomcat进程。

使用命令:netstat –apn

查看所有的进程和端口使用情况。发现下面的进程列表,其中最后一栏是PID/Program name 

发现8080端口被PID为9658的Java进程占用。

进一步使用命令:ps -aux | grep java,或者直接:ps -aux | grep pid 查看

就可以明确知道8080端口是被哪个程序占用了!然后判断是否使用KILL命令干掉!


方法二:直接使用 netstat   -anp   |   grep  portno
即:netstat –apn | grep 8080


查看进程:

1、ps 命令用于查看当前正在运行的进程。
grep 是搜索
例如: ps -ef | grep java
表示查看所有进程里 CMD 是 java 的进程信息
2、ps -aux | grep java
-aux 显示所有状态
ps
3. kill 命令用于终止进程
例如: kill -9 [PID]
-9 表示强迫进程立即停止
通常用 ps 查看进程 PID ,用 kill 命令终止进程


作者:chow__zh 发表于2013-5-21 17:27:45 原文链接
阅读:124 评论:0 查看评论

    
[3]分布式选主 -- 利用Mysql ACID和Lease协议实现选主和高可用
    来源: 互联网  发布时间: 2013-11-19

      在实际生产开发中,遇到一些多节点共存,需要选主,并且要实现HA自动容错的场景,思考了写方法拿出来和大家分享一下。

  • Lease协议,Mysql ACID
  • 高可用选主方案设计
  • 适用场景
  • Java语言实现描述
  • 进一步优化
  •       系统中有很多应用场景要类似主从架构,主服务器(Master)对外提供服务,从服务器(Salve)热备份,不提供服务但随时活着,如果Master出现宕机或者网络问题,Slave即可接替Master对外服务,并由Slave提升为Master(新主)。典型的多节点共存,但只能同时存在一个主,并且所有节点的状态能统一维护。

          大家一定首先想到了著名的Paxos算法(http://baike.baidu.com/view/8438269.htm)。简单的说,Paxos通过每个节点的投票算法,来决议一个事情,当多余1/2个节点都投票通过时,Paxos产生一个唯一结果的决议,并通知各个节点维护这个信息。例如Paxos的选主,首先产生一个关于某个节点希望当Master的投票,然后各个节点给出反馈,最终Paxos集群维护唯一的Master的结论。Zookeeper就是Paxos的一种实现。这种场景最适合用zookeeper来选主,但zookeeper有个明显的缺点,当存活的节点小于zookeeper集群的1/2时,就不能工作了。比如zk有10各节点,那么必须满足可用的节点大于5才可。

          在实际环境中,如果对Master要求不是那么严格的话,可以通过某些改进和取舍来达到目的。比如可能在秒级别允许Master暂时不能访问、选主时间内可能存在一定的冲突但通过再次选主即可。本人设计了一个简易的利用Mysql一致性和简易版Lease来workaround。

    Mysql ACID保证了一条数据记录的一致性、完整性,不会出现多进程读写的一致性问题和唯一正确性。Lease协议(协议细节可以Google之)通过向Master发送一个lease(租期)包,Master在这个lease期之内充当主角色,如果lease期到了则再次去申请lease,如果lease期到了,但是网络除了问题,这时Master可以i主动下线,让其他节点去竞选Master。举个例子,三个节点A、B、C经过第一轮选主之后,A成为Master,它获得了10秒的lease,当前时间假设是00:00:00,那么它Master地位可以用到00:00:10,当时间到达00:00:10时,A、B、C会重新进行Master选举,每个节点都有可能成为Master(从工程的角度触发,A继续为Master的概率更大),如果这时候A的网络断了,不能联通B、C的集群了,那么A会自动下线,不会去竞争,这样就不会出现“脑裂”的现象。

          

           ---------------------------------------------- 华丽的分割线 ----------------------------------------------

          

            设计方案如下:(server代表集群中的一台机器,也可看作一个进程,server之间是平等的)

  • 各个server之间用ntpserver时间同步(保证服务器之间秒级同步即可)
  • 各个server持有一个唯一ID号(ip+进程号),通过此id唯一标识一个server实例
  • 各个server定义一个lease租期,单位为秒
  • Mysql唯一表唯一一条记录维护全局Master的信息,ACID保证一致性
  • Master Server每半个lease期向Mysql更新如上的唯一一条记录,并更新心跳,维护Master状态
  • Slaver Server每半个lease周期从mysql获取Master Server信息,如果数据库中Master的Lease超过了当前时间(heartbeat_time+ lease > current_time),则申请当Master。
  •       这其中比较棘手的问题是:

            1、由于数据库访问和休眠的时间(lease的一半),有时延的存在,要处理Mysql异常、网络异常。

            2、可能存在同时抢占Master的server,这个时候就需要一个验证机制保证为抢到Master的server自动退位为Slaver


          下面给出图实例 :(10.0.0.1为Master)


         10.0.0.1 crash了。mysql中维护的10.0.0.1的主信息已过期,其他节点去抢占



          各个节点再次读取数据库,查看是否是自己抢占成功了:



    之后,10.0.0.3作为Master对外服务。此时如果10.0.0.1重启,可作为Slaver。如果10.0.0.1因为网络分化或者网络异常而不能维护心跳,则在超过自身lease时自动停止服务,不会出现“双Master”的现象。


          每个Server遵循如下流程:



            数据库设计:


            某一时刻,数据库中Master的信息:

     

           当前时间: 45分15秒

           当前Master Lease :6秒

           当前Master Lease可用到: 45分21秒

      

           ---------------------------------------------- 华丽的分割线 ----------------------------------------------

           3、适用的场景

            一、生命周期内可使用Mysql、并且各个server之间时间同步。

            二、需要集群中选出唯一主对外提供服务,其他节点作为slaver做standby,主lease过期时竞争为Master

            三、对比zookeeper,可满足如果集群挂掉一半节点,也可正常工作的情况,比如只有一主一备。

            四、允许选主操作在秒级容错的系统,选主的时候可能有lease/2秒的时间窗口,此时服务可能不可用。

            五、允许lease/2秒内出现极限双Master情况,但是概率很小。


            ---------------------------------------------- 华丽的分割线 ----------------------------------------------

            4、Java语言实现描述

          一些配置信息和时间相关、休眠周期相关的时间变量
            final long interval = lease / intervalDivisor;
            long waitForLeaseChallenging = 0L; 
            lease = lease / 1000L;
    
            long challengeFailTimes = 0L; 
            long takeRest = 0L; 
            long dbExceptionTimes = 0L; 
            long offlineTime = 0L; 
            Random rand = new Random();
            Status stateMechine = Status.START;
    
            long activeNodeLease = 0L; 
            long activeNodeTimeStamp = 0L; 

            数据库异常的处理:

                KeepAlive keepaliveNode = null;
                try {
                    /* first of all get it from mysql */
                    keepaliveNode = dbService.accquireAliveNode();
                    if (stateMechine != Status.START && keepaliveNode==null)
                        throw new Exception();
                    // recount , avoid network shake
                    dbExceptionTimes = 0L;
                } catch (Exception e) {
                    log.fatal("[Scanner] Database Exception with times : " + dbExceptionTimes++);
                    if (stateMechine == Status.OFFLINE) {
                        log.warn("[Scanner] Database Exception , OFFLINE ");
                    } else if (dbExceptionTimes >= 3) {
                        log.fatal("[Scanner] Database Exception , Node Offline Mode Active , uniqueid : " + uniqueID);
                        stateMechine = Status.OFFLINE;
                        dbExceptionTimes = 0L;
                        offlineTime = System.currentTimeMillis();
                        online = false;
                    } else
                        continue;
                }

            总的循环和状态机的变迁:

            while (true) {
    
                SqlSession session = dbConnecction.openSession();
                ActionScanMapper dbService = session.getMapper(ActionScanMapper.class);
    
                KeepAlive keepaliveNode = null;      
        
    最新技术文章:
    ▪主-主数据库系统架构    ▪java.lang.UnsupportedClassVersionError: Bad version number i...    ▪eclipse项目出现红色叉叉解决方案
    ▪Play!framework 项目部署到Tomcat    ▪dedecms如何做中英文网站?    ▪Spring Batch Framework– introduction chapter(上)
    ▪第三章 AOP 基于@AspectJ的AOP    ▪基于插件的服务集成方式    ▪Online Coding开发模式 (通过在线配置实现一个表...
    ▪观察者模式(Observer)    ▪工厂模式 - 程序实现(java)    ▪几种web并行化编程实现
    ▪机器学习理论与实战(二)决策树    ▪Hibernate(四)——全面解析一对多关联映射    ▪我所理解的设计模式(C++实现)——解释器模...
    ▪利用规则引擎打造轻量级的面向服务编程模式...    ▪google blink的设计计划: Out-of-Progress iframes    ▪FS SIP呼叫的消息线程和状态机线程
    ▪XML FREESWITCH APPLICATION 实现    ▪Drupal 实战    ▪Blink: Chromium的新渲染引擎
    ▪(十四)桥接模式详解(都市异能版)    ▪你不知道的Eclipse用法:使用Allocation tracker跟...    ▪Linux内核-进程
    ▪你不知道的Eclipse用法:使用Metrics 测量复杂度    ▪IT行业为什么没有进度    ▪Exchange Server 2010/2013三种不同的故障转移
    ▪第二章 IoC Spring自动扫描和管理Bean    ▪CMMI简介    ▪目标检测(Object Detection)原理与实现(六)
    ▪值班总结(1)——探讨sql语句的执行机制    ▪第二章 IoC Annotation注入    ▪CentOS 6.4下安装Vagrant
    ▪Java NIO框架Netty1简单发送接受    ▪漫画研发之八:会吃的孩子有奶吃    ▪比较ASP和ASP.NET
    ▪SPRING中的CONTEXTLOADERLISTENER    ▪在Nginx下对网站进行密码保护    ▪Hibernate从入门到精通(五)一对一单向关联映...
    ▪.NET领域驱动设计—初尝(三:穿过迷雾走向光...    ▪linux下的块设备驱动(一)    ▪Modem项目工作总结
    ▪工作流--JBPM简介及开发环境搭建    ▪工作流--JBPM核心服务及表结构    ▪Eclipse:使用JDepend 进行依赖项检查
    ▪windows下用putty上传文件到远程Linux方法    ▪iBatis和Hibernate的5点区别    ▪基于学习的Indexing算法
    ▪设计模式11---设计模式之中介者模式(Mediator...    ▪带你走进EJB--JMS编程模型    ▪从抽象谈起(二):观察者模式与回调
    ▪设计模式09---设计模式之生成器模式(Builder)也...    ▪svn_resin_持续优化中    ▪Bitmap recycle方法与制作Bitmap的内存缓存
    ▪Hibernate从入门到精通(四)基本映射    ▪设计模式10---设计模式之原型模式(Prototype)    ▪Dreamer 3.0 支持json、xml、文件上传
    ▪Eclipse:使用PMD预先检测错误    ▪Jspx.net Framework 5.1 发布    ▪从抽象谈起(一):工厂模式与策略模式
    ▪Eclipse:使用CheckStyle实施编码标准    ▪【论文阅读】《Chain Replication for Supporting High T...    ▪Struts2 Path_路径问题
    ▪spring 配置文件详解    ▪Struts2第一个工程helloStruts极其基本配置    ▪Python学习入门基础教程(learning Python)--2 Python简...
    ▪maven springmvc环境配置    ▪基于SCRUM的金融软件开发项目    ▪software quality assurance 常见问题收录
    ▪Redis集群明细文档    ▪Dreamer 框架 比Struts2 更加灵活    ▪Maven POM入门
    ▪git 分支篇-----不断更新中    ▪Oracle非主键自增长    ▪php设计模式——UML类图
    ▪Matlab,Visio等生成的图片的字体嵌入问题解决...    ▪用Darwin和live555实现的直播框架    ▪学习ORM框架—hibernate(二):由hibernate接口谈...
    ▪(十)装饰器模式详解(与IO不解的情缘)    ▪无锁编程:最简单例子    ▪【虚拟化实战】网络设计之四Teaming
    ▪OSGi:生命周期层    ▪Javascript/Jquery——简单定时器    ▪java代码 发送GET、POST请求
    ▪Entity Framework底层操作封装(3)    ▪HttpClient 发送GET、POST请求    ▪使用spring框架,应用启动时,加载数据
    ▪Linux下Apache网站目录读写权限的设置    ▪单键模式的C++描述    ▪学习ORM框架—hibernate(一):初识hibernate
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3