clickhouse集群搭建(1)

ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。可以用于PB级大数据实时分析,特点呢,就是快,比sparksql 和 impala还要快很多,同样也支持利用sql进行分析,相对于hadoop生态的那套,安装和学习成本要低很多

clickhouse中文文档
https://clickhouse.tech/docs/zh/
参考博客
https://www.jianshu.com/p/20639fdfdc99
https://www.jianshu.com/p/ae45e0aa2b52

  1. 创建clickhouse用户 (root用户执行)
useradd clickhouse -d /home/clickhouse
passwd clickhouse

1.png

2.上传安装包 (clickhouse用户执行)rz


2.png
  1. 添加sudo 权限(root用户执行)
    chmod u+w /etc/sudoers
    vim /etc/sudoers
    添加一行,保存并退出


    3.png

    chmod u-w /etc/sudoers

  2. 安装(clickhouse用户执行)
    cd /home/clickhouse
    sudo rpm –ivh *

4.png

5.启动服务
sudo service clickhouse-server start

6.clickhouse-client 命令直接连接执行 selet 1 验证

7.配置文件所在目录

6.png

8.users.xml 创建用户

8.png
  1. clickhouse-client连接参数
--host, -h -– 服务端的 host 名称, 默认是 ‘localhost’。 您可以选择使用 host 名称或者 IPv4 或 IPv6 地址。
--port – 连接的端口,默认值: 9000。注意 HTTP 接口以及 TCP 原生接口是使用不同端口的。
--user, -u – 用户名。 默认值: default。
--password – 密码。 默认值: 空字符串。
--query, -q – 非交互模式下的查询语句.
--database, -d – 默认当前操作的数据库. 默认值: 服务端默认的配置 (默认是 default)。
--multiline, -m – 如果指定,允许多行语句查询(Enter 仅代表换行,不代表查询语句完结)。
--multiquery, -n – 如果指定, 允许处理用逗号分隔的多个查询,只在非交互模式下生效。
--format, -f – 使用指定的默认格式输出结果。
--vertical, -E – 如果指定,默认情况下使用垂直格式输出结果。这与 ‘–format=Vertical’ 相同。在这种格式中,每个值都在单独的行上打印,这种方式对显示宽表很有帮助。
--time, -t – 如果指定,非交互模式下会打印查询执行的时间到 ‘stderr’ 中。
--stacktrace – 如果指定,如果出现异常,会打印堆栈跟踪信息。
--config-file – 配置文件的名称

10.创建数据库(命令行执行)

create database tclydcdb ENGINE = Ordinary;

11.表结构同步

第一步创建Mysql到CLickhouse的映射表插入1条数据,这里可以随表

CREATE TABLE Orders ENGINE = MergeTree ORDER BY OrderID AS SELECT * FROM mysql('$ip:$port', '$database', '$table', '$user', '$pwd') limit 1;

第二步查询创建的表结构复制下来
show create table Orders;
第三步删除表
drop table Orders;
第四步将第二步复制的表结构里的Decimal字段类型进行变更然后执行即可
第五步插入数据

insert into Orders SELECT * FROM mysql('$ip:$port', '$database', '$table', '$user', '$pwd');

=======================================
=====>单机完成,开始集群搭建 两机一备(无备份)=======================================

12.在两台机器的/etc/hosts 文件中添加域名映射(Ip 主机名 域名)

9.png

13.配置

/etc/clickhouse-server/config.xml

<?xml version="1.0"?>
<yandex>
   <!-- 日志 -->
   <logger>
       <level>trace</level>
       <log>/var/lib/clickhouse/log/server.log</log>
       <errorlog>/var/lib/clickhouse/log/error.log</errorlog>
       <size>1000M</size>
       <count>10</count>
   </logger>

   <!-- 端口 -->
   <http_port>8123</http_port>
   <tcp_port>9000</tcp_port>
   <interserver_http_port>9009</interserver_http_port>

   <!-- 本机域名 -->
   <interserver_http_host>tv1-xxxx-java-01.ab.elong.com</interserver_http_host>

   <!-- 监听IP -->
   <listen_host>0.0.0.0</listen_host>
   <!-- 最大连接数 -->
   <max_connections>64</max_connections>
   <keep_alive_timeout>3</keep_alive_timeout>

   <!-- 最大并发查询数 -->
   <max_concurrent_queries>16</max_concurrent_queries>

   <!-- 单位是B -->
   <uncompressed_cache_size>8589934592</uncompressed_cache_size>
   <mark_cache_size>10737418240</mark_cache_size>

   <!-- 存储路径 -->
   <path>/var/lib/clickhouse/</path>
   <tmp_path>/var/lib/clickhouse/tmp/</tmp_path>

   <!-- user配置 -->
   <users_config>users.xml</users_config>
   <default_profile>default</default_profile>

   <log_queries>1</log_queries>

   <default_database>default</default_database>

   <remote_servers incl="clickhouse_remote_servers" />
   <zookeeper incl="zookeeper-servers" optional="true" />
   <macros incl="macros" optional="true" />

 
   <builtin_dictionaries_reload_interval>3600</builtin_dictionaries_reload_interval>

   <!-- 控制大表的删除 -->
   <max_table_size_to_drop>0</max_table_size_to_drop>

   <include_from>/etc/clickhouse-server/metrika.xml</include_from>
</yandex>

/etc/clickhouse-server/metrika.xml

<yandex>

<!-- 集群配置 -->
<clickhouse_remote_servers>
    <ck_cluster>

        <!-- 数据分片1  -->
        <shard>
            <internal_replication>false</internal_replication>
            <replica>
                <host>tv1-xxxx-java-01.ab.elong.com</host>
                <port>9000</port>
                <user>xxxx</user>
                <password>xxxx</password>
            </replica>
        </shard>
        <!-- 数据分片2  -->

        <shard>
            <internal_replication>false</internal_replication>
            <replica>
                <host>tv1-xxxx-java-02.ab.elong.com</host>
                <port>9000</port>
                <user>xxxx</user>
                <password>xxxx</password>
            </replica>
        </shard>

    </ck_cluster>
</clickhouse_remote_servers>

<!—宏配置,相当于环境变量(这里先不用) -->
<!--<macros>
    <replica>ck1</replica>
</macros>-->
<networks>
   <ip>::/0</ip>
</networks>


<!-- 数据压缩算法  -->
<clickhouse_compression>
<case>
  <min_part_size>10000000000</min_part_size>
  <min_part_size_ratio>0.01</min_part_size_ratio>
  <method>lz4</method>
</case>
</clickhouse_compression>

</yandex>

14.将目录下的这三个配置sz下载下来,传到第二台机器上

10.png

15.clickhouse-client命令行select * from system.clusters ;查看集群

11.png

16.集群搭建成功
中间有一个小细节,配置好集群之后,再启动,报UNKNOWN
然后进/var/lib/clickhouse目录下发现少了log文件夹
用clickhouse用户创建即可

17.建分布式表,利用前面的步骤在每台机器上建好表之后,就可以建分布式表了

分布表(Distributed)本身不存储数据,相当于路由,需要指定集群名、数据库名、数据表名、分片KEY,这里分片用rand()函数,表示随机分片。查询分布表,会根据集群配置信息,路由到具体的数据表,再把结果进行合并。

CREATE TABLE orders_all AS orders ENGINE = Distributed(ck_cluster,tclydcdb, orders, rand())

18.验证
ck01插入5条数据

insert into Orders SELECT * FROM mysql('$ip:$port', '$database', '$table', '$user', '$pwd') limit 5 ;

ck02插入5条数据

insert into Orders SELECT * FROM mysql('$ip:$port', '$database', '$table', '$user', '$pwd') limit 5,10;

ck01执行查询


13.png
14.png

查分布式表得到全量数据,查本地orders表只得到了在本机的5条。

到此为止,一个简单的集群就搭建完成。但是,在生产环境的话,如果某一台机器挂掉了,整个集群就不可用了,某一个硬盘坏掉了,部分数据就没了。呵呵

下期,就是高可用集群的搭建(两机两备);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。