clickhouse集群搭建

文章目录

安装clickhouse

本次用了4台服务器搭建clickhouse集群,使用rpm安装方式在4台服务器上安装clickhouse,步骤如下:

  1. sudo yum install -y curl
  2. curl ­-s https://packagecloud.io/install/repositories/altinity/clickhouse/script.rpm.sh | sudo bash
  3. sudo yum install ­-y clickhouse­-server clickhouse-­client

rpm安装后,会在服务器上生成如下几个文件:
clickhouse集群搭建
默认的配置文件,对我们的管理是个隐患,建议把配置文件、数据目录、临时目录、日志文件,统一放在某个地方,即:
clickhouse集群搭建
修改默认的shell脚本,修改默认配置文件的位置,即上面的start_.sh 修改前的启动脚本在/etc/init.d中,复制clickhouse-server文件更改即可
clickhouse集群搭建
clickhouse集群搭建

修改集群配置文件

集群配置文件在/etc/clickhouse-server文件夹下

  1. 修改基本配置文件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集群搭建

  1. 创建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的配置

  1. 修改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>,之间填加密之后的东西

如何加密?(当时看见很懵逼),操作如下:
clickhouse集群搭建
具体命令:
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,出现下面的就搭建成功了
clickhouse集群搭建

测试集群的可用性

ck里的引擎有十几个,这里只推荐3个:

  • MergeTree,是ck里最advanced的引擎,性能超高,单机写入可以达到50w峰值,查询性能非常快
  • ReplicatedMergeTree,基于MergeTree,同时引入zk,做了复制
  • Distributed,分布式引擎,本身不存储数据,可认为就是一个view,如果写入,会把请求丢到集群里的节点,如果查询,会帮你做查询转发再聚合返回

ReplicatedMergeTree + Distributed可以做到分布式+高可用

使用方式如下:

  1. 建立本地表,每个节点都需要建表
    CREATE TABLE ontime_replica (

    ) ENGINE = ReplicatedMergeTree(’/clickhouse/tables/ontime/{shard}’, ‘{replica}’, FlightDate, (Year, FlightDate), 8192);
    其中,{shard}和{replica}是macros配置(相当于环境变量)
    /clickhouse/tables/ontime/{shard}是zk的节点,可以在zk上去看
  2. 建立分布式表,可以所有节点都建,也可以部分节点建表:
    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

上一篇:一文彻底搞清 Kafka 的副本复制机制


下一篇:一文彻底搞清 Kafka 的副本复制机制