安装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:
如果这步出现错误:
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/
- 编辑配置
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
连接后,查询集群可以看到:
测试分片
为简单起见,在三个节点上都创建了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 了一个数据:
后记
(记一次断电后集群的启动)
断电重启后,docker 挂了。
【报错】
chmod /var/lib/docker:read-only file system
mount -v
发现根目录是只读的
【解决办法】
先重载
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库的链接为正常可以访问的即可(不知道直接删掉可不可以。)