# 部署

  • 架构分为两个模块:
    • clickhouse-server :服务器。
    • clickhouse-client :客户端。

# 单实例

  • 用 docker-compose 部署:
    version: "3"
    
    services:
      clickhouse:
        container_name: clickhouse
        image: yandex/clickhouse-server:21.11
        restart: unless-stopped
        ports:
          - 8123:8123
          - 9000:9000
          - 9004:9004
        volumes:
          - /etc/localtime:/etc/localtime:ro
          - ./config:/etc/clickhouse-server
          - ./data:/var/lib/clickhouse
    
    • 需要调整挂载目录的权限:
      chown -R 101 .
      

# 客户端

  • ClickHouse 默认监听了多个端口,供不同类型的客户端访问:

    • 8123 :提供 HTTP API 。访问 /play 页面会显示一个 Web UI ,可执行命令。
    • 9000 :采用 TCP 协议,供 clickhouse 原生客户端访问。
    • 9004 :采用 TCP 协议,供 MySQL 客户端兼容访问。
  • 例:使用 HTTP API

    [root@CentOS]# curl 10.0.0.1:8123
    Ok.
    [root@CentOS]# curl '10.0.0.1:8123/?user=default&password=xxx' -d 'show databases'
    INFORMATION_SCHEMA
    default
    information_schema
    system
    
  • 例:使用原生客户端

    docker run -it --rm yandex/clickhouse-client:21.11
          # --host localhost
          # --port 9000
          # --user default
          # --password ''
          # --query ''
    
  • 例:使用 MySQL 客户端

    mysql -h 10.0.0.1 -P 9004 -u root -p
    

# 配置

  • 配置文件采用 XML 或 YAML 格式。
    • 根节点都是 <clickhouse>
  • config.xml 示例:
    <?xml version="1.0"?>
    <clickhouse>
        <http_port>8123</http_port>
        <tcp_port>9000</tcp_port>
        <mysql_port>9004</mysql_port>
        <listen_host>127.0.0.1</listen_host>  <!-- 默认只允许本机访问 -->
    </clickhouse>
    
  • users.xml 示例:
    <?xml version="1.0"?>
    <clickhouse>
        <!-- 定义用户 -->
        <users>
            <default>                     <!-- 用户名,默认为 default -->
                <password></password>     <!-- 明文密码,默认为空字符串 -->
    
                <!-- 是否允许通过 SQL 配置 ClickHouse 的用户、权限,默认为 0 -->
                <access_management>0</access_management>
    
                <!-- 允许登录的客户端地址,默认为任何地址 -->
                <networks>
                    <ip>::/0</ip>
                </networks>
    
                <profile>default</profile>
                <quota>default</quota>
            </default>
        </users>
    
        <!-- 定义一些配置,可被用户采用 -->
        <profiles>
            <default>
                <max_memory_usage>10000000000</max_memory_usage>
                <load_balancing>random</load_balancing>
            </default>
            <readonly>
                <readonly>1</readonly>
            </readonly>
        </profiles>
    
        <!-- 定义一些配额,可被用户采用 -->
        <quotas>
            <default>
                <interval>
                    <!-- 限制用户在 duration 时间内,消耗的 queries 等资源数量,取值为 0 则不限制 -->
                    <duration>3600</duration>
                    <queries>0</queries>
                    <errors>0</errors>
                    <result_rows>0</result_rows>
                    <read_rows>0</read_rows>
                    <execution_time>0</execution_time>
                </interval>
            </default>
        </quotas>
    </clickhouse>
    
  • 创建管理员用户的步骤:
    1. 在 users.xml 中修改 default 用户的配置,然后重启 ClickHouse 。
      <access_management>1</access_management>
      <networks>
          <ip>127.0.0.1</ip>
      </networks>
      
    2. 用 default 用户登录 ClickHouse ,创建管理员用户:
      CREATE USER root@'%' IDENTIFIED WITH PLAINTEXT_PASSWORD BY '******'
      GRANT ALL ON *.* TO root WITH GRANT OPTION
      

# 集群

  • ClickHouse 支持部署多个 server 实例,组成集群。
    • 可以连接到 zookeeper ,保证分布式一致性。
  • config.xml 中集群的配置示例:
    <remote_servers>
        <cluster1>          <!-- 集群名 -->
            <shard>         <!-- 一个分片 -->
                <replica>   <!-- 该分片中的一个副本 -->
                    <host>10.0.0.1</host>
                    <port>9000</port>
                </replica>
                 <weight>1</weight>    <!-- 该分片存储新数据的权重,默认为 1 -->
            </shard>
            <shard>
                <replica>
                    <host>10.0.0.2</host>
                    <port>9000</port>
                </replica>
            </shard>
        </cluster1>
    </remote_servers>
    
    • 集群中可以划分多个分片,分别存储不同的数据。
    • 每个分片可以包含多个副本实例,存储相同的数据。