为什么选择golang,出于什么考虑

Golang以其高效的并发模型和编译速度,使其成为处理高并发情况下的优秀选择。其轻量级的协程(goroutine)机制可以在有限的资源下处理大量的并发请求,从而提供更好的性能。

Golang以静态链接方式生成可执行文件,这意味着可以将所有依赖项包含在二进制文件中,减少了在镜像中包含大量依赖的需要。这有助于减小镜像的大小,加快部署速度,并减少网络传输负担。

使用过ES吗,ES对比mysql有什么优势,原理是什么

  • Elasticsearch(ES)与MySQL的优势对比:

    • 全文搜索和复杂查询: Elasticsearch是一个分布式搜索和分析引擎,专注于全文搜索和复杂查询。它在搜索大量文本数据、执行复杂查询、实现模糊匹配等方面表现出色。相比之下,MySQL虽然有全文搜索功能,但在处理大规模全文搜索时,ES通常更为高效和灵活。

    • 分布式性能和可伸缩性: Elasticsearch被设计为分布式系统,具有良好的水平可伸缩性。它可以将数据分片并存储在多个节点上,从而提供更好的性能和扩展性。对于需要处理大量数据的应用,特别是日志分析、大数据搜索等领域,ES通常优于MySQL。

    • 实时性能: Elasticsearch对实时数据的处理非常适用,能够在毫秒级别内提供查询结果。这使得它在监控、实时日志分析等场景中非常有用。MySQL在实时数据查询方面可能有一些限制。

    • 多数据类型支持: Elasticsearch支持多种数据类型,包括文本、数字、日期等。它的数据建模更加灵活,可以满足不同类型的数据存储和查询需求。MySQL则主要是关系型数据库,适合结构化数据。

  • Elasticsearch的工作原理:

    • 倒排索引:Elasticsearch是基于Lucene引擎的搜索和分析引擎。它的核心概念是倒排索引(Inverted Index)。在传统数据库中,我们会根据数据的行来索引,而在Elasticsearch中,它将数据进行切片,然后建立索引,索引中存储的是词项(terms)以及词项在文档中出现的位置。这使得它可以高效地执行复杂的全文搜索和关键词查询。

    • 多节点并行执行:Elasticsearch的数据被分布式地存储在多个节点上,每个节点都可以处理查询和索引操作。查询会在各个节点上并行执行,然后由协调节点汇总结果。它使用了分片(sharding)和副本(replication)的机制来实现数据的可伸缩性和高可用性。

总之,Elasticsearch和MySQL在不同的应用场景中有不同的优势。Elasticsearch适用于需要高效全文搜索、大规模数据分析和实时性能的场景,而MySQL则更适合处理结构化数据、事务处理等传统数据库任务。选择合适的数据库取决于项目的具体需求。

聊聊MySQL索引以及优缺点?

  • 优点:

    • 加速数据检索: 索引可以大大提高查询数据的速度,特别是在大型表中。通过使用索引,数据库可以更快地定位和返回匹配查询条件的行。

    • 提高排序性能: 当执行排序操作时,索引可以帮助数据库更快地返回排序后的结果,而不需要全表扫描。

    • 唯一性约束: 索引可以用于确保表中的某个列具有唯一值,从而实现唯一性约束。

  • 缺点:

    • 额外的存储空间: 索引需要占用额外的存储空间。对于大型表,创建多个索引可能会显著增加存储需求。

    • 写操作开销: 当进行INSERT、UPDATE或DELETE等写操作时,数据库需要维护索引的更新,这会增加写操作的开销。特别是在频繁执行写操作的情况下,索引可能会影响性能。

    • 维护成本: 随着数据的插入、更新和删除,索引需要进行维护,以保持其有效性。这会导致一些额外的开销,特别是对于大型表。

聊一聊k8s的组件和作用

Kubernetes(通常简称为K8s)是一个开源的容器编排和管理平台,用于自动化部署、扩展和操作应用程序容器。它由多个核心组件和附加组件组成,共同实现了容器化应用程序的管理和运行。以下是Kubernetes的核心组件及其作用:

API Server(API服务器): Kubernetes的核心组件之一,用于公开K8s集群的API。它是控制平面中的前端,用于接收来自用户、客户端、内部组件等的请求,并执行相应的操作。

Scheduler(调度器): 调度器负责将容器化应用程序的Pod调度到集群的可用节点上。它根据资源需求、亲和性、反亲和性等条件,选择最合适的节点来运行Pod。

Controller Manager(控制器管理器): 控制器管理器维护控制器的运行状态,这些控制器负责监控系统的期望状态并采取措施确保系统达到期望状态。常见的控制器包括Replication Controller、Deployment、StatefulSet等。

etcd: etcd是一个分布式键值存储系统,被用作Kubernetes的数据存储后端。它存储了集群的配置信息、状态和元数据。

Kubelet: Kubelet运行在每个节点上,负责管理该节点上的容器。它会监控Pod的状态,确保Pod根据描述运行,并与Master节点通信以汇报节点状态。

Kube-proxy: Kube-proxy负责在集群中维护网络代理和负载均衡。它维护网络规则,以确保Pod可以相互通信,并提供了负载均衡服务。

Container Runtime(容器运行时): K8s支持多种容器运行时,如Docker、containerd等。容器运行时负责运行和管理容器,它与Kubelet紧密集成,确保Pod中的容器按预期方式运行。

介绍一下golang的sync包中常用方法

  1. sync.Mutex(互斥锁)、sync.RWMutex(读写锁)
    • 显示加解锁
  2. sync.WaitGroup
    • 用于等待一组goroutine完成
    • Add()增加计数器,Done()减少计数器,Wait()阻塞直到计数器为0
  3. sync.Once
    • 初始化数据
  4. sync.Map
    • 并发安全的map
  5. sync.Pool
var pool = sync.Pool{
    New: func() interface{} {
        return &MyObject{}
    },
}

obj := pool.Get().(*MyObject)  // 从池中获取对象
// 使用对象
pool.Put(obj)  // 将对象放回池中
  1. sync.Cond
var cond = sync.NewCond(&sync.Mutex{})

// 等待条件
cond.L.Lock()
for !condition {
    cond.Wait()
}
cond.L.Unlock()

// 通知
cond.Signal()  // 唤醒一个goroutine
cond.Broadcast() // 唤醒所有goroutine

golang select 语句的使用和实现原理

  • 使用特点

    • 多路复用:可以同时监听多个channel的读写操作
    • 非阻塞:配合default可以实现非阻塞操作
    • 随机选择:当多个case同时满足时,会随机选择一个执行
  • 运行时实现

      1. 随机顺序执行:Go运行时使用伪随机算法决定case的执行顺序,避免饥饿问题
    
      2. 数据结构:
         `scase`结构体表示一个case
          `selectgo`函数是运行时实现select的核心函数
    
      3. 执行流程:
       	 锁定所有涉及的channel
      	 检查是否有立即可以执行的case
      	 如果没有,则将当前goroutine加入所有channel的等待队列
      	 当某个channel就绪时,唤醒goroutine并执行对应case
      	 清理其他channel的等待队列
    

说一下mysql的锁

  • 锁分类
    • 粒度分类
      • 全局锁
      • 表锁
      • 行锁
    • 性质分类
      • 共享锁
      • 排它锁
      • 意向锁
  • innodb行级锁实现方式
    • 记录锁
    • 间隙锁(Gap locks)
      • 解决幻读问题
    • 临键锁(next-key locks)
    • 插入意向锁

MQ怎么保证数据不丢失

  • 生产者
    • 确认机制
    • 消息重试
    • 持久化发送
  • Broker端
    • 消息持久化
    • 高可用机制,主从复制、多副本集群
    • 文件存储优化
  • 消费者
    • 手动确认(ACK)
    • 消息重试
    • 幂等消费

如果发现线上数据库主从复制延迟过大怎么办

  • 确认原因
    • show slave status
    • ping 查看网络延迟
  • 可能原因
    • 硬件资源不足-升级从库配置
    • 大事务或大批量更新-分拆小事务
    • 单线程复制瓶颈-升级版本、并行复制
    • 从库负载过高-优化查询、读分流到其他从库
    • 复制配置不当-修改配置
  • 优化建议
    • 读写分离
    • 分表分库减少单表数据量
    • 建立监控预警
    • 定期检测表结构和索引
    • 重新建立从库-如果延迟过大
    • 只从主库读,停止从库的读操作-避免读写分离时数据不一致