New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

处理ansible部署java应用的核心问题 #2

Open
2d0g opened this Issue Jun 27, 2017 · 0 comments

Comments

Projects
None yet
1 participant
@2d0g
Owner

2d0g commented Jun 27, 2017

问题1 进程管理

场景
方案:目前我用得比较多的有两种
1.使用monit
2.使用supervisor
这两种的原理和方式差别还是比较大的,这里选用supervisor。

问题2 配置管理

这里我们把项目配置件与项目代码分离,用独立的项目管理。因为公司只有我一个运维所以就放到了ansible的项目目录里。
image

问题3 表结构变更

场景: java没有像ror django高度集成化的框架自带migrate工具,需要额外使用工具完成。
方案: 这里我们使用了一个第三方的数据库migrate工具flywaydb
难点: flywaydb提供了几种执行方式表面上选择很多其实最适合线上的只有commandline。mvn 等构建的方式每次部署还需要构建浪费时间,而配置成启动执行更不科学,migrate因为一些原因(比如建立唯一索引时有重复数据)失败会导致应用无法起来。所以部署方案应该是使用commandline最合适,当然开发的时候开发人员可以使用启动执行migrate来简化开发步骤。此外需要考虑多台应用时候不应该都执行migrate,而是指定一台。尽管migrate工具可能已经有做这方面的考虑。

[java_cbs_app]
java_cbs_test1  app_address=192.168.10.103
java_cbs_test2   app_address=192.168.10.107                                        
  
[java_cbs_app:vars]
app_port=8088
app_version=develop
app_migrate_server=java_cbs_test1

这里我们在host文件的主机组增加一个变量app_migrate_server用于指定由谁执行migrate

问题4 热部署

java部署不像php项目,天生热部署。所以更多的是依靠前面挂载nginx haproxy依次重启应用完成切换部署。
现在生产环境具体如何用ansible完成自动切换。这里解决的问题总的来说就是ansible如何处理依次重启服务避免服务中断。

场景: 一台nginx 挂着两台java 应用
方案: 更新完java应用,依次重启。避免服务中断。
难点: ansible 对 nginx 和 java应用状态的判断和处理。这里使用wait_for 监听应用服务重启状态。

以下java_cbs是一个项目的ansible host 配置文件

[java_cbs_app]
java_cbs_test1  app_address=192.168.10.103
java_cbs_test2   app_address=192.168.10.107                                        
  
[java_cbs_app:vars]
app_port=8088
app_version=develop
app_migrate_server=java_cbs_test1
app_master=java_cbs_test1

这个项目配置两台服务器,一台java_cbs1 一台java_cbs2
app_master这里用于指定由java_cbs1 先重启。

- name: 先重启一台或部分应用服务
  supervisorctl: >-
    name={{ app_name }}
    state=restarted
    config=/etc/supervisord.conf
  when: inventory_hostname == app_master
 
- set_fact:
    master_host: "{{hostvars[app_master]['app_address']}}"
    master_port: "{{hostvars[app_master]['app_port']}}"
 
- name: 其他的应用服务器等待第一批服务重启完毕
  wait_for:
    host: "{{master_host}}"
    port: "{{master_port}}"
    timeout: 90
  when: inventory_hostname != app_master
 
- name: 等待nginx的一个fail_timeout周期,确保应用重新被加入nginx 
  pause:
    seconds: seconds: "{{(nginx_fail_timeout+1)|int}}"
 
- name: 重启其他的服务
  supervisorctl: >-
    name={{ app_name }}
    state=restarted
    config=/etc/supervisord.conf
  when: inventory_hostname != app_master

@2d0g 2d0g changed the title from ansible热切换部署java应用 to 处理ansible部署java应用的核心问题 Jun 29, 2017

@2d0g 2d0g self-assigned this Jul 4, 2017

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment