轉載來自 blog.miaoji.io/?p=57
寫在前面你好,歡迎瀏覽我的博客,這篇文章將記錄我使用docker搭建clickhouse集群的過程
工具準備 服務器準備這裡我們準備三臺服務器,
分別配置hostname為server01、server02、server03
所有服務器的/etc/hosts都加上
$ip1 server01 $ip2 server02 $ip3 server03 複製代碼注意: 這裡的$ip1、$ip2、$ip3代表的是你三臺服務器的ip,記得以實際值寫入到/etc/hosts文件中哦
安裝 docker執行命令 yum list | grep docker
返回結果應該如圖所示
注意 docker 的版本
一致了之後執行yum install -y docker
-y參數是為了在待輸入yes的時候直接自動輸入yes
安裝 clickhouse-server 和 clickhouse-client執行命令 yum list | grep clickhouse 返回結果應該如圖所示
我們裝的是前兩個
接下來我們執行下面兩條命令進行安裝
yum pull docker.io/yandex/clickhouse-server; yum pull docker.io/yandex/clickhouse-client; 複製代碼 安裝 zookeeper 集群可以參照Zookeeper 集群搭建
啟動clickhouse-server 創建對應本地路徑在三臺服務器
創建配置存儲目錄: mkdir /etc/clickhouse-server
創建數據存儲目錄: mkdir /opt/clickhouse
獲取配置在server01服務器
採用非docker方式安裝都是有默認配置的,這個時候我們沒有默認配置怎麼辦?
我們可以先按照官方教程的docker命令啟動一下
docker run -d --name clickhouse-server --ulimit nofile=262144:262144 --volume=/opt/clickhouse/:/var/lib/clickhouse yandex/clickhouse-server
-d參數:當前容器在後臺啟動
--name參數:當前容器的名字,不傳的話docker會隨機生成
--ulimit參數:這個參數還不清楚,有了解的朋友可以在評論區告訴我一下
--volume參數:將冒號兩側的路徑建立映射,當容器服務讀取冒號後面的虛擬機內路徑時,會去讀冒號前面的本機路徑。加這個參數的作用是自定義配置
啟動完成了後,我們需要複製容器內的配置文件到本機目錄下
docker cp clickhouse-server:/etc/clickhouse-server/ /etc/clickhouse-server/
配置集群在server01服務器
編輯config.xml執行命令vim /etc/clickhouse-server/config.xml編輯config.xml文件
在remote_servers這個xml標籤後添加如下配置
<include>/etc/clickhouse-server/metrika.xml/<include> 複製代碼 新增metrika.xml執行命令vim /etc/clickhouse-server/metrika.xml新增metrika.xml文件
輸入如下文本
<yandex> <clickhouse> <cluster> <shard> <internal>false/<internal> <replica> <host>server01/<host> <port>9000/<port> <user>default/<user> <password> /<replica> /<shard> <shard> <internal>false/<internal> <replica> <host>server02/<host> <port>9000/<port> <user>default/<user> <password> /<replica> /<shard> <shard> <internal>false/<internal> <replica> <host>server03/<host> <port>9000/<port> <user>default/<user> <password> /<replica> /<shard> /<cluster> /<clickhouse> <zookeeper-servers> <node> <host>server01/<host> <port>2181/<port> /<node> <node> <host>server02/<host> <port>2181/<port> /<node> <node> <host>server03/<host> <port>2181/<port> /<node> /<zookeeper-servers> <networks>到這裡我們的關於集群的配置就全部完成了,接下來要做的是把我們在server01上的配置文件傳輸到其它服務器上 執行命令
scp -r /etc/clickhouse-server server02:/etc/clickhouse-server scp -r /etc/clickhouse-server server03:/etc/clickhouse-server 複製代碼可以去對應服務器驗證一下
啟動集群分別在三臺服務器
執行docker啟動腳本
docker run -d \\ --name cs \\ --ulimit nofile=262144:262144 \\ --volume=/opt/clickhouse/:/var/lib/clickhouse \\ --volume=/etc/clickhouse-server/:/etc/clickhouse-server/ \\ --add-host server01:$ip1 \\ --add-host server02:$ip2 \\ --add-host server03:$ip3 \\ --hostname $current_hostname \\ -p 9000:9000 \\ -p 8123:8123 \\ -p 9009:9009 \\ yandex/clickhouse-server 複製代碼注意1: 這裡的 $ip1、$ip2、$ip3 記得替換為實際值
注意2: $current_hostname 為當前服務器的hostname
--add-host參數:因為我們在配置文件中使用了hostname來指代我們的服務器,為了讓容器能夠識別,所以需要加此參數
--hostname參數:clickhouse中的system.clusters表會顯示集群信息,其中is_local的屬性如果不配置hostname的話clickhouse無法識別是否是當前本機。is_local都為0的話會影響集群操作,比如create table on cluster cluster_2s_1r .....
--p參數:暴露容器中的端口到本機端口中。容器端口
驗證集群搭建分別查看三臺服務器的system.clusters,應該顯示集群中三臺服務器的信息,且is_local為正確值
啟動 clickhouse-client在任意服務器
docker run -it \\ --rm \\ --add-host server01:$ip1 \\ --add-host server02:$ip2 \\ --add-host server03:$ip3 \\ yandex/clickhouse-client \\ --host server01 \\ --port 9000 複製代碼--host參數:相當於我們通過yum安裝clickhouse時,執行命令clickhouse-client --host server01後面接的參數host,指定用於連接的clickhouse-server的host
--port參數:相當於我們通過yum安裝clickhouse時,執行命令clickhouse-client --port 9000後面接的參數port,指定用於連接的clickhouse-server的port
寫在最後使用docker搭建服務和我們平時在服務器上搭建的思路有些不太一樣,需要時刻注意我們使用docker啟動的服務是在一個虛擬機裡的,可以理解為“面向虛擬機部署”
一開始部署集群的時候我的is_local這個屬性值就一直不正常,後來看了這篇文章,想著用他的方式試一下
發現is_local的值好了!我一開始還以為是docker中network的問題,後來在改配置的過程中才意識到是參數hostname起到了關鍵的作用
歡迎關注,會陸續發佈一些知識點總結,減少你的讀書時間,一起交流面試經驗!每月隨機抽取20名粉絲進入高級技術交流群(大量資料、BAT員工)!
div class="pgc-img">閱讀更多 GetJob 的文章