haproxy和keepalived的个人理解

2016/05/16 21:35:48 No Comments

附参考文:http://weizhifeng.net/HA-with-HAProxy-and-KeepAlived.html

关于此两者,随便google一下都会有大量的文章,因此这里也不用介绍如何来进行安装和配置了。主要从一个整体方案的角度来描述什么要这样做,以及这样做所解决的问题。

所有的系统,都是先经历一个单台机器搞所有业务的时代,一个程序+一个mysql数据库,就可以满足开发及第一个版本上线的要求。随着,数据的增加以及业务的增长,这些应用就面临一个访问量的扩大以及扩展的问题。最简单的扩展就是水平扩展,原来由一个mysql增加为2个或多个,形成一个集群,这样最简单的能力就是提供更强的服务能力。如原来的访问量支持每秒1000,现在可以支持2000(理想值),相当于将服务能力分散到多个节点。
这里面涉及到多个问题,首先就是数据的相互备份,然后就是如何分配计算能力,外部如何来访问等。本文引入HaProxy和KeepAlived主要处理的就是一个外部访问问题。

在后面的介绍当中,假定有2个mysql,分别为mysqlA和mysqlB.

read more… »

获取java代码中方法的参数名信息

2016/04/28 20:25:46 No Comments

随着java8的使用,在相应的方法签名中增加了新的对象Parameter,用于表示特定的参数信息,通过它的getName可以获取相应的参数名.即像在代码中编写的,如命名为username,那么在前台进行传参时,即不需要再编写如@Parameter("username")类的注解,而直接就能进行按名映射.
如下的代码参考所示:

public class T {
    private interface T2 {
        void method(String username, String password);
    }

    public static void main(String[] args) throws Exception {
        System.out.println(T.class.getMethod("main", String[].class).getParameters()[0].getName());
        System.out.println(T2.class.getMethod("method", String.class, String.class).getParameters()[0].getName());
        System.out.println(T2.class.getMethod("method", String.class, String.class).getParameters()[1].getName());
    }
}

按java8之前,也可以通过一些手段拿到参数名信息,只不过方式不同而已.如通过spring mvc中的ParameterMethodNameResolver在之前的版本中也可以正常工作.不过需要特别的编译而已.这里面起作用的即是 LocalVariableTable 和 MethodParameters,中文编译为本地变量表和方法参数表.

read more… »

使用JDI进行线上程序断点信息记录

2016/02/22 08:26:21 No Comments

之前在某一次蚂蚁金服的分享当中,得知可以通过在线上程序中进行断点记录,当程序运行到断点的时候,即将此次调用的上下文信息记录下来,以进行进一次分析。实际上这也是相当于在程序中打log记录信息的方式了。当线上出现问题时,我们最希望的就是将相应的参数信息记录下来,以拿到当时的数据,以便知道到底是哪儿出现了问题。但又不希望通过重新在代码中加入代码,然后发布这样的方式,因为新的发布可能导致问题重现机率变小等。

java的整个调试体系为JDPA,Oracle提供了高级的jdi接口以方便使用java来连接调试程序进行相应的调试。这样,只需要调用相应的java接口,就能进行打断点,记录断点,然后继续运行,清除断点这样基本的断点调试手法了。

1. 连接远程JVM

连接其它JVM称之为附加(attach)操作,当前实现中有2种,如果是本地JVM,则通过Process的方式即可,如果是远程,则需要通过socket的方式才能进行连接。首先是server端需要开启调试agent,并且指定相应的端口,如下启动命令所示:

-Xdebug -agentlib:jdwp=transport=dt_socket,address=1234,server=y,suspend=n

上面的参数表示监听指定端口(1234),并且当存在断点时并不主动阻塞。
旧的JVM也有使用Xrunjdwp参数的,但不再被建议使用.

read more… »

redis中aof备份策略中的配置参数

2015/12/15 11:31:36 No Comments

在使用redis时,都会配置相应的存储策略,以保证redis并不会由于意外挂掉,在短时间内重启时数据不会消失。在当前的版本中,redis提供了bgsave和aof两种策略,本文主要描述了aof中的相关参数以及为什么这样是可以足够安全的。
本文的描述主要参考redis的conf文件以及各项网络

appendonly

开启aof特性,这个控制是否启用aof.

appendfilename

写入文件的文件名。开启aof之后,每条命令(除读之外的命令),均会写入到文件中,这里即实际写入的文件.

appendfsync

写入策略,默认值everysec,每秒写一次(调用flush)。另外两个值,always | no,分别表示每次redis写命令之外就写文件,和由操作系统保证。always对硬盘压力大,everysec是一个平衡值,no对硬盘压力最小,但调度由系统控制,丢失数据风险最大.

read more… »

Metrics相关技术使用点

2015/10/25 10:26:50 No Comments

本文参考了原metrics的get start以及用户手册,如链接:http://metrics.dropwizard.io/3.1.0/getting-started/

技术点

1 Gauge 取值功能

用来进行获取某个值的功能,其封装一个getValue方法,那么在指定的周期时间之内,metrics可以调用这个方法用于获取特定的值。比如,某个队列当前大小,当前cpu,内存等信息。
因为是实时获取,因此可能有些值获取成本较高,或者不需要每次都取最新值,因此可以考虑使用类似缓存的技术。如在5s之内是缓存的。

read more… »

解决jetty在windows下锁静态文件的问题

2015/10/13 18:36:57 No Comments

本文原英文地址:http://www.eclipse.org/jetty/documentation/9.3.0.v20150612/troubleshooting-locked-files-on-windows.html#d0e26059
在jetty容器内,对于静态文件,会采用内存缓存的实现方式,如采用buteBuffer的方式来进行缓存。如果使用NIO连接器(默认情况),jetty就会采用文件映射(filemapper)的方式。但是这个方式在windows下会存在一个问题,即使用文件内存映射会导致这个文件被进程锁住,其它进程就不能但修改或者替换这个文件了。解决这个问题的一个方法就会停掉jetty,但这种方式显示不太靠谱。

jetty提供了一个开关标记来开启或者禁止内存映射,在类DefaultServlet中有一个属性useFileMappedBuffer,此属性值默认为false,并且在配置文件webdefault.xml中进行配置。

默认的配置文件存储在jar包jetty-webapp-${version}.jar中的org/eclipse/jetty/webapp/webdefault.xml,还有一份存储在jetty-home/etc/目录中。两者的区别在于,后者由jetty运行时配置文件中默认使用。前者由在代码中WebAppContext默认使用(没有配置值的情况下).最简单的作法就是修改这个配置文件,如下所示:

<init-param>
   <param-name>useFileMappedBuffer</param-name>
   <param-value>true</param-value> <!-- change to false -->
</init-param>

read more… »