安裝zookeeper
雖然不是必要的槐雾,但clickhouse官方建議使用zookeeper部署集群钓瞭,原因是ck的復(fù)制是用zk實(shí)現(xiàn)的:
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嘉熊,那么副本表是無法實(shí)現(xiàn)的
1.準(zhǔn)備三臺機(jī)器(/etc/hosts):
192.168.11.100 ch100
192.168.11.101 ch101
192.168.11.102 ch102
2.下載zookeeper3.5.6
注意一定要下載帶有bin的版本陈惰,否則會
【報(bào)錯(cuò)】
Starting Zookeeper Cluster. Error: Could not find or load main class org.apache.zookeeper.server.quorum.QuorumPeerMain
3.解壓并修改配置文件北专,三機(jī)一致
目錄:/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
配置文件主要改兩個(gè)地方:
dataDir=/apps/zookeeper-3.5.6/data/zookeeper
dataLogDir=/apps/zookeeper-3.5.6/log/zookeeper
和
server.1=ch100:2888:3888 #這里的.1 .2 .3實(shí)際上對應(yīng)了后面要?jiǎng)?chuàng)建的myid
server.2=ch101:2888:3888
server.3=ch102:2888:3888
4.每臺機(jī)器創(chuàng)建自己的myid文件
在剛剛配置文件中指定的dataDir目錄下創(chuàng)建myid文件
vi /apps/zookeeper-3.5.6/data/zookeeper/myid
三臺機(jī)器禀挫,分別寫上數(shù)字1,2拓颓,3
5.三臺機(jī)器按順序啟動(dòng)zk:
./bin/zkServer.sh start
啟動(dòng)后语婴,檢查:
./bin/zkServer.sh status
會看到一個(gè)leader,兩個(gè)follower:
如果這步出現(xiàn)錯(cuò)誤:
Error contacting service. It is probably not running.
請檢查防火墻:firewalld 或者 iptables
docker安裝clickhouse-server
1.先啟動(dòng)一個(gè)節(jié)點(diǎn)录粱,目的是將config目錄拷貝出來腻格,clickhouse的默認(rèn)配置目錄為:/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>標(biāo)簽?zāi)┪玻砑?lt;include_from>標(biāo)簽
<!-- 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>
<!-- 修改時(shí)區(qū)-->
<timezone>Asia/Shanghai</timezone>
然后增加metrika.xml:(注:這個(gè)配置只配置了分片啥繁,沒有配置副本)
這個(gè)配置中菜职,cluster_3s_1r就是集群的名字
<yandex>
<!-- 集群配置 -->
<clickhouse_remote_servers>
<cluster_3s_1r>
<!-- 數(shù)據(jù)分片1 -->
<shard>
<internal_replication>false</internal_replication>
<replica>
<host>ch100</host>
<port>9000</port>
<user>default</user>
<password></password>
</replica>
</shard>
<!-- 數(shù)據(jù)分片2 -->
<shard>
<internal_replication>false</internal_replication>
<replica>
<host>ch101</host>
<port>9000</port>
<user>default</user>
<password></password>
</replica>
</shard>
<!-- 數(shù)據(jù)分片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>
<!-- 數(shù)據(jù)壓縮算法 -->
<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.重新啟動(dòng)三個(gè)節(jié)點(diǎn)的docker:clickhouse-server
啟動(dòng)命令在三個(gè)節(jié)點(diǎn)都要執(zhí)行,變化的參數(shù)為--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參數(shù)作用相當(dāng)于容器內(nèi)的/etc/hosts
--hostname參數(shù)對每個(gè)容器配置自身的hostname酬核,用于識別is_local
4.啟動(dòng)clickhouse-client驗(yàn)證集群環(huán)境
在任意節(jié)點(diǎn)執(zhí)行,
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
因?yàn)閏lient也是用的docker嫡意,每次連接完畢需要自動(dòng)銷毀docker實(shí)例。
--host 就是連接的server
連接后捣辆,查詢集群可以看到:
測試分片
為簡單起見蔬螟,在三個(gè)節(jié)點(diǎn)上都創(chuàng)建了mysql引擎的數(shù)據(jù),創(chuàng)建方法是:
CREATE DATABASE mysql_jiu_wen \
ENGINE = MySQL('192.168.201.36:3306', 'jiu_wen', 'root', '84b405294fc45757e2a5e1fcf203593b')
接下來創(chuàng)建一個(gè)視圖汽畴,也就是分布表(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()) 表示創(chuàng)建在集群cluster_3s_1r上旧巾,數(shù)據(jù)庫名是mysql_jiu_wen耸序,表名是t_user_trade,分片依據(jù)是 隨機(jī):rand() ;
這樣創(chuàng)建表以后鲁猩,實(shí)際上這張表包含了三個(gè)分片的總數(shù)據(jù)坎怪。二我的每個(gè)分片都加載了相同的mysql數(shù)據(jù)庫,所以表中的數(shù)據(jù)就是mysql數(shù)據(jù)重復(fù)三次廓握。
我只是為了方便測試才這么做搅窿,在實(shí)際生產(chǎn)中,每個(gè)分片當(dāng)然是存放不同的數(shù)據(jù)隙券,而不是存放相同的數(shù)據(jù)男应。
然后隨便group by 了一個(gè)數(shù)據(jù):
后記
(記一次斷電后集群的啟動(dòng))
斷電重啟后,docker 掛了是尔。
【報(bào)錯(cuò)】
chmod /var/lib/docker:read-only file system
mount -v
發(fā)現(xiàn)根目錄是只讀的
【解決辦法】
先重載
sudo mount -o remount,rw /
在重啟
reboot
然后卸載docker重裝:
1.先用 yum list installed|grep docker 查看裝了哪些包
2.然后執(zhí)行卸載命令(后面三個(gè)包就是第一步中查詢出來的):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.啟動(dòng):systemctl restart docker
然后再啟動(dòng)clickhouse
【報(bào)錯(cuò)】
這時(shí)候一直報(bào)錯(cuò)殉了,說連接不上mysql
因?yàn)橹霸賑lickhouse中使用了mysql引擎,現(xiàn)在這個(gè)mysql已經(jīng)斷開了拟枚,所以就一直報(bào)錯(cuò)薪铜。
最后通過修改metadata解決:
【解決辦法】
在/var/lib/clickhouse中有一個(gè)metadata文件夾,里面存放了建庫的sql腳本恩溅,修改那個(gè)mysql庫的鏈接為正掣艄浚可以訪問的即可(不知道直接刪掉可不可以。)