参考官方文档及一些网上文章整理的搭建步骤,能建起来但未实际用于过生产环境,请谨慎用于生产环境。
一、 操作系统设置
| 编号 | 需求项 | 操作环境 | 需求细节内容 | 说明 | 分配主机 | 1 | 操作系统要求 | ch01,ch02,ch03 | linux版本:CentOS 7
如果使用VMWare,则关闭vmware的overcommit | update版本选择为最新版本的上一个版本,如最新版本为CentOS 7.3,则安装选择CentOS 7.2。
clickhouse只放在专用的clickhouse数据库主机上,不与类型数据库或应用软件混用,生产环境也不建议与zookeeper服务器混用。 | 2 | 文件系统要求 | ch01,ch02,ch03 | 建议为EXT4 | 1. Ext4 是最可靠的选择,设置选项noatime 2. 应避免使用 XFS,它工作得很好,但有一些关于性能较低的报告 3. 大多数其他文件系统也应该可以正常工作 4. 不要使用压缩文件系统,ClickHouse 可以自行压缩并且效果更好 5. 不推荐使用加密文件系统,在ClickHouse 中使用内置加密更好
https://clickhouse.com/docs/en/operations/tips/ | 3 | CPU要求 | ch01,ch02,ch03 | 1. 使用支持SSE4.2指令集的x86_64架构的CPU grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported" SSE 4.2 supported
2. 建议使用 睿频加速 和 超线程 技术 | ClickHouse在具有大量计算核、时钟频率稍低的平台上比计算核少、时钟频率高的平台上效率更高。例如,ClickHouse在16核 2.6GHz的CPU上运行速度高于8核 3.6GHz的CPU。
https://clickhouse.com/docs/zh/operations/requirements/ | 4 | 内存要求 | ch01,ch02,ch03 | 建议32G以上 | 1. 如果内存少于16 GB,可能会遇到各种内存异常,因为默认设置与此内存不匹配。 2. 对于少量数据(压缩后小于200 GB),最好使用与数据量一样多的内存。 3. 对于大量数据及在处理交互式查询时,应该使用合理的内存(128G或更多)。
https://clickhouse.com/docs/en/operations/tips/ | 5 | SWAP要求 | ch01,ch02,ch03 | 生产环境禁用swap file | https://clickhouse.com/docs/en/operations/requirements/ | 6 | 建卷要求 | ch01,ch02,ch03 | 1. 单独挂载数据卷:/data 2. clickhouse软件要求至少2G可用空间,数据空间根据实际确定 3. 建议使用 SSD,如果没有,7200转SATA硬盘也可以 | https://clickhouse.com/docs/zh/operations/requirements/ https://clickhouse.com/docs/en/operations/tips/ | 7 | 关闭文件系统/分区的atime选项 | ch01,ch02,ch03 | cat /etc/fstab,看到对应的分区是noatime ,nodiratime | vi /etc/fstab # 改为 /dev/vg-data/lv-data /data xfs defaults,noatime,nodiratime 0 0
重启后生效
https://clickhouse.com/docs/en/operations/tips/ | 8 | 关闭透明大页 | ch01,ch02,ch03 | cat /sys/kernel/mm/transparent_hugepage/enabled 应该看到[never]
如果这个文件不存在,则检查 cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
如果2个文件都不存在,那么就是在系统内核中移除了THP。 | 设置方法: echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag #永久追加never到以上文件中 echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.d/rc.local echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local | 9 | 禁用SELinux | ch01,ch02,ch03 | 当前生效: setenforce 0 重启后生效: vi /etc/selinux/config SELINUX=disabled | | 10 | 设置/etc/hosts | ch01,ch02,ch03 | 加入各clickhouse与zookeeper节点信息
vi /etc/hosts
192.168.13.81??? ch01 192.168.13.82??? ch02 192.168.13.83??? ch03 192.168.13.100??? zk01 192.168.13.119??? zk02 192.168.13.120??? zk03 | | 11 | NTP时间同步 | ch01,ch02,ch03 | crontab -e * * * * * /usr/sbin/ntpdate 192.168.0.11 | | 12 | 调整limit设置 | ch01,ch02,ch03 | vi /etc/security/limits.conf
clickhouse soft nproc 2047 clickhouse hard nproc 16384 clickhouse soft nofile 1024 clickhouse hard nofile 65536 | | 防火墙实施 | 12 | 网络防火墙要求 | ch01,ch02,ch03 | clickhouse间双向开通8123,9000端口 | | zookeeper到clickhouse单向开通8123,9000端口 | | clickhouse到zookeeper单向开通2181端口 | | 13 | 本地防火墙要求 | ch01,ch02,ch03 | 关闭并禁用本地防火墙 systemctl stop firewalld systemctl disable firewalld | | 网络规划 | 14 | IP要求 | ch01,ch02,ch03 | 各zookeeper与clickhouse服务器尽量在相同网段 | | 网络要求 | 如果可能的话,请使用10G或更高级别的网络。 | https://clickhouse.com/docs/zh/operations/requirements/ |
二、?软件安装
编号 | 需求项 | 操作环境 | 需求细节内容 | 说明 | 1 | 下载rpm包 | ch01,ch02,ch03 | 下载以下4个rpm包,并上传至服务器目录
clickhouse-client-21.8.14.5-2.noarch.rpm?????? clickhouse-common-static-21.8.14.5-2.x86_64.rpm clickhouse-server-21.8.14.5-2.noarch.rpm?????? clickhouse-server-common-19.4.0-2.noarch.rpm?? | https://repo.yandex.ru/clickhouse/rpm/stable/x86_64/ | 2 | 安装rpm包 | ch01,ch02,ch03 | rpm -ivh clickhouse*
期间会要求输入default用户密码 Enter password for default user: | 应该看到输出 ClickHouse has been successfully installed. | 3 | 创建clickhouse目录 | ch01,ch02,ch03 | mkdir -p /data/prd/clickhouse/21.8.14/ch9000/log mkdir -p /data/prd/clickhouse/21.8.14/ch9000/data mkdir -p /data/prd/clickhouse/21.8.14/ch9000/tmp
chown -R clickhouse.clickhouse /data | mkdir -p /data/<prd>/clickhouse/<db_version_3_digit>/ch<port>/data | 4 | 修改配置文件 | ch01,ch02,ch03 | vi /etc/clickhouse-server/config.xml
# 修改以下参数 <level>warning</level> <log>/data/prd/clickhouse/21.8.14/ch9000/log/clickhouse-server.log</log> <errorlog>/data/prd/clickhouse/21.8.14/ch9000/log/clickhouse-server.err.log</errorlog>
<!-- Path to data directory, with trailing slash. --> <path>/data/prd/clickhouse/21.8.14/ch9000/data/</path>
<!-- Path to temporary data for processing hard queries. --> <tmp_path>/data/prd/clickhouse/21.8.14/ch9000/tmp/</tmp_path>
<listen_host>::</listen_host>
<interserver_http_host>IBG-ClickHouse-DB-CWP01</interserver_http_host> | <level>:日志等级 <log>:clickhouse日志文件路径 <errorlog>:错误日志文件路径 <path>:数据文件路径 <tmp_path>:tmp文件路径 <listen_host>:允许外部机器连接 <interserver_http_host>:其他主机通过什么名字访问该主机,不设置默认为hostname -f命令的执行结果 | 5 | 启动并enable clickhouse服务 | ch01,ch02,ch03 | systemctl start clickhouse-server systemctl enable clickhouse-server | | 6 | 连接测试 | ch01,ch02,ch03 | clickhouse-client --password | 至此单节点clickhouse创建完成 |
三、?zookeeper创建
| 编号 | 需求项 | 操作环境 | 需求细节内容 | 说明 | 安装java环境 | 1 | 下载java安装包 | zk01,zk02,zk03 | 可以从Oracle官网或GitHub下载 https://www.oracle.com/java/technologies/downloads https://github.com/AdoptOpenJDK/openjdk8-binaries/releases | 使用java 1.8版本,若操作系统已有则跳过 | 2 | 解压及软链接 | zk01,zk02,zk03 | tar -zxvf jdk-8u311-linux-x64.tar.gz -C /usr/local/ ln -s /usr/local/jdk1.8.0_311 /usr/local/java | 3 | 设置java环境变量 | zk01,zk02,zk03 | vim /etc/profile export JAVA_HOME=/usr/local/java export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH
source /etc/profile | 4 | 查看版本 | zk01,zk02,zk03 | java -version | 安装zookeeper | 1 | 设置/etc/hosts | zk01,zk02,zk03 | 加入各zookeeper节点信息
vi /etc/hosts
192.168.13.100??? zk01 192.168.13.119??? zk02 192.168.13.120??? zk03 | | 2 | 下载zookeeper安装包 | zk01,zk02,zk03 | https://zookeeper.apache.org/releases.html | 使用3.5.9版本 | 3 | 创建目录 | zk01,zk02,zk03 | mkdir -p? /data/app/deploy mkdir -p? /data/app/data/zookeeper/data mkdir -p /data/app/data/zookeeper/logs | | 4 | 解压及软链接 | zk01,zk02,zk03 | cd /data/app/deploy tar -zxf apache-zookeeper-3.5.9-bin.tar.gz ln -snf apache-zookeeper-3.5.9-bin zookeeper | | 5 | 配置环境变量 | zk01,zk02,zk03 | vim /etc/profile export ZOOKEEPER_HOME=/data/app/deploy/zookeeper export PATH=$PATH:$ZOOKEEPER_HOME/bin
source /etc/profile | | 配置zookeeper | 1 | 添加配置文件 | zk01,zk02,zk03 |
cd /data/app/deploy/zookeeper/conf vi zoo.cfg
注意添加zookeeper集群信息 server.1=192.168.13.100:2888:3888 server.2=192.168.13.119:2888:3888 server.3=192.168.13.120:2888:3888 |
| https://clickhouse.com/docs/en/operations/tips/ | 2 | 配置myid | zk01,zk02,zk03 | echo 1 > /data/app/data/zookeeper/data/myid? # 节点1 echo 2 > /data/app/data/zookeeper/data/myid? # 节点2 echo 3 > /data/app/data/zookeeper/data/myid? # 节点3 | 各节点myid必须不同 | 3 | 配置zookeeper日志 | zk01,zk02,zk03 | vi zookeeper-env.sh #!/usr/bin/env bash
#tip:custom configurationfile,do not amend the zkEnv.sh file #chang the log dir and output of rolling file ZOO_LOG_DIR=/data/app/logs/zookeeper ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
chmod 755 zookeeper-env.sh | | 4 | 修改日志输入形式 | zk01,zk02,zk03 | vi log4j.properties
zookeeper.root.logger=INFO, ROLLINGFILE #zookeeper.root.logger=INFO, CONSOLE
# Max log file size of 10MB log4j.appender.ROLLINGFILE.MaxFileSize=128MB # uncomment the next line to limit number of backup files log4j.appender.ROLLINGFILE.MaxBackupIndex=10 | 默认zk日志输出到一个文件,且不会自动清理,一段时间后zk日志会非常大 | 5 | 配置运行zookeeper的JVM | zk01,zk02,zk03 | vi java.env
#!/usr/bin/env bash ? #config the jvm parameter in a reasonable,note that shell be source so that do not need to use export #set classpath,here do not set #export CLASSPATH="" #set jvm start parameter , also can set JVMFLAGS variable SERVER_JVMFLAGS="-Xmx1G -Xms1G -Djute.maxbuffer=8388608 \ ??? -verbose:gc -XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps \ ??? -Xloggc:/data/app/logs/zookeeper/zookeeper-gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=16 -XX:GCLogFileSize=16M ??? -XX:MaxGCPauseMillis=50"
chmod 755 java.env | | 6 | 启动zookeeper服务 | zk01,zk02,zk03 | ./bin/zkServer.sh start | | 7 | 配置为系统服务 | zk01,zk02,zk03 | vi /usr/lib/systemd/system/zookeeper.service
[Unit] Description=Zookeeper Service unit Configuration After=network.target ? [Service] Type=forking Environment=JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk ExecStart=/data/app/deploy/zookeeper/bin/zkServer.sh start ExecStop=/data/app/deploy/zookeeper/bin/zkServer.sh stop PIDFile=/data/app/deploy/zookeeper/zookeeper_server.pid KillMode=none User=dji Group=dji Restart=on-failure [Install] WantedBy=multi-user.target | | 8 | 启动并enable服务 | zk01,zk02,zk03 | systemctl start zookeeper systemctl enable zookeeper | |
五、?集群配置
需求项 | 操作环境 | 需求细节内容 | 说明 | 配置集群信息 | ch01,ch02,ch03 | ??? <remote_servers> ??????? <!-- Test only shard config for testing distributed storage --> ??????? <ads_cluster> ? ??????????<shard> ??????????????? <!-- 数据自动同步 --> ??? ????????????<internal_replication>true</internal_replication> ??????????????? <replica> ??????????????????? <host>ch01</host> ??????????????????? <port>9000</port> ??????????????? </replica> ??????????????? <replica> ??????????????????? <host>ch02</host> ??????????????????? <port>9000</port> ??????????????? </replica> ??????????????? <replica> ??????????????????? <host>ch03</host> ??????????????????? <port>9000</port> ??????????????? </replica> ??????????? </shard> ??????? </ads_cluster> ??? </remote_servers> | <ads_cluster>:集群名,根据实际自行修改 <shard>:分片配置,有几个分片放几对标签,1对标签等于不分片 <replica>:副本配置,有几个副本放几对标签,1对标签等于没有副本 <internal_replication>:是否只将数据写入其中一个副本。默认为false,表示写入所有副本,在复制表的情况下可能会导致重复和不一致,所以要改为true | 配置zookeeper信息 | ch01,ch02,ch03 | ??? <zookeeper> ??????? <node> ??????????? <host>zk01</host> ??????????? <port>2181</port> ??????? </node> ??????? <node> ??????????? <host>zk02</host> ??????????? <port>2181</port> ??????? </node> ??????? <node> ??????????? <host>zk03</host> ??????????? <port>2181</port> ??????? </node> ??? </zookeeper> | 有几个zookeeper节点配几个 | 复制表的参数替换 | ch01,ch02,ch03 | ??? <macros incl="macros" optional="true" /> ??? <macros> ??????? <shard>01</shard> ??????? <replica>replica01</replica> ??? </macros> | 用于创建带副本、分片参数信息的表 如有分片和复制,各节点需要对应修改标签中的值 | 建库测试 | 任意ch节点 | create database hydb on cluster ads_cluster; | CREATE DATABASE hydb ON CLUSTER ads_cluster
Query id: f74e9584-30f6-4657-9562-cc8ba8200675
┌─host────────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ │ ch01 │ 9000 │????? 0 │?????? │?????????????????? 2 │??????????????? 0 │ │ ch02 │ 9000 │????? 0 │?????? │?????????????????? 1 │??????????????? 0 │ │ ch03 │ 9000 │????? 0 │?????? │?????????????????? 0 │??????????????? 0 │ └─────────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
3 rows in set. Elapsed: 0.126 sec. | 建表测试(不带参数) | ch01,ch02,ch03 | CREATE TABLE hydb.hytest(EventDate DateTime,CounterID UInt32,UserID UInt32) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01/hytest','replica01')PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID))SETTINGS index_granularity = 8192;
CREATE TABLE hydb.hytest(EventDate DateTime,CounterID UInt32,UserID UInt32) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01/hytest','replica02')PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID))SETTINGS index_granularity = 8192;
CREATE TABLE hydb.hytest(EventDate DateTime,CounterID UInt32,UserID UInt32) ENGINE = ReplicatedMergeTree('/clickhouse/tables/01/hytest','replica03')PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID))SETTINGS index_granularity = 8192; | | 插入与查询 | 任意ch节点 | insert into hydb.hytest VALUES (now(), 10000, 10000);
select * from hydb.hytest; | 每个节点均可执行insert,且插入的数据应该在所有节点都能看到 | 建表测试(带参数) | 任意ch节点 | CREATE TABLE hydb.events_local ON CLUSTER ads_cluster (ts_date Date,user_id Int64) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/events_local','{replica}') PARTITION BY ts_date ORDER BY (ts_date); | CREATE TABLE hydb.events_local ON CLUSTER ads_cluster ( ??? `ts_date` Date, ??? `user_id` Int64 ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/events_local', '{replica}') PARTITION BY ts_date ORDER BY ts_date
Query id: 6a06df3a-2b9a-4e2e-b473-614c6d858fd4
┌─host────────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ │ ch01 │ 9000 │????? 0 │?????? │?????????????????? 2 │??????????????? 0 │ │ ch02 │ 9000 │????? 0 │?????? │?????????????????? 1 │??????????????? 0 │ │ ch03 │ 9000 │????? 0 │?????? │?????????????????? 0 │??????????????? 0 │ └─────────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
3 rows in set. Elapsed: 0.114 sec.? | 插入与查询 | 任意ch节点 | insert into hydb.hytest VALUES (now(), 10000, 10000);
select * from hydb.hytest; | 每个节点均可执行insert,且插入的数据应该在所有节点都能看到 |
七、?新建用户
需求项 | 命名规则 | 权限 | 操作目录 | 备注 | DBA用户 | default | 所有权限 | vi user.xml # 修改 <access_management>1</access_management> | 启用RBAC权限控制,可通过SQL执行创建/删除用户、角色及授权等操作 | 业务读写用户 | 业务名_rw | 业务DB所有权限(待定) | CREATE USER ads_rw@'%' IDENTIFIED BY 'xxxxx' ON CLUSTER ads_cluster; GRANT all ON ads_db.* TO ads_rw ON CLUSTER ads_cluster; | | 业务只读用户 | 业务名_r | 业务DB只读权限 | CREATE USER ads_r@'%' IDENTIFIED BY 'xxxxx' ON CLUSTER ads_cluster; GRANT SELECT ON ads_db.* TO ads_r ON CLUSTER ads_cluster; | |
八、?主要参数设置
序号 | 参数 | 参数说明 | 默认值 | 建议值 | 备注 | 0 | config.xml(前面已提及的参数不再重复解释) | 1 | max_connections | 最大连接数 | 4096 | 4096 | 参考阿里云ClickHouse设置 | 2 | max_server_memory_usage | ClickHouse 最大可用内存 | 0(Auto) | | 默认大小=内存大小 * max_server_memory_usage_to_ram_ratio
如果设置值大于计算值,会被减少至计算值 | 3 | max_server_memory_usage_to_ram_ratio | ClickHouse可用内存占总内存的比例 | 0.9 | | 设为0表示可用所有服务器内存 | 4 | max_concurrent_queries | 同时可处理的MergeTree相关表最大请求数 | 100 | 100 | 0表示不限制,参考阿里云ClickHouse设置 | 5 | max_concurrent_insert_queries | 同时处理的最大INSERT数 | 0 | 0 | 0表示不限制 | 6 | max_concurrent_select_queries | 同时处理的最大SELECT数 | 0 | 0 | 0表示不限制 | 7 | max_concurrent_queries_for_user | 每个用户同时可处理的MergeTree相关表最大请求数 | 0 | 0 | 0表示不限制 | 8 | max_table_size_to_drop | 如果MergeTree表的大小超过max_table_size_to_drop(以字节为单位),则无法使用 DROP 将其删除 | 50GB | 0 | 0表示不限制 | 9 | max_partition_size_to_drop | 如果MergeTree分区的大小超过max_partition_size_to_drop(以字节为单位),则无法使用DROP将其删除 | 50GB | 0 | 0表示不限制 | 10 | query_log | 结合log_queries=1,记录执行的语句 | log_queries=0 | | 审计需求,注意日志大小及性能影响。一般建成带TTL属性的表,自动清理数据 | 12 | keep_alive_timeout | ClickHouse在关闭连接之前等待传入请求的秒数 | 3 | 300 | 参考阿里云ClickHouse设置 | | | | | | | 参考: config.xml??? https://clickhouse.com/docs/en/operations/server-configuration-parameters/settings/ user.xml?????? https://clickhouse.com/docs/en/operations/settings/settings-profiles/ |
|