王民利

大家好,我是王民利,这是我的个人站点,目的之一当然是利己,主要用来记录我工作或学习过程中的一些东西,避免遗忘,也可以当作个人成长的见证;另外也希望我写的内容对大家有所帮助,有一些内容比较杂碎,但我尽量保持行文流畅!

配置Redis Sentinel,并使用Jedis连接

目标:
演示的3台redis主从服务器的连接信息,使用sentinel管理主从节点,并使用jedis连接sentinel
配置:

* 配置3个redis服务,其中7000做主服务器,7001、7002做从服务器
* 配置3个sentinel,端口分别为26379、26380、26381
* 使用jedis连接26379这个sentinel

注意

* 所有编辑的文件和输出日志均在/usr/local/bin目录下,生产中最好将日志文件移出
* 所有服务器均在本地测试,生产中要使用不同的服务器

演示:
编辑一个redis-7000.conf的配置文件,如下

 port 7000
 daemonize yes
 pidfile /var/run/redis-7000.pid
 logfile "7000.log"
 dir "/usr/local/bin/"

使用sed命令生成redis-7001.conf、redis-7002.conf

《深入理解Java虚拟机》笔记

自动内存分配管理机制
  • Java虚拟机栈
    • 这里面存储的是Java方法的内存模型
    • 这里会有两种异常情况
      • StackOverFlowError
      • OutOfMemoryError
  • 本地方法栈
    • 存储的是Native方法服务
    • Native方法根据系统环境的不同而不同
    • 这里也会有这两种异常情况
      • StackOverFlowError
      • OutOfMemoryError
  • Java堆
    • 存放对象实例的空间,几乎所有的对象实例都在这里分配,所以也被称为GC堆。
    • 是java虚拟机管理的最大的一块空间,跟随虚拟机启动而创建。
    • 划分
      • 新生代
      • 老生代
      • 元空间
        • 它分配在物理内存,1.8以前叫“永久代”,永久代在堆内存中分配,功能基本相同
        • 这是为了兼容HotSpot和JRockit诞生的,这两个虚拟机都被Oracle收购,故要兼容
    • 细分

解决Windows下无法对docker容器进行端口映射的问题

微信截图_20170427183208

 

在安装了一个Windows下安装了docker,并尝试在其中运行Nginx、owncloud等服务,但映射完毕之后,在主机的浏览器中,打开localhost:port无法访问对应的服务。

用百度尝试了下,始终找不到答案,难道这个问题大家都没遇到过么?于是使用Google,并用英文检索,一会就找到了对应的答案。

The reason you’re having this, is because on Linux, the docker daemon (and your containers) run on the Linux machine itself, so “localhost” is also the host that the container is running on, and the ports are mapped to.

On Windows (and OS X), the docker daemon, and your containers cannot run natively, so only the docker client is running on your Windows machine, but the daemon (and your containers) run in a VirtualBox Virtual Machine, that runs Linux.

原来,docker是运行在Linux上的,在Windows中运行docker,实际上还是在Windows下先安装了一个Linux环境,然后在这个系统中运行的docker。也就是说,服务中使用的localhost指的是这个Linux环境的地址,而不是我们的宿主环境Windows。我们可以通过命令

在Windows中通过docker安装Ubuntu镜像

1

缘起

Docker的技术已经比较热了,因为我不是运维工程师,过去一直没有冲动让我去学习一下。我平时喜欢在Linux上折腾点东西,但公司为了配合开发,使用的是Windows系统。最近脑子一热,想通过docker在Windows下安装一个Linux虚拟机,抛弃笨笨的VM Ware和Virtual Box的安装方式,这样做一来在以后可以在虚拟机里测试点东西,二来也通过这个方式学习一下Docker。

Canal记录mysql的binlog日志监听

缘起

公司有一个app客户端,在调取某些数据时,需要从不同的项目中获得数据,并处理这些数据,导致显示到客户端非常慢,现需要对这个问题进行优化。数据库大都是mysql服务器,所以选用了适合它的开源框架canal来处理数据。

在使用canal监听mysql的二进制日志的过程中,发现可用性还是比较强的,优点如下
  • 能够针对不同的表进行监听(订阅)
  • Canal客户端出现异常时,服务器可以将产品记录,重启客户端时可以将未消费的数据继续消费,做到不丢失数据(服务端记录未消费的产品)
  • Canal服务端出现异常,导致客户端无法消费数据时, 重启Canal服务器可以从出现异常时产生的数据,也可以做到不丢失数据。(服务端可以从上次无法生产的地方继续生产数据)

使用mybatis动态查询表名

开发时有个需求,需要对不同的表进行统计条目,然后,在table中分页显示,如果对每个表的统计功能都建立一个mapper,势必会非常繁杂,所以采用动态传入表名的形式会比较方便。
正常情况下,向表名这样的特殊字段是不可以正确执行的,mybatis做了预编译的处理,此时表名是必需的,这是为了防止sql注入的情况。如果我们要动态传递表名,我们可以对mybatis声明为statementType=”STATEMENT”的形式,取消mybatis的预编译,并且,传参时通过${}来接收,这样就可以完成表名的动态传参。
<select id=”countByTbName” statementType=”STATEMENT” resultType=”java.lang.Integer”  parameterType=”java.util.Map” >
        SELECT
            count(*)
        FROM
            ${tbName}
    </select>

 

Linux常用的几种上传下载命令

对于客户端和服务器都是Linux系统(或MacOS),他们之间的文件传递的命令是兼容的,使用命令scp就可以做到,需要注意的只是文件上传/下载的顺序
上传
scp -P port -r  local_folder user@remote_ip:remote_folder
下载
scp -p port -r user@remote_ip:remote_folder local_folder
对于客户端是Windows系统,可以使用secureCRT实现文件的上传/下载功能,目前常用的putty不支持Zmodem协议,所以无法完成这个功能。
这时,需要对secureCRT做个设置,指明文件上传下载的路径分别是什么,在option——session options中指明他们
命令如下:
rz:上传命令(Receive)
sz: 下载命令(Send)

解决jar包互相依赖导致的错误

最近项目中需要使用阿里巴巴的canal记录mysql的binary log,来监听主数据库的变化,从而备份到从数据库服务器中。但是在一切测试完毕之后,导入到原项目的时候,居然报错,解决了一个上午,终于解决,报错内容如下:
Image
发现,仅仅在向pom.xml文件中添加canal的依赖时,就会包上述的错误,我添加的内容如下:

导出JVM的快照文件,并使用MAT打开分析

最近在学习JVM的工作原理,这是高级工程师必学的知识,书放了好久,现在终于鼓起勇气看完了基础部分。

MAT(Memory Analyzer tool)是分析JVM内存使用情况的工具,可以对线上的项目导出dump快照文件,真实的项目一般都是在Linux服务器上运行,而命令行式的分析难免费劲,这是可以通过导出的dump文件导出后,在可视化的界面进行分析。使用eclipse安装mat的过程可以参考:eclipse安装Eclipse Memory Analyzer插件

下面记录一下,如何使用MAT时怎么使用的,具体的使用过程不太好写,自己也在不断的学习过程中,不敢多说,下面仅记录一下其中的两个过程以备忘:

  • 导出项目的快照dump文件
  • 使用mat打开dump文件
  1. 导入项目的快照dump文件

可以通过两种方式导出dump文件,参数设置方式和命令方式。

参数方式导出

我们可以在项目出现OutOfMemory错误的时候让系统自动执行导出dump文件的过程,这是需要设置两个参数

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:\proj.bin

这样在出现内存溢出的时候系统就可以自动导出这个文件,这个文件一般都非常大。