部署clickhouse cluster(基于docker+zookeeper)

安装zookeeper

虽然不是必要的,但clickhouse官方建议使用zookeeper部署集群,原因是ck的复制是用zk实现的:

ZooKeeper is not a strict requirement: in some simple cases you can duplicate the data by writing it into all the replicas from your application code. This approach is not recommended, in this case ClickHouse won't be able to guarantee data consistency on all replicas. This remains the responsibility of your application.
而且很重要的是,如果不安装zookeeper,那么副本表是无法实现的


1.准备三台机器(/etc/hosts):

192.168.11.100 ch100
192.168.11.101 ch101
192.168.11.102 ch102

2.下载zookeeper3.5.6
注意一定要下载带有bin的版本,否则会
【报错】
Starting Zookeeper Cluster. Error: Could not find or load main class org.apache.zookeeper.server.quorum.QuorumPeerMain

3.解压并修改配置文件,三机一致
目录:/apps/

tar -zxvf apache-zookeeper-3.5.6-bin.tar.gz
mkdir -p /apps/apache-zookeeper-3.5.6-bin/data/zookeeper && mkdir -p /apps/apache-zookeeper-3.5.6-bin/log/zookeeper
cp /apps/apache-zookeeper-3.5.6-bin/conf/zoo-sample.cnf  /apps/apache-zookeeper-3.5.6-bin/conf/zoo.cnf
vi /apps/apache-zookeeper-3.5.6-bin/conf/zoo.cnf

配置文件主要改两个地方:

dataDir=/apps/zookeeper-3.5.6/data/zookeeper
dataLogDir=/apps/zookeeper-3.5.6/log/zookeeper

server.1=ch100:2888:3888 #这里的.1 .2 .3实际上对应了后面要创建的myid
server.2=ch101:2888:3888
server.3=ch102:2888:3888

4.每台机器创建自己的myid文件
在刚刚配置文件中指定的dataDir目录下创建myid文件
vi /apps/zookeeper-3.5.6/data/zookeeper/myid
三台机器,分别写上数字1,2,3

5.三台机器按顺序启动zk:

 ./bin/zkServer.sh start

启动后,检查:

 ./bin/zkServer.sh status

会看到一个leader,两个follower:


follower

leader

如果这步出现错误:
Error contacting service. It is probably not running.
请检查防火墙:firewalld 或者 iptables

docker安装clickhouse-server

单机安装在这篇文章中有讲述


1.先启动一个节点,目的是将config目录拷贝出来,clickhouse的默认配置目录为:/etc/clickhouse-server/

docker run -d --name clickhouse-server --ulimit nofile=262144:262144 -p 8123:8123 --volume=$HOME/clickhouse:/var/lib/clickhouse  yandex/clickhouse-server
docker cp clickhouse-server :/etc/clickhouse-server/ /etc/clickhouse-server/
  1. 编辑配置
    vi /etc/clickhouse-server/config.xml
    修改以下配置:
 <listen_host>::</listen_host>  -- 去掉注释

找到<remote_servers>标签末尾,添加<include_from>标签
<!-- If element has 'incl' attribute, then for it's value will be used corresponding substitution from another file.
         By default, path to file with substitutions is /etc/metrika.xml. It could be changed in config in 'include_from' element.
         Values for substitutions are specified in /yandex/name_of_substitution elements in that file.
      -->
<include_from>/etc/clickhouse-server/metrika.xml</include_from>
<!-- 修改时区-->
<timezone>Asia/Shanghai</timezone> 

然后增加metrika.xml:(注:这个配置只配置了分片,没有配置副本)
这个配置中,cluster_3s_1r就是集群的名字

<yandex>
 
    <!-- 集群配置 -->
    <clickhouse_remote_servers>
        <cluster_3s_1r>
 
            <!-- 数据分片1  -->
            <shard>
                <internal_replication>false</internal_replication>
                <replica>
                    <host>ch100</host>
                    <port>9000</port>
                    <user>default</user>
                    <password></password>
                </replica>
            </shard>
 
            <!-- 数据分片2  -->
            <shard>
                <internal_replication>false</internal_replication>
                <replica>
                    <host>ch101</host>
                    <port>9000</port>
                    <user>default</user>
                    <password></password>
                </replica>
            </shard>
 
            <!-- 数据分片3  -->
            <shard>
                <internal_replication>false</internal_replication>
                <replica>
                    <host>ch102</host>
                    <port>9000</port>
                    <user>default</user>
                    <password></password>
                </replica>
            </shard>
        </cluster_3s_1r>
    </clickhouse_remote_servers>
 
    <!-- ZK  -->
    <zookeeper-servers>
        <node index="1">
            <host>ch100</host>
            <port>2181</port>
        </node>
        <node index="2">
            <host>ch101</host>
            <port>2181</port>
        </node>
        <node index="3">
            <host>ch102</host>
            <port>2181</port>
        </node>
    </zookeeper-servers>
 
    <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>

3.重新启动三个节点的docker:clickhouse-server
启动命令在三个节点都要执行,变化的参数为--hostname

docker run -d \
--name chserver \
--ulimit nofile=262144:262144 \
-p 9000:9000 \
-p 8123:8123 \
-p 9009:9009 \
--volume=/var/lib/clickhouse/:/var/lib/clickhouse/  \
--volume=/etc/clickhouse-server/:/etc/clickhouse-server/ \
--add-host ch100:192.168.11.100 \
--add-host ch101:192.168.11.101 \
--add-host ch102:192.168.11.102 \
--hostname ch102 \
yandex/clickhouse-server

其中,

--add-host参数作用相当于容器内的/etc/hosts
--hostname参数对每个容器配置自身的hostname,用于识别is_local

4.启动clickhouse-client验证集群环境
在任意节点执行,

docker run -it --rm   --add-host ch100:192.168.11.100 --add-host ch101:192.168.11.101 --add-host ch102:192.168.11.102 yandex/clickhouse-client --host ch101 --port 9000

其中,

--rm Automatically remove the container when it exits
因为client也是用的docker,每次连接完毕需要自动销毁docker实例。
--host 就是连接的server

连接后,查询集群可以看到:


system.clusters

测试分片


为简单起见,在三个节点上都创建了mysql引擎的数据,创建方法是:

CREATE DATABASE  mysql_jiu_wen  \
ENGINE = MySQL('192.168.201.36:3306', 'jiu_wen', 'root', '84b405294fc45757e2a5e1fcf203593b')

接下来创建一个视图,也就是分布表(Distributed table)

create table default.t_user_trade as mysql_jiu_wen.t_user_trade  ENGINE = Distributed(cluster_3s_1r, 'mysql_jiu_wen', 't_user_trade', rand());
-- Distributed(cluster_3s_1r, 'mysql_jiu_wen', 't_user_trade', rand()) 表示创建在集群cluster_3s_1r上,数据库名是mysql_jiu_wen,表名是t_user_trade,分片依据是 随机:rand() ;

这样创建表以后,实际上这张表包含了三个分片的总数据。二我的每个分片都加载了相同的mysql数据库,所以表中的数据就是mysql数据重复三次。
我只是为了方便测试才这么做,在实际生产中,每个分片当然是存放不同的数据,而不是存放相同的数据。

然后随便group by 了一个数据:

image.png

后记

(记一次断电后集群的启动)
断电重启后,docker 挂了。
【报错】
chmod /var/lib/docker:read-only file system

image.png

mount -v

read only

发现根目录是只读的
【解决办法】
先重载
sudo mount -o remount,rw /
在重启
reboot

然后卸载docker重装:
1.先用 yum list installed|grep docker 查看装了哪些包

2.然后执行卸载命令(后面三个包就是第一步中查询出来的):yum -y remove containerd.io.x86_64 docker-ce.x86_64 docker-ce-cli.x86_64

3.删除目录 :rm -rf /var/lib/docker

4.重装: yum install -y docker-ce

5.启动:systemctl restart docker

然后再启动clickhouse
【报错】
这时候一直报错,说连接不上mysql
因为之前再clickhouse中使用了mysql引擎,现在这个mysql已经断开了,所以就一直报错。
最后通过修改metadata解决:
【解决办法】
在/var/lib/clickhouse中有一个metadata文件夹,里面存放了建库的sql脚本,修改那个mysql库的链接为正常可以访问的即可(不知道直接删掉可不可以。)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容