原文链接地址:「实战篇」开源项目 docker 化运维部署 - 后端 java 部署 (七)
本节主要说说后端的部署需要注意的点, 本身 renren-fast 这个项目就是通过 springboot 来进行开发的, springboot 内置的有 tomcat 所以, 咱们不用在容器内安装 tomcat, 直接用 jar 文件来进行运行. 源码: 后端 / 后端双机热备
https://gitee.com/renrenio/renren-fast
spring boot
如何配置 Redis 集群
之前配置的 Redis 集群, 修改下单节点的吧, 把所有的 Redis 集群都放上去.
- spring:
- # 环境 dev|test|prod
- profiles:
- active: dev
- # jackson 时间格式化
- jackson:
- time-zone: GMT+8
- date-format: yyyy-MM-dd HH:mm:ss
- http:
- multipart:
- max-file-size: 100MB
- max-request-size: 100MB
- enabled: true
- Redis:
- open: false # 是否开启 Redis 缓存 true 开启 false 关闭
- database: 0
- #host: localhost
- #port: 6379
- #password: # 密码 (默认为空)
- timeout: 6000 # 连接超时时长 (毫秒)
- cluster:
- nodes:
- - 172.19.0.2:6379
- - 172.19.0.3:6379
- - 172.19.0.4:6379
- - 172.19.0.5:6379
- - 172.19.0.6:6379
- - 172.19.0.7:6379
- pool:
- max-active: 1000 # 连接池最大连接数 (使用负值表示没有限制)
- max-wait: -1 # 连接池最大阻塞等待时间 (使用负值表示没有限制)
- max-idle: 10 # 连接池中的最大空闲连接
- min-idle: 5 # 连接池中的最小空闲连接
maven 打包工程
renren-fast 包含了 tomcat.jar 文件, 准确的来说是 springboot 的 maven,pom 中自带的 tomcat. 所以打包成 jar 包可以独立运行文件
注意: java 后台程序不使用虚拟网络, 直接使用宿主的 ip 端口.--net=host
运行 java 容器部署后端项目 <j1 的后台 >
- docker volume create j1
- # 查看 j1 所在的路径, 方便 jar 包上传
- docker volume inspect j1
- docker run -it -d name j1 -v j1:/home/soft --net=host java
- docker exec -it j1 bash
- # 将编译好的 jar 拷贝到宿主机上 j1 所在的目录下 nohubp 就是后台挂机项目
- nohup java -jar /home/soft/renren-fast.jar
运行 java 容器部署后端项目 <j2 的后台 >
- docker volume create j2
- # 查看 j2 所在的路径, 方便 jar 包上传
- docker volume inspect j2
- docker run -it -d name j2 -v j2:/home/soft --net=host java
- docker exec -it j2 bash
- # 将编译好的 jar 拷贝到宿主机上 j2 所在的目录下 nohubp 就是后台挂机项目
- nohup java -jar /home/soft/renren-fast.jar
运行 java 容器部署后端项目 <j3 的后台 >
- docker volume create j3
- # 查看 j3 所在的路径, 方便 jar 包上传
- docker volume inspect j3
- docker run -it -d name j3 -v j3:/home/soft --net=host java
- docker exec -it j3 bash
- # 将编译好的 jar 拷贝到宿主机上 j3 所在的目录下 nohubp 就是后台挂机项目
- nohup java -jar /home/soft/renren-fast.jar
设置负载均衡
所有的负载都发送到一个 jar 包上, 如果量比较大, tomcat 最大承受 500 的并发, Tomcat 可能就挂了.
nginx
nginx 是性能非常出色的反向代理服务器, 最大可以支持 8 万 / 秒的并发访问, 之前咱们数据库中间件和 Redis 中间件使用了 haproxy, 因为 haproxy 对 tcp 这种负载均衡做的比较好, 现在 java 容器内的 tomcat 是支持的 http 的协议, http 负载做的最好的是 nginx, 我们选择 nginx 负载均衡的产品.
nginx 的配置 < n1>
定义了一个 upstream tomcat 内置的都是宿主机器的 ip 和端口, 通过端口的映射找到对应的容器, 在 server 中配置好 tomcat 的和 nginx 的端口, 直接访问 nginx, 进行跳转到对应的 java 容器上. 端口 6101
- user nginx;
- worker_processes 1;
- error_log /var/log/nginx/error.log warn;
- pid /var/run/nginx.pid;
- events {
- worker_connections 1024;
- }
- http {
- include /etc/nginx/mime.types;
- default_type application/octet-stream;
- log_format main '$remote_addr - $remote_user [$time_local]"$request" '
- '$status $body_bytes_sent"$http_referer" '
- '"$http_user_agent" "$http_x_forwarded_for"';
- access_log /var/log/nginx/access.log main;
- sendfile on;
- #tcp_nopush on;
- keepalive_timeout 65;
- #gzip on;
- proxy_redirect off;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- client_max_body_size 10m;
- client_body_buffer_size 128k;
- proxy_connect_timeout 5s;
- proxy_send_timeout 5s;
- proxy_read_timeout 5s;
- proxy_buffer_size 4k;
- proxy_buffers 4 32k;
- proxy_busy_buffers_size 64k;
- proxy_temp_file_write_size 64k;
- upstream tomcat {
- server 192.168.66.100:6001;
- server 192.168.66.100:6002;
- server 192.168.66.100:6003;
- }
- server {
- listen 6101;
- server_name 192.168.66.100;
- location / {
- proxy_pass http://tomcat;
- index index.html index.htm;
- }
- }
- }
创建 nginx 的指令 < n1>
nginx 使用宿主的主机 ip.--net=host
- # 容器内的 nginx 启动加载容器外的配置文件
- docker run -it -d --name n1 -v /root/v1/nginx.conf:/etc/nginx/nginx.conf --net=host --privileged nginx
nginx 的配置 < n2>
端口 6102
- user nginx;
- worker_processes 1;
- error_log /var/log/nginx/error.log warn;
- pid /var/run/nginx.pid;
- events {
- worker_connections 1024;
- }
- http {
- include /etc/nginx/mime.types;
- default_type application/octet-stream;
- log_format main '$remote_addr - $remote_user [$time_local]"$request" '
- '$status $body_bytes_sent"$http_referer" '
- '"$http_user_agent" "$http_x_forwarded_for"';
- access_log /var/log/nginx/access.log main;
- sendfile on;
- #tcp_nopush on;
- keepalive_timeout 65;
- #gzip on;
- proxy_redirect off;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- client_max_body_size 10m;
- client_body_buffer_size 128k;
- proxy_connect_timeout 5s;
- proxy_send_timeout 5s;
- proxy_read_timeout 5s;
- proxy_buffer_size 4k;
- proxy_buffers 4 32k;
- proxy_busy_buffers_size 64k;
- proxy_temp_file_write_size 64k;
- upstream tomcat {
- server 192.168.66.100:6001;
- server 192.168.66.100:6002;
- server 192.168.66.100:6003;
- }
- server {
- listen 6102;
- server_name 192.168.66.100;
- location / {
- proxy_pass http://tomcat;
- index index.HTML index.htm;
- }
- }
- }
创建 nginx 的指令 < n2>
nginx 使用宿主的主机 ip.--net=host
- # 容器内的 nginx 启动加载容器外的配置文件
- docker run -it -d --name n2 -v /root/v2/nginx.conf:/etc/nginx/nginx.conf --net=host --privileged nginx
后端项目的双机热备负载均衡方案
之前已经设置了 n1 和 n2, 都可以正常的访问后端, 但是没有设置 keepalived, 他们之前无法争抢 ip, 无法做到双机热备. 这次说说双机热备.
进入容器 n1 然后安装 keepalived
keepalived 必须在 n1 所在的容器之内, 也可以在 docker 仓库里面下载一个 nginx-keepalived 的镜像. 这里直接在容器内安装 keepalived.
- docker exec -it n1 /bin/bash
- # 写入 dns, 防止 apt-get update 找不到服务器
- echo "nameserver 8.8.8.8" | tee /etc/resolv.conf> /dev/null
- apt-get clean
- apt-get update
- apt-get install VIM
- vi /etc/apt/sources.list
sources.list 添加下面的内容
- deb http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse
- deb-src http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse
- deb http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted
- deb-src http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted
- deb http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted
- deb http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted
- deb-src http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted
- deb http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted
- deb-src http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted
- deb-src http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted
更新 apt 源
- apt-get clean
- apt-get update
- apt-get install keepalived
- apt-get install VIM
keepalived 配置文件
容器内的路径:/etc/keepalived/keepalived.conf
- vi /etc/keepalived/keepalived.conf
- keepalived.conf
- vrrp_instance VI_1 {
- state MASTER
- interface ens33
- virtual_router_id 51
- priority 100
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 123456
- }
- virtual_ipaddress {
- 192.168.66.151
- }
- }
- virtual_server 192.168.66.151 6201 {
- delay_loop 3
- lb_algo rr
- lb_kind NAT
- persistence_timeout 50
- protocol TCP
- real_server 192.168.66.100 6101 {
- weight 1
- }
- }
VI_1 名称可以自定义
state MASTER | keepalived 的身份 (MASTER 主服务器, BACKUP 备份服务器, 不会抢占虚拟机 ip). 如果都是主 MASTER 的话, 就会进行互相争抢 IP, 如果抢到了就是 MASTER, 另一个就是 SLAVE.
interface 网卡, 定义一个虚拟 IP 定义到那个网卡上边. 网卡设备的名称. eth33 是宿主机是网卡.
virtual_router_id 51 | 虚拟路由标识, MASTER 和 BACKUP 的虚拟路由标识必须一致. 标识可以是 0-255.
priority 100 | 权重. MASTER 权重要高于 BACKUP 数字越大优选级越高. 可以根据硬件的配置来完成, 权重最大的获取抢到的级别越高.
advert_int 1 | 心跳检测. MASTER 与 BACKUP 节点间同步检查的时间间隔, 单位为秒. 主备之间必须一致.
authentication | 主从服务器验证方式. 主备必须使用相同的密码才能正常通信. 进行心跳检测需要登录到某个主机上边所有有账号密码.
virtual_ipaddress | 虚拟 ip 地址, 可以设置多个虚拟 ip 地址, 每行一个. 根据上边配置的 eth33 上配置的 ip.192.168.66.151 是自己定义的虚拟 ip
启动 keeplived
容器内启动
service keepalived start
image
进入容器 n2 然后安装 keepalived
keepalived 必须在 n2 所在的容器之内, 也可以在 docker 仓库里面下载一个 nginx-keepalived 的镜像. 这里直接在容器内安装 keepalived.
- docker exec -it n2 /bin/bash
- # 写入 dns, 防止 apt-get update 找不到服务器
- echo "nameserver 8.8.8.8" | tee /etc/resolv.conf> /dev/null
- apt-get clean
- apt-get update
- apt-get install VIM
- vi /etc/apt/sources.list
sources.list 添加下面的内容
- deb http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse
- deb-src http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse
- deb http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted
- deb-src http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted
- deb http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted
- deb http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted
- deb-src http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted
- deb http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted
- deb-src http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted
- deb-src http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted
更新 apt 源
- apt-get clean
- apt-get update
- apt-get install keepalived
- apt-get install VIM
keepalived 配置文件
容器内的路径:/etc/keepalived/keepalived.conf
- vi /etc/keepalived/keepalived.conf
- keepalived.conf
- vrrp_instance VI_1 {
- state MASTER
- interface ens33
- virtual_router_id 51
- priority 100
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 123456
- }
- virtual_ipaddress {
- 192.168.66.151
- }
- }
- virtual_server 192.168.66.151 6201 {
- delay_loop 3
- lb_algo rr
- lb_kind NAT
- persistence_timeout 50
- protocol TCP
- real_server 192.168.66.100 6101 {
- weight 1
- }
- }
VI_1 名称可以自定义
state MASTER | keepalived 的身份 (MASTER 主服务器, BACKUP 备份服务器, 不会抢占虚拟机 ip). 如果都是主 MASTER 的话, 就会进行互相争抢 IP, 如果抢到了就是 MASTER, 另一个就是 SLAVE.
interface 网卡, 定义一个虚拟 IP 定义到那个网卡上边. 网卡设备的名称. eth33 是宿主机是网卡.
virtual_router_id 51 | 虚拟路由标识, MASTER 和 BACKUP 的虚拟路由标识必须一致. 标识可以是 0-255.
priority 100 | 权重. MASTER 权重要高于 BACKUP 数字越大优选级越高. 可以根据硬件的配置来完成, 权重最大的获取抢到的级别越高.
advert_int 1 | 心跳检测. MASTER 与 BACKUP 节点间同步检查的时间间隔, 单位为秒. 主备之间必须一致.
authentication | 主从服务器验证方式. 主备必须使用相同的密码才能正常通信. 进行心跳检测需要登录到某个主机上边所有有账号密码.
virtual_ipaddress | 虚拟 ip 地址, 可以设置多个虚拟 ip 地址, 每行一个. 根据上边配置的 eth33 上配置的 ip.192.168.66.151 是自己定义的虚拟 ip
启动 keeplived
容器内启动
service keepalived start
image
PS: 到此未知后端的 nginx 双负载, 双热备方案已经实现了,
来源: http://www.jianshu.com/p/25e6a9d8c6ed