Установка chproxy

chproxy - это http-прокси и балансировщик нагрузки для базы данных ClickHouse, реализованный на go.

Основные возможности:
- индивидуальная маршрутизация и кэширование ответов;
- гибкие ограничения;
- автоматическое продление SSL сертификатов.

Официальная документация

Готовим конфигурацию

Создаем файл /etc/chproxy/config.yml

log_debug: true
hack_me_please: true

server:
  http:
      listen_addr: "10.55.126.27:9090"

users:
  - name: "report"
    password: "gxuDczvNWMQZS0Bwa9Q7JEnDUN6y"
    to_cluster: "ch"
    to_user: "default"
    max_concurrent_queries: 1000
    max_execution_time: 10m

clusters:
  - name: "ch"
    nodes: [
      "10.55.126.3:8123",
      "10.55.126.4:8123",
      "10.55.126.5:8123"
    ]

    users:
      - name: "default"
        password: ""

Запуск и проверка

chproxy -config=/etc/chproxy/config.yml &
echo 'select * from logs;' | curl 'http://10.55.126.27:9090/?user=report&password=gxuDczvNWMQZS0Bwa9Q7JEnDUN6y&database=cloud_audit' --data-binary @-

Перемонтируем jdbc

Меняем точку входа jdbc_connection_string из прямого подключения к clickhouse на chproxy в файле etc/logstash/pipelines/clickhouse-get.conf и параметры подключения (jdbc_user и jdbc_password).

cat /
input {
  jdbc {
    #jdbc_driver_library => "/usr/share/logstash/logstash-core/lib/jars/clickhouse-jdbc-0.4.0.jar"
    jdbc_driver_library => "/usr/share/logstash/logstash-core/lib/jars/clickhouse-jdbc-0.4.0.jar"
    jdbc_driver_class => "com.clickhouse.jdbc.ClickHouseDriver"
    #jdbc_connection_string => "jdbc:clickhouse://10.55.126.3:8123/cloud_audit"
    jdbc_connection_string => "jdbc:clickhouse://10.55.126.27:9090/cloud_audit"
    #jdbc_user => "grafana"
    #jdbc_password => "Grafana_Pass"
    jdbc_user => "report"
    jdbc_password => "gxuDczvNWMQZS0Bwa9Q7JEnDUN6y"
    schedule => "* * * * *"
    #statement_filepath => "/etc/logstash/from-scratch.sql"
    statement => "select timestamp,source,event.value from logs WHERE timestamp > :sql_last_value ORDER BY timestamp"
    tracking_column => "timestamp"
    use_column_value => true
  }
}

filter {
    mutate {
        rename => ["timestamp", "update_time" ]
    }
}

output {
  # stdout { codec => rubydebug { metadata => true } }
  #file {
  #  path => "/tmp/logstash_out.log"
  #}

  elasticsearch {
    hosts => ["http://10.55.126.27:9200"]
    manage_template => false
    index => "main_vk3-%{+YYYY.MM.dd}"
    ilm_rollover_alias => "main_vk3_clickhouse"
    ilm_pattern => "000001"
    ilm_policy => "main_vk3_clickhouse"
    ssl => false
    cacert => '/etc/opensearch/tls/client.pem'
    ssl_certificate_verification => false
    user => "admin"
    password => "ES_Seret_pass"
  }

}

Создаем юнит-файл

[Unit]
Description=ClickHouse Proxy Load Balancer
After=network.target

[Service]
ExecStart=/usr/local/bin/chproxy -config=/etc/chproxy/config.yml
Restart=always
#SuccessExitStatus=143
Type=simple

[Install]
WantedBy=multi-user.target
Запускаем сервис

pkill chproxy
systemctl daemon-reload
systemctl start chproxy
EOF