文章目录
安装clickhouse
本次用了4台服务器搭建clickhouse集群,使用rpm安装方式在4台服务器上安装clickhouse,步骤如下:
- sudo yum install -y curl
- curl -s https://packagecloud.io/install/repositories/altinity/clickhouse/script.rpm.sh | sudo bash
- sudo yum install -y clickhouse-server clickhouse-client
rpm安装后,会在服务器上生成如下几个文件:
默认的配置文件,对我们的管理是个隐患,建议把配置文件、数据目录、临时目录、日志文件,统一放在某个地方,即:
修改默认的shell脚本,修改默认配置文件的位置,即上面的start_.sh 修改前的启动脚本在/etc/init.d中,复制clickhouse-server文件更改即可
修改集群配置文件
集群配置文件在/etc/clickhouse-server文件夹下
- 修改基本配置文件config.xml,修改如下:
<?xml version="1.0"?>
<yandex>
<!-- 日志 -->
<logger>
<level>trace</level>
<log>/opt/clickhouse/log/server.log</log>
<errorlog>/opt/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>192.168.254.14</interserver_http_host>
<!-- 监听ip -->
<listen_host>::</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>5368709120</mark_cache_size>
<!-- 存储路径 -->
<path>/opt/clickhouse/</path>
<tmp_path>/opt/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>
<!-- Maximum session timeout, in seconds. Default: 3600. -->
<max_session_timeout>3600</max_session_timeout>
<!-- Default session timeout, in seconds. Default: 60. -->
<default_session_timeout>60</default_session_timeout>
<!-- 控制大表的删除 -->
<max_table_size_to_drop>0</max_table_size_to_drop>
<include_from>/opt/clickhouse/metrika.xml</include_from>
</yandex>
注意:需在文件里加上include_from,这个指向了clickhouse集群的配置
- 创建clickhouse集群的配置:metrika.xml
<?xml version="1.0"?>
<yandex>
<!-- 集群配置 -->
<clickhouse_remote_servers>
<dgg_ck_cluster>
<!-- 数据分片1 -->
<shard>
<weight>1</weight>
<internal_replication>true</internal_replication>
<replica>
<host>slave2</host>
<port>9000</port>
<user>default</user>
<password>m8yjvWQ+</password>
</replica>
<replica>
<host>slave3</host>
<port>9000</port>
<user>default</user>
<password>m8yjvWQ+</password>
</replica>
</shard>
<!-- 数据分片2 -->
<shard>
<weight>1</weight>
<internal_replication>true</internal_replication>
<replica>
<host>slave4</host>
<port>9000</port>
<user>default</user>
<password>m8yjvWQ+</password>
</replica>
<replica>
<host>slave5</host>
<port>9000</port>
<user>default</user>
<password>m8yjvWQ+</password>
</replica>
</shard>
</dgg_ck_cluster>
</clickhouse_remote_servers>
<macros>
<shard>01</shard>
<replica>01</replica>
</macros>
<!-- ZK -->
<zookeeper-servers>
<node index="1">
<host>slave2</host>
<port>2181</port>
</node>
<node index="2">
<host>slave3</host>
<port>2181</port>
</node>
<node index="3">
<host>slave4</host>
<port>2181</port>
</node>
</zookeeper-servers>
<!-- 数据压缩算法 -->
<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>
解释如下:
dgg_ck_cluster是集群名,可以任意配置
whight是权重,代表数据有多大几率落入此分片,因为这里所有的概率都相同所以都设置为1
internal_replication表示是否将数据只写入一个副本,默认为false,在复制表的时候可能会导致重复和不一致。设置为true,表示数据只写入一个副本,其他的交给zk和集群自己复制
replica是副本,里面的user和password可以不要,如果改了default的密码就必须要加上,默认查询走的是default
shard是数据分片,可以有多个分片
macros是别名,每台服务器上都不一样,就相当于给服务器取了一个编号
zk是zookeeper的配置
- 修改user.xml
<?xml version="1.0"?>
<yandex>
<!-- Profiles of settings. -->
<profiles>
<!-- 读写用户设置 -->
<default>
<max_memory_usage>10000000000</max_memory_usage>
<use_uncompressed_cache>0</use_uncompressed_cache>
<load_balancing>random</load_balancing>
</default>
<!-- 只写用户设置 -->
<readonly>
<max_memory_usage>10000000000</max_memory_usage>
<use_uncompressed_cache>0</use_uncompressed_cache>
<load_balancing>random</load_balancing>
<readonly>1</readonly>
</readonly>
</profiles>
<!-- 配额 -->
<quotas>
<!-- Name of quota. -->
<default>
<interval>
<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>
<users>
<!-- 读写用户 -->
<default>
<password_sha256_hex>29c957adeb44605c0d378acc260ead6ebc08f632679d166752de99159be8da6e</password_sha256_hex>
<networks incl="networks" replace="replace">
<ip>::/0</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
</default>
<!-- 只读用户,可以不添加 -->
<ck>
<password_sha256_hex>29c957adeb44605c0d378acc260ead6ebc08f632679d166752de99159be8da6e</password_sha256_hex>
<networks incl="networks" replace="replace">
<ip>::/0</ip>
</networks>
<profile>readonly</profile>
<quota>default</quota>
</ck>
</users>
</yandex>
注意:密码有2种,一种是明文,一种是写sha256sum的Hash值,官方不建议直接写明文密码。
如果设置明文密码,需要把上面user.xml文件的password_sha256_hex替换为password即可,中间写明文密码。如果想用密文,具体设置如下:
将改为<password_sha256_hex>,之间填加密之后的东西
如何加密?(当时看见很懵逼),操作如下:
具体命令:
PASSWORD=
(
b
a
s
e
64
<
/
d
e
v
/
u
r
a
n
d
o
m
∣
h
e
a
d
−
c
8
)
;
e
c
h
o
"
(base64 < /dev/urandom | head -c8); echo "
(base64</dev/urandom∣head−c8);echo"PASSWORD"; echo -n “$PASSWORD” | sha256sum | tr -d ‘-’
只需要把下面那一长串的东西放入<password_sha256_hex>,然后重启,搞定。
登录的时候就需要使用–password EM4Zxr+C来登录了。
然后发送配置文件到每台服务器上。
启动clickhouse集群
分别在每台服务器上都启动,启动命令如下:
sh start-up.sh start
注意:可能会权限错误,更改当前目录下权限即可 chmod 777 log/data/data_old
登录clickhouse:clickhouse-client -u default --password 密码
运行命令:select * from system.clusters,出现下面的就搭建成功了
测试集群的可用性
ck里的引擎有十几个,这里只推荐3个:
- MergeTree,是ck里最advanced的引擎,性能超高,单机写入可以达到50w峰值,查询性能非常快
- ReplicatedMergeTree,基于MergeTree,同时引入zk,做了复制
- Distributed,分布式引擎,本身不存储数据,可认为就是一个view,如果写入,会把请求丢到集群里的节点,如果查询,会帮你做查询转发再聚合返回
ReplicatedMergeTree + Distributed可以做到分布式+高可用
使用方式如下:
- 建立本地表,每个节点都需要建表
CREATE TABLEontime_replica
(
…
) ENGINE = ReplicatedMergeTree(’/clickhouse/tables/ontime/{shard}’, ‘{replica}’, FlightDate, (Year, FlightDate), 8192);
其中,{shard}和{replica}是macros配置(相当于环境变量)
/clickhouse/tables/ontime/{shard}是zk的节点,可以在zk上去看 - 建立分布式表,可以所有节点都建,也可以部分节点建表:
CREATE TABLE ontime_replica_all AS ontime_replica ENGINE = Distributed(dgg_ck_cluster, default, ontime_replica, rand())
Distributed(集群名,库,表名,rand()),rand()表示向分布式表插入数据时,将随机插入到副本。
一般来说写操作使用本地表,读操作使用all表。
ReplicatedMergeTree表也能这样建:
create table dgg_performance_aggr(
…
)ENGINE = ReplicatedMergeTree(’/clickhouse/tables/dgg_performance_aggr/{shard}’,
‘{replica}’) order by sign_user_id SETTINGS index_granularity = 8192