【k8s】【ELK】【zookeeper+kafka+efak】日志环境部署

news2024/9/22 9:58:54

1、日志收集基本概念

k8s中pod的路径:
containers log: /var/log/containers/*.log
Pod log: /var/log/pods
docker log: /var/lib/docker/containers/*/*.log

如何收集日志

使用 EFK+Logstash+Kafka
在这里插入图片描述

1、filebeat读取容器中的日志,然后写入Kafka集群中对应的topic(重点在于filebeat如何收集容器日志);
2、logstash从Kafka中读取数据,然后对数据进行清洗,而后写入ES对应的索引中;
3、Kibana匹配对应的ES索引,进行日志展示,分析

收集K8S哪些日志?

在这里插入图片描述

在这里插入图片描述

2、交付Elastic集群

#创建ns 、 docker-registry
kubectl create namespace logging

kubectl create secret docker-registry harbor-admin \
--docker-username=admin \
--docker-password=Harbor12345 \
--docker-server=harbor.oldxu.net \
-n logging

2.1 ES集群的构建

传统方式部署ES集群,参考:
https://blog.csdn.net/weixin_42890981/article/details/126692731 
和
https://blog.csdn.net/opensystem123/article/details/128131030
1、 ES 集群是由多个节点组成的,通过 cluster.name设置ES集群名称,同时用于区分其它的ES集群。
2、每个节点通过 node.name 参数来设定所在集群的节点名称。
3、节点使用 discovery.send_hosts 参数来设定集群节点的列表。

4、集群在第一次启动时,需要初始化,同时需要指定参与选举的master节点IP,或节点名称。
5、每个节点可以通过 node.master:true 设定为master角色,通过 node.data:true 设定为data角色。

demo:
在这里插入图片描述

2.2 交付ES-Service

#docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.6
docker pull elasticsearch:7.17.6
docker tag 5fad10241ffd harbor.oldxu.net/base/elasticsearch:7.17.6
docker push harbor.oldxu.net/base/elasticsearch:7.17.6

01-es-svc.yaml

#创建es-headlessService,为每个ES Pod设定固定的DNS名称,无论它是Master或是Data,易或是Coordinating
apiVersion: v1
kind: Service
metadata:
  name: es-svc
  namespace: logging
spec:
  selector:
    app: es
  clusterIP: None
  ports:
  - name: cluster
    port: 9200
    targetPort: 9200
  - name: transport
    port: 9300
    targetPort: 9300

2.3 交付ES-Master节点

1、ES无法使用root直接启动,需要授权数据目录UID=1000,同时还需要持久化/usr/share/elasticsearch/data
2、ES所有节点都需要设定 vm.max_map_count 内核参数以及ulimit;

3、ES启动是通过ENV环境变量传参来完成的
3.1、集群名称、节点名称、角色类型
3.2、 discovery.seed_hosts 集群地址列表
3.3、 cluster.initial_master_nodes 初始集群参与选举的master节点名称;
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: es-master
  namespace: logging
spec:
  serviceName: "es-svc"
  replicas: 3
  selector:
    matchLabels:
      app: es
      role: master
  template:
    metadata:
      labels:
        app: es
        role: master
    spec:
      imagePullSecrets:
      - name: harbor-admin
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values: ["es"]
              - key: role
                operator: In
                values: ["master"]
            topologyKey: "kubernetes.io/hostname"
            
      initContainers:
      - name: fix-permissions
        image: busybox
        command: ["sh","-c","chown -R 1000:1000 /usr/share/elasticsearch/data ; sysctl -w vm.max_map_count=262144; ulimit -n 65536"]        
        securityContext:
          privileged: true
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
          
      containers:
      - name: es
        image: harbor.oldxu.net/base/elasticsearch:7.17.6
        resources:
          limits:
            cpu: 1000m
            memory: 1024Mi
        ports:
        - name: cluster
          containerPort: 9200
        - name: transport
          containerPort: 9300
        
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
        env:
        - name: ES_JAVA_OPTS
          value: "-Xms512m -Xmx512m"        
        - name: cluster.name
          value: es-oldxu
        - name: node.name
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: node.master
          value: "true"
        - name: node.data
          value: "false"
        - name: discovery.seed_hosts
          value: "es-master-0.es-svc,es-master-1.es-svc,es-master-2.es-svc"
        - name: cluster.initial_master_nodes
          value: "es-master-0,es-master-1,es-master-2"
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]   
      storageClassName: "nfs"
      resources:
        requests:
          storage: 25Gi         

2.4交付ES-Data节点

1、ES无法使用root直接启动,需要授权数据目录UID=1000,同时还需要持久化 /usr/share/elasticsearch/data
2、ES所有节点都需要设定 vm.max_map_count 内核参数以及ulimit;

3、ES启动是通过ENV环境变量传参来完成的
3.1、集群名称、节点名称、角色类型
3.2、 discovery.seed_hosts 集群节点地址,任意填写Master节点域名
#资源内存有限,部署2个ES-data节点
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: es-data
  namespace: logging
spec:
  serviceName: "es-svc"
  replicas: 2
  selector:
    matchLabels:
      app: es
      role: data
  template:
    metadata:
      labels:
        app: es
        role: data
    spec:
      imagePullSecrets:
      - name: harbor-admin
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values: ["es"]
              - key: role
                operator: In
                values: ["data"]
            topologyKey: "kubernetes.io/hostname"
      initContainers:
      - name: fix-permissions
        image: busybox
        command: ["sh","-c","chown -R 1000:1000 /usr/share/elasticsearch/data ; sysctl -w vm.max_map_count=262144; ulimit -n 65536"]
        securityContext:
          privileged: true
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
      
      containers:
      - name: es
        image: harbor.oldxu.net/base/elasticsearch:7.17.6
        resources:
          limits:
            cpu: 1000m
            memory: 1024Mi
        ports:
        - name: cluster
          containerPort: 9200
        - name: transport
          containerPort: 9300
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
        env:
        - name: ES_JAVA_OPTS
          value: "-Xms512m -Xmx512m"
        - name: cluster.name
          value: es-oldxu
        - name: node.name
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: node.master
          value: "false"
        - name: node.data
          value: "true"
        - name: discovery.seed_hosts
          es-master-0.es-svc,es-master-1.es-svc,es-master-2.es-svc
          #value: "es-master-0,es-master-1,es-master-2"  

  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: "nfs"
      resources:
        requests:
          storage: 20Gi

2.5 验证ES集群

[root@master01 02-es-data-service]# dig @10.96.0.10 es-svc.logging.svc.cluster.local +short
10.244.2.169
10.244.0.3
10.244.1.213
10.244.1.212
10.244.2.164

在这里插入图片描述

通过curl访问ES,检查ES集群是否正常(如果仅交付Master,没有data节点,集群状态可能会Red,因为没有数据节点进行数据存储;)

curl -XGET "http://10.244.1.213:9200/_cluster/health?pretty"
curl -XGET "http://10.244.1.213:9200/_cat/nodes?/v"
curl -XGET "http://10.244.1.213:9200/_cat/shards?v"

在这里插入图片描述
在这里插入图片描述

注意: yaml文件的- name: discovery.seed_hosts 的值,否则也会是red。

在这里插入图片描述

3.交付Kibana可视化

3.1 交付Kibana(dp、svc、ingress)

docker pull kibana:7.17.6
docker tag kibana:7.17.6 harbor.oldxu.net/base/kibana:7.17.6
docker push harbor.oldxu.net/base/kibana:7.17.6
#说明:
#cat /etc/kibana/kibana.yml
server.port: 5601           #kibana默认监听端口
server.host: "0.0.0.0"      #kibana监听地址段
elasticsearch.hosts: ["http://localhost:9200"]
# kibana丛coordinating节点获取数据
i18n.locale: "zh-CN"        #kibana汉化

01-kibana-dp.yam

apiVersion: apps/v1
kind: Deployment
metadata:
  name: kibana
  namespace: logging
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kibana
  template:
    metadata:
      labels:
        app: kibana
    spec:
      imagePullSecrets:
      - name: harbor-admin
      containers:
      - name: kibana
        image: harbor.oldxu.net/base/kibana:7.17.6
        resources:
          limits:
            cpu: 1000m
        ports:
        - containerPort: 5601
        env:
        - name: ELASTICSEARCH_HOSTS
          value: '["http:/es-data-0.es-svc:9200","http:/es-data-1.es-svc:9200"]'        
        - name: I18N_LOCALE
          value: "zh-CN"
        - name: SERVER_PUBLICBASEURL
          value: "http://kibana.oldxu.net"        
        

02-kibana-svc.yam

apiVersion: v1
kind: Service
metadata:
  name: kibana-svc
  namespace: logging
spec:
  selector:
    app: kibana
  ports:
  - name: web
    port: 5601
    targetPort: 5601  

03-kibana-ingress.yam

#apiVersion: networking.k8s.io/v1
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: kibana-ingress
  namespace: logging
spec:
  ingressClassName: "nginx"
  rules:
  - host: "kibana.oldxu.net"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          serviceName: kibana-svc
          servicePort: 5601
          #service:
          #  name: kibana-svc
          #  port:
          #    number: 5601

3.2 访问kibana

在这里插入图片描述

4、交付Zookeeper集群至K8S

镜像: harbor.oldxu.net/base/zookeeper:3.8.0
变量 ZOOK_SERVERS :zk集群节点通信地址

01-zk-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: zk-svc
  namespace: logging
spec:
  clusterIP: None
  selector: 
    app: zk
  ports:
  - name: client
    port: 2181
    targetPort: 2181
  - name: leader-follwer
    port: 2888
    targetPort: 2888
  - name: selection
    port: 3888
    targetPort: 3888

02-zk-sts.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: zookeeper
  namespace: logging
spec:
  serviceName: "zk-svc"
  replicas: 3
  selector:
    matchLabels:
      app: zk
  template:
    metadata:
      labels:
        app: zk
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values: ["zk"]
              topologyKey: "kubernetes.io/hostname" 
      imagePullSecrets:
      - name: harbor-admin
      containers:
      - name: zk
        image: harbor.oldxu.net/base/zookeeper:3.8.0
        imagePullPolicy: IfNotPresent
        ports:
        - name: client
          containerPort: 2181
        - name: leader-follwer
          containerPort: 2888
        - name: selection
          containerPort: 3888
        env:
        - name: ZOOK_SERVERS                
          value: "server.1=zookeeper-0.zk-svc.logging.svc.cluster.local:2888:3888 server.2=zookeeper-1.zk-svc.logging.svc.cluster.local:2888:3888 server.3=zookeeper-2.zk-svc.logging.svc.cluster.local:2888:3888"
        readinessProbe:
          exec:
            command:
            - "/bin/bash"
            - "-c"
            - '[[ "$(/zookeeper/bin/zkServer.sh status 2>/dev/null|grep 2181)" ]] && exit 0 || exit 1'
          initialDelaySeconds: 5
        livenessProbe:
          exec:
            command:
            - "/bin/bash"
            - "-c"
            - '[[ "$(/zookeeper/bin/zkServer.sh status 2>/dev/null|grep 2181)" ]] && exit 0 || exit 1'
        volumeMounts:
        - name: data
          mountPath: /data
          
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteMany"]
      storageClassName: "nfs" 
      resources:
        requests:
          storage: 21Gi      

验证zk集群

kubectl exec -it -n logging zookeeper-0 -- /zookeeper/bin/zkServer.sh status
kubectl exec -it -n logging zookeeper-1 -- /zookeeper/bin/zkServer.sh status
kubectl exec -it -n logging zookeeper-2 -- /zookeeper/bin/zkServer.sh status

在这里插入图片描述

5、交付Kafka集群至K8S

镜像名称及tag: harbor.oldxu.net/base/kafka:2.12
变量: ZOOK_SERVERS :Kafka元数据存储ZK,需明确指定Zookeeper集群地址

01-kafka-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: kafka-svc
  namespace: logging
spec:
  clusterIP: None
  selector:
    app: kafka
  ports:
  - name: client
    port: 9092
    targetPort: 9092
  - name: jmx
    port: 9999
    targetPort: 9999

02-kafka-sts.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: kafka
  namespace: logging
spec:
  serviceName: "kafka-svc"
  replicas: 3
  selector:
    matchLabels:
      app: kafka
  template:
    metadata:
      labels:
        app: kafka
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    value: ["kafka"]
              topologyKey: "kubernetes.io/hostname"
      imagePullSecrets:
      - name: harbor-admin
      containers:
      - name: kafka
        image: harbor.oldxu.net/base/kafka:2.12
        imagePullPolicy: IfNotPresent
        ports:
        - name: client
          containerPort: 9092
        - name: jmxport
          containerPort: 9999
        env:
        - name: ZOOK_SERVERS
          value: "zookeeper-0.zk-svc:2181,zookeeper-1.zk-svc:2181,zookeeper-2.zk-svc:2181"        
        readinessProbe:
          tcpSocket:
            port: 9092
          initialDelaySeconds: 5
        livenessProbe:
          tcpSocket:
            port: 9092
          initialDelaySeconds: 5
        volumeMounts:
        - name: data
          mountPath: /data    

  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteMany"]
      storageClassName: "nfs"
      resources:
        requests:
          storage: 20Gi 

验证Kafka集群

#1、登陆任意kafka Pod,然后创建topic主题
[root@master01 ~]# kubectl exec -it -n logging kafka-0 -- bash

root@kafka-0:/# /kafka/bin/kafka-topics.sh --create --zookeeper zookeeper-0.zk-svc:2181,zookeeper-1.zk-svc:2181,zookeeper-2.zk-svc:2181 --partitions 1 --replication-factor 3 --topic oldl33
Created topic oldl33.

#2、消息发布
[root@master01 ~]# kubectl exec -it -n logging kafka-1 -- bash
root@kafka-1:/# /kafka/bin/kafka-console-producer.sh \
> --broker-list kafka-0.kafka-svc:9092,kafka-1.kafka-svc:9092,kafka-2.kafka-svc:9092 \
> --topic oldl33
>
>deploy kafka ok
>heloo kafka on k8s
>

#3、消息订阅(可以登陆其他Pod进行消息订阅)
[root@master01 ~]# kubectl exec -it -n logging kafka-2 -- bash
root@kafka-2:/# ls
bin  boot  data  dev  entrypoint.sh  etc  home	kafka  lib  lib64  media  mnt  opt  proc  root	run  sbin  srv	sys  tmp  usr  var
root@kafka-2:/# 
root@kafka-2:/# /kafka/bin/kafka-console-consumer.sh \
> --bootstrap-server kafka-0.kafka-svc:9092,kafka-1.kafka-svc:9092,kafka-2.kafka-svc:9092 \
> --topic oldl33 \
> --from-beginning

deploy kafka ok
heloo kafka on k8s

6、交付EFAK至K8S

镜像名称及tag: harbor.oldxu.net/base/efak:3.0
变量: ZOOK_SERVERS :efak需要连接Zk获取zk和kafka集群各种状态指标信息

01-efak-dp.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: efak
  namespace: logging
spec:
  replicas: 1
  selector:
    matchLabels:
      app: efak
  template:
    metadata:
      labels:
        app: efak
    spec:
      imagePullSecrets:
      - name: harbor-admin
      containers:
      - name: efak
        image: harbor.oldxu.net/base/efak:3.0
        imagePullPolicy: IfNotPresent
        
        ports:
        - name: http
          containerPort: 8048
        env:
        - name: ZOOK_SERVERS
          value: "zookeeper-0.zk-svc:2181,zookeeper-1.zk-svc:2181,zookeeper-2.zk-svc:2181"
        

02-efak-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: efak-svc
  namespace: logging
spec:
  selector:
    app: efak
  ports:
  - port: 8048
    targetPort: 8048

03-efak-ingress.yaml

apiVersion: networking.k8s.io/betav1
kind: Ingress
metadata:
  name: efak-ingress
  namespace: logging
spec:
  ingressClassName: "nginx"
  rules:
  - host: "efak.oldxu.net"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          serviceName: efak-svc
          servicePort: 8048
          #service:
          #  name: efak-svc
          #  port:
          #    number: 8048            

访问eagle

admin / 123456
zk和kafka状态:
在这里插入图片描述
在这里插入图片描述

END

备注:

以前的博文有详细部署zookeeper 、kafka、efak的描述
https://blog.csdn.net/Nightwish5/article/details/130389581 《zookeeper》
https://blog.csdn.net/Nightwish5/article/details/130402955 《kafka集群,efak 》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/535897.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

camunda如何发布和调用rest服务接口

一、camunda如何发布rest服务接口 Camunda BPM 平台本身提供了 REST API 接口,可以用于管理和操作 Camunda 平台中的各种资源和数据,如流程定义、流程实例、任务等。因此,我们可以通过编写 Camunda 应用程序的方式,将 Camunda RE…

Ubuntu系统远程桌面安装运行记录

Ubuntu系统远程桌面安装运行记录 分别测试了20.04和22.04两个版本 一、widows远程 参考连接https://blog.csdn.net/qq_50263172/article/details/128465149 安装步骤如下: sudo apt-get install xrdpsudo apt install tightvncserversudo apt-get install xubuntu-…

CSS基础-超详解

目录 什么是CSS? CSS的引入方式 内部样式 外部样式 内联样式 CSS选择器 CSS标签选择器 类选择器 id选择器 通配符选择器 CSS属性设置 字体 文本 什么是CSS? CSS也被叫做层叠样式表, 英文全称为: Cascading Style Sheets, 是一种用来表现HTML(标准通用标记语言的一个应用)…

【云原生】k8s管理工具--Kubectl(二)

k8s管理工具--Kubectl(二) 一、项目生命周期1、项目生命周期2、创建kubectl run命令3、发布kubectl expose命令(1) Service的作用(2)Service的类型(3)查看Pod网络状态详细信息和Serv…

django 数据迁移makemigrations和migrate的备忘录

问题描述 之前成功生成过,重新执行python manage.py migrate后,数据库没有生成对应的数据表;表现为 Apply all migrations: admin, auth, contenttypes, sessions Running migrations:No migrations to apply.执行python manage.oy makemig…

STM32-光敏传感器实验

光敏传感器的主要是光敏二极管,核心是PN结,利用了光电效应,对光强很敏感,有单向导电性,工作时需要加反向电压。光照越强,等效电阻越小。 实验要求通过ADC3通道6(PF8)采集光敏二极管…

geoserver安装与发布服务过程

geoserver是做地图领域开发必会的插件之一,今天我们来分享多种安装方式与发布服务过程: 一、安装下载 1、官网地址:GeoServer 进入下载页面选择下载的版本,我这里选择2.22.3的稳定版本。 来到: 多种安装包可选&#…

科研er如何查询学术期刊分区信息?

文章目录 引言:为什么要查询学术期刊分区信息?1.使用LetPub查询1.1.LetPub简介1.2.查询步骤 2.使用《中科院文献情报中心期刊分区表》进行查询2.1.《中科院文献情报中心期刊分区表》简介2.2.查询步骤 引言:为什么要查询学术期刊分区信息&…

Linux man手册什么都找不到 常见问题总结

1.尝试安装缺少的page sudo yum[或者apt-get] install manpages-de manpages-de-dev manpages-dev glibc-doc manpages-posix-dev manpages-posix 安装成功后解决了没有pages的问题,如果还是查不到,则可能是找不到pages的问题 2.更新Gcc 或 G 后导致路径变化 man手册的所有…

每日一练 | 网络工程师软考真题 Day2

1、某工程制定的开发方案中定义了3个任务,其中任务A首先开始,且需要3周完成,任务周完B必须在任务A启动1周后开始,且需要2周完成,任务C必须在任务A后才能开始,且需要完成2周完成。该工程的进度安排可用下面的…

案例12:Java宠物医院预约管理系统设计与实现开题报告

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

CCF大数据与计算智能大赛-基于人工智能的漏洞数据分类冠军方案

基于人工智能的漏洞数据分类 前言 为及时跟踪国际信息安全趋势,需对国际公开的漏洞数据内容进行及时统计和梳理,例如CVE漏洞平台。CVE平台的漏洞信息包含有CVE编号、漏洞评分、漏洞描述等内容,其中漏洞描述含有对漏洞的利用条件、受影响的范…

Windows下快速启动Kafka以及三种发送消息的方式

目录 一、下载Kafka 二、启动kafka 2.1 启动kafka前得先启动zk 2.2 启动kafka 三、操作Kafka 3.1 创建 Kafka 主题(Topic) 3.2 将信息写入主题(Topic) 3.3 读取信息 四、Java实践-三种发送消息的方式 4.1 异步发送-无回…

登录appuploader

登录appuploader 常规使用登录方法 双击appuploader.exe 启动appuploader 点击底部的未登录,弹出登录框 在登录框内输入apple开发者账号 如果没有apple开发者账号,只是普通的apple账号,请勾选上未支付688 然后软件会提示输入验证码&#…

Go语言中sync.Mutex和sync.WaitGroup的用法

目录 【goroutine的调度器】 【Go语言的sync包】 【sync.Mutex】 sync.Mutex 底层原理 sync.Mutex 其它用法 【sync.RWMutex】 sync.RWMutex 实现原理 【sync.WaitGroup】 Go 并发编程中存在的难题:并发编程不像是传统的串行编程,程序的运行存在…

chatgpt批量生成网站文章-chatgpt批量生成自媒体的文章

怎么用chatgpt批量生成文章符合SEO优化的文章 ChatGPT是一款功能强大、智能化的自然语言处理模型,可以用于生成符合SEO优化的文章。以下是一些建议: 确定主题和关键词:在开始生成文章之前,需要先确定文章的主题和关键词。这有助于…

张益唐直播报告学术报告,零点猜想问题终于被解决(文末可获取论文原文)

原创 | 文BFT机器人 8日上午9点,张益唐教授带着一支黑笔、一块白板现身b站直播,全网超10万人在线观看,从直播消息放出开始,大家就早早端好了小板凳等着教授精彩开讲! 直播40分钟一堂课的时长,知识点一个接…

《人月神话》译文修订明细(1)-读者可以对照修改

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> 《人月神话》译文修订如下,读者可以对照自己手上的书修改。 相关阅读 这回真要动刀子-征集《人月神话》中译本的翻译修正>> 第一章 原译文 它们最后都…

金山办公的WPS AI将引入大模型能力(LLM)到表格、文字、演示和PDF四大组件

🚀 金山办公的WPS AI将引入大模型能力(LLM)到表格、文字、演示和PDF四大组件,并支持桌面电脑和移动设备。 金山办公的WPS AI将引入大模型能力(LLM)到表格、文字、演示和PDF四大组件,并支持桌面…

MySQL双写机制

MySQL双写机制的目的是什么?是如何实现的? 一、双写的目的 为了解决 partial page write 问题。 InnoDB 的Page Size一般是16KB,其数据校验也是针对这16KB来计算的,将数据写入到磁盘是以Page为单位进行操作的。而计算机硬件和操…