添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

最近老大给我了一个需求,研究一下nexus的高可用的方案,刚开始确实没有啥头绪。只能网上各种找资料,但是确实这方面资料不多。而且在线上搭建的教案也就更少了。前前后后大概花了两周多才把方案整理出来,并在uat环境搭建起来。

方案:基于keepalived+inotify+rsync的nexus主备模式

1、安装jdk

1.1 linux安装jdk

这个不做过多介绍,网上多的是。

1.2 配置jdk环境

vim /etc/profile

# vim /etc/profile
export JAVA_HOME=/opt/export/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export RUN_AS_USER=root  # 后边启动nexus需要
# source /etc/profile

这里如果线上有多套jdk版本,可以在nexus配置里面去指定jdk。

export RUN_AS_USER=root 保证nexus在启动的时候不会报错

2、安装nexus 3

nexus 3可以到官网下载, https://help.sonatype.com/repomanager3/download/download-archives---repository-manager-3

解压nexus

tar -zxvf nexus.tar.gz

进入nexus :

如有需要可以进入nexus,修改配置

## DO NOT EDIT - CUSTOMIZATIONS BELONG IN $data-dir/etc/nexus.properties
# Jetty section
application-port=8081
application-host=0.0.0.0
nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml
nexus-context-path=/
# Nexus section
nexus-edition=nexus-pro-edition
nexus-features=\
 nexus-pro-feature

这里可以修改端口号 

设置jdk

vim bin/nexus

指定jdk :INSTALL4J_JAVA_HOME_OVERRIDE=/opt/jdk8

#!/bin/sh
# chkconfig:         2345 75 15
# description:       nexus
### BEGIN INIT INFO
# Provides:          nexus
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: nexus
### END INIT INFO
# Uncomment the following line to override the JVM search sequence
INSTALL4J_JAVA_HOME_OVERRIDE=/opt/jdk8
# Uncomment the following line to add additional VM parameters
# INSTALL4J_ADD_VM_PARAMS=
INSTALL4J_JAVA_PREFIX=""
GREP_OPTIONS=""
read_db_entry() {
  if [ -n "$INSTALL4J_NO_DB" ]; then
    return 1
  if [ ! -f "$db_file" ]; then
    return 1
  if [ ! -x "$java_exc" ]; then

启动nexus

./nexus-3.14.0-04/bin/nexus start

查看日志 cat sonatype-work/nexus3/log/nexus.log

如下所以表示已经启动成功了

当然我们要搭建主备模式,也要选择一台服务器做备份,执行上面操作。

浏览器访问nexus页面

如上所示,主备nexus已经搭建完成了。

下面我们考虑如何使他们成为主备模式。

  1. 通信如何让备nexus在主nexus宕机的情况下,让备nexus充当主nsxus,我们采用的是keepalived 
  2. 数据同步,让备nexus数据和主nexus数据一致rsync
  3. 但是rsync不及时,容易遗漏数据,我们这里采用inotify+rsync来实现数据实时同步

3、keepalived 搭建

  • Keepalived的作用是检测服务器状态,如果一台服务器宕机或者出现其他故障导致当前服务器不可用,keep alived就会检测到并将故障的服务器从系统中剔除,同时使用备用服务器替代该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
  • Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。
  • Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。

所以,Keepalived 一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。

总而言之 keepalived有三个功能:

  1. 管理LVS软件
  2. 基于VRRP实现高可用
  3. 健康检查,故障切换

3.1 搭建keepalived

安装命令:yum install keepalived -y

搭建成功后如下:

keepalived.conf 配置文件后面我们需要对他进行修改。

3.2 日志服务配置(主备一样)

将KEEPALIVED_OPTIONS="-D"  改成  KEEPALIVED_OPTIONS="-D -d -S 0"

[root@KSSHUAT01041 /home/ec1]# cat /etc/sysconfig/keepalived 
# Options for keepalived. See `keepalived --help' output and keepalived(8) and
# keepalived.conf(5) man pages for a list of all options. Here are the most
# common ones :
# --vrrp               -P    Only run with VRRP subsystem.
# --check              -C    Only run with Health-checker subsystem.
# --dont-release-vrrp  -V    Dont remove VRRP VIPs & VROUTEs on daemon stop.
# --dont-release-ipvs  -I    Dont remove IPVS topology on daemon stop.
# --dump-conf          -d    Dump the configuration data.
# --log-detail         -D    Detailed log messages.
# --log-facility       -S    0-7 Set local syslog facility (default=LOG_DAEMON)
KEEPALIVED_OPTIONS="-D -d -S 0"

修改配置文件:vim /etc/rsyslog.conf

添加:local0.* /var/log/keepalived.log

重启rsyslog服务:service rsyslog restart

重启keepalived,后面我们把keepalived的配置文件修改好在重启

3.3 keepalived的配置文件修改

3.3.1 主nexus 配置如下:

! Configuration File for keepalived
global_defs {
   router_id nexus01
   # vrrp_strict
vrrp_script chk_http_port 
    script "/etc/keepalived/check_keepalived.sh"
    interval 10
vrrp_instance VI_1 {
    state MASTER
    interface ens192 
    virtual_router_id 51
    priority 120
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    virtual_ipaddress {
        172.25.221.253/24
	track_script {
        chk_http_port
  • 这里需要注意的地方:vrrp_script chk_http_port 与大括号一定要换行,不然可能会不执行,之前我是做了空格,怎么都不识别。换行后就可行了。卡了我近一天的时间。
  • 设置虚拟ip 这里也要主要到。如果你是在线上布置,一定要确定这个虚拟ip别的服务器没有再用(找运维把这个ip申请下来独用),切记,切记。这个地方我踩了坑,搞了好久。
  • # vrrp_strict把这个注释掉

配置详情如下:

# 全局配置
global_defs {
   # 邮件通知信息
   notification_email {
     # 定义收件人
     [email protected]
   # 定义发件人
   notification_email_from [email protected]
   # SMTP服务器地址
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   # 路由器标识,一般不用改,也可以写成每个主机自己的主机名
   router_id LVS_DEVEL
   # VRRP的ipv4和ipv6的广播地址,配置了VIP的网卡向这个地址广播来宣告自己的配置信息,下面是默认值
   vrrp_mcast_group4 224.0.0.18
   vrrp_mcast_group6 ff02::12
# 定义用于实例执行的脚本内容,比如可以在线降低优先级,用于强制切换
vrrp_script SCRIPT_NAME {
# 一个vrrp_instance就是定义一个虚拟路由器的,实例名称
vrrp_instance VI_1 {
    # 定义初始状态,可以是MASTER或者BACKUP
    state MASTER
    # 工作接口,通告选举使用哪个接口进行
    interface ens33
    # 虚拟路由ID,如果是一组虚拟路由就定义一个ID,如果是多组就要定义多个,而且这个虚拟
    # ID还是虚拟MAC最后一段地址的信息,取值范围0-255
    virtual_router_id 51
    # 使用哪个虚拟MAC地址
    use_vmac XX:XX:XX:XX:XX
    # 监控本机上的哪个网卡,网卡一旦故障则需要把VIP转移出去
    track_interface {
        ens33
    # 如果你上面定义了MASTER,这里的优先级就需要定义的比其他的高
    priority 100
    # 通告频率,单位为秒
    advert_int 1
    # 通信认证机制,这里是明文认证还有一种是加密认证
    authentication {
        auth_type PASS
        auth_pass 1111
    # 设置虚拟VIP地址,一般就设置一个,在LVS中这个就是为LVS主机设置VIP的,这样你就不用自己手动设置了
    virtual_ipaddress {
        # IP/掩码 dev 配置在哪个网卡
        192.168.200.16/24 dev eth1
        # IP/掩码 dev 配置在哪个网卡的哪个别名上
        192.168.200.17/24 dev label eth1:1
    # 虚拟路由,在需要的情况下可以设置lvs主机 数据包在哪个网卡进来从哪个网卡出去
    virtual_routes {
        192.168.110.0/24 dev eth2
    # 工作模式,nopreempt表示工作在非抢占模式,默认是抢占模式 preempt
    nopreempt|preempt
    # 如果是抢占默认则可以设置等多久再抢占,默认5分钟
    preempt delay 300
    # 追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容
    track_script {
    # 三个指令,如果主机状态变成Master|Backup|Fault之后会去执行的通知脚本,脚本要自己写
    notify_master ""
    notify_backup ""
    notify_fault ""
# 定义LVS集群服务,可以是IP+PORT;也可以是fwmark 数字,也就是防火墙规则
# 所以通过这里就可以看出来keepalive天生就是为ipvs而设计的
virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr|wrr|lc|wlc|lblc|sh|dh 
    # LVS的模式
    lb_kind NAT|DR|TUN
    # 子网掩码,这个掩码是VIP的掩码
    nat_mask 255.255.255.0
    # 持久连接超时时间
    persistence_timeout 50
    # 定义协议
    protocol TCP
    # 如果后端应用服务器都不可用,就会定向到那个服务器上
    sorry_server 192.168.200.200 1358
    # 后端应用服务器 IP PORT
    real_server 192.168.200.2 1358 {
        weight 1
        # MSIC_CHECK|SMTP_CHEKC|TCP_CHECK|SSL_GET|HTTP_GET这些都是
        # 针对应用服务器做健康检查的方法
        MISC_CHECK {}
        # 用于检查SMTP服务器的
        SMTP_CHEKC {}
        # 如果应用服务器不是WEB服务器,就用TCP_CHECK检查
        TCP_CHECK {
          # 向哪一个端口检查,如果不指定默认使用上面定义的端口
          connect_port <PORT>
          # 向哪一个IP检测,如果不指定默认使用上面定义的IP地址
          bindto <IP>
          # 连接超时时间
          connect_timeout 3
        # 如果对方是HTTPS服务器就用SSL_GET方法去检查,里面配置的内容和HTTP_GET一样
        SSL_GET {}
        # 应用服务器UP或者DOWN,就执行那个脚本
        notify_up "这里写的是路径,如果脚本后有参数,整体路径+参数引起来"
        notify_down "/PATH/SCRIPTS.sh 参数"
        # 使用HTTP_GET方法去检查
        HTTP_GET {
            # 检测URL
            url { 
              # 具体检测哪一个URL
              path /testurl/test.jsp
              # 检测内容的哈希值
              digest 640205b7b0fc66c1ea91c463fac6334d
              # 除了检测哈希值还可以检测状态码,比如HTTP的200 表示正常,两种方法二选一即可
              status_code 200
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            # 向哪一个端口检查,如果不指定默认使用上面定义的端口
            connect_port <PORT>
            # 向哪一个IP检测,如果不指定默认使用上面定义的IP地址
            bindto <IP>
            # 连接超时时间
            connect_timeout 3
            # 尝试次数
            nb_get_retry 3
            # 每次尝试之间间隔几秒
            delay_before_retry 3
    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3

脚本check_keepalived.sh根据实际情况进行编写,我写的比较简单。

#!/bin/bash
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
SERVER=localhost
PORT=8081
</dev/tcp/$SERVER/$PORT
if [ "$?" -ne 0 ]; then	
echo "$d nexus down,keepalived will stop" >> /etc/keepalived/check_keepalived.log
  echo "$d nexus down,keepalived will stop"
  systemctl stop keepalived
  echo "$d nexus is running,keepalived is starting"

当主nexus挂掉后,我就关闭keepalived,虚拟ip则会漂移到备nexus上。进行正常访问。并且会记录挂掉的日志。

3.3.2 备nexus配置文件搭建

! Configuration File for keepalived
global_defs {
   router_id nexus02
   # vrrp_strict
vrrp_instance VI_1 {
    state BACKUP
    interface ens192
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    virtual_ipaddress {
         172.25.221.253/24
    notify_master "/etc/keepalived/restart_nexus.sh"	
  • 备份状态为BACKUP 
  • 其中监听当备nexus变成为主的时候(虚拟ip漂移到备nexus服务上)重启nexus ,让nexus重新构建索引(nexus数据虽然已经同步过来,但是nexus备份过来数据不展示)。

restart_nexus.sh脚本如下:

#!/bin/bash
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
echo "$d virtual_ipaddress is skipping,nexus will restart"
echo "$d virtual_ipaddress is skipping,nexus will restart" >> /etc/keepalived/keepalived.log
/opt/nexus/nexus/nexus-3.14.0-04/bin/nexus restart

其中我们需要对在任务目录启动nexus进行配置。

vim /etc/profile

在配置下添加:export PATH=$PATH:/opt/nexus/nexus/nexus-3.14.0-04/bin

重新加载/etc/profile

source /etc/profile  

3.4 测试

主备 keepalived启动

systemctl start keepalived

我们看看虚拟ip是否已经开启

虚拟ip已经开启,查看日志:cat /var/log/keepalived.log 

这时候我们关闭nexus,看看是否可漂移备nexus上

root@KSSHUAT01041 /opt/nexus]# ./nexus/nexus-3.14.0-04/bin/nexus stop
WARNING: ************************************************************
WARNING: Detected execution as "root" user.  This is NOT recommended!
WARNING: ************************************************************
Shutting down nexus
Stopped.
[root@KSSHUAT01041 /opt/nexus]# 

nexus已关闭。查看监控日志:

那么我们再看看备nexus服务器是不是已经ip漂移过去

已经漂移。虚拟ip依然可以正常访问

亲测nexus后,如果不手动重启keepalived,则ip不会漂移过来,这就是我们的目的达到了。等到适当的时间再叫虚拟ip转回到主服务器上。

手动重启后,虚拟ip已经跑回主服务上。

4、数据同步

4.1 备 部署rsync服务端

yum install -y rsync

  • 编写配置文件
# /etc/rsyncd: configuration file for rsync daemon mode
uid = rsync
gid = rsync
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[nexus]
path = /opt/nexus/nexus/sonatype-work/nexus3
comment = "nexus backup dir"
ignore errors
read only = no
write only = no
hosts allow = 172.25.221.151
auth users = rsync_backup
secrets file = /etc/rsync.password
  • 创建备份目录的管理用户:useradd -s /sbin/nologin -M rsync
  • 创建安全认证文件:
  1. echo "rsync_backup:123" >/etc/rsync.password   
  2. chmod 600 /etc/rsync.password
  • 修改备份目录属主:chown -R rsync.rsync  /opt/nexus/nexus/sonatype-work/nexus3
  • 启动rsync服务 rsync --daemon

4.2 主 部署rsync客户端

  • 安装 yum install -y rsync
  • 创建安全认证文件
     echo "123" >/etc/rsync.password
     chmod 600 /etc/rsync.password

     

4.3 部署inotify-tools软件

下载:wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

解压并进入该目录下

tar xzf inotify-tools-3.14.tar.gz ;cd inotify-tools-3.14 

安装:./configure --prefix=/usr && make && su -c 'make install'

当然也可以:yum install -y inotify-tools

没有这个包,更新epel源:yum install -y epel-release && yum update

4.4 写同步脚本 

touch backup.sh

#!/bin/bash
###########
inotifywait -mrq /opt/nexus/nexus/sonatype-work/nexus3/  --format '%w%f'  -e create,delete,close_write,moved_to|\
while read line
  rsync -az --delete  /opt/nexus/nexus/sonatype-work/nexus3/*  [email protected]::nexus --password-file=/etc/rsync.password &>/dev/null
注意:inotify默认监控同步文件的个数是有限制的,8192,通过配置文件/proc/sys/fs/inotify/max_user_watches可以调整监控的个数。此问题明显就是文件太多,导致无法监控。

解决方案:echo 8192000 > /proc/sys/fs/inotify/max_user_watches

在后台执行: sh backup.sh &

如上,关于nexus的主备模式就搭建好了,自测数据可以同步。

最近老大给我了一个需求,研究一下nexus的高可用的方案,刚开始确实没有啥头绪。只能网上各种找资料,但是确实这方面资料不多。而且在线上搭建的教案也就更少了。前前后后大概花了两周多才把方案整理出来,并在uat环境搭建起来。方案:基于keepalived+inotify+rsync的nexus主备模式1、安装jdk1.1 linux安装jdk这个不做过多介绍,网上多的是。1.2 配置jdk环境vim /etc/profile# vim /etc/profileexport JAV
1、在ifconfig内容中找出ip [root@localhost ~]# ifconfig ens33|grep "inet "\ > |awk '{print $2}' #awk默认分割符号为空格 ping都懂用,可是linux下,ping命令会一直ping,不会自动停止怎么办 [root@localhost ~]# ping www.baidu.com -c 4 #-c 次数...
2、解决方法 1. 使用图片的网络路径 background:url('http://1812.img.pp.sohu.com.cn/images/blog/2009/11/18/18/8/125b6560a6ag214.jpg'); 2. base64
作为linux中最为常用的三大文本(awk,sed,grep)处理工具之一,掌握好其用法是很有必要的。 首先谈一下grep命令的常用格式为:grep [选项] ”模式“ [文件] grep家族总共有三个:grep,egrep,fgrep。 常用选项:   -E :开启扩展(Extend)的正则表达式。   -i :忽略大小写(ignore case)。   -v :反过来(inv...
Cisco Nexus系列交换机的切换引擎命令是非常简单的。可以通过以下步骤完成: 1.进入交换机的配置界面,输入命令“vpc domain <domain-id>”,赋值一个唯一的vPC名称; 2.再输入命令“peer-gateway”,配置同步 vPC peer-gateway选项; 3. 接着设置链路的优先级(priority和priority )和保护组(peer-keepalive destination、peer-gateway); 4.最后,定义交换机之间的虚拟机器口(vPC peer-link),使用命令“vpc peer-link”进行. 在配置完以上命令之后,切换引擎已经开始工作,交换机发生故障时,份交换机将自动接管网络操作并维持网络的正常运转。需要注意的是,由于Nexus 系列交换机大部分都是采用配置文件自动份功能,因此在进行切换之前一定要保证配置文件的一致性。在完成切换之后,测试网络是否正常,及时进行维护和故障排除。 ### 回答2: Cisco Nexus是一个数据中心交换平台,用于提供高性能和高可用性的网络服务。其切换引擎命令是通过在交换机上配置多个切换引擎来实现的。 首先,在交换机上配置多个切换引擎,可以使用"switch system"命令实现。具体命令如下: switch# conf t Enter configuration commands, one per line. End with CNTL/Z. switch(config)# switchsystem dual-sup switch(config)# switch 1 switch(config)# switchname Nexus7010-Switch1 switch(config)# exit switch(config)# switch(config)# switch 2 switch(config)# switchname Nexus7010-Switch2 switch(config)# exit switch(config)# 以上命令将交换机切换引擎名称分别设为Nexus7010-Switch1和Nexus7010-Switch2。 在此基础上,还需要配置两个切换引擎的优先级,可以使用"priority"命令实现。具体命令如下: switch(config)# span root primary priority 24576 switch(config)# span root secondary priority 16384 以上命令将切换引擎的优先级设置为24576,次切换引擎的优先级设置为16384。 最后,需要配置切换的触发条件,可以使用"spanning-tree guard root"命令实现。具体命令如下: switch(config)# interface Ethernet5/1 switch(config-if)# spanning-tree guard root 以上命令将Ethernet5/1端口配置为在切换引擎失效时,该端口将从切换引擎上接收并转发数据。 总的来说, Cisco Nexus切换引擎命令的配置过程是:配置切换引擎名称,设置切换引擎优先级,配置切换的触发条件。这样可以确保在切换引擎故障或故障发生时,网络不会发生中断的情况。 ### 回答3: Cisco Nexus交换机的切换引擎命令非常简单且易于执行。以下是具体操作步骤: 1. 确认交换机引擎的状态:通过执行show system redundancy status命令来查看交换机引擎的状态。输出结果应该包括引擎的IP地址和状态。 2. 更改交换机引擎状态为份:通过执行configure terminal命令进入配置模式,并执行system redundancy命令来切换引擎为份引擎,比如使用以下命令: switch# configureterminal switch(config)# systemredundancy switch(config-red)# switch-id2 switch(config-red)# exit 这里,switch-id 2表示份引擎的ID,可以根据实际情况进行调整。 3. 确认交换机引擎的状态更新:执行show system redundancy status命令可以再次确认引擎状态是否已成功更改。如果发现引擎的状态已更改为份引擎,则说明已成功执行切换引擎命令。 在使用切换引擎命令时,需要注意以下事项: 1. 在切换引擎命令期间,交换机可能会出现短暂的中断或性能下降。因此,建议在非工作时间执行此操作。 2. 在切换引擎命令执行期间,网络管理员应该时刻关注引擎状态并确保正常运行。 总的来说,切换引擎命令是保证切换引擎在Cisco Nexus交换机中正常运行的必要操作。网络管理员应该熟悉该命令的执行步骤,并在必要时执行此命令。 主keepalived需要停了同步吧 [code=shell] for i in `ps aux |grep [b]ackup.s |awk '{print $2}'`;do kill -9 $i;done [/code] Mybatis关键源码深度分析学习-插件与缓存 ctotalk: