明哥的运维笔记

明哥的运维笔记 查看完整档案

广州编辑广东工业大学  |  行政管理 编辑泛华保险服务集团  |  运维负责人 编辑 www.pvcreate.com 编辑
编辑

因为喜欢,所以专注!

个人动态

明哥的运维笔记 发布了文章 · 9月8日

Ingress(Nginx)日志持久化与可视化(多图预警)

Ingress(Nginx)日志持久化与可视化(多图预警)

[toc]

前言

早期我们通常会使用goaccess或awstat来对nginx等访问日志进行分析和统计,但随着统计分析的多样性以及后续访问日志的实时监控等定制化的需求越来越强烈,goaccess或awstat越来越不能满足我们的需求.所以我们急迫需要更加灵活的日志统计分析工具,能辅助我们对访问日志进行统计、分析和监控.这时候,随着elk/efk的广泛应用,nginx等访问日志也将纳入到elk体系当中,同时elk也能满足我们对日志的统计与分析、监控的多样化需求.

先上图
Alt text
Alt text
Alt text
Alt text
Alt text

部署架构

如图,以下是1个很简单的架构,也没有做缓冲和聚合,如果对日志的要求比较高,可以在中间加入redis或Kafka 等.

Alt text

为什么ingress或者nginx的日志要转换成json格式呢?
我这边简单的解释一下:,主要是2个原因:
1:便于结合elasticseach做实时监控和报警.
比如直接监控status字段,如果1分钟连续出现20次4XX报错就直接报警,如果不转换的化,你还需要进一步解析access日志,这样带来了很多的不便.
2:便于结合elk做可视化分析.
可以组合不同的字段,对不同的需求定制不同的可视化报表.

部署步骤

一、ingress持久化步骤

1. 自建kubernetes的ingress持久化

ingress部署参考: https://www.pvcreate.com/index.php/archives/205/
Alt text

(1) ingress添加PVC用于ingress日志存储

kubectl apply -f ingress-nfs.yaml

apiVersion: v1      
kind: PersistentVolumeClaim      
metadata:      
  name: ingress-nfs      
spec:      
  accessModes:      
  - ReadWriteMany      
  resources:      
    requests:      
      storage: 10Gi      
  storageClassName: nfs-client-local      

Alt text

(2) ingress添加挂载

kubectl edit deployments.apps ingress-nginx-controller

        ......      
        volumeMounts:      
        - mountPath: /data/log/ingress/      
          name: ingress-nfs      
      ......      
      volumes:      
      - name: ingress-nfs      
        persistentVolumeClaim:      
          claimName: ingress-nfs      
(3) ingress修改日志格式和存储位置

kubectl edit configmaps ingress-nginx-controller

  access-log-path: /data/log/ingress/access_$hostname.log      
  error-log-path: /data/log/ingress/error.log      
  log-format-upstream: '{"@timestamp": "$time_iso8601","remote_addr": "$remote_addr","x-forward-for":      
    "$proxy_add_x_forwarded_for","request_id": "$req_id","remote_user": "$remote_user","bytes_sent":      
    $bytes_sent,"request_time": $request_time,"status": $status,"vhost": "$host","request_proto":      
    "$server_protocol","path": "$uri","request_query": "$args","request_length": $request_length,"duration":      
    $request_time,"method": "$request_method","http_referrer": "$http_referer","http_user_agent":      
    "$http_user_agent","upstream-sever":"$proxy_upstream_name","proxy_alternative_upstream_name":"$proxy_alternative_upstream_name","upstream_addr":"$upstream_addr","upstream_response_length":$upstream_response_length,"upstream_response_time":$upstream_response_time,"upstream_status":$upstream_status}'      
2. 阿里云kubernetes的ingress持久化

由于阿里云kubernetes上的ingress默认已经部署,同时官方也是建议使用AliyunLogConfig自动接入日志服务和可视化.我们考虑到自定义以及其他原因,采用了自定义接入ingress日志存储,也就是说将ingress存储到nas中,同时发送到elasticsearch中.

Alt text

(1) 通过阿里云控制台为ingress添加nas存储

Alt text
Alt text
Alt text

(2) ingress添加挂载

kubectl edit deployments.apps -n kube-system nginx-ingress-controller

...      
        volumeMounts:      
        - mountPath: /data      
          name: nfs-oss      
...      
      volumes:      
      - name: nfs-oss      
        persistentVolumeClaim:      
          claimName: ingress-log      
                
(3) ingress修改日志格式和存储位置

kubectl edit configmaps ingress-nginx-controller
修改内容和上面自建kubernetes的ingress一致,需要注意的是如果ingress的日志路径定义为/data/log/ingress/access.log,一定要注意挂载的目录要存在,也就是说你在修改configmaps之前要确保/data/log/ingress提前创建,可以进入pod中创建,也可以在外部创建好.

二、Nginx日志格式修改

除了ingress以外,如果你的nginx也需要同步推送到elasticsearch中的话,也需要修改nginx的日志格式为json,值得注意的是有部分参数ingress和nginx是不一致的,比如ingress中支持req_id而nginx中没有该参数.同时以下参数是添加到nginx.conf的http全局参数当中,添加在server段中无效的.
vim nginx.conf

        log_format json '{"@timestamp": "$time_iso8601","remote_addr": "$remote_addr","x-forward-for":"$proxy_add_x_forwarded_for","remote_user": "$remote_user","bytes_sent":$bytes_sent,"request_time": $request_time,"status": $status,"vhost": "$host","request_proto":"$server_protocol","path": "$uri","request_query": "$args","request_length": $request_length,"duration":$request_time,"method": "$request_method","http_referrer": "$http_referer","http_user_agent":"$http_user_agent","upstream_addr":"$upstream_addr","upstream_response_length":$upstream_response_length,"upstream_response_time":$upstream_response_time,"upstream_status":"$upstream_status"}';      
      
        access_log  /data/log/nginx/access.log  json;      

三、filebeat解析Ingress/Nginx日志

filebeat的安装很简单,这边就不做赘述,我这边主要贴下filebeat的配置文件.
filebeat.yml

setup.template.name: "local-app"      
setup.template.pattern: "local-app-*"      
setup.template.enabled: true      
setup.ilm.enabled: false      
filebeat.config:      
  inputs:      
    path: /data/www/apps/filebeat/inputs.d/*.yml      
    reload.enabled: true      
    reload.period: 10s      
  modules:      
    path: /data/www/apps/filebeat/modules.d/*.yml      
    reload.enabled: false      
output.elasticsearch:      
  protocol: "https"      
  ssl.verification_mode: none      
  hosts: ['192.168.1.100:9200']      
  username: "elastic"      
  password: "123456"      
  index: "local-app-%{[fields.appName]}-%{+yyyy.MM.dd}"      

nginx_ingress.yml

  - type: log      
      
    enable: true      
    tail_files: true      
    # 如果设置为true,Filebeat从文件尾开始监控文件新增内容,把新增的每一行文件作为一个事件依次发送,      
    # 而不是从文件开始处重新发送所有内容      
    paths:      
      - /data/log/nginx/access*.log      
    tags: [app, nginx-local]      
    fields:      
      appName: nginx-local      
      
    json.keys_under_root: true      
    #keys_under_root可以让字段位于根节点,默认为false      
        
    json.overwrite_keys: true      
    #对于同名的key,覆盖原有key值      
        
    json.message_key: message      
    #message_key是用来合并多行json日志使用的,如果配置该项还需要配置multiline的设置,后面会讲      
      
    json.add_error_key: true      
    #将解析错误的消息记录储存在error.message字段中      
        
    json.ignore_decoding_error: true      
    #用于指定是否JSON解码错误应该被记录到日志中。如果设为true,错误将被记录      

要注意的是,如果配置了multiline,会开启合并多条json日志的功能,如果不需要该功能请务必注释掉该yml中关于multiline的配置。(由于我在nginx/ingress中的access的json日志都是一行,所以在nginx日志当中不需要配置multiline配置)
multiline配置:

  #将'['作为新的一行的标识,如果message中不碰到'[',则合并为一条日志      
  multiline.pattern: ^\[      
  multiline.negate: true      
  multiline.match: after      

同时配置:

    processors:      
      - decode_json_fields:      
          fields: ['message']      
          target: json      

四、kibana接入elasticsearch与可视化配置

kibana的安装配置此处不再说明.
添加索引按照界面一步步操作即可.
Alt text
Alt text

几个典型图形配置示例
Alt text

(1)PV
Alt text
(2)UV
Alt text
(3)Top10(接口访问量)
Alt text
Alt text
(4)Top10(客户端IP访问占比)
Alt text
Alt text
(5)Top10(最慢接口)
Alt text
Alt text
(6)后端upstream占比
Alt text
Alt text
(7)实时流量
Alt text
Alt text
(8)客户端访问占比
Alt text
Alt text
(9)平均并发数
Alt text
Alt text
(10)异常状态码统计
Alt text
Alt text
Alt text
(11)总流量
Alt text
(12)接口异常响应码
Alt text
Alt text
Alt text
(13)接口访问耗时占比
Alt text
Alt text
Alt text
(14)每10秒接口访问平均耗时
Alt text
Alt text
(15)每10秒接口访问最大耗时
Alt text
Alt text
(16)状态码统计
Alt text
Alt text
(17)访问量趋势图
Alt text
Alt text
(18)超过30秒以上的接口
Alt text
Alt text
(19)超过30秒以上的接口出现次数
Alt text
Alt text
Alt text

五、踩坑指南

可视化Metrics无法获取耗时(duration)字段

Top10(最慢接口)举例,获取Top10耗时最慢的url组成1个表格,但是我在Metrics怎么都找不到duration字段或者request_time字段,通过排查得知,Metrics字段一般是数值型字段,对数值型字段求和、求最大值、求平均值等.但是我在ingress定义的字段都是字符串,所以同步到elasticsearch中也是字符串,所以在kibana的Metrics中也无法找到duration字段.既然找到问题症结了,我们就开始修正.重新修改ingress的confimap配置,重新在kibana添加索引.当然添加索引之前,我先删除了原来的索引重新添加.当然这个方法比较粗暴!!还有其他方法可以解决.
(1)如果是logstash可以使用mutate对字段进行转换

mutate {       
 convert => ["name-of-field", "integer"]       
}       

(2)官方没有提供字符串转数值,但我们可以创建1个新的索引,同时把原来的elasticsearch格式化数值后导入即可.

#创建新索引并格式化duration字段      
curl -H 'Content-Type: application/json' -XPUT "http://localhost:9200/ingress_new"      
curl  -H 'Content-Type: application/json' -XPOST "http://localhost:9200/ingress_new/ingress_old/_mapping?pretty" -d '       
{      
    "ingress_old": {      
            "properties": {      
                "duration": {      
                    "type": "double",      
                    "store": "true",      
                    "ignore_malformed": "true"      
                }      
            }      
        }      
  }      
      
#从旧索引中导入数据      
curl  -X POST "localhost:9200/_reindex" -H 'Content-Type: application/json' -d'      
{      
  "source": {      
    "index": "ingress_old"      
    "size": 5000      
  },      
  "dest": {      
    "index": "ingress_new"      
    "routing": "=cat"      
  }      
}'      
      
      
查看原文

赞 1 收藏 1 评论 0

明哥的运维笔记 发布了文章 · 9月8日

helm安装、使用、实践

helm安装、使用、实践

[toc]

helm简介

Helm 是管理 Kubernetes 的应用管理工具
相当于centos的yum,python中pip,node中的npm.

几个概念

  • Chart

Helm的应用包,采用tgz格式。类似于Yum的RPM包,其包含了一组定义Kubernetes资源相关的YAML文件。也称为应用Chart。

  • Repoistory

Helm的应用仓库,Repository本质上是一个Web服务器,该服务器保存了一系列的Chart应用包以供用户下载,并且提供了一个该Repository的Chart包的清单文件以供查询。Helm可以同时管理多个不同的Repository。
Helm社区官方提供了stable和incubator仓库,但Helm社区没有打算独占仓库,而是允许其他人和组织也可以搭建仓库。仓库可以是公共仓库,也可以是私有仓库。

  • Hub

不同的个人和组织提供的公共仓库形成了分散和分布的Helm仓库,不利于查找,所以官方提供了Helm Hub,各公共仓库可以注册到Helm Hub中以方便集中查找,Helm Hub只是分布的仓库的集中展示中心。
仓库注册到Helm Hub时,会将Chart清单文件向Helm Hub同步一份,这样可以在Helm Hub集中展示仓库列表和各仓库中的Chart列表。
Chart包也就是tgz文件实际上存储在各仓库中。Helm Hub并不实际存储Chart包。Helm只是在查询Chart时和Helm Hub有交互,其它操作都是和仓库直接交互的。

  • Release

在Kubernetes集群上运行的Chart的一个实例。在同一个集群上,一个Chart可以安装很多次。每次安装都会创建一个新的Release。例如一个MySQL Chart,如果想在服务器上运行两个MySQL数据库,就可以把这个Chart安装两次。每次安装都会生成一个新的Release

helm安装和使用

二进制安装

#根据操作系统去获取最新二进制安装包https://github.com/helm/helm/releases       
wget https://get.helm.sh/helm-v3.3.1-linux-amd64.tar.gz       
#由于helm包在国外,我通过ss拉到了腾讯云cos,国内可通过以下地址访问:https://download.osichina.net/tools/k8s/helm/helm-v3.3.1-linux-amd64.tar.gz       
tar -zxvf helm-v3.3.1-linux-amd64.tar.gz       
cp linux-amd64/helm /usr/local/bin/

Alt text

helm其他安装可参考官方网站: https://helm.sh/docs/intro/install/

注意: helm 客户端需要下载到安装了 kubectl 并且能执行能正常通过 kubectl 操作 kubernetes 的服务器上, 否则 helm 将不可用

使用

配置
helm repo add  elastic    https://helm.elastic.co       
helm repo add  gitlab     https://charts.gitlab.io       
helm repo add  harbor     https://helm.goharbor.io       
helm repo add  bitnami    https://charts.bitnami.com/bitnami       
helm repo add  incubator  https://kubernetes-charts-incubator.storage.googleapis.com       
helm repo add  stable     https://kubernetes-charts.storage.googleapis.com       
#添加国内仓库       
helm repo add stable http://mirror.azure.cn/kubernetes/charts       
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts       
helm repo update       
helm repo list       

Alt text

实践

1.helm安装nginx
Alt text
Alt text

关键解释

#搜索       
helm search repo nginx       
#安装       
helm install nginx bitnami/nginx -n nginx       
nginx/
├── charts   #依赖其他包的charts文件       
├── Chart.yaml   # 该chart的描述文件,包括ico地址,版本信息等       
├── templates   #存放k8s模板文件目录       
│   ├── deployment.yaml   #创建k8s资源的yaml 模板       
│   ├── _helpers.tpl   #下划线开头的文件,可以被其他模板引用.
│   ├── hpa.yaml   # 配置服务资源CPU 内存       
│   ├── ingress.yaml   # ingress 配合service域名访问的配置       
│   ├── NOTES.txt   #说明文件,helm install之后展示给用户看的内容       
│   ├── service.yaml   #kubernetes Serivce yaml 模板       
└── values.yaml   #给模板文件使用的变量       

2.推荐实践
Alt text

关键解释

#查询已安装       
helm list -A       
#搜索       
helm search repo nginx       
#拉取到本地       
helm pull bitnami/nginx --untar       
#根据values.yml配置本地安装       
helm install nginx . -f values.yaml -n nginx       
#根据values.yml配置本地升级       
helm upgrade nginx . -f values.yaml -n nginx       
#卸载       
helm uninstall nginx -n nginx       

Alt text

关键解释

#使用set更新       
helm upgrade tomcat bitnami/tomcat --set service.type=NodePort  --set persistence.enabled=false       
helm list       
#查看状态       
helm status tomcat       
#使用values.yaml更新       
helm upgrade -f values.yaml tomcat .
#查看更新历史       
helm history tomcat       
#回滚       
helm rollback tomcat 2       

helm安装nfs storageclasses

安装nfs

yum -y install epel-release       
yum -y install nfs-utils rpcbind       
systemctl enable rpcbind nfs-server nfs-lock nfs-idmap       
systemctl start rpcbind nfs-server nfs-lock nfs-idmap       
#172.18.4.*的IP都能访问nfs       
echo "/data 172.18.4.*(rw,sync,no_root_squash)" >  /etc/exports       
exportfs -a       

安装nfs storageclasses

helm pull stable/nfs-client-provisioner --untar       
cd nfs-client-provisioner/
vim values.yaml       
helm install nfs -f values.yaml .

values.yaml

...
nfs:
  server: 172.18.4.202       
  path: /data/nfs       
  mountOptions:
...

Alt text

helm安装ingress

Alt text

由于GFW的原因,镜像下载失败,我这边是从本地下载好导入.

关键点

helm search repo ingress       
helm pull stable/nginx-ingress --untar       
helm install ingress -f values.yaml . -n ingress       
vim nginx-ingress/values.yaml       
helm upgrade -f values.yaml ingress . -n ingress       
查看原文

赞 0 收藏 0 评论 0

明哥的运维笔记 发布了文章 · 6月29日

通过跳板机管理多个ssh会话

通过跳板机管理多个ssh会话

为了加强服务器的安全性,一般情况下,服务器的登陆管理都通过跳板机(或堡垒机)进行管理和维护,内网的之间的ssh并不对外开放.

Alt text

通常情况下,我们如果需要登陆到内部的服务器要先登陆到跳板机,然后再由跳板机连接到内网去进行进一步操作. 这样操作下来对于运维人员来说非常不便.是否有更好的方法来实现本地和内网服务器之间的访问呢?

答案是肯定有的

通过命令行一键连接内网服务器

ssh -i 秘钥 内网用户@内网地址 -p 内网端口 -o ProxyCommand='ssh 跳板机用户@跳板机地址 -p 跳板机端口 -W %h:%p'

通过ssh配置文件一键连接内网服务器

当然我们还可以通过ssh配置文件来实现一键连接,主要通过/etc/ssh/ssh_config 或者~/.ssh/config,我这边采用的是~/.ssh/config

Host server1
    HostName 192.168.1.4
    User test
    Port 22
    AddKeysToAgent yes
    PreferredAuthentications publickey    
    IdentityFile ~/.ssh/test/.ssh/id_rsa
    ProxyCommand ssh tiaobanji@8.8.4.4 -p 12356 -W %h:%p 

Host 10.*.*.*
    Port 22
    User test
    AddKeysToAgent yes
    UseKeychain yes
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/test/.ssh/id_rsa
    ProxyCommand ssh tiaobanji@8.8.4.4 -p 12356 -W %h:%p 

执行ssh server1则可以直接连接内网192.168.1.4
同时还支持配置通配符,如上 10网段的主机可以直接通过跳板机连接, 比如执行ssh 10.0.0.1,则会自动通过跳板机连接到内部网络.

查看原文

赞 0 收藏 0 评论 0

明哥的运维笔记 发布了文章 · 5月29日

重磅消息!!!Terraform、Consul、Vagrant等禁止中国使用!

国外HashiCorp在官网宣布:不允许中国境内使用、部署和安装该企业旗下的产品和软件。
消息来源hashicorp官网: https://www.hashicorp.com/terms-of-evaluation

Terraform:Terraform 是一种安全有效地构建、更改和版本控制基础设施的开源工具(基础架构自动化的编排工具)。它的目标是 "Write, Plan, and create Infrastructure as Code", 基础架构即代码,Terraform也提供了Kubernetes应用程序的完整生命周期管理,包含Pod的创建、删除以及副本控制等。国内众多公有云都支持Terraform。

Consul:是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发,目前在国内也有大量的使用和落地案例。

Vagrant:也是一个比较流行的虚拟机管理软件,使用Vagrant 可以让我们用命令直接从云上下载虚拟机的镜像,然后进行创建和管理等。

国产加油! 中国加油!
查看原文

赞 2 收藏 1 评论 4

明哥的运维笔记 发布了文章 · 5月19日

Zabbix添加钉钉markdown报警

Zabbix添加钉钉markdown报警

步骤
1. 添加报警脚本

默认zabbix服务端配置文件 /etc/zabbix/zabbix_server.conf
找到AlertScriptsPath,默认位置在/usr/lib/zabbix/alertscripts
将钉钉报警脚本添加到对应的位置
并对脚本添加可执行权限
Alt text

2.对报警脚本进行调试

./shellSets/shellSets.sh sendDingding "[markdown内容]" markdown "[markdown左侧栏提示]" -C-access_token=[钉钉token]

Alt text

Alt text

3.添加报警媒介

"### {ALERT.SUBJECT}\n>{ALERT.MESSAGE}":{ALERT.SUBJECT}为报警消息3级标题,{ALERT.MESSAGE}为报警的具体内容
{ALERT.SENDTO}: 关联每个用户的钉钉token
Alt text

4.添加用户并关联钉钉token

Alt text

Alt text

Alt text

Alt text

5.添加报警动作

我的示例: 添加了只对工作时间(周一到周五 9点到18点)以及应用集的限制.
报警消息标题: 故障(内网):Devops:{TRIGGER.NAME}
报警消息内容:

告警主机:{HOSTNAME1}\\n\n>告警时间:{EVENT.DATE} {EVENT.TIME}\\n\n>告警等级:{TRIGGER.SEVERITY}\\n\n>告警信息:{TRIGGER.NAME}\\n\n>告警项目:{TRIGGER.KEY1}\\n\n>问题详情:{ITEM.NAME}:{ITEM.VALUE}\\n\n>当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}\\n\n>告警环境:生产环境\n\n>事件ID:{EVENT.ID}\\n\n\n\n©公司名字       

恢复消息标题: 已恢复(内网):Devops:{TRIGGER.NAME}
恢复消息内容:

恢复主机:{HOSTNAME1}\\n\n>恢复时间:{EVENT.DATE} {EVENT.RECOVERY.TIME}\\n\n>告警等级:{TRIGGER.SEVERITY}\\n\n>告警信息:{TRIGGER.NAME}\\n\n>告警项目:{TRIGGER.KEY1}\\n\n>问题详情:{ITEM.NAME}:{ITEM.VALUE}\\n\n>当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}\\n\n>告警环境:生产环境\n\n>事件ID:{EVENT.ID}\\n\n\n\n>©公司名字       

Alt text

Alt text

Alt text

Alt text

Alt text

6.钉钉消息示例

Alt text

查看原文

赞 0 收藏 0 评论 0

明哥的运维笔记 发布了文章 · 5月16日

k8s开启ipvs

k8s开启ipvs

1.加载内核模快

lsmod|grep ip_vs

modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

yum install ipvsadm ipset -y

2.修改kube-proxy配置

kubectl edit configmap kube-proxy -n kube-system

   minSyncPeriod: 0s
      scheduler: ""
      syncPeriod: 30s
    kind: KubeProxyConfiguration
    metricsBindAddress: 127.0.0.1:10249
    mode: "ipvs"                          # 修改此处
    nodePortAddresses: null

3.删除所有kube-proxy的pod

kubectl delete pod xxx -n kube-system

4.校验

kubectl logs kube-proxy-xxx -n kube-system
日志出现Using ipvs Proxier即可

5.检查ipvs代理规则

kubectl get svc --all-namespaces
# ipvsadm -ln
#可以看到service对应的很多规则
查看原文

赞 0 收藏 0 评论 0

明哥的运维笔记 发布了文章 · 5月10日

minio 高性能 Kubernetes 原生对象存储


minio 高性能 Kubernetes 原生对象存储

[toc]

MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。

特点

  • 高性能

minio是世界上最快的对象存储(官网说的: https://min.io/)

  • 弹性扩容

很方便对集群进行弹性扩容

  • 天生的云原生服务
  • 开源免费,最适合企业化定制
  • S3事实标准
  • 简单强大
  • 存储机制(Minio使用纠删码erasure code和校验和checksum来保护数据免受硬件故障和无声数据损坏。 即便丢失一半数量(N/2)的硬盘,仍然可以恢复数据)

安装

minio分服务端和客户端,服务端是通过minio进行部署,客户端只是1个二进制命令(mc),通过mc可以操作对象存储(增删查等),当然minio也提供各种语言的SDK,具体可以参考官网

服务端的安装分为独立单机模式和分布式安装, 以下单机模式的安装方法.
分布式的安装和单机模式的安装类似,只是根据传参不同

单机

  • Docker容器安装
docker pull minio/minio     
docker run -p 9000:9000 minio/minio server /data     
  • macOS
brew install minio/stable/minio     
minio server /data     
  • Linux
wget https://dl.min.io/server/minio/release/linux-amd64/minio     
chmod +x minio     
./minio server /data     
  • Windows
wget https://dl.min.io/server/minio/release/windows-amd64/minio.exe     
minio.exe server D:\Photos     

分布式

分布式好处
分布式Minio可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式Minio避免了单点故障

数据保护
分布式Minio采用 纠删码来防范多个节点宕机和位衰减bit rot。
分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。

高可用
单机Minio服务存在单点故障,相反,如果是一个有N块硬盘的分布式Minio,只要有N/2硬盘在线,你的数据就是安全的。不过你需要至少有N/2+1个硬盘来创建新的对象。
例如,一个16节点的Minio集群,每个节点16块硬盘,就算8台服務器宕机,这个集群仍然是可读的,不过你需要9台服務器才能写数据。
注意,只要遵守分布式Minio的限制,你可以组合不同的节点和每个节点几块硬盘。比如,你可以使用2个节点,每个节点4块硬盘,也可以使用4个节点,每个节点两块硬盘,诸如此类。

一致性
Minio在分布式和单机模式下,所有读写操作都严格遵守read-after-write一致性模型。

纠删码
Minio使用纠删码erasure code和校验和checksum来保护数据免受硬件故障和无声数据损坏。 即便您丢失一半数量(N/2)的硬盘,您仍然可以恢复数据。
什么是纠删码erasure code?
纠删码是一种恢复丢失和损坏数据的数学算法, Minio采用Reed-Solomon code将对象拆分成N/2数据和N/2 奇偶校验块。 这就意味着如果是12块盘,一个对象会被分成6个数据块、6个奇偶校验块,你可以丢失任意6块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的数据进行恢复,是不是很NB,感兴趣的同学请翻墙google。
为什么纠删码有用?
纠删码的工作原理和RAID或者复制不同,像RAID6可以在损失两块盘的情况下不丢数据,而Minio纠删码可以在丢失一半的盘的情况下,仍可以保证数据安全。 而且Minio纠删码是作用在对象级别,可以一次恢复一个对象,而RAID是作用在卷级别,数据恢复时间很长。 Minio对每个对象单独编码,存储服务一经部署,通常情况下是不需要更换硬盘或者修复。Minio纠删码的设计目标是为了性能和尽可能的使用硬件加速。
什么是位衰减bit rot保护?
位衰减又被称为数据腐化Data Rot、无声数据损坏Silent Data Corruption,是目前硬盘数据的一种严重数据丢失问题。硬盘上的数据可能会神不知鬼不觉就损坏了,也没有什么错误日志。正所谓明枪易躲,暗箭难防,这种背地里犯的错比硬盘直接咔咔宕了还危险。 不过不用怕,Minio纠删码采用了高速 HighwayHash 基于哈希的校验和来防范位衰减。

分布式部署:GNU/Linux 和 macOS
示例1: 启动分布式Minio实例,8个节点,每节点1块盘,需要在8个节点上都运行下面的命令。

export MINIO_ACCESS_KEY=<ACCESS_KEY>     
export MINIO_SECRET_KEY=<SECRET_KEY>     
minio server http://192.168.1.11/export1 http://192.168.1.12/export2 \     
               http://192.168.1.13/export3 http://192.168.1.14/export4 \     
               http://192.168.1.15/export5 http://192.168.1.16/export6 \     
               http://192.168.1.17/export7 http://192.168.1.18/export8     
     

Alt text

分布式部署:kebernetes

#helm安装自行google     
helm install minio --set mode=distributed,numberOfNodes=4,imagePullPolicy=IfNotPresent,accessKey=v9rwqYzXXim6KJKeyPm344,secretKey=0aIRBu9KU7gAN0luoX8uBE1eKWNPDgMnkVqbPC,service.type=NodePort,service.nodePort=25557 googleapis/minio -n velero     
     
     
#安装完成之后查询pods状态,如果pods的READY状态是正常的,则安装成功,如下图图示     
kubectl get pods -n velero -o wide     

#如果pods的READY状态一直不是状态的话,查看下logs     
kubectl logs minio-0 -n velero     

#如果都是提示disk都是等待状态,可以重启pods在查看     
kubectl delete pods -n velero minio-{0,1,2,3} 

#默认是cluser访问,为了方便,我这里是nodeport方式     

Alt text
Alt text

如上图,当我使用4个节点创建分布式minio时,会使用默认的pvc创建存储.默认每个节点创建1个10G的存储(可以自定义修改)

客户端mc安装和使用

安装

wget https://dl.min.io/client/mc/release/linux-amd64/mc     
chmod +x mc     
./mc --help     

mc命令指南

ls       列出文件和文件夹。     
mb       创建一个存储桶或一个文件夹。     
cat      显示文件和对象内容。     
pipe     将一个STDIN重定向到一个对象或者文件或者STDOUT。     
share    生成用于共享的URL。     
cp       拷贝文件和对象。     
mirror   给存储桶和文件夹做镜像。     
find     基于参数查找文件。     
diff     对两个文件夹或者存储桶比较差异。     
rm       删除文件和对象。     
events   管理对象通知。     
watch    监听文件和对象的事件。     
policy   管理访问策略。     
session  为cp命令管理保存的会话。     
config   管理mc配置文件。     
update   检查软件更新。     
version  输出版本信息。     

mc命令实践

#查看minio服务端配置     
mc config host ls     
     
#添加minio服务端配置     
mc config host add minio  http://minio.vaicheche.com:25555  v9rwqYzXXim6KJKeyPm344 0aIRBu9KU7gAN0luoX8uBE1eKWNPDgMnkVqbPC --api s3v4     
     
#查看minio bucket     
mc ls minio     
     
#创建bucket     
mc mb minio/backup     
     
#上传本地目录(文件不加r)     
mc cp -r  ingress minio/backup/     
     
#下载远程目录(文件不加r)     
mc cp -r  minio/backup .     
     
#将一个本地文件夹镜像到minio(类似rsync)      
mc mirror localdir/ minio/backup/     
     
#持续监听本地文件夹镜像到minio(类似rsync)      
mc mirror -w localdir/ minio/backup/     
     
#持续从minio存储桶中查找所有jpeg图像,并复制到minio "play/bucket"存储桶     
mc find minio/bucket --name "*.jpg" --watch --exec "mc cp {} play/bucket"     
     
#删除目录     
mc rm minio/backup/ingress  --recursive --force     
     
#删除文件     
mc rm minio/backup/service_minio.yaml     
     
#从mybucket里删除所有未完整上传的对象     
mc rm  --incomplete --recursive --force play/mybucket     
     
#删除7天前的对象     
mc rm --force --older-than=7 play/mybucket/oldsongs     
     
#将MySQL数据库dump文件输出到minio     
mysqldump -u root -p ******* db | mc pipe minio/backups/backup.sql     
     
#mongodb备份     
mongodump -h mongo-server1 -p 27017 -d blog-data --archive | mc pipe minio1/mongobkp/backups/mongo-blog-data-`date +%Y-%m-%d`.archive     
     
     
     

minio在K8S的优化实践

如上minio在k8s的实践,在我实践环境里面.我通过helm安装分布式之后,我默认是采用nfs作为storeagesclasses,一共起了4个节点,自动创建了4个pvc,在我删除1个pvc的数据之后,minio依然可以正常读写,数据依然的可以存在.参考下图
Alt text
Alt text

但这其中有1个最大的问题, 如果你使用的是nfs这种自建共享存储的话,就算minio起了4个节点,能保证数据安全.但是你的nfs磁盘确只有1个,万一的你的nfs宕机,磁盘损坏了,你的数据全都没有了.所以为了保证数据的安全性.建议通过hostPath的方式,在每个节点保存对应的数据.这样就算节点的宕机了,磁盘损坏了,你的数据并不会丢.而且通过本地节点的方式,读写数据的速度也会更快.当然你需要额外管理节点本地存储.

minio在K8S的hostPath部署实践

环境描述: 5个节点k8s环境,使用其中4个节点作为mino,同时都使用节点主机网络

#1.给其中4个节点打标签,因为我要选择标签为minio-server=true的节点部署minio     
kubectl get node --show-labels=true     
kubectl label nodes node-hostname1  minio-server=true     
kubectl label nodes node-hostname2  minio-server=true     
kubectl label nodes node-hostname3  minio-server=true     
kubectl label nodes node-hostname3  minio-server=true     
     
#2.给对应主机添加hosts,如果你的hostname能够自动解析,不用修改.4台主机都添加     
echo "host1 [IP1] >> /etc/hosts"     
echo "host2 [IP2] >> /etc/hosts"     
echo "host3 [IP3] >> /etc/hosts"     
echo "host4 [IP4] >> /etc/hosts"     
     
#3.创建namespace     
#你也可以使用自定义的其他namespace,不过你需要修改下面yaml文件     
kubectl create ns velero     
     
#4.下载headless、daemonset、service     
wget https://download.osichina.net/tools/k8s/yaml/minio/minio-distributed-headless-service.yaml     
wget https://download.osichina.net/tools/k8s/yaml/minio/minio-distributed-daemonset.yaml     
wget https://download.osichina.net/tools/k8s/yaml/minio/minio-distributed-service.yaml     
     
#5.修改并创建对应的service、daemonset     
其中主要修改的是`minio-distributed-daemonset.yaml`     
hostPath: 定义你需要使用节点本地路径     
MINIO_ACCESS_KEY、MINIO_SECRET_KEY: 定义你的秘钥,为了安全及时修改     
args: 启动参数后url改成主机名方式: http://host{1...4}/data/minio     
     
`minio-distributed-service.yaml`为对外服务,默认为ClusterIP,可以结合ingress或者nodePort来访问,可以自行修改     
     
kubectl create -f minio-distributed-statefulset.yaml      
kubectl create -f minio-distributed-daemonset.yaml     
kubectl create -f minio-distributed-service.yaml     
     

实践过程如下:

Alt text

Alt text

Alt text

Alt text

查看原文

赞 1 收藏 1 评论 0

明哥的运维笔记 发布了文章 · 2019-12-02

MYSQL 5.6 从库复制的部署和监控

MYSQL 5.6 从库复制的部署和监控

MYSQL 5.6 安装和部署

#1.下载安装包      
wget https://download.osichina.net/tools/mysql/mysql-5.6.28.tar.gz     
     
#2.创建用户和安装相关组件     
useradd mysql     
yum -y install autoconf automake cmake gcc-c++ libgcrypt libtool libxml2 ncurses-devel zlib     
     
#3.解压和编译安装(安装路径:/usr/local/mysql)     
tar -xzvf mysql-5.6.28.tar.gz     
cd mysql-5.6.28     
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DENABLED_LOCAL_INFILE=1 -DMYSQL_DATADIR=/data/mysql/data -DSYSCONFDIR=/etc -DWITH_PARTITION_STORAGE_ENGINE=1     
make && make install     
     
#4.添加环境变量     
echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile     
     
#5.MYSQL配置     
cat > /etc/my.cnf << EOF     
[mysqld_safe]     
log-error=/data/mysql/log/mysql.err     
     
[mysqld]     
datadir=/data/mysql/data     
tmpdir=/data/mysql/tmp     
socket=/var/lib/mysql/mysql.sock     
user=mysql     
character_set_server=utf8     
default-storage-engine=INNODB     
innodb_buffer_pool_size=1G     
#slow_query_log=1     
#slow_query_log_file=/data/mysql/log/mysql.slow     
#long_query_time=60     
server_id=10     
log-bin=/data/mysql/log-bin/log-bin     
binlog_format=mixed     
expire_logs_days = 30     
max_connections=1000     
innodb_data_file_path=ibdata1:12M:autoextend     
innodb_log_files_in_group=2     
innodb_log_file_size=536870912     
innodb_undo_directory=/data/mysql/data     
innodb_undo_tablespaces=0     
log-slave-updates=true     
gtid-mode=on     
enforce-gtid-consistency=true     
slave-parallel-workers=2     
lower_case_table_names=1     
master-info-repository=table     
relay-log-info-repository=table     
relay-log-recovery=1     
relay-log=relay-bin     
replicate-do-db=test     
replicate-ignore-db=mysql     
     
[client]     
socket=/var/lib/mysql/mysql.sock     
EOF     
     
#6.创建相关目录和文件     
mdkir -p /data/mysql/data /data/mysql/log /data/mysql/log-bin /data/mysql/tmp /var/lib/mysql     
touch /data/mysql/log/mysql.err     
chown mysql:mysql /data/mysql /var/lib/mysql /usr/local/mysql -R     
     
#7.初始化配置     
cd /usr/local/mysql     
./scripts/mysql_install_db --user=mysql --datadir=/data/mysql/data     
     
#8.启动、添加为服务和安全配置     
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld     
chmod +x /etc/init.d/mysqld     
chkconfig --add mysqld     
chkconfig mysqld on     
service mysqld restart     
     
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock     
mysql_secure_installation #交互式安全配置     
     

MYSQL 主从配置

1. 主库创建账号

GRANT REPLICATION SLAVE ON *.* to 'user'@'%' identified by 'password';     
flush privileges ;     

2. 备份数据与恢复到从库

为了保障数据的一致性,需要对表加锁。如果数据量比较小,先锁表lock后记录master的的pos位置,然后采用mysqldump备份即可。如果数据量比较大可采用mydumper或者xtrabackup进行数据备份。我这边数据量相对较大,采用mydumper进行备份。
#1.下载和安装mydumper(默认安装位置在:/usr/local/bin)     
wget https://download.osichina.net/tools/mysql/mydumper-0.9.1.tar.gz     
cmake .     
make && make install     
     
#2.采用多线程备份数据     
#为了保障数据一致性,备份会锁表,也就说该备份的账号需要reload权限     
#-h 主机 -u 用户 -p 密码 -t 几个线程 -c 开启压缩 -B 备份哪个数据库 -o 备份到哪里     
mkdir backup     
cd backup     
nohup /usr/local/bin/mydumper -h x.x.x.x -u user -p 'password' -t 8 -c -B dbname  -o ./ &     
     
#3.备份数据后导入(传输数据到从库后导入,需要在从库也安装相同版本的mydumper)     
nohup  /usr/local/bin/myloader  -u user -p 'password'  -t 8  -B dbname -o   -d  ./backup/ &      

3. 主从配置

(1) master配置

# 不同步哪些数据库     
binlog-ignore-db = mysql     
binlog-ignore-db = test     
binlog-ignore-db = information_schema     
     
# 只同步哪些数据库,除此之外,其他不同步     
binlog-do-db = dbname     
     
# 日志保留时间     
expire_logs_days = 10     
     
# 控制binlog的写入频率。每执行多少次事务写入一次     
# 这个参数性能消耗很大,但可减小MySQL崩溃造成的损失     
sync_binlog = 5     
     
# 日志格式,建议mixed     
# statement 保存SQL语句     
# row 保存影响记录数据     
# mixed 前面两种的结合     
binlog_format = mixed     

(2) slave配置
slave如上安装时的配置,注意的是replicate-do-db、replicate-ignore-db的配置

(3) 执行同步
master log file和pos可以参考mydumper metadata文件
Alt text

CHANGE MASTER TO MASTER_HOST='x.x.x.x',master_port=3306,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=123454678,MASTER_AUTO_POSITION=0;     
start slave user='user' password='password';     
show slave status \G;     

MYSQL延迟监控和报警

1. 利用zabbix添加MYSQL监控

(1) zabbix客户端安装和部署以及添加主机

zabbixServer=192.168.1.2     
rpm -Uvh https://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64/zabbix-release-4.4-1.el7.noarch.rpm     
yum -y install zabbix-agent     
sed -i "s/Server=127.0.0.1/Server=${zabbixServer}/g"  /etc/zabbix/zabbix_agentd.conf      
sed -i "s/ServerActive=127.0.0.1/ServerActive=${zabbixServer}/g"  /etc/zabbix/zabbix_agentd.conf      
sed -i "s/Hostname=Zabbix server/Hostname=`hostname`/g"  /etc/zabbix/zabbix_agentd.conf      
systemctl enable zabbix-agent --now     

具体怎么在zabbix上添加主机,此处就省略了。(以上安装zabbix客户端操作系统版本是:centos7.6)
默认通过yum安装的zabbix配置文件目录在: /etc/zabbix/,默认在有1个关联的MYSQL配置文件/etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf

(2) 添加zabbix监控授权

GRANT USAGE,REPLICATION CLIENT,PROCESS,SHOW DATABASES,SHOW VIEW  on *.* to zabbix_monitor@'127.0.0.1' identified by 'xxxxxxx';     
GRANT USAGE,REPLICATION CLIENT,PROCESS,SHOW DATABASES,SHOW VIEW on *.* to zabbix_monitor@'localhost' identified by 'xxxxxxx';     
flush privileges ;     

(3) 初始化配置(该mysql zabbix客户端上执行)

mdkir -p /var/lib/zabbix     
cat > /var/lib/zabbix/.my.cnf << EOF     
[client]     
user=zbx_monitor     
password=xxxxxxx     
EOF     
chown zabbix:zabbix  /var/lib/zabbix  -R     
service zabbix-agent restart     
service zabbix-agent status     

(4) 在zabbix web端关联MYSQL模板即可完成监控

Alt text

2. 利用zabbix现有MYSQL模板添加从库延迟监控

(1) 创建主从延迟脚本

mkdir -p /etc/zabbix/scripts     
cat > /etc/zabbix/scripts/check_mysql_slave.sh << EOF     
#!/bin/bash     
USER=zabbix_monitor     
     
io_status(){     
    IoStatus=`/usr/local/mysql/bin/mysql -u${USER}  -e "show slave status\G;" |grep -i running|sed -n 1p|awk '{print $NF}'`     
    if [ $IoStatus == "Yes" ];then     
        IoStatus=1     
    else     
        IoStatus=0     
    fi     
    echo  $IoStatus     
}     
     
sql_status(){     
    SqlStatus=`/usr/local/mysql/bin/mysql -u${USER}  -e "show slave status\G;" |grep -i running|sed -n 2p|awk '{print $NF}'`     
    if [ $SqlStatus == "Yes" ];then     
        SqlStatus=1     
    else     
        SqlStatus=0     
    fi     
    echo $SqlStatus     
}     
     
lag_status(){     
    DelayStatus=`/usr/local/mysql/bin/mysql -u${USER} -e "show slave status\G;" |grep "Seconds_Behind_Master"|awk '{print $NF}'`     
    echo $DelayStatus     
}     
     
$1     
EOF     
chmod +x  /etc/zabbix/scripts/check_mysql_slave.sh     

(2) 从缺省配置文件中读取账号信息
如果在脚本中直接用账号密码执行命令,会产生不安全的提示

cat >> /etc/my.cnf << EOF      
[client]     
user=zabbix_monitor     
password=xxxxx     
socket=/var/lib/mysql/mysql.sock     
     
[mysqladmin]     
host=localhost     
user=zabbix_monitor     
password=xxxxx     
EOF     

(3) 测试脚本是否正常

/etc/zabbix/scripts/check_mysql_slave.sh io_status     
/etc/zabbix/scripts/check_mysql_slave.sh sql_status     
/etc/zabbix/scripts/check_mysql_slave.sh lag_status     

io_status: 1 表示正常 0表示不正常
sql_status: 1 表示正常 0表示不正常
lag_status: 表示延迟的时间

(4) 添加用户参数配置(客户端)

cat >> /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf  << EOF     
UserParameter=mysql.slave[*],/etc/zabbix/scripts/check_mysql_slave.sh "$1"     
EOF     

(5) 重启zabbix客户端后再服务端验证

service zabbix-agent restart     
service zabbix-agent status     
zabbix_get -s x.x.x.x -p 10050 -k mysql.slave[io_status]     
zabbix_get -s x.x.x.x -p 10050 -k mysql.slave[sql_status]     
zabbix_get -s x.x.x.x -p 10050 -k mysql.slave[lag_status]     

(6) 在zabbix web上克隆原来的MYSQL模板后添加监控项和触发器和图形
Alt text
Alt text
Alt text
Alt text
Alt text
Alt text
Alt text
Alt text

(7)在主机上关联新的MYSQL从库监控模板
Alt text

几个补充的知识点

1. 关于replicate-do-db的控制

在MySQL5.5/5.6版本中,由于修改复制过滤参数只能在my.cnf中进行修改,所以需要重启数据库;
而最新版5.7版本中,如下三步就可以不用重启服务器就生效了:

STOP SLAVE SQL_THREAD;     
CHANGE REPLICATION FILTER REPLICATE_DO_DB = (dbname),REPLICATE_IGNORE_DB = (mysql);     
START SLAVE SQL_THREAD;     

2. change Master的相关问题

如果是整库复制,不需要指定pos file和pos位置。

CHANGE MASTER TO MASTER_HOST='x.x.x.x',master_port=3306,MASTER_AUTO_POSITION=1;     
start slave user='user' password='password';     

如果是复制部分数据库或者出现找不到master上的pos位置。请手动指定pos位置

3. mydumper的安装和部署以及相关问题

在安装mydumper时,如果出现glib报错,请安装glib库 yum install glib2* -y
安装完成之后,请删除解压后文件,重新解压后编译安装

4. 从库提示用户和密码不安全的问题

默认的情况下,如果你在change master中指定用户和密码,会将账号信息传给master,这样做是不安全的。最新的同步语法,建议在change master中不指定账号信息,而是在start slave中指定。

5. 从库提示crash问题

为了安全崩溃考虑,需要将master和Relaylog存储在表中,如果不存表中,mysql日志中会出现warning的警告。

#Master信息存储在表里     
master_info_repository = TABLE     
#Relaylog信息存储在表里     
relay_log_info_repository = TABLE     
查看原文

赞 0 收藏 0 评论 0

明哥的运维笔记 赞了文章 · 2019-07-25

2019 DevOps 技术指南

图片

原文链接:https://hackernoon.com/the-20...
原文作者:javinpaul
翻译君:CODING 戴维奥普斯

写在前面

我们在推进国内研发团队 DevOps 落地的过程中,发现不少研发组织在积极寻求 DevOps 技能方面的提升。今天翻译的这篇深受欢迎的 DevOps 技术雷达来自一位国外的 Java 博主,他也是一位非常热爱学习的开发者,接下来让我们马上进入到正文。

DevOps 技术指南

DevOps 目前非常火热,我认识的大多数朋友、同事和高级开发人员都在努力成为 DevOps 工程师,以及研发组织中的 DevOps 佼佼者。虽然我承认 DevOps 的好处,它与改进软件开发和部署过程直接相关,但从我有限的经验来看,这不是一件容易的事。在如此多的工具和实践中选择正确的学习路径是非常困难的。作为一名 Java 博主,许多读者经常问我:

  • 如何成为一名 DevOps 工程师?
  • 应该学习哪些工具?
  • 应该遵循哪些实践?
  • Maven 和 Jenkins 是不是 DevOps 工程师的必备技能?
  • Docker 和 Kubernetes 呢?
  • 基础设施自动化是不是 DevOps 的组成部分?
  • 是否应该学习 Chef、Puppet 或 Ansible?

以上只是读者经常会提到的一部分问题,我努力用我浅薄的经验来回答那些问题,但我不会只是用简单粗暴和重复使用的方式把那些答案整合后丢给大家。今天我将分享一个很不错的资源 —— 2019 DevOps RoadMap,它将帮助你成为梦寐以求的 DevOps 工程师。

昨天我在网上冲浪,偶遇了 Kamranahmedse 这个优秀的 GitHub 页面,上面有不少对立志成为前端开发人员、后端开发人员、全栈 Web 开发人员、DevOps 工程师的读者都很有用的路线图。这个 RoadMap 在任何意义上都很有价值,因为它不仅突出了 DevOps 工程师的角色,还讲述了覆盖该领域需要学习的工具和技术。最重要的是,它在视觉上令人赏心悦目(难道你不喜欢黄色和奶油色的蓝线吗?),所以你可以打印出来并粘在桌子上以便参考。

虽然路线图很好,它告诉了你要学什么,但它没有告诉你如何学习和在哪里学习。为了补充路线图,我分享了一些有用的免费和付费在线课程,以便你可以学习和改进你想要掌握的工具或领域。

话不多说,以下就是我所说的 DevOps RoadMap:

图片
图片来自 kamranahmedse

现在让我们一步一步浏览 RoadMap,了解在 2019 年成为 DevOps 大师所需的基本技能:

1、编程语言

你们肯定知道以下三种主流编程语言之一,即 Java、Python 或 JavaScript。如果没有,你可以看看下面的课程来学习你选择的语言。我强烈建议你至少学习其中一种。

  • Java

如果你想学习 Java,The Complete Java MasterClass 是一个很棒的课程,最近也针对 Java 10 进行了更新。

图片

  • Python

如果你想学习 Python,那么 The Complete Python BootCamp 是我最喜欢的资源,它将教你 Python 3,这是 Python 最受欢迎的版本。

图片

  • JavaScript

如果你想学习 JavaScript,那么你不应该错过 Mosh Hamdani 在 Udemy 上的 JavaScript Basics for Beginners

图片

如果你需要更多的选择并且不介意学习免费资源,你可以随时查看我的免费 JavaPythonJavaScript 课程列表。

2、操作系统

这是 Ops 部分的内容,在更早之前负责了解操作系统和硬件的人员以及系统管理员掌握操作系统即可。但对于 DevOps,现在开发人员也需要了解它们。你至少需要了解路线图中建议的:流程管理、多线程和高并发、Sockets、I/O 管理、虚拟化、内存存储和文件系统。

由于我们大多数人都在 Linux 操作系统上工作,我建议你通过 Udemy 上的 Linux Administration BootCamp 课程来更好地学习和理解 Linux 操作系统。

图片

更多免费资源可查看 free Linux courses 列表。

3、终端命令

对于 DevOps 人员来说,熟练地掌握常用的、好用的操作系统命令是很重要的,特别是在 Linux 操作系统上工作的研发人员,至少需要知道一些必需的 Linux shell 命令,如 Bash、Ksh、findgrep、awk、sedlsof 以及 nslookup、netstat 等网络命令。如果你认为需要刷新下这些命令和工具,你可以考虑学习 Pluralsight 上的 Linux Command Line Interface (CLI) Fundamentals 课程。

图片

对初学者和有经验的 Linux 用户来说,这是一个很好的复习。你需要一个 Pluralsight 会员才能访问该课程,每月花费约 29 美元或每年 299 美元,但我觉得物有所值。Pluralsight 就像开发者的 Netflix,它拥有超过 6000 个最新技术的高质量课程,可以随时随地学习,我主要是在旅行和上下班途中学习。如果你需要更多的选择并希望成为 shell 脚本大师,可以查看我的 best courses to learn shell scripting

4、网络和安全

信息孤岛的日子已经一去不复返了。当今世界,万物都连接在了一起,这也使得网络和安全变得非常重要。为了成为优秀的 DevOps 工程师,你必须了解基本的网络和安全概念,如 DNS、OSI 模型、HTTP、HTTPS、FTP、SSL、TLS 等。为了刷新概念认知,你可以查看在 Ed Liberman 在 Pluralsight 上的 TCP/IP and Networking Fundamentals for IT Pros 课程。

如果你需要更多选择,还可以查看这些 Udemy 课程,网络方面例如 The Complete Networking Fundamentals 是一个很好的课程,安全方面你还可以学习 The Complete Cyber Security Course: Network Security

图片

5、服务器配置

作为 DevOps 大师,你应该知道你的机器中设置了什么以及如何设置它,只有这样你才可以思考如何去自动化操控它。通常 DevOps 工程师应该知道如何设置 IIS,Apache Tomcat 等 Web 服务器;还应该了解缓存服务器,负载均衡器,反向代理和防火墙等。如果你是 Web 开发领域的新手,我建议你查看 Colt Steele 的 Web Developer Bootcamp 课程。

图片

6、基础设施即为代码

对于 DevOps 工程师来说,这可能是最重要的事情,这也是一个非常广阔的领域。作为DevOps 工程师,你应该了解 DockerKubernetes容器技术;AnsibleChefSaltPuppet 等配置管理工具;Terraform 和 Cloud Formation 等基础设施配置。以下是我推荐的一些相关工具的学习课程。

图片

图片

图片

7、持续集成/交付

对于 DevOps 大师来说,这是另一个非常重要的事情:建立一个持续集成和交付的流水线。CI / CD 领域有很多工具,例如 Jenkins、TeamCity、Drone 等。

但是我强烈建议至少学习 Jenkins,因为它是最广泛使用的,可能是市场上最成熟的 CI / CD 工具。如果你不认识 Jenkins,那么这门课程最好先开始。没有比 Udemy 上经典的 Learn DevOps: CI/CD with Jenkins using Pipelines and Docker 更好的课程。我也从这个课程中学到了大部分的 Jenkins 技能。

图片

更多 Java 开发人员免费资源可查看 6 free Jenkins and Maven courses 列表。

8、监控软件和基础设施

除了配置和部署之外,监控是 DevOps 的另一个重要方面,这就是 DevOps 工程师了解基础设施和应用程序监控的重要原因。

这个领域有很多工具,如 Nagios、Icing、Datadog,Zabbix、Monit、AppDynanic、New Relic 等。你可以根据需要选择其中一些来学习。

9、云提供商

云是下一个重要的事情,迟早你得将应用程序迁移到云,因此对于 DevOps 工程师来说了解一些流行的云提供商及其基础知识是很重要的。

 虽然 AWS 显然是云计算领域的领导者,但 Google Cloud 和 Azure 正在慢慢赶上,还有一些其它参与者,如 Heroku、Cloud Foundry 和 Digital Ocean。

我强烈建议学习 Udemy 上经典的完整入门课程:AWS Serverless APIs & Apps — A Complete Introduction 。

图片

更多 AWS 免费学习资源可查看列表 free AWS courses 。

如果你只想从一门课程开始学习 DevOps,我认为 Learn DevOps: CI/CD with Jenkins using Pipelines and Docker 会是最好的开始。

写在最后

原文作者非常详尽地给我们解读了 DevOps 技术的学习路线图,除了作者分享的国外课程、工具,国内也有非常多的学习资源。对英文课程没有太大兴趣的同学,只要了解这个学习思路即可。CODING 也会持续关注并分享 DevOps 领域最新理念与技术,与 DevOps 工程师一起成长。

查看原文

赞 44 收藏 30 评论 0

明哥的运维笔记 发布了文章 · 2019-07-25

一键安装mysql主从环境(Docker)

一键安装mysql主从环境(Docker)

日期:2019-07-24
类别:docker
标题:一键安装mysql主从环境(Docker)
作者:黄高明
名称结果备注
实测环境mac for docker实测通过
支持平台Debian, Ubuntu, Fedora, CentOS and Arch Linux...Docker
git路径setup.sh
脚本名称setup.sh
执行方式/bin/bash setup.sh
是否需要传参数
是否有配置参数有,见下

配置参数setup.sh

其中hostip是必须修改的,其他配置可以酌情修改.
注意: 如果你的Docker环境是通过Docker Toolbox,且是安装在windows环境,建议将isToolBox=1.
因为windows下数据目录共享可能会出现磁盘异步io的异常,此时通过设置--skip-innodb-use-native-aio关闭异步io之后就会正常.关闭异步io会导致性能下降,此参数仅建议用于测试。磁盘异步IO介绍请参考:https://dev.mysql.com/doc/refman/5.7/en/innodb-linux-native-aio.html

mysqld启动参数查询:mysqld --verbose --help |grep aio

logdir=/data/log/shell          #日志路径
log=$logdir/log.log            #日志文件
is_font=1              #终端是否打印日志: 1打印 0不打印
is_log=0               #是否记录日志: 1记录 0不记录
hostip="10.0.0.107"    #docker host machine 
networkName="o2o-network"       #docker网络
dockerMaster="o2o-mysql-master" #master 名称
dockerSlave="o2o-mysql-slave"   #slave 名称
rootPass="d3eb23f714529f1e73f934876d1b39" #root密码
replicationUser="backup"                  #复制账号
replicationPasss="04698e89512807"         #复制密码
masterPort=3307                           #master映射后端口
isToolBox=0                               #是否toolBox安装docker环境,1是 0否
dockerCompose="docker-compose.yml.template" #docker-compose.yml模板文件
memLimit="8g"               #内存限制
masterData=".\/master\/db"  #master数据目录
slaveData=".\/slave\/db"    #slave数据目录
waitMYSQLTime=30            #mysql初始化后等待时间,单位秒
waitSlaveTime=15            #mysql主从连接初始化后等待时间,单位秒
操作说明
  • 初始化以及一键安装
    /bin/bash setup.sh
  • 删除数据文件且停止和删除容器
    /bin/bash setup.sh clean
  • 初始化容器(build)
    /bin/bash setup.sh init
  • 初始化配置容器
    /bin/bash setup.sh config

运行截图

1

2

查看原文

赞 0 收藏 0 评论 0

认证与成就

  • 获得 7 次点赞
  • 获得 4 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 4 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

注册于 2018-08-09
个人主页被 346 人浏览