Category - IT技术

数据库 DB 版本管理 刘迎光 狐刺科技    2017-03-26 11:28:27    907

概述

软件开发过程中,往往会遇到版本管理问题,也常常会遇到服务多版本管理问题,也常常会遇到不同版本的服务之间,数据库字段不同、建表语句不同的问题,那么如何在不同版本间进行平滑升级,那么就需要有一系列的规范(暂不涉及回退方案):

升级步骤

自动化管理,由程序在启动前操作:

  1. 检查数据库中的当前版本,检查程序版本(version.properties中)
  2. 检查与当前版本相关联的升级脚本(这一步骤依赖于与数据库版本相对应的文件命名规范)
  3. 如果找到了文件,则执行文件内容并验证输出,如果出现错误则退出,抛出异常
  4. 如果没有发现脚本,则直接退出,抛出异常
  5. 重复步骤1

注意事项

  1. 版本控制:数据库中存在db_schema_version表,用来管理当前所有应用实例的版本信息,每个项目中,都应包含一个version的描述文件(version.properties),有版本变动,即修改其版本信息,db_schema_version表结构见第6条
  2. 版本号控制:<主版本号>.<子版本号>.<修订号>
    第一部分在系统的重要发布或重大阶段会进行改变,比如每几个月一次。下面两部分是由开发者控制的。子版本改变意味着数据库中加入了破坏性的改动(例如新的必需字段),这使得“旧的”应用程序与新的数据库架构不再兼容。修订号则是每次非破坏性的变动发生时(例如新的索引、新表、新的可选字段等等)进行递增的。每次上级版本号更新,下级版本号默认清零
  3. 更新脚本:
    由开发者进行编写的数据库更新脚本,此脚本中包含多个更新数据库的语句,使用英文分号分隔(标准的数据库语句写法),不必特意使用事务脚本,java程序会将每一个更新脚本文件当做一个事务来处理。
    添加注释需要使用“ /注释/ ”方式来写
  4. 更新脚本文件命名规范:
    为文件名称使用以下格式
    <前缀><数据库版本表中的当前版本号><目标版本号>_<有关升级的其它信息>.sql,
    例如:report_1.0.1_1.0.2_rename_column.sql
    目前,前缀我们默认使用产品名称来描述,用来和每个项目中配置文件中的product_name对应
    5、记录应用升级脚本的历史,db_version_h
Docker jetty jersey 微服务 MicroService 容器    2017-03-26 11:06:08    927

本项目是将restful项目打包成可执行的war包,在docker中执行

环境介绍:

  1. docker 1.10.3
  2. jetty 8
  3. jersey 1.19

关键配置:

1. pom.xml配置

  1. <build>
  2. <finalName>${project.artifactId}</finalName>
  3. <plugins>
  4. <plugin>
  5. <groupId>org.mortbay.jetty</groupId>
  6. <artifactId>jetty-maven-plugin</artifactId>
  7. <version>${jetty.version}</version>
  8. <configuration>
  9. <systemProperties>
  10. </systemProperties>
  11. <webApp>
  12. <contextPath>/</contextPath>
  13. </webApp>
  14. </configuration>
  15. </plugin>
  16. <plugin>
  17. <groupId>org.apache.maven.plugins</groupId>
  18. <artifactId>maven-compiler-plugin</artifactId>
  19. <version>2.5.1</version>
  20. <configuration>
  21. <source>1.7</source>
  22. <target>1.7</target>
  23. </configuration>
  24. </plugin>
  25. <plugin>
  26. <groupId>org.apache.maven.plugins</groupId>
  27. <artifactId>maven-source-plugin</artifactId>
  28. <version>2.2</version>
  29. <executions>
  30. <execution>
  31. <id>attach-sources</id>
  32. <goals>
  33. <goal>jar</goal>
  34. </goals>
  35. </execution>
  36. </executions>
  37. </plugin>
  38. <plugin>
  39. <groupId>org.
Docker consul swarm overlay 容器    2017-03-26 11:04:44    1226

Docker的使用中,尤为重要的是服务发现和docker的宿主机集群及跨主机overlay网络的搭建,这里来介绍下常用来配合使用的swarm+consul集群的搭建(此处全基于docker容器)

集群介绍:

192.168.11.30 为consul服务的leader,swarm的集群server和client节点,并为primary

192.168.11.32 为consul服务的节点,swarm的集群server和client节点,并为备份节点

服务分布:

192.168.11.30:

consul、swarm、nginx

192.168.11.32:

consul、swarm、nexus、jenkins、registry

基础环境

修改docker基础配置

cluster-store 是consul的leader的地址

cluster-advertise 是swarm client的地址,即当前主机

11.30

  1. vi /usr/lib/systemd/system/docker.service
  2. ExecStart=/usr/bin/docker daemon --tls=false -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375 --cluster-store=consul://192.168.11.30:8500 --cluster-advertise=192.168.11.30:2375
  3. systemctl daemon-reload
  4. systemctl restart docker

11.32

  1. vi /usr/lib/systemd/system/docker.service
  2. ExecStart=/usr/bin/docker daemon --tls=false -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375 --cluster-store=consul://192.168.11.30:8500 --cluster-
docker alpine 容器 时区    2017-01-11 09:51:41    1018

在使用docker的时候,由于很多基础linux镜像都比较大,alpine这个仅仅几兆的linux基础镜像受到了很多人喜欢,笔者也不例外,可是由于alpine中的一些配置及命令与常见的centos等系统在一些方面不一样,下面来看看时区问题是如何解决的:

原因:alpine中,原生是不带时区相关的命令及文件的,需要安装额外的包来支持,然后需要将时区文件内容替换为localtime文件

解决办法

建议打造自己的alpine基础镜像,如下是我的alpine的Dockerfile:

  1. FROM alpine:3.4
  2. MAINTAINER firewarm LightingLiu <liuyg@liuyingguang.cn>
  3. # Install root filesystem
  4. ADD ./rootfs /
  5. # Install base packages
  6. RUN apk update && apk add curl bash tree tzdata \
  7. && cp -r -f /usr/share/zoneinfo/Hongkong /etc/localtime \
  8. && echo -ne "Alpine Linux 3.4 image. (`uname -rsv`)\n" >> /root/.built
  9. # Define bash as default command
  10. CMD ["/bin/bash"]

当这个镜像完成以后,不需要配置任何环境变量即可使用京八区的时区及时间

参考的源代码

  1. docker run -it --rm alpine /bin/sh
  2. / # date
  3. Sun May 8 20:46:18 UTC 2016
  4. / # apk add -U tzdata
  5. fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/main/x86_64/APKINDEX.tar.gz
  6. fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/comm
26/26