kibana监控

只需要一步就可以开启

QQ图片20200604101646.png

查看效果

QQ图片20200604101650.png

使用nginx+keepalived代理多台redis

上面我们实验了单台redis作为收集日志的缓存层,但是单台redis存在一个问题,就是单点故障.虽然可以做持久化处理,但是加入服务器坏掉或者修复时间未知的情况下还是有可能会丢数据.redis集群方案有哨兵和集群,但可惜的是filebeat和logstash都不支持这两种方案.不过利用我们目前所学的知识完全可以解决这个问题,虽然不是彻底解决,但是已经很好了

  • 解决方案
  1. 使用nginx+keepalived反向代理负载均衡到后面的多台redis
  2. 考虑到redis故障切换中数据一致性的问题,所以最好我们只使用2台redis,并且只工作一台,另外一台作为backup,只有第一台坏掉后,第二台才会工作
  3. filebeat的output的redis地址为keepalived的虚拟IP
  4. logstash可以启动多个节点来加速读取redis的数据
  5. 后端可以采用多台Elasticsearch集群来做支撑

QQ图片20200604133751.png

节点安排

db01(10.0.0.51)

  • nginx: 80端口提供访问
  • filebeat: 读取日志文件存入redis
  • logstash: 从redis中读取日志
  • Elasticsearch: 存储日志信息

db02(10.0.0.52)

  • redis: 缓存日志,两台redis为独立节点

db03(10.0.0.53)

  • redis: 缓存日志,两台redis为独立节点

lb01(10.0.0.5)

  • nginx: 负载均衡提供高可用
  • keepalived: 高可用,避免redis单点故障

lb02(10.0.0.6)

  • nginx: 负载均衡提供高可用
  • keepalived: 高可用,避免redis单点故障

安装部署keepalived

#lb01,lb02
yum install -y keepalived

编写keepalived配置文件

  • /etc/keepalived/keepalived.conf : keepalived配置文件
  • GLOBAL CONFIGURATION : 全局配置部分
  • VRRPD CONFIGURATION : VRRP协议配置部分
  • LVS CONFIGURATION : LVS服务管理配置部分
#lb01,lb02
! Configuration File for keepalived

#全局配置部分
global_defs {
   #设置发送邮件信息的收件人
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   #设置连接的邮件服务器信息
   notification_email_from 1997sty@163.com
   smtp_server 163.smtp.xxx_
   smtp_connect_timeout 30
   #高可用集群主机身份标识(集群中主机身份标识名称不能重复)
   router_id LVS_DEVEL
}

#Vrrp协议家族
vrrp_instance 1997sty {
    #标识所在家族中的身份 (MASTER/BACKUP)
    state MASTER
    #指定虚拟IP地址出现在什么网卡上
    interface eth0
    #标识家族身份信息 多台高可用服务配置要一致
    virtual_router_id 51
    #设定优先级 优先级越高,就越有可能成为主
    priority 100
    #定义组播包发送的间隔时间(秒)  主和备配置一样
    advert_int 1
    #实现通讯需要有认证过程
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #配置虚拟IP地址信息
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}
  • 修改10.0.0.5/etc/keepalived/keepalived.conf配置文件
! Configuration File for keepalived

global_defs {
    router_id lb01
}

vrrp_instance 1997sty {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3/24
    }
}
  • 修改10.0.0.6/etc/keepalived/keepalived.conf配置文件
! Configuration File for keepalived

global_defs {
   router_id lb02
}

vrrp_instance 1997sty {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3/24
    }   
}

配置完成后启动keepalived服务

systemctl start keepalived.service
systemctl status keepalived.service

#查看ip信息,MASTER主机的ip会增加一个keepalived的ip地址
ip a

安装部署nginx

#lb01,lb02
vi /etc/yum.repos.d/nginx.repo

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
  • 启动nginx和设置开机启动
#lb01,lb02
systemctl start nginx
systemctl enable nginx

配置反向代理,四层转发

  • 在nginx主配置文件/etc/nginx/nginx.conf中,最后一行追加以下配置,重启nginx
#lb01,lb02
vi /etc/nginx/nginx.conf

stream {
  upstream redis {
      server 10.0.0.52:6379 max_fails=2 fail_timeout=10s;
      server 10.0.0.53:6379 max_fails=2 fail_timeout=10s backup;
  }

  server {
          listen 6379;
          proxy_connect_timeout 1s;
          proxy_timeout 3s;
          proxy_pass redis;
  }
}

安装部署redis

目录规划

#db02,db03
# redis下载目录
/data/soft/
# redis安装目录
/opt/redis_cluster/redis_{PORT}/{conf,logs,pid}
# redis数据目录
/data/redis_cluster/redis_{PORT}/redis_{PORT}.rdb
# redis运维脚本
/root/scripts/redis_shell.sh

安装命令

#db02,db03
#编辑hosts文件
echo '10.0.0.51 db01' >> /etc/hosts
echo '10.0.0.52 db02' >> /etc/hosts
echo '10.0.0.53 db03' >> /etc/hosts

#创建目录
mkdir -p /data/soft
mkdir -p /data/redis_cluster/redis_6379
mkdir -p /opt/redis_cluster/redis_6379/{conf,pid,logs}

#获取redis安装包或上传安装到到该路径
cd /data/soft/
wget http://download.redis.io/releases/redis-3.2.9.tar.gz

#解压
tar zxf redis-3.2.9.tar.gz -C /opt/redis_cluster/

#创建软连接,并进入目录编译安装
ln -s /opt/redis_cluster/redis-3.2.9/ /opt/redis_cluster/redis
cd /opt/redis_cluster/redis
make && make install

#默认执行脚本
/opt/redis_cluster/redis/utils/install_server.sh

创建db02配置文件

#db02
cd /opt/redis_cluster/redis_6379/conf/
cat > redis_6379.conf <<EOF
### 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 10.0.0.52
### 监听端口
port 6379
### pid文件和log文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
### 设置数据库的数量,默认数据库为0
databases 16
### 指定本地持久化文件的文件名,默认是dump.rdb
dbfilename redis_6379.rdb
### 本地数据库的目录
dir /data/redis_cluster/redis_6379
EOF

创建db03配置文件

#db03
cd /opt/redis_cluster/redis_6379/conf/
cat > redis_6379.conf <<EOF
### 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 10.0.0.53
### 监听端口
port 6379
### pid文件和log文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
### 设置数据库的数量,默认数据库为0
databases 16
### 指定本地持久化文件的文件名,默认是dump.rdb
dbfilename redis_6379.rdb
### 本地数据库的目录
dir /data/redis_cluster/redis_6379
EOF

启动关闭服务

#db02,db03
#启动
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf

修改filebeat配置文件

#db01
#修改后重启
vi /etc/filebeat/filebeat.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
  json.keys_under_root: true
  json.overwrite_keys: true
  tags: ["access"]

- type: log
  enabled: true
  paths:
    - /var/log/nginx/error.log
  tags: ["error"]

setup.kibana:
  host: "10.0.0.51:5601"

output.redis:
  hosts: ["10.0.0.3"]
  key: "filebeat"

修改完成后启动

systemctl restart filebeat

修改logstash配置文件

#db01
vi /etc/logstash/conf.d/redis.conf

input {
  redis {
    host => "10.0.0.3"
    port => "6379"
    db => "0"
    key => "filebeat"
    data_type => "list"
  }
}

filter {
  mutate {
    convert => ["upstream_time", "float"]
    convert => ["request_time", "float"]
  }
}

output {
    stdout {}
    if "access" in [tags] {
      elasticsearch {
        hosts => "http://localhost:9200"
        manage_template => false
        index => "nginx_access-%{+yyyy.MM.dd}"
      }
    }
    if "error" in [tags] {
      elasticsearch {
        hosts => "http://localhost:9200"
        manage_template => false
        index => "nginx_error-%{+yyyy.MM.dd}"
      }
    }
}

修改完成后启动

/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/redis.conf