golang实现Ollama集群管理、负载均衡与故障转移插件库OllamaFarm的使用

Golang实现Ollama集群管理、负载均衡与故障转移插件库OllamaFarm的使用

OllamaFarm简介

OllamaFarm是一个Go语言包,用于管理多个Ollama实例,提供与Ollama服务器集群交互的便捷方式。它具有自动离线检测和故障转移、模型可用性跟踪以及基于模型等条件的服务器选择功能。

Go Report Card codecov Go Test GoDoc License: MIT

安装

使用以下命令安装OllamaFarm:

go get github.com/presbrey/ollamafarm

使用示例

以下是一个使用OllamaFarm管理多个Ollama实例的完整示例:

package main

import (
    "context"
    "fmt"
    "log"

    "github.com/presbrey/ollamafarm"
    "github.com/ollama/ollama/api"
)

func main() {
    // 创建一个新的Farm实例
    farm := ollamafarm.New()

    // 注册Ollama服务器到同一个组,设置不同优先级
    farm.RegisterURL("http://ollama1:11434", &ollamafarm.Properties{Group: "4090", Priority: 1})
    farm.RegisterURL("http://ollama2:11434", &ollamafarm.Properties{Group: "4090", Priority: 2})
    farm.RegisterURL("http://ollama3:11434", &ollamafarm.Properties{Group: "3090", Priority: 1})

    // 选择一个Ollama实例
    ollama := farm.First(&ollamafarm.Where{Model: "llama3.1:8b-instruct-fp16"})
    if ollama != nil {
        // 执行Chat调用
        req := &api.ChatRequest{
            Model: "llama3.1:8b-instruct-fp16",
            Messages: []api.Message{
                {Role: "user", Content: "How many letter R are in the word Strawberry?"},
            },
        }

        err := ollama.Client().Chat(context.Background(), req, func(resp api.ChatResponse) error {
            fmt.Print(resp.Message.Content)
            return nil
        })

        if err != nil {
            log.Fatalf("Chat error: %v", err)
        }
    }

    // 获取模型计数
    modelCounts := farm.ModelCounts(nil)
    fmt.Printf("Available models: %v\n", modelCounts)
}

注意:当Ollama实例离线时,OllamaFarm会自动选择同一组中优先级最高(优先级数字最小)的下一个在线Ollama。这确保了无需人工干预即可持续运行和优化资源利用。

API参考

类型

  • Farm: 管理多个Ollama实例的主结构体
  • Ollama: 表示单个Ollama服务器
  • Options: 定义Farm的选项,所有字段都是可选的
type Options struct {
    Client     *http.Client
    Heartbeat  time.Duration
    ModelsTTL  time.Duration
}
  • Properties: 定义Ollama客户端的属性,所有字段都是可选的
type Properties struct {
    Group    string
    Offline  bool
    Priority int
}
  • Where: 定义Ollama客户端的选择条件
type Where struct {
    Group   string
    Model   string
    Offline bool
}

函数

  • New() *Farm: 使用默认选项创建一个新的Farm实例
  • NewWithOptions(options *Options) *Farm: 使用给定选项创建一个新的Farm实例

Farm方法

  • RegisterClient(id string, client *api.Client, properties *Properties): 如果不存在,则向Farm添加一个新的Ollama
  • RegisterURL(baseURL string, properties *Properties) error: 使用baseURL作为ID向Farm添加一个新的Ollama
  • First(where *Where) *Ollama: 返回第一个匹配给定条件的Ollama
  • Select(where *Where) []*Ollama: 返回匹配给定条件的Ollama列表,按优先级升序排序
  • ModelCounts(where *Where) map[string]uint: 返回所有注册Ollama中可用模型的计数

Ollama方法

  • Client() *api.Client: 返回Ollama客户端
  • Farm() *Farm: 返回此Ollama所属的Farm
  • Group() string: 返回Ollama的组
  • Online() bool: 返回Ollama是否在线
  • Priority() int: 返回Ollama的优先级

贡献指南

欢迎对OllamaFarm做出贡献!请遵循以下指南:

  1. 所有pull请求必须保持或改进现有的测试覆盖率
  2. 新功能或更改不得破坏任何现有API
  3. 编写清晰、简洁的提交消息
  4. 遵循Go最佳实践和风格指南

许可证

本项目采用MIT许可证。


更多关于golang实现Ollama集群管理、负载均衡与故障转移插件库OllamaFarm的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实现Ollama集群管理、负载均衡与故障转移插件库OllamaFarm的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang实现Ollama集群管理与负载均衡

OllamaFarm是一个用于管理Ollama模型集群的Golang库,它提供了负载均衡、故障转移和集群管理功能。下面我将详细介绍如何使用OllamaFarm来构建一个高可用的Ollama服务集群。

基本概念

OllamaFarm主要包含以下核心功能:

  • 集群节点管理(添加/删除节点)
  • 智能负载均衡(支持轮询、最少连接等策略)
  • 自动故障检测与恢复
  • 请求重试机制

安装OllamaFarm

go get github.com/ollama/ollamafarm

基本使用示例

1. 初始化集群管理器

package main

import (
	"fmt"
	"time"
	"github.com/ollama/ollamafarm"
)

func main() {
	// 创建集群管理器
	cluster := ollamafarm.NewClusterManager(
		ollamafarm.WithHealthCheckInterval(10*time.Second),
		ollamafarm.WithLoadBalancerStrategy(ollamafarm.LeastConnections),
	)

	// 添加Ollama节点
	cluster.AddNode("http://node1:11434", "node1")
	cluster.AddNode("http://node2:11434", "node2")
	cluster.AddNode("http://node3:11434", "node3")

	// 使用集群
	client := ollamafarm.NewClient(cluster)
	
	// 后续可以使用client进行模型操作...
}

2. 负载均衡请求

// 获取一个可用节点
node, err := client.GetAvailableNode()
if err != nil {
    log.Fatalf("获取节点失败: %v", err)
}

// 使用该节点进行请求
resp, err := node.Generate("llama2", "你好,请介绍一下你自己")
if err != nil {
    log.Printf("请求失败: %v", err)
    // 可以在这里实现重试逻辑
} else {
    fmt.Println(resp)
}

高级功能

1. 自定义负载均衡策略

// 实现自定义负载均衡策略
type CustomStrategy struct{}

func (s *CustomStrategy) Select(nodes []*ollamafarm.Node) (*ollamafarm.Node, error) {
    // 实现自己的选择逻辑,例如基于地理位置
    return nodes[0], nil
}

// 使用自定义策略
cluster := ollamafarm.NewClusterManager(
    ollamafarm.WithLoadBalancerStrategy(&CustomStrategy{}),
)

2. 故障转移与重试

// 启用自动重试
client := ollamafarm.NewClient(
    cluster,
    ollamafarm.WithMaxRetries(3),
    ollamafarm.WithRetryDelay(1*time.Second),
)

// 请求会自动在失败时重试其他节点
resp, err := client.GenerateWithRetry("llama2", "请写一篇关于AI的文章")

3. 健康检查配置

cluster := ollamafarm.NewClusterManager(
    // 每15秒检查一次健康状态
    ollamafarm.WithHealthCheckInterval(15*time.Second),
    // 自定义健康检查端点
    ollamafarm.WithHealthCheckEndpoint("/api/health"),
    // 健康检查超时时间
    ollamafarm.WithHealthCheckTimeout(3*time.Second),
)

监控与统计

// 获取集群统计信息
stats := cluster.GetStats()

fmt.Printf("总请求数: %d\n", stats.TotalRequests)
fmt.Printf("成功请求数: %d\n", stats.SuccessfulRequests)
fmt.Printf("失败请求数: %d\n", stats.FailedRequests)
fmt.Printf("当前活跃节点数: %d\n", stats.ActiveNodes)

// 获取单个节点统计
nodeStats := cluster.GetNodeStats("node1")
fmt.Printf("节点1的负载: %d\n", nodeStats.CurrentLoad)

最佳实践

  1. 节点配置:建议至少配置3个节点以保证高可用性
  2. 健康检查:根据业务需求调整健康检查间隔
  3. 负载均衡策略
    • 对于均匀负载的场景使用轮询(RoundRobin)
    • 对于长任务使用最少连接(LeastConnections)
  4. 错误处理:实现适当的重试和回退机制

完整示例

package main

import (
	"fmt"
	"log"
	"time"
	"github.com/ollama/ollamafarm"
)

func main() {
	// 1. 初始化集群
	cluster := ollamafarm.NewClusterManager(
		ollamafarm.WithHealthCheckInterval(10*time.Second),
		ollamafarm.WithLoadBalancerStrategy(ollamafarm.LeastConnections),
		ollamafarm.WithMaxRetries(3),
	)

	// 2. 添加节点
	nodes := []struct {
		url  string
		name string
	}{
		{"http://ollama-node1:11434", "node1"},
		{"http://ollama-node2:11434", "node2"},
		{"http://ollama-node3:11434", "node3"},
	}

	for _, n := range nodes {
		if err := cluster.AddNode(n.url, n.name); err != nil {
			log.Printf("添加节点 %s 失败: %v", n.name, err)
		}
	}

	// 3. 创建客户端
	client := ollamafarm.NewClient(cluster)

	// 4. 使用集群
	for i := 0; i < 10; i++ {
		resp, err := client.GenerateWithRetry("llama2", 
			fmt.Sprintf("这是第%d个请求,请返回一个随机数", i+1))
		if err != nil {
			log.Printf("请求失败: %v", err)
			continue
		}
		fmt.Printf("响应 %d: %s\n", i+1, resp)
	}

	// 5. 打印统计信息
	stats := cluster.GetStats()
	fmt.Printf("\n集群统计:\n")
	fmt.Printf("总请求数: %d\n", stats.TotalRequests)
	fmt.Printf("成功请求数: %d\n", stats.SuccessfulRequests)
	fmt.Printf("失败请求数: %d\n", stats.FailedRequests)
	fmt.Printf("当前活跃节点数: %d\n", stats.ActiveNodes)
}

OllamaFarm为Golang开发者提供了一个强大的工具来管理Ollama集群,通过合理的配置可以显著提高服务的可用性和性能。根据实际业务需求,你可以进一步定制负载均衡策略、健康检查机制和故障转移行为。

回到顶部