搭建Artifactory集群

搭建Artifactory集群

在阿里云上搭建Artifactory集群。

Artifactory许可证

官方正版license,3个 License 25900美元(16.7万人民币)一年,贵的离谱。本文以实验学习为主使用最新破解版4.7.4,破解也非常容易就不赘述了。商业用途,请使用正版。

所需硬件

Artifactory集群需要以下硬件设备:

  1. 支持粘性会话的均衡负载(HAProxy/Nginx等)。
  2. NFS共享文件夹。
  3. 数据库(MySQL等)。

网络

集群中所有的节点最好处于同一局域网内,节点之间使用固定端口传输数据。

服务器

本文使用阿里云ECS服务器,申请三台阿里云ECS服务器分别取名artifactory-master,artifactory-slave,artifactory-nfs。

Artifactory节点配置

artifactory会部署在artifactory-master和artifactory-slave上,需要安装所需的软件。

  1. 生成ssh key并配置authorized_keys方便服务管理。
  2. 安装JDK 8。

    1 apt-get install software-properties-common
    2 add-apt-repository ppa:webupd8team/java 3 apt-get update 4 apt-get install oracle-java8-installer
  3. 编辑.bashrc文件vi ~/.bashrc在文件尾加入以下内容:

    1 if [ -f ~/.bash_env ]; then
    2    . ~/.bash_env
    3 fi
  4. 创建.bash_env文件touch ~/.bash_env并添加JAVA_HOME环境变量:

    1 export JAVA_HOME=/usr/lib/jvm/java-8-oracle
    2 export JRE_HOME=$JAVA_HOME/jre 3 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib 4 export PATH=$JAVA_HOME/bin:$PATH
  5. 上传artifactory-pro-4.7.4.zip到artifactory-master和artifactory-slave服务器/opt目录并解压,并生成两个不同的artifactory.lic许可证,分别放在/opt/artifactory-pro-4.7.4/etc目录下。

    1 scp artifactory-pro-4.7.4.zip root@<ip>:/opt
  6. 分别在artifactory两个节点设置artifactory环境变量,编辑.bash_env文件。

    1 export ARTIFACTORY_HOME=/opt/artifactory-pro-4.7.4
    2 export JAVA_HOME=/usr/lib/jvm/java-8-oracle
    3 export JRE_HOME=$JAVA_HOME/jre 4 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib 5 export PATH=$JAVA_HOME/bin:$PATH
  7. 安装artifactory as service。

    1 sh installService.sh
    2 
    3 passwd artifactory <new password>

NFS配置

NFS配置需要在artifactory-nfs上安装NFS服务端,需要在artifactory-master和artifactory-salve上安装NFS客户端。

  1. 在artifactory-nfs服务器上安装nfs-kernel-server。

    1 apt-get install nfs-kernel-server
  2. 在/etc/exports文件里增加一行。

    1 /artifactory/cluster-home *(rw,sync,no_root_squash,no_subtree_check)
  3. 在artifactory-master和artifactory-salve分别安装NFS客户端。

    1 apt-get install nfs-common portmap
  4. 在artifactory-master和artifactory-salve分别创建NFS待挂载目录/artifactory/cluster-home。

    1 mkdir /artifactory/cluster-home
    2 mount <artifactory-nfs' IP>:/artifactory/cluster-home /artifactory/cluster-home
  5. 将NFS目录分配权限。

    1 chown -R artifactory:artifactory /artifactory/cluster-home

安装MySQL

在artifactory-nfs上安装MySQL。

  1. 安装MySQL。

    1 apt-get install mysql-server mysql-client
    2 
    3 mysql>
    4 CREATE DATABASE artdb CHARACTER SET utf8 COLLATE utf8_bin; 5 CREATE USER artifactory IDENTIFIED BY 'password'; 6 GRANT ALL PRIVILEGES ON *.* TO 'artifactory'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; 7 FLUSH PRIVILEGES;
  2. MySQL性能优化。

  3. 允许MySQL远程访问。修改云主机上的/etc/mysql/my.cnf 文件,注释掉 bind_address=127.0.0.1就可以了。

配置artifactory-master

  1. /artifactory/cluster-home下创建一下目录:

    1 mkdir ha-etc
    2 mkdir ha-data 3 mkdir ha-backup
  2. ./ha-etc下创建文件cluster.properties,内容为:

    1 ##随机生成的token,保证唯一就行
    2 security.token=4n4tpxip7spQQu2pKf3811S2W7GY46Yb
  3. ./ha-etc下创建文件storage.properties,内容为:

    1 type=mysql
    2 driver=com.mysql.jdbc.Driver 3 url=jdbc:mysql://<artifactory-nfs' IP>:3306/artdb?characterEncoding=UTF-8&elideSetAutoCommits=true 4 username=artifactory 5 password=password
  4. 复制artifactory.system.propertiesmimetypes.xml文件

    1 mv /opt/artifactory-pro-4.7.4/etc/artifactory.system.properties /artifactory/cluster-home/ha-etc
    2 mv /opt/artifactory-pro-4.7.4/etc/mimetypes.xml /artifactory/cluster-home/ha-etc
  5. 在/opt/artifactory-pro-4.7.4/etc目录下创建ha-node.properties文件,内容如下:

    1 node.id=art1
    2 cluster.home=/artifactory/cluster-home 3 context.url=http://<artifactory-master's IP>:8081/artifactory 4 membership.port=10001 5 primary=true
  6. .bash_env文件添加$CLUSTER_HOME环境变量。

    1 export ARTIFACTORY_HOME=/opt/artifactory-pro-4.7.4
    2 export CLUSTER_HOME=/artifactory/cluster-home
    3 export JAVA_HOME=/usr/lib/jvm/java-8-oracle 4 export JRE_HOME=$JAVA_HOME/jre 5 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib 6 export PATH=$JAVA_HOME/bin:$PATH

配置artifactory-slave

注意:对于每个artifactory集群节点使用的artifactory.lic是不一样的,否者将会报错。

  1. 在/opt/artifactory-pro-4.7.4/etc目录下创建ha-node.properties文件,内容如下:

    1 node.id=art1
    2 cluster.home=/artifactory/cluster-home 3 context.url=http://<artifactory-slave's IP>:8081/artifactory 4 membership.port=10001 5 primary=false
  2. 在.bash_env文件添加$CLUSTER_HOME环境变量。

    1 export ARTIFACTORY_HOME=/opt/artifactory-pro-4.7.4
    2 export CLUSTER_HOME/artifactory/cluster-home
    3 export JAVA_HOME=/usr/lib/jvm/java-8-oracle 4 export JRE_HOME=$JAVA_HOME/jre 5 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib 6 export PATH=$JAVA_HOME/bin:$PATH

安装Nginx负载均衡

Nginx也支持粘性会话如使用ip_hash等,但是最好的方案是借助第三份中间件例如Redis来存储session,使用Nginx+Tomcat+Redis组合。在此我使用最简单的ip_hash方法。Nginx的default文件配置:

##nginx.conf
user www-data;

worker_processes 8;

error_log /var/log/nginx/error.log crit;

pid /run/nginx.pid;

events
{
  use epoll;
  worker_connections 8192;
}

http
{
  include /etc/nginx/mime.types;
  default_type application/octet-stream;

  charset utf-8;

  server_names_hash_bucket_size 128;
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;

  keepalive_timeout 30;

  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;

  # gzip压缩功能设置
  gzip on;
  gzip_min_length 1k;
  gzip_buffers 4 16k;
  gzip_http_version 1.1;
  gzip_comp_level 2;
  gzip_types text/plain application/json application/xml application/x-javascript text/css text/xml text/javascript;
  gzip_vary on;

  #允许客户端请求的最大的单个文件字节数
  client_max_body_size 10m;

  #缓冲区代理缓冲用户端请求的最大字节数
  client_body_buffer_size 128k;

  #跟后端服务器连接的超时时间_发起握手等候响应超时时间
  proxy_connect_timeout 600;

  #连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理
  proxy_read_timeout 600;

  #后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
  proxy_send_timeout 600;

  #代理请求缓存区_这个缓存区间会保存用户的头信息以供Nginx经行规则处理_一般只要能保存下头信息即可
  proxy_buffer_size 16k;

  #Nginx保存单个用的几个Buffer及最大用多大空间
  proxy_buffers 4 32k;

  #如果系统很忙的时候可以申请最大的proxy_buffers
  proxy_busy_buffers_size 64k;

  #proxy缓存临时文件的大小
  proxy_temp_file_write_size 64k;

  include /etc/nginx/conf.d/*.conf;
  include /etc/nginx/sites-enabled/*;
}
##default
upstream artifactory {
    ip_hash;
    server <ip>:<port>;
    server <ip>:<port>;
}

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.html index.htm;

    # Make site accessible from http://localhost/
    server_name localhost;

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
        # Uncomment to enable naxsi on this location
        # include /etc/nginx/naxsi.rules
    }

   location /artifactory {
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header Host $http_host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Url-Scheme $scheme;
       proxy_redirect off;
       proxy_pass http://artifactory;
   }
  
   # Media: images, icons, video, audio, HTC
   location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc| woff)$ {
       expires 1M;
       access_log off;
       add_header Cache-Control "public";
       proxy_pass http://artifactory;
   }
    
   # CSS and Javascript
   location ~* \.(?:css|js)$ {
       expires 1M;
       access_log off;
       add_header Cache-Control "public";
       proxy_pass http://artifactory;
   }
}

启动

1 su - artifactory
2 service artifactory start

仓库之间复制

Artifactory允许支持不同地区不同项目之间artifactory实例复制。带来的好处有以下几点:

  1. 不同地区的开发团队可以使用相同artifacts。
  2. 构建的产出artifacts能够及时共享。
  3. 缓解远程网络连接不稳定性。
  4. 访问远程其他artifactory仓库。

Push方式

用于本地仓库,上传到某个artifactory实例的某个本地仓库能够同步到其他远程artifactory仓库里面。

Pull方式

用于远程仓库,将远程artifactory仓库同步到本地artifactory某个仓库。

Artifactory集群性能优化

  1. Artifactory Performance Tuning

你可能感兴趣的:(搭建Artifactory集群)