golang高性能ClickHouse数据库HTTP代理插件chproxy的使用

golang高性能ClickHouse数据库HTTP代理插件chproxy的使用

概述

chproxy是一个用于ClickHouse数据库的HTTP代理和负载均衡器。它是一个开源社区项目,并非ClickHouse官方项目。

Go Report Card Go Coverage

功能特性

  • 提供ClickHouse数据库的HTTP代理功能
  • 支持负载均衡
  • 高性能设计

示例代码

下面是一个使用chproxy的基本示例:

package main

import (
	"log"
	"net/http"
	
	"github.com/ContentSquare/chproxy"
	"github.com/ContentSquare/chproxy/config"
)

func main() {
	// 创建配置
	cfg := config.Config{
		Server: config.Server{
			HTTP: config.HTTP{
				ListenAddr: ":9090",
			},
		},
		Clusters: []config.Cluster{
			{
				Name: "default",
				Nodes: []config.Node{
					{
						Name:       "node1",
						Address:    "localhost:8123",
						Password:   "password",
						Username:   "default",
					},
				},
			},
		},
		Users: []config.User{
			{
				Name:         "default",
				Password:     "password",
				ToCluster:    "default",
				ToUser:       "default",
				MaxConcurrentQueries: 4,
				MaxExecutionTime:     config.Duration{Duration: time.Minute},
			},
		},
	}

	// 创建代理
	proxy, err := chproxy.NewProxy(&cfg)
	if err != nil {
		log.Fatalf("failed to create proxy: %v", err)
	}

	// 启动HTTP服务
	log.Printf("starting proxy on %s", cfg.Server.HTTP.ListenAddr)
	if err := http.ListenAndServe(cfg.Server.HTTP.ListenAddr, proxy); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

配置文件示例

chproxy也支持通过配置文件启动,下面是一个示例配置文件config.yml

server:
  http:
    listen_addr: ":9090"
    allowed_networks: ["127.0.0.0/24"]

clusters:
  - name: "default"
    nodes:
      - name: "node1"
        address: "localhost:8123"
        username: "default"
        password: "password"
    users:
      - name: "default"
        password: "password"
        to_cluster: "default"
        to_user: "default"
        max_concurrent_queries: 4
        max_execution_time: 1m

启动命令:

chproxy -config=config.yml

使用说明

  1. chproxy可以作为ClickHouse的前置代理,提供统一的访问入口
  2. 支持多节点负载均衡
  3. 提供查询限制和超时控制
  4. 支持用户认证和权限控制

注意事项

  • 请确保配置文件中密码等敏感信息的安全性
  • 根据实际需求调整并发查询数和执行超时时间
  • 生产环境建议配置allowed_networks限制访问网络

更多关于golang高性能ClickHouse数据库HTTP代理插件chproxy的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang高性能ClickHouse数据库HTTP代理插件chproxy的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


chproxy: ClickHouse HTTP代理工具使用指南

chproxy是一个高性能的ClickHouse HTTP代理服务器,主要用于负载均衡、访问控制和查询限制等功能。下面详细介绍其使用方法和Golang示例。

主要功能

  1. 负载均衡:在多个ClickHouse节点间分发查询
  2. 访问控制:基于用户/IP的认证和授权
  3. 查询限制:限制查询复杂度、执行时间等
  4. 缓存:查询结果缓存
  5. 监控:提供Prometheus格式的指标

安装chproxy

# 下载预编译二进制
wget https://github.com/ContentSquare/chproxy/releases/download/v1.16.0/chproxy-linux-amd64-v1.16.0.tar.gz
tar -xzf chproxy-linux-amd64-v1.16.0.tar.gz
sudo mv chproxy /usr/local/bin/

基本配置示例

创建配置文件config.yml:

server:
  http:
    listen_addr: ":9090"
    allowed_networks: ["127.0.0.1/32"]

users:
  - name: "web"
    password: "password123"
    to_cluster: "default"
    to_user: "default"

clusters:
  - name: "default"
    nodes: ["http://localhost:8123"]

启动chproxy

chproxy -config=config.yml

Golang集成示例

package main

import (
	"database/sql"
	"fmt"
	"log"
	"time"

	_ "github.com/ClickHouse/clickhouse-go"
)

func main() {
	// 连接到chproxy而不是直接连接ClickHouse
	connectStr := "tcp://localhost:9090?username=web&password=password123&database=default"
	
	db, err := sql.Open("clickhouse", connectStr)
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// 测试连接
	if err := db.Ping(); err != nil {
		log.Fatal(err)
	}

	// 执行查询
	rows, err := db.Query("SELECT name, value FROM system.settings LIMIT 5")
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	for rows.Next() {
		var (
			name  string
			value string
		)
		if err := rows.Scan(&name, &value); err != nil {
			log.Fatal(err)
		}
		fmt.Printf("name: %s, value: %s\n", name, value)
	}
}

高级配置示例

server:
  http:
    listen_addr: ":9090"
    read_timeout: 5m
    write_timeout: 10m

users:
  - name: "readonly"
    password: "read123"
    to_cluster: "cluster1"
    to_user: "default"
    max_concurrent_queries: 10
    max_execution_time: 30s
    requests_per_minute: 100
    
  - name: "admin"
    password: "admin123"
    to_cluster: "cluster1"
    to_user: "admin"
    allowed_networks: ["192.168.1.0/24"]

clusters:
  - name: "cluster1"
    nodes: [
      "http://ch-node1:8123",
      "http://ch-node2:8123",
      "http://ch-node3:8123"
    ]
    kill_query_user:
      name: "default"
      password: "kill123"
    heartbeat:
      interval: 1m
      timeout: 10s
      request: "/ping"
      response: "Ok.\n"

cache:
  mode: "file_system"
  dir: "/var/lib/chproxy/cache"
  max_size: 1GB
  expire: 1h

hack_me_please: false

监控指标

chproxy提供Prometheus格式的指标,可通过/metrics端点获取:

func scrapeMetrics() {
	resp, err := http.Get("http://localhost:9090/metrics")
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	
	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}

性能优化建议

  1. 合理设置连接池大小
  2. 为不同用户类型配置不同的并发限制
  3. 对大查询设置适当的超时时间
  4. 对频繁查询使用缓存
  5. 监控关键指标如查询延迟、错误率等

常见问题解决

  1. 连接被拒绝:检查chproxy和ClickHouse服务是否运行
  2. 认证失败:验证用户名/密码是否正确
  3. 查询超时:调整max_execution_time参数
  4. 并发限制:增加max_concurrent_queries

chproxy是管理ClickHouse访问的强大工具,特别适合多用户环境和需要精细控制查询的场景。通过合理配置可以显著提高ClickHouse集群的稳定性和安全性。

回到顶部