第4章 配置部署

4.1 DataViz配置

大数据计算引擎的配置位于后台应用 WEB-INF/conf/localdata.properties。主要包含3部分内容:

4.1.1 ClickHouse 设置

目前大数据计算引擎是一个用于大数据分析的列存储,使用单节点部署即可获得非常显著的加速效果,它本身也支持集群部署,大规模部署最高可支持PB级的秒级计算响应。(部署方法见第4章)

该部分配置是使用该功能必需填写的配置。以下是配置项说明:

  • clickhouse.address:服务器地址
  • clickhouse.port:服务器http端口,服务器默认配置端口为8123
  • clickhouse.userName:连接用户名,服务器默认用户为default
  • clickhouse.password:连接密码,服务器默认default用户密码为空
  • clickhouse.cluster:集群名称,ClickHouse集群使用时配置,单机使用时可以直接留空 ClickHouse 集群用于数据分片存储,以提高查询和插入性能。集群名称是在配置连接的ClickHouse服务器节点上配置的,在DataViz中配置的集群名称应在ClickHouse服务器上也有所配置,否则使用分片功能时会出现错误。

4.1.2 同步相关配置

在DataViz单机部署情况下,可以不调整使用默认配置。

  • dataSync.logKeep:数据同步日志保留天数
  • dataSync.loadThreads:数据同步每次同步的数据载入线程数,该值会影响同步时的内存占用及速度。考虑ClickHouse的性能,该值不宜设置过大。
  • dataSync.insertRows:数据同步时单次插入的数据行数。该行数会影响同步时DataViz的内存占用,过大可能出现内存不足,过小会影响ClickHouse插入性能。ClickHouse官方建议不要单次使用较小的插入行数。
  • dataSync.progressType:同步进度实现类型。DataViz单机时配置为simple,多机时应配置为zk
  • dataSync.locksType:同步锁类型。DataViz单机时配置为simple,多机时应配置为zk 当于DataViz集群中使用该功能时,需要同时部署Apache ZooKeeper支持集群下的协调。以下是ZooKeeper设置:
  • zk.addresses:zookeeper地址,使用<地址>:<端口>[,<地址>:<端口>,…] 形式
  • zk.timeout: 会话超时设置(单位:毫秒)

注:多机推荐使用ZooKeeper,ZooKeeper同时也是ClickHouse集群功能所需组件。如果不想使用ZooKeeper,可以自行开发DataSyncProgressManager及ExclusiveLocks的实现类扩展实现。

4.1.3 Quartz设置(可选)

Quartz 用于定时执行数据同步,此部分一般情况不需做任何设置。仅对特殊情况需要设置:

  • DataViz集群:需要配置 quartz.org.quartz.jobStore.isClustered=true

此处的设置均是直接设置到Quartz上,设置项如不满足可参考Quartz文档手动添加,只需在quartz标准配置项前额外添加 quartz. 前缀即可。(Quartz的jobstore.driverDelegateClass设置不需要添加,系统会根据数据源类型自动设置)

4.2 ClickHouse单机部署

4.2.1 部署要求

  1. CPU

    ClickHouse要求所运行的机器CPU支持SSE 4.2指令集,该指令集在2008年以后生产的电脑CPU均可以支持。

    如果不确定机器CPU是否支持,可以通过以下Linux命令查看:

    grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"
    
  2. 操作系统

    ClickHouse是由C++语言编写,本身并不能够跨平台部署。目前可以直接部署的操作系统为Ubuntu Linux,CentOS/RHEL及Gentoo。

    其他操作系统(包括Windows操作系统)需要使用Docker镜像部署。出于性能考虑不推荐使用。

  3. 其他 ClickHouse是一个高性能分析性列式存储数据库,它能够极大地利用系统资源完成大数据量的数据的分析,因此建议ClickHouse独立部署在DataViz应用服务器外的其他机器上,并通过局域网访问,以免影响DataViz应用及ClickHouse的运行性能。

4.2.2 单机安装

ClickHouse 包含服务端及原生客户端两个组件。服务端必须安装,客户端建议安装。

4.2.2.1 Ubuntu Linux

Ubuntu Linux为ClickHouse官方推荐使用的操作系统,其支持的版本为Ubuntu Precise (12.04) 以上x86_64版并使用UTF-8编码(默认编码),推荐使用较新的长期支持版Ubuntu Trusty(14.04), Ubuntu Xenial(16.04), Ubuntu Bionic(18.04,未测试)。

如果单机使用,建议在线使用ClickHouse官方软件源方式安装和更新以更方便地安装并获得最新的问题修复及特性支持。

4.2.2.1.1 在线安装
  1. 添加软件源

    于 /etc/apt/sources.list.d/ 下添加 clickhouse.list 文件,该文件包含以下内容:

    deb http://repo.yandex.ru/clickhouse/deb/stable/ main/
    
  2. 添加Key 执行以下命令: sudo apt-key adv –keyserver hkp://keyserver.ubuntu.com:80 --recv E0C56BD4 如果使用http代理连接,于上述命令中额外添加如下参数添加代理配置:--keyserver-options http-proxy=http://user:password@proxy-server-address:proxy-port

  3. Apt HTTP代理(可选) 如果使用http代理连接互联网,需要修改 /etc/apt/apt.conf

    Acquire::http::Proxy "http://user:password@proxy-server-address:proxy-port";
    Acquire::https::Proxy "http://user:password@proxy-server-address:proxy-port";
    
  4. 执行安装

    执行安装命令:

    sudo apt-get update

    sudo apt-get install clickhouse-client clickhouse-server

    安装完成后,随系统更新可以更新至最新版本

4.2.2.1.2 离线安装

如果需要集群部署则通常更适合离线下载后安装。可以从https://repo.yandex.ru/clickhouse/deb/stable/main/ 下载较新版本的 clickhouse-client,clickhouse-server,clickhouse-common-static deb安装包后,拷贝至系统中,使用 dpkg -i clickhouse-*执行安装。

4.2.2.2 CentOS/RHEL

CentOS/RHEL 系统推荐使用 ClickHouse服务供应商Alnity.com 提供的安装方式,支持EL6及EL7版本。

4.2.2.2.1 在线安装
  1. 安装packagecloud.io脚本

    确保curl已安装:sudo yum install -y curl

    安装脚本:

    curl -s https://packagecloud.io/install/repositories/altinity/clickhouse/script.rpm.sh | sudo bash

  2. 安装软件包 查看软件包: sudo yum list 'clickhouse*' 执行安装: sudo yum install -y clickhouse-server clickhouse-client 确认已安装: sudo yum list installed 'clickhouse*'

4.2.2.2.2 离线安装

访问 https://packagecloud.io/Altinity/clickhouse ,根据操作系统版本,下载所需ClickHouse版本的全部rpm包,然后拷贝到操纵系统下执行rpm -ivh安装。

4.2.2.3 Gentoo

emerge clickhouse

4.2.2.4 Docker镜像

启动服务:docker run -d --name some-clickhouse-server --ulimit nofile=262144:262144 yandex/clickhouse-server

使用客户端:docker run -it --rm --link some-clickhouse-server:clickhouse-server yandex/clickhouse-client --host clickhouse-server

4.2.3 服务启动

ClickHouse Server会被安装为系统服务 clickhouse-server,可以通过 service 或 systemctl 控制服务器状态:

  • 重启服务(2种均可):

    service clickhouse-server restart

    systemctl restart clickhouse-server

  • 服务器状态(2种均可):

    service clickhouse-server status

    systemctl status clickhouse-server

    服务器日志默认位于 /var/log/clickhouse-server/ 目录下。

4.2.4 客户端

如果安装了客户端,可以运行clickhouse-client运行原生命令行客户端。直接无参数运行clickhouse-client,会使用默认的default用户+空密码连接当前机器上的服务,连接后使用默认数据库(默认default)。

客户端的其他常用参数如下:

  • -d: 更改登录后的默认数据库

  • -h: 连接指定的主机

  • -u: 登录用户名

  • --password: 登录密码

  • -q: 执行一个SQL查询后退出

4.2.5 服务配置

4.2.5.1 配置文件说明

ClickHouse服务端配置文件位于 /etc/clickhouse-server/ 路径下,包含两个主要的配置文件,config.xml 和 users.xml。

config.xml 是服务全局设置。其中包含了一些默认配置,可以阅读其中注释了解其含义。对该文件内容的修改大多都需重启服务器才能生效。

users.xml包含了用户相关设置。包含3部分:profiles,quotas及users。所有的用户位于users 节点下,默认包含一个default用户和一个readonly用户。每个用户需要关联一个profile和一个quota,并可以设置密码和网络访问控制。profiles下每个profile是一组用户级的设置,系统包含一个默认default profile,更改profile中的设置不需要重启。

4.2.5.2 必需修改的设置

ClickHouse安装完成后,需要修改一项设置:默认配置只监听本地地址,可以本机使用 clickhouse-client 连接访问(默认用户为default,密码为空),需要修改config.xml以让其他机器连接访问到: <listen_host>::</listen_host>

4.2.5.3 建议的设置

  1. 建议设置ClickHouse数据存储目录使用独立的的磁盘或分区,便于优化性能。数据存储路径修改位于config.xml的 path 配置项(路径需要使用 / 结尾),需要通过chown将该目录的所有者改为clickhouse:clickhouse 以保证读写权限。

  2. 建议修改users.xml更改default用户密码,或修改default用户networks设置只允许特定机器访问,以防止了解ClickHouse地址后直接用默认用户名密码连接修改其内容。

  3. 资源选项参数,主要用于处理性能问题。建议使用默认的default profile,并在default profile中修改或添加(不需要重启):

    • max_memory_usage_for_all_queries

    全部查询最大使用内存值(以字节为单位),内存使用超过该值则查询会失败。可为设置为略小于物理内存值。

    当并发执行较多返回结果行数较大或一些需要较大内存的查询时,可能会使得ClickHouse内存溢出(无法获得足够的内存),并导致ClickHouse服务异常终止(但随后会自动启动,期间可能会有数十秒无法使用)。设置该值可有效减少此类情况的发生。(但出于未知原因不能100%避免)

    • max_memory_usage

    单个查询的最大内存使用量,如果查询占用内存超过该值,查询会以失败结束。可以结合并发量和当前物理内存设置。该值与下面的设置项相关。

    • max_bytes_before_external_group_by

    用于处理分组汇总结果行超大时的情况,通常汇总的结果不会太大时可以不用设置。该值为一个字节数,如果设置了该值,每当聚合计算中间处理结果的字节占用超过该值时,会将数据放到磁盘临时目录(tmp_path)上,以减少计算时的内存占用,避免内存不足导致内存不足或执行失败,但如此查询速度会出现明显下降。鉴于聚合计算的 2步骤的实现机制,如果设置该值,建议将该值设置为可承受的单次最大内存(max_memory_usage)的一半大小,因为聚合计算对中间结果做处理的第二步同样会占用相当的内存。

    • max_bytes_before_external_sort

    与上一项设置作用类似,用于处理排序占用内存过大的情况。每当读取到排序数据达到指定大小时,数据会被排序并写入磁盘,当读取完成后,再将磁盘排序数据合并输出。由于查询时除排序外还会有其他内存占用(视查询的内容不同不定),如果设置则该值必须要小于单次查询的最大内存(max_memory_usage)。

    排序在DataViz中使用较多,建议对该值进行设置。

    按照官网文档说明,对于单次查询场景,128G内存可设置max_memory_usage为100G, max_bytes_before_external_sort设置为80G。实际测试显示,单机8G物理内存,单次执行1.6亿行的数据集1个排序字段向后翻页查询8个字段数据,配置max_bytes_before_external_sort 为 3000000000 (3G)时,内存使用峰值为5.2GB,配置为 4000000000(4G)时,内存使用峰值为6.9GB。考虑实际运行时会同时运行多个查询,可选取设置为相对较低的值。

    该值也不要设置过低(如数K、数M),否则单次排序数量过少,最终合并内容过多,也会出现内存占用过多导致执行失败。

    • distributed_aggregation_memory_efficient

    可设置为0或1。当设置为1时在集群情况下可大幅减少Dataviz直连节点查询时的内存占用,非集群情况没有作用。集群部署可参看4.3部分说明。

4.2.5.4 其他设置

4.2.5.4.1 user.xml

DataViz 在某些用户查询选项较多的情况下会产生很长的SQL,此时可能会遇到在执行查询时 Clickhouse 报出类似查询过长的错误,此时可以添加如下设置到 user.xml 中当前使用的 profile下。

  • max_query_size:最大查询语句长度,默认值为256KiB(即256000),可设置为更大的数值(如*2)。

  • max_ast_elements:最大查询语法树元素数,默认值为50000,可以设置为更大的值(如*2)。

4.2.5.4.2 config.xml

以下是config.xml 中其他一些相对常用的可能会用到的配置(大多可以在配置文件中找到注释的配置),可视情况修改:

  • logger-level: 日志级别,默认为trace(最详细),可以修改为information或warn以减少存储日志记录。如果需要从 clickhouse.log中查看每次查询的内存使用情况,需要设置为trace或debug。

  • max_connections:最大连接数,默认4096。

  • max_concurrent_queries:最大并发查询数,默认100。

  • max_table_size_to_drop:默认的表drop保护,默认50G,达到该大小的表无法被直接drop删除。除非机器配置非常好,否则一般单表(数据集)达到50G(可能的数据量会在5-6亿行*100多列的数据量级)的数据量通常出于性能考虑会使用集群分片存储,不会达到限制。如果机器配置足够好且数据量较高,可能突破该限制,则需要禁用该保护,需要将该值设置为0。

  • max_partition_size_to_drop:与上一配置类似,但针对的是比表更低粒度的partition。可参考上一配置修改。

  • tmp_path:临时数据存储路径用来处理某些大数据量查询(以 / 结尾),参考建议设置中的max_bytes_before_external_group_by 设置说明。

  • http_port: http监听端口

  • tcp_port: tcp 监听端口(主要用于本地客户端及集群)

4.2.5.5 确认设置

对于users.xml profile中的修改设置,可以通过客户端连接后,执行SQL查询system.settings 表确认(查看已更改的设置):

  select * from system.settings where changed

该表包含了profile中所有的可配置项及说明,可以查询该表获取相关信息。

4.2.6 性能建议

通常情况在一个在合理硬件配置下单机运行的ClickHouse在面对相当数据量的计算时都能够达到相当不错的性能,当性能不能满足要求时,增强单机的配置(CPU升级、内存增加)或是进行横向扩展做集群都能够有较好的改善。

DataViz中的某些查询(主要是无聚合度量的列表查询)在数据量较大情况下对内存的需求会很高(如设置了排序),在内存充足时所有计算都是基于内存的,如果不够充足,在一些情况下会导致ClickHouse该类计算时性能有所下降(由于会进行基于磁盘的计算),某些查询在数据量过大时会直接导致计算无法完成,甚至ClickHouse服务崩溃重启,对于这类情况建议增大ClickHouse机器内存并修改内存相关配置,添加机器使用多机集群也会有一定改善。

其他ClickHouse官网提供的性能建议:

  1. ClickHouse能够最大程度利用系统资源,CPU核心数的增加相比CPU主频的提升对性能的改善更大。(即CPU核心数>CPU主频)
  2. 不要禁用CPU的超线程,它对一些查询有帮助。
  3. 建议CPU超频,对性能提升有帮助。
  4. 内存的提高能够让ClickHouse更多地使用缓存提高查询效率;对于数据压缩后超过200GB的大数据,建议提供足够大的内存(如128GB RAM)以缓存热数据。即使对于超过2TB的存储数据,128GB内存较64GB内存性能提升也很明显。
  5. 除非部署于个人笔记本上,否则建议禁用系统交换文件(swap file)。
  6. 禁用内核的透明大页内存(transparent huge pages),该选项会导致明显的性能下降。命令: echo 'never' | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
  7. 如果资金允许,可以使用SSD硬盘,否则7200rpm SATA硬盘也可以。
  8. 如果不使用SSD硬盘,可以使用RAID-10, RAID-5, RAID-6 或 RAID-50磁盘阵列。对于Linux系统推荐使用软件 RAID(mdadm),且不建议使用LVM。如果资金允许,建议使用RAID-10。如果拥有超过4块磁盘,建议使用RAID-6或RAID-50而不是RAID-5。当使用RAID-5, RAID-6 或 RAID-50时,建议增加stripe_cache_size。RAID块大小1025KB足够,不要过大或过小。启用长队列NCQ,对于HDD选择CFQ调度器,对于SSD使用noop。不要减少'readahead'设置,对于HDD启用写缓存。
  9. 文件系统建议使用 ext4, 并使用选项 noatime, nobarrier。
  10. 如果可以,至少使用10GB网络,1GB也应该可以。(主要是考虑集群情况)

4.3 ClickHouse集群部署

ClickHouse支持集群部署,集群可以提高大数据量下的计算性能,目前ClickHouse最大使用者(也是其开发者)使用了数百台机器组成的集群对PB级数据进行查询。

ClickHouse集群是一组服务节点的描述,它可以存在于任何一个节点上,一个节点上也可以有多个集群描述。集群以分片的形式保存分布式表(ClickHouse的一种表类型)中的数据。当客户端通过某个节点上的分布式表访问一个集群时,该节点会将查询分派到集群的各个节点上,待所有节点完成后汇总返回给客户端。(ClickHouse本身允许当前节点不在集群中,但目前DataViz中使用不支持。)

DataViz在配置ClickHouse集群时,需要配置到一个ClickHouse节点上,该节点上包含了一个集群的描述:集群名称+集群中所有节点的访问信息配置。(其他节点可不包含该描述)当集群节点发生变化时,需要在该节点上进行修改,集群配置的变更不需要重启ClickHouse服务。

ClickHouse集群支持replica分片复制和ReplicatedMergeTree表复制两种类型的数据复制保证数据可靠性,后者DataViz没有支持,而前者虽然可以直接在ClickHouse中配置出来,但考虑数据分析对数据可靠性要求不高,增加复制节点会增加部署成本,且该方法数据复制的正确性不能得到保证,因此本文不做说明。

img/12

图中为ClickHouse集群部署的大致结构,DataViz只与1个ClickHouse节点通信,ClickHouse节点间互相通信完成操作。图中还引入了Apache ZooKeeper,ZooKeeper在ClickHouse完成某些集群操作时是必需的,也需要同时部署。

4.3.1 集群安装与配置

ClickHouse集群部署需要在每个网络节点上安装一个ClickHouse服务,安装配置方法与上面单机方法相同。

安装完成后,需要在DataViz的连接的ClickHouse节点上配置集群信息,并将该信息同步到该集群的所有节点上去。(DataViz执行分布式DDL操作必需)

于 /etc/clickhouse-server/conf.d/ 位置创建配置文件clickhouse_remote_servers.xml。内容大致如下:

<yandex>
<remote_servers>
        <cluster_name_1>
            <shard>
                <weight>1</weight>
                <replica>
                    <host>node_address_1</host>
                    <port>9000</port>
                </replica>
            </shard>
            <shard>
                <weight>1</weight>
                <replica>
                    <host>node_address_2</host>
                    <port>9000</port>
                    <user>default</user>
                    <password>node_password_2</password>
                </replica>
            </shard>
        </cluster_name_1>
</remote_servers>
</yandex>

该配置创建了一个名字为 cluster_name_1的集群,其中包含两个节点,分别位于node_address_1 和node_address_2,且均使用默认的tcp端口9000,并被赋予了同样的权重1。

集群名字是需要配置到DataViz localdata.properties中的集群名。节点host地址可以使用IP地址也可以使用主机名。如果使用hosts解析的主机名,也应同时将对应的hosts文件内容发布到其他节点。用户可以在一个节点上配置任意多个集群及任意多个节点,但DataViz要求使用的集群中必需包含DataViz所连接的节点。

集群配置的更改不需要重新启动ClickHouse服务。修改完成后,可以通过客户端(clickhouse-client)执行SQL验证检查配置是否正确,该SQL会返回当前节点已生效的所有集群及节点:

select * from system.clusters

如果需要集群中节点规模较大,也可以在配置好zookeeper后,通过XML元素上配置from_zk="zookeeper路径" 属性的方式,将细节配置内容存储在zookeeper的一个路径下集中管理。

4.3.2 ZooKeeper

DataViz中使用ClickHouse集群需要同时部署Apache Zookeeper。ZooKeeper是一个分布式协调服务,主要存储一些少量的配置信息,在ClickHouse集群中用来协助分布式DDL执行及支持复制表。ZooKeeper是由Java编写,因此可以在任何支持Java的系统上运行(需要Java 1.6或以上)。

作为最低要求,ZooKeeper可以部署在网络上已有的任何一个机器上不必独占,如果需要高效可靠运行,可以独立集群部署(称作 ensemble),集群部署需要运行奇数个节点。

ClickHouse推荐使用较新版本的ZooKeeper (3.4.9以上),可以从Apache ZooKeeper网站下载。

4.3.2.1 ZooKeeper使用

ZooKeeper下载完成并解压后,bin目录下包含一个 zkServer 脚本用来控制服务,可以通过 zkServer.sh start (Windows 上为 zkServer start)启动服务,默认监听端口 2181。

ZooKeeper的配置文件位于 conf/zoo.cfg。建议修改/添加以下配置:

  • autopurge.snapRetainCount=10
  • autopurge.purgeInterval=1
  • dataDir:数据存储路径更改,不要在/tmp下
  • dataLogDir:日志存储路径

如果需要搭建ZooKeeper集群,则需要额外做2件事:

  1. 对于每个ZK节点,在 dataDir 下建立一个myid文件,文件内容只有1行,是一个1-255之间的数字,作为该节点的标识,集群中每个节点的数字标识不能重复。

  2. 在每个节点的 zoo.cfg 中,将集群中所有节点的信息添加进来,其格式为:server.id=host:port:port,每个节点占1行,id为该节点的数字标识,host为访问地址,两个port可以任意指定,不冲突即可。

4.3.2.2 ClickHouse配置

ZooKeeper 服务成功启动后,需要在每个ClickHouse服务节点添加ZooKeeper的配置信息。配置方法为在服务节点的 /etc/clickhouse-server/conf.d/ 目录下创建 zookeeper-servers.xml,其内容大致如下:

<yandex>
    <zookeeper>
      <node index="1">
        <host>10.4.53.220</host>
        <port>2181</port>
      </node>
    </zookeeper>
</yandex>

该配置配置了 10.4.53.220 节点的zookeeper,这里也可以配置多个node节点,这些节点应该属于同一个Zookeeper集群(ensemble)。

ZooKeeper配置更改完成后,需要在节点上重启服务生效。修改后也同样可以通过客户端(clickhouse-client) 执行SQL 验证该节点的配置是否生效:

  select * from system.zookeeper where path='/clickhouse'

如果能够正常执行出结果,则证明ZooKeeper配置成功。

4.3.3 验证

配置完成后,建议使用SQL进行一次验证以确认基本使用。可以使用客户端连接DataViz连接的ClickHouse节点,执行SQL:

  create table if not exists test on cluster <将使用的集群名> (id Int32) engine=MergeTree order by id

如果执行失败,则需要检查问题节点ZooKeeper、集群及hosts配置(如果使用主机名的话)。

results matching ""

    No results matching ""

    results matching ""

      No results matching ""