暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

clickhouse集群安装部署

武林萌主 2024-07-12
312


    一、产品介绍

        clickhouse分片介绍、clickhouse副本介绍、clickhouse安装、clickhouse复制表、clickhouse分布式总表、clickhouse测试


        1、为什么需要使用分片(shard)
              https://clickhouse.com/docs/en/concepts/why-clickhouse-is-so-fast

            clickhouse会利用整台服务器上面所有资源,如果有大的SSD、CPU、内存clikchouse可以处理TB级别的数据,而且具有高速度的插入和查询。

             当服务器资源不够的时候,比如说服务器存储64TB然后做了raid10,变成32TB之后,数据量还是超过这个量的时候,可以通过分片来解决,所以clickhouse首先尽量为扩容磁盘,之后在增加分片。

            clickhouse分片介绍

         


       2、CPU利用率应该是多少?


                   ClickHouse没有标准的CPU利用率目标。利用iostat等工具来测量平均CPU使用率,并相应地调整服务器的大小以管理意外的流量峰值。但是,对于具有即使查询的分析或数据仓库用例,您应该将CPU利用率定为10-20%。

        3、 我应该使用多少CPU核心?

                      应该使用的CPU数量取决于您的工作负载。但是,我们通常会根据您的CPU类型推荐以下内存与CPU核心比率:

                      M型(通用用例):4:1的内存与CPU核心比率

                      R型(数据仓库用例):8:1的内存与CPU核心比率

                      C型(计算优化的用例):2:1的内存与CPU核心比率

                    例如,当使用M型CPU时,我们建议为每25个CPU内核配置100 GB内存。要确定适合应用程序的内存量,必须分析内存使用情况。

     二、      如何吧数据写入到两台服务器的不同分片

                  有2种方式可以吧数据写入到不同的分片里面

                 1.第一种通过分布式总表的方式写入,用户把数据写入到分布式总表,然后通过分布式总表的分配键来进行分发到不同分片里面,一般常用的是rand(),这个会平均的把数据分配到每个分片。

                 2.第二种直接写入两个分片的本地表中。


                

                

         如何查询所有不同分片的数据

                clickhouse的可以通过查询分布式总表的方式来检索所有,这也是clickhouse的优势点。

              

 

   clickhouse副本介绍


       副本可以实现数据的完整性和自动故障转移


           比如一下异常情况

           数据库磁盘坏了

           数据库内存OOM导致数据库挂了

           主机宕机
           ......

           

     一台主机坏了,另外一台主机上有副本则可以保证业务的实时稳定


           


     当出问题的主机启动,修复完毕时则可以自动与其他副本同步数据

           


      这些步骤都是通过clickhouse keeper或者zookeeper来完成的,并且clickhouse keeper与zookeeper完全兼容

          


    clickhouse分片和副本配置

         分片和副本的配置介绍


       1.cluster配置是在config.xml里面配置。

       2.可以通过 on cluster 来为所有节点创建本地表、分布式总表、数据库......
           CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
        (
name1 [type1] [NULL|NOT NULL] [DEFAULT|MATERIALIZED|EPHEMERAL|ALIAS expr1] [compression_codec] [TTL expr1] [COMMENT 'comment for column'],
name2 [type2] [NULL|NOT NULL] [DEFAULT|MATERIALIZED|EPHEMERAL|ALIAS expr2] [compression_codec] [TTL expr2] [COMMENT 'comment for column'],
...
) ENGINE = engine
COMMENT 'comment for table'


    1.分片和副本的简单配置如下,下面配置cluster1的集群

           

      2.分片和副本的简单配置如下,需要再所有主机配置,可以通过分布式DDL查询,创建等。


          


        3. 需要重点介绍参数<internal_replication>true</internal_replication>

         这个参数保证使用复制表的时候只在同一个副本进行写数据,之后副本直接回自动同步数据。

         

         

           分布式查询会直接使用分布式总表的模版,可以直接查询,就会调用所有数据

          



        安装部署

  

          本测试环境

               192.168.137.64

               192.168.137.68

                Centos 7.9     8G     2个cpu


      安装 zookeeper

                
    1. 安装jdk

          
       cd  /usr/local

        tar -xf  jdk-8u351-linux-x64.tar.gz


     2.  安装 zookeeper

       下载

         解压

        tar -zxvf  apache-zookeeper-3.7.0-bin.tar.gz  -C  /usr/local/

        cd  /usr/local/apache-zookeeper-3.7.0-bin/conf

        cp zoo_sample.cfg    zoo.cfg

   

[root@node2 conf]# vi zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/apache-zookeeper-3.7.0-bin/data
dataLogDir=/usr/local/apache-zookeeper-3.7.0-bin/logs
clientPort=2181
maxClientCnxns=60
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
server.1=xxxx.xxxx.xxxx.xxxx:2888:3888
server.2=xxxx.xxxx.xxxx.xxxx:2888:3888
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
autopurge.purgeInterval=1

##建数据目录和日志目录
mkdir -p /usr/local/apache-zookeeper-3.7.0-bin/data
mkdir -p /usr/local/apache-zookeeper-3.7.0-bin/logs

cd /usr/local/apache-zookeeper-3.7.0-bin/data

[root@node1 data]# cat myid ### 根据上面的 server.1 数值去是建立,根据具体的标注对应不同的值.
1

最后再zoo.cfg中 dataDir=*** 指定的目录下创建myid文件,里面加上zk节点的序号,注意每个节点都不一样。
另外如果想修改zk的日志存储地址,可以修改log4j.properties中的相关属性配置
注意事项: zoo.cfg 里面的参数所有节点顺序都保持一致.

###添加环境变量

vi /etc/profile

export PATH=/usr/local/jdk1.8.0_351/bin:$PATH
export JAVA_HOME=/usr/local/jdk1.8.0_351
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
export ZK_HOME=/usr/local/apache-zookeeper-3.7.0-bin
export PATH=$PATH:$ZK_HOME/bin


source /etc/profile


###启动 zookeeper 一定查看状态及日志是否正常.

/usr/local/apache-zookeeper-3.7.0-bin/bin
[root@node1 bin]# ./zkServer.sh start

###查看状态
[root@node1 bin]# ./zkServer.sh status


二 安装 clickhouse

    
   ##环境检查脚本


     vi  ac_install_ck_cluster.sh


   #!/bin/bash

#########################################
# File Name: install_ck_.sh
# Version: v1.4
# CreateTime:2024-07-3
 #########################################

current_time=$(date "+%Y-%m-%d %H:%M:%S")
configPath=config
ips=`awk -F= -v k=ips '{ if ( $1 == k ) print $2; }' $configPath`
ck_mount_dir=`awk -F= -v k=ck_mount_dir '{ if ( $1 == k ) print $2; }' $configPath`
package_dir=`awk -F= -v k=package_dir '{ if ( $1 == k ) print $2; }' $configPath`
ck_password=`awk -F= -v k=ck_password '{ if ( $1 == k ) print $2; }' $configPath`
share=`awk -F= -v k=share '{ if ( $1 == k ) print $2; }' $configPath`
replicas=`awk -F= -v k=replicas '{ if ( $1 == k ) print $2; }' $configPath`
zookeeper_ip=`awk -F= -v k=zookeeper_ip '{ if ( $1 == k ) print $2; }' $configPath`
zookeeper_port=`awk -F= -v k=zookeeper_port '{ if ( $1 == k ) print $2; }' $configPath`

eval $(echo $ips | awk '{split($0, arr, ","); for(i in arr) print "array["i-1"]="arr[i]}')

eval $(echo $zookeeper_ip | awk '{split($0, arr1, ","); for(i in arr1) print "array_zk["i-1"]="arr1[i]}')

function menu()
{
echo -e "\033[34m -------------------菜单功能选项------------------------ \033[0m"
echo -e "\033[34m 0 显示功能菜单 \033[0m"
echo -e "\033[34m 1 修改操作系统相关配置 \033[0m"
echo -e "\033[34m 2 安装clickhouse \033[0m"
echo -e "\033[34m 3 退出 \033[0m"
echo -e "\033[34m ------------------------------------------------------- \033[0m"
}

function selector()
{
while :
do
read -p "请输入要操作的菜单编号[0-3],查看功能菜单输入0:" key
case $key in
0)
menu ;;
1)
change_system ;;
2)
install_clickhouse
get_local_ip
change_ck_server_config
change_remote_servers_zk_mocros
create_systemctl_file
init_create_user ;;
3)
exit ;;
esac
done
}


function output_logs()
{
if [ "$?" != 0 ] ; then
echo -e "\033[31m $current_time $1 \033[0m"
exit 1
else
echo -e "\033[32m $current_time $2 \033[0m"
fi
}

function change_system()
{
echo 'madvise' | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
output_logs 禁用透明大页失败 禁用透明大页成功

echo 'vm.swappiness = 1' >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf
output_logs 禁用swap失败 禁用swap成功

setenforce 0
#output_logs 禁用SElinux失败 禁用SElinux成功

sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
output_logs 修改SElinux配置文件disabled失败 修改SElinux配置文件disabled成功

echo '* soft nofile 1048576
* hard nofile 1048576
* soft nproc 131072
* hard nproc 131072' >> /etc/security/limits.d/20-nproc.conf

# 安装clickhouse依赖包
yum install -y yum-utils libtool *unixODBC*
output_logs clickhouse安装依赖失败 clickhouse安装依赖成功

systemctl stop firewalld.service
output_logs 禁用iptables失败 禁用iptables成功
systemctl disable firewalld.service
output_logs 禁用iptables开机自启动失败 禁用iptables开机自启动成功

}

function install_clickhouse()
{

# 创建数据目录、日志目录
mkdir -p $ck_mount_dir/clickhouse/data
output_logs 创建clickhouse数据目录失败 创建clickhouse数据目录成功
mkdir -p $ck_mount_dir/clickhouse-1/data
output_logs 创建clickhouse-1数据目录失败 创建clickhouse-1数据目录成功
mkdir -p $ck_mount_dir/clickhouse/log
output_logs 创建clickhouse日志目录失败 创建clickhouse日志目录成功
mkdir -p $ck_mount_dir/clickhouse-1/log
output_logs 创建clickhouse-1日志目录失败 创建clickhouse-1日志目录成功


# 解压tgz包安装clickhouse
cd $package_dir
output_logs 进入安装包目录失败 进入安装包目录成功
clickhouse_client=`ls -l |grep 'clickhouse-client'|awk '{print $9}'`
clickhouse_common_static=`ls -l |grep 'clickhouse-common-static'|grep -v dbg|awk '{print $9}'`
clickhouse_common_static_dbg=`ls -l |grep 'clickhouse-common-static-dbg'|awk '{print $9}'`
clickhouse_server=`ls -l |grep 'clickhouse-server'|awk '{print $9}'`
echo -e "\033[32m $current_time 开始解压压缩包 \033[0m"
tar -zxvf $clickhouse_client -C /opt
output_logs 解压$clickhouse_client包失败 解压$clickhouse_client包成功
tar -zxvf $clickhouse_common_static -C /opt
output_logs 解压$clickhouse_common_static包失败 解压$clickhouse_common_static包成功
tar -zxvf $clickhouse_common_static_dbg -C /opt
output_logs 解压$clickhouse_common_static_dbg包失败 解压$clickhouse_common_static_dbg包成功
tar -zxvf $clickhouse_server -C /opt
output_logs 解压$clickhouse_server包失败 解压$clickhouse_server包成功
clickhouse_client_dir=`ls -l /opt |grep 'clickhouse-client'|awk '{print $9}'`
clickhouse_common_static_dir=`ls -l /opt |grep 'clickhouse-common-static'|grep -v dbg|awk '{print $9}'`
clickhouse_common_static_dbg_dir=`ls -l /opt|grep 'clickhouse-common-static-dbg'|awk '{print $9}'`
clickhouse_server_dir=`ls -l /opt|grep 'clickhouse-server'|awk '{print $9}'`
# [已废弃] echo -e "\033[32m $current_time 开始安装clickhouse,安装 clcikhouse-servert 过程中提示为 default 用户设置密码,直接回车即可。 \033[0m"
/opt/$clickhouse_common_static_dir/install/doinst.sh
output_logs 安装$clickhouse_common_static失败 安装$clickhouse_common_static成功
/opt/$clickhouse_common_static_dbg_dir/install/doinst.sh
output_logs 安装$clickhouse_common_static_dbg失败 安装$clickhouse_common_static_dbg成功
#sed -i "s:/var/lib/clickhouse:$ck_mount_dir/clickhouse/data:g" /opt/$clickhouse_server_dir/install/doinst.sh
expect -c "spawn /opt/$clickhouse_server_dir/install/doinst.sh;expect \"Enter password for the default user\";send \"\n\";expect eof"
output_logs 安装$clickhouse_server失败 安装$clickhouse_server成功
/opt/$clickhouse_client_dir/install/doinst.sh
output_logs 安装$clickhouse_client失败 安装$clickhouse_client成功
echo -e "\033[32m $current_time 开始拷贝clickhouse-1副本目录。 \033[0m"


cp -a /etc/clickhouse-server /etc/clickhouse-server-1
output_logs 默认配置目录拷贝失败 默认配置目录拷贝成功
#cp -a /var/lib/clickhouse /var/lib/clickhouse-1
cp -a /var/log/clickhouse-server /var/log/clickhouse-server-1
output_logs 日志目录拷贝失败 日志目录拷贝成功
#cp -a /etc/rc.d/init.d/clickhouse-server /etc/rc.d/init.d/clickhouse-server-1
#output_logs 启动脚本拷贝失败 启动脚本拷贝成功
cp -a /etc/security/limits.d/clickhouse.conf /etc/security/limits.d/clickhouse-1.conf
output_logs 文件数限制文件拷贝失败 文件数限制文件拷贝成功
#cp -a /etc/cron.d/clickhouse-server /etc/cron.d/clickhouse-server-1
#output_logs 定时任务文件拷贝失败 定时任务文件拷贝成功

if [[ $replicas = 3 ]];then
cp -a /etc/clickhouse-server /etc/clickhouse-server-2
output_logs 默认配置目录拷贝失败 默认配置目录拷贝成功
#cp -a /var/lib/clickhouse /var/lib/clickhouse-2
cp -a /var/log/clickhouse-server /var/log/clickhouse-server-2
output_logs 日志目录拷贝失败 日志目录拷贝成功
#cp -a /etc/rc.d/init.d/clickhouse-server /etc/rc.d/init.d/clickhouse-server-2
#output_logs 启动脚本拷贝失败 启动脚本拷贝成功
cp -a /etc/security/limits.d/clickhouse.conf /etc/security/limits.d/clickhouse-2.conf
output_logs 文件数限制文件拷贝失败 文件数限制文件拷贝成功
mkdir -p /$ck_mount_dir/clickhouse-2/data/tmp
fi

mkdir -p /$ck_mount_dir/clickhouse/data/tmp
mkdir -p /$ck_mount_dir/clickhouse-1/data/tmp
output_logs 副本tmp目录创建失败 副本tmp目录创建成功
echo -e "\033[32m $current_time clickhouse-1副本目录拷贝完成。 \033[0m"

}

function get_local_ip()
{
nums=${#array[@]}
for ((i=0; i<$nums; i++))
do
if [[ ${array[$i]} = $(ip a | grep ${array[$i]} | awk '{print $2}' | cut -d/ -f1) ]];then
local_ip=${array[$i]}
fi
done
}

function change_ck_server_config()
{
# 计算内存和cpu
men1=`echo $(($(free -b|grep Mem|awk '{print $2}')*7/10/$replicas))`
output_logs max_memory_usage计算失败 max_memory_usage计算成功
men2=`echo $(($(free -b|grep Mem|awk '{print $2}')*5/10/$replicas))`
output_logs max_bytes_before_external_group_by计算失败 max_bytes_before_external_group_by计算成功
cpu_num2=`echo $(grep 'processor' /proc/cpuinfo | sort -u | wc -l)`
if [[ $cpu_num2 -le 15 ]];then
cpu_num2=16
fi
output_logs cpu核数计算失败 cpu核数计算成功

# 修改主节点config.xml文件
echo -e "\033[32m $current_time 开始修改主节点config.xml文件 \033[0m"
awk '/<prometheus>/{print NR-1}' /etc/clickhouse-server/config.xml | while read line; do sed -i "${line}d" /etc/clickhouse-server/config.xml; done
awk '/<\/prometheus>/{print NR+1}' /etc/clickhouse-server/config.xml | while read line; do sed -i "${line}d" /etc/clickhouse-server/config.xml; done
sed -i "s#<log>/var/log/clickhouse-server/clickhouse-server.log</log>#<log>$ck_mount_dir/clickhouse/log/clickhouse-server.log</log>#g" /etc/clickhouse-server/config.xml
sed -i "s#<errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>#<errorlog>$ck_mount_dir/clickhouse/log/clickhouse-server.err.log</errorlog>#g" /etc/clickhouse-server/config.xml
sed -i "s#<remote_servers>#<remote_servers_del>#g" /etc/clickhouse-server/config.xml
sed -i "s#</remote_servers>#</remote_servers_del>#g" /etc/clickhouse-server/config.xml
sed -i "s#<!-- <listen_host>::</listen_host> -->#<listen_host>::</listen_host>#g" /etc/clickhouse-server/config.xml
sed -i "s#<keep_alive_timeout>3</keep_alive_timeout>#<keep_alive_timeout>600</keep_alive_timeout>#g" /etc/clickhouse-server/config.xml
sed -i "s#<max_concurrent_queries>100</max_concurrent_queries>#<max_concurrent_queries>150</max_concurrent_queries>#g" /etc/clickhouse-server/config.xml
sed -i "s#<!-- <max_table_size_to_drop>0</max_table_size_to_drop> -->#<max_table_size_to_drop>0</max_table_size_to_drop>#g" /etc/clickhouse-server/config.xml
sed -i "s#<path>/var/lib/clickhouse/</path>#<path>$ck_mount_dir/clickhouse/data/</path>#g" /etc/clickhouse-server/config.xml
sed -i "s#/var/lib/clickhouse/tmp/#<path>$ck_mount_dir/clickhouse/data/tmp/</path>#g" /etc/clickhouse-server/config.xml
sed -i "s#<user_files_path>/var/lib/clickhouse/user_files/</user_files_path>#<user_files_path>$ck_mount_dir/clickhouse/data/user_files/</user_files_path>#g" /etc/clickhouse-server/config.xml
sed -i "s#<path>/var/lib/clickhouse/access/</path>#<path>$ck_mount_dir/clickhouse/data/access/</path>#g" /etc/clickhouse-server/config.xml
sed -i "s#<format_schema_path>/var/lib/clickhouse/format_schemas/</format_schema_path>#<format_schema_path>$ck_mount_dir/clickhouse/data/format_schemas/</format_schema_path>#g" /etc/clickhouse-server/config.xml
sed -i '''/<\/send_crash_reports>/a\ <default_replica_path>/clickhouse/tables/{shard}/{database}/{table}</default_replica_path>''' /etc/clickhouse-server/config.xml
sed -i '''/<\/send_crash_reports>/a\ <default_replica_name>{replica}</default_replica_name>''' /etc/clickhouse-server/config.xml
sed -i '''/<\/send_crash_reports>/a\ <compression incl="clickhouse_compression" optional="true"/>''' /etc/clickhouse-server/config.xml
sed -i '''/<\/send_crash_reports>/a\ <networks incl="networks" optional="true"/>''' /etc/clickhouse-server/config.xml
sed -i '''/<\/send_crash_reports>/a\ <macros incl="macros" optional="true" />''' /etc/clickhouse-server/config.xml
sed -i '''/<\/send_crash_reports>/a\ <remote_servers incl="clickhouse_remote_servers" optional="true" />''' /etc/clickhouse-server/config.xml
sed -i '''/<\/send_crash_reports>/a\ <zookeeper incl="zookeeper-servers" optional="true" />''' /etc/clickhouse-server/config.xml
sed -i '''/<\/send_crash_reports>/a\ <include_from>/etc/clickhouse-server/metrika.xml</include_from>''' /etc/clickhouse-server/config.xml
sed -i "/<interserver_http_port>9009<\/interserver_http_port>/a\ <interserver_http_host>$local_ip<\/interserver_http_host>" /etc/clickhouse-server/config.xml
sed -i "/<\/max_thread_pool_size>/a\ <background_distributed_schedule_pool_size>$cpu_num2<\/background_distributed_schedule_pool_size>" /etc/clickhouse-server/config.xml
sed -i "/<\/max_thread_pool_size>/a\ <background_schedule_pool_size>$cpu_num2<\/background_schedule_pool_size>" /etc/clickhouse-server/config.xml
sed -i "/<\/max_thread_pool_size>/a\ <background_pool_size>$cpu_num2<\/background_pool_size>" /etc/clickhouse-server/config.xml
echo -e "\033[32m $current_time 成功修改主节点config.xml文件 \033[0m"

# 修改主节点user.xml文件
echo -e "\033[32m $current_time 开始修改主节点user.xml文件 \033[0m"
first=$(egrep -n '<default>' /etc/clickhouse-server/users.xml | head -1 | cut -d: -f1)
sed -i "$first a\ <max_memory_usage>$men1<\/max_memory_usage>" /etc/clickhouse-server/users.xml
sed -i "$first a\ <max_bytes_before_external_group_by>$men2<\/max_bytes_before_external_group_by>" /etc/clickhouse-server/users.xml
sed -i "$first a\ <max_execution_time>300<\/max_execution_time>" /etc/clickhouse-server/users.xml
sed -i "$first a\ <distributed_product_mode>local<\/distributed_product_mode>" /etc/clickhouse-server/users.xml
sed -i "$first a\ <async_insert>1<\/async_insert>" /etc/clickhouse-server/users.xml
sed -i "s#<password></password>#<password>$ck_password</password>#g" /etc/clickhouse-server/users.xml
sed -i "s#<!-- <access_management>1</access_management> -->#<access_management>1</access_management>#g" /etc/clickhouse-server/users.xml
echo -e "\033[32m $current_time 成功修改主节点user.xml文件 \033[0m"


# 修改副本节点config.xml文件
echo -e "\033[32m $current_time 开始修改副本节点config.xml文件 \033[0m"
awk '/<prometheus>/{print NR-1}' /etc/clickhouse-server-1/config.xml | while read line; do sed -i "${line}d" /etc/clickhouse-server-1/config.xml; done
sed -i 's/9363/9364/g' /etc/clickhouse-server-1/config.xml
awk '/<\/prometheus>/{print NR+1}' /etc/clickhouse-server-1/config.xml | while read line; do sed -i "${line}d" /etc/clickhouse-server-1/config.xml; done
sed -i "s#<log>/var/log/clickhouse-server/clickhouse-server.log</log>#<log>$ck_mount_dir/clickhouse-1/log/clickhouse-server.log</log>#g" /etc/clickhouse-server-1/config.xml
sed -i "s#<errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>#<errorlog>$ck_mount_dir/clickhouse-1/log/clickhouse-server.err.log</errorlog>#g" /etc/clickhouse-server-1/config.xml
sed -i "s#<remote_servers>#<remote_servers_del>#g" /etc/clickhouse-server-1/config.xml
sed -i "s#</remote_servers>#</remote_servers_del>#g" /etc/clickhouse-server-1/config.xml
sed -i "s#<http_port>8123</http_port>#<http_port>8124</http_port>#g" /etc/clickhouse-server-1/config.xml
sed -i "s#<tcp_port>9000</tcp_port>#<tcp_port>9001</tcp_port>#g" /etc/clickhouse-server-1/config.xml
sed -i "s#<mysql_port>9004</mysql_port>#<mysql_port>9006</mysql_port>#g" /etc/clickhouse-server-1/config.xml
sed -i "s#<postgresql_port>9005</postgresql_port>#<postgresql_port>9007</postgresql_port>#g" /etc/clickhouse-server-1/config.xml
sed -i "s#<interserver_http_port>9009</interserver_http_port>#<interserver_http_port>9010</interserver_http_port>#g" /etc/clickhouse-server-1/config.xml
sed -i "s#<keep_alive_timeout>3</keep_alive_timeout>#<keep_alive_timeout>600</keep_alive_timeout>#g" /etc/clickhouse-server-1/config.xml
sed -i "s#<max_concurrent_queries>100</max_concurrent_queries>#<max_concurrent_queries>150</max_concurrent_queries>#g" /etc/clickhouse-server-1/config.xml
sed -i "s#<path>/var/lib/clickhouse/</path>#<path>$ck_mount_dir/clickhouse-1/data/</path>#g" /etc/clickhouse-server-1/config.xml
sed -i "s#<tmp_path>/var/lib/clickhouse/tmp/</tmp_path>#<tmp_path>$ck_mount_dir/clickhouse-1/data/tmp/</tmp_path>#g" /etc/clickhouse-server-1/config.xml
sed -i "s#<user_files_path>/var/lib/clickhouse/user_files/</user_files_path>#<user_files_path>$ck_mount_dir/clickhouse-1/data/user_files/</user_files_path>#g" /etc/clickhouse-server-1/config.xml
sed -i "s#<path>/var/lib/clickhouse/access/</path>#<path>$ck_mount_dir/clickhouse-1/data/access/</path>#g" /etc/clickhouse-server-1/config.xml
sed -i "s#<format_schema_path>/var/lib/clickhouse/format_schemas/</format_schema_path>#<format_schema_path>$ck_mount_dir/clickhouse-1/data/format_schemas/</format_schema_path>#g" /etc/clickhouse-server-1/config.xml
sed -i "s#<!-- <listen_host>::</listen_host> -->#<listen_host>::</listen_host>#g" /etc/clickhouse-server-1/config.xml
sed -i "s#<!-- <max_table_size_to_drop>0</max_table_size_to_drop> -->#<max_table_size_to_drop>0</max_table_size_to_drop>#g" /etc/clickhouse-server-1/config.xml
sed -i '''/<\/send_crash_reports>/a\ <default_replica_path>/clickhouse/tables/{shard}/{database}/{table}</default_replica_path>''' /etc/clickhouse-server-1/config.xml
sed -i '''/<\/send_crash_reports>/a\ <default_replica_name>{replica}</default_replica_name>''' /etc/clickhouse-server-1/config.xml
sed -i '''/<\/send_crash_reports>/a\ <compression incl="clickhouse_compression" optional="true"/>''' /etc/clickhouse-server-1/config.xml
sed -i '''/<\/send_crash_reports>/a\ <networks incl="networks" optional="true"/>''' /etc/clickhouse-server-1/config.xml
sed -i '''/<\/send_crash_reports>/a\ <macros incl="macros" optional="true" />''' /etc/clickhouse-server-1/config.xml
sed -i '''/<\/send_crash_reports>/a\ <remote_servers incl="clickhouse_remote_servers" optional="true" />''' /etc/clickhouse-server-1/config.xml
sed -i '''/<\/send_crash_reports>/a\ <zookeeper incl="zookeeper-servers" optional="true" />''' /etc/clickhouse-server-1/config.xml
sed -i '''/<\/send_crash_reports>/a\ <include_from>/etc/clickhouse-server-1/metrika.xml</include_from>''' /etc/clickhouse-server-1/config.xml
sed -i "/<interserver_http_port>9010<\/interserver_http_port>/a\ <interserver_http_host>$local_ip<\/interserver_http_host>" /etc/clickhouse-server-1/config.xml
sed -i "/<\/max_thread_pool_size>/a\ <background_distributed_schedule_pool_size>$cpu_num2<\/background_distributed_schedule_pool_size>" /etc/clickhouse-server-1/config.xml
sed -i "/<\/max_thread_pool_size>/a\ <background_schedule_pool_size>$cpu_num2<\/background_schedule_pool_size>" /etc/clickhouse-server-1/config.xml
sed -i "/<\/max_thread_pool_size>/a\ <background_pool_size>$cpu_num2<\/background_pool_size>" /etc/clickhouse-server-1/config.xml
echo -e "\033[32m $current_time 成功修改副本节点config.xml文件 \033[0m"

# 修改副本节点user.xml文件
echo -e "\033[32m $current_time 开始修改副本节点user.xml文件 \033[0m"
first=$(egrep -n '<default>' /etc/clickhouse-server/users.xml | head -1 | cut -d: -f1)
sed -i "$first a\ <max_memory_usage>$men1<\/max_memory_usage>" /etc/clickhouse-server-1/users.xml
sed -i "$first a\ <max_bytes_before_external_group_by>$men2<\/max_bytes_before_external_group_by>" /etc/clickhouse-server-1/users.xml
sed -i "$first a\ <max_execution_time>300<\/max_execution_time>" /etc/clickhouse-server-1/users.xml
sed -i "$first a\ <distributed_product_mode>local<\/distributed_product_mode>" /etc/clickhouse-server-1/users.xml
sed -i "$first a\ <async_insert>1<\/async_insert>" /etc/clickhouse-server-1/users.xml
sed -i "s#<password></password>#<password>$ck_password</password>#g" /etc/clickhouse-server-1/users.xml
sed -i "s#<!-- <access_management>1</access_management> -->#<access_management>1</access_management>#g" /etc/clickhouse-server-1/users.xml
echo -e "\033[32m $current_time 成功修改副本节点user.xml文件 \033[0m"

if [[ $replicas = 3 ]];then
# 修改副本2节点config.xml文件
echo -e "\033[32m $current_time 开始修改副本节点config.xml文件 \033[0m"
awk '/<prometheus>/{print NR-1}' /etc/clickhouse-server-2/config.xml | while read line; do sed -i "${line}d" /etc/clickhouse-server-2/config.xml; done
sed -i 's/9363/9365/g' /etc/clickhouse-server-2/config.xml
awk '/<\/prometheus>/{print NR+1}' /etc/clickhouse-server-2/config.xml | while read line; do sed -i "${line}d" /etc/clickhouse-server-2/config.xml; done
sed -i "s#<log>/var/log/clickhouse-server/clickhouse-server.log</log>#<log>$ck_mount_dir/clickhouse-2/log/clickhouse-server.log</log>#g" /etc/clickhouse-server-2/config.xml
sed -i "s#<errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>#<errorlog>$ck_mount_dir/clickhouse-2/log/clickhouse-server.err.log</errorlog>#g" /etc/clickhouse-server-2/config.xml
sed -i "s#<remote_servers>#<remote_servers_del>#g" /etc/clickhouse-server-2/config.xml
sed -i "s#</remote_servers>#</remote_servers_del>#g" /etc/clickhouse-server-2/config.xml
sed -i "s#<http_port>8123</http_port>#<http_port>8125</http_port>#g" /etc/clickhouse-server-2/config.xml
sed -i "s#<tcp_port>9000</tcp_port>#<tcp_port>9002</tcp_port>#g" /etc/clickhouse-server-2/config.xml
sed -i "s#<mysql_port>9004</mysql_port>#<mysql_port>9003</mysql_port>#g" /etc/clickhouse-server-2/config.xml
sed -i "s#<postgresql_port>9005</postgresql_port>#<postgresql_port>9008</postgresql_port>#g" /etc/clickhouse-server-2/config.xml
sed -i "s#<interserver_http_port>9009</interserver_http_port>#<interserver_http_port>9011</interserver_http_port>#g" /etc/clickhouse-server-2/config.xml
sed -i "s#<keep_alive_timeout>3</keep_alive_timeout>#<keep_alive_timeout>600</keep_alive_timeout>#g" /etc/clickhouse-server-2/config.xml
sed -i "s#<max_concurrent_queries>100</max_concurrent_queries>#<max_concurrent_queries>150</max_concurrent_queries>#g" /etc/clickhouse-server-2/config.xml
sed -i "s#<path>/var/lib/clickhouse/</path>#<path>$ck_mount_dir/clickhouse-2/data/</path>#g" /etc/clickhouse-server-2/config.xml
sed -i "s#<tmp_path>/var/lib/clickhouse/tmp/</tmp_path>#<tmp_path>$ck_mount_dir/clickhouse-2/data/tmp/</tmp_path>#g" /etc/clickhouse-server-2/config.xml
sed -i "s#<user_files_path>/var/lib/clickhouse/user_files/</user_files_path>#<user_files_path>$ck_mount_dir/clickhouse-2/data/user_files/</user_files_path>#g" /etc/clickhouse-server-2/config.xml
sed -i "s#<path>/var/lib/clickhouse/access/</path>#<path>$ck_mount_dir/clickhouse-2/data/access/</path>#g" /etc/clickhouse-server-2/config.xml
sed -i "s#<format_schema_path>/var/lib/clickhouse/format_schemas/</format_schema_path>#<format_schema_path>$ck_mount_dir/clickhouse-2/data/format_schemas/</format_schema_path>#g" /etc/clickhouse-server-2/config.xml
sed -i "s#<!-- <listen_host>::</listen_host> -->#<listen_host>::</listen_host>#g" /etc/clickhouse-server-2/config.xml
sed -i "s#<!-- <max_table_size_to_drop>0</max_table_size_to_drop> -->#<max_table_size_to_drop>0</max_table_size_to_drop>#g" /etc/clickhouse-server-2/config.xml
sed -i '''/<\/send_crash_reports>/a\ <default_replica_path>/clickhouse/tables/{shard}/{database}/{table}</default_replica_path>''' /etc/clickhouse-server-2/config.xml
sed -i '''/<\/send_crash_reports>/a\ <default_replica_name>{replica}</default_replica_name>''' /etc/clickhouse-server-2/config.xml
sed -i '''/<\/send_crash_reports>/a\ <compression incl="clickhouse_compression" optional="true"/>''' /etc/clickhouse-server-2/config.xml
sed -i '''/<\/send_crash_reports>/a\ <networks incl="networks" optional="true"/>''' /etc/clickhouse-server-2/config.xml
sed -i '''/<\/send_crash_reports>/a\ <macros incl="macros" optional="true" />''' /etc/clickhouse-server-2/config.xml
sed -i '''/<\/send_crash_reports>/a\ <remote_servers incl="clickhouse_remote_servers" optional="true" />''' /etc/clickhouse-server-2/config.xml
sed -i '''/<\/send_crash_reports>/a\ <zookeeper incl="zookeeper-servers" optional="true" />''' /etc/clickhouse-server-2/config.xml
sed -i '''/<\/send_crash_reports>/a\ <include_from>/etc/clickhouse-server-2/metrika.xml</include_from>''' /etc/clickhouse-server-2/config.xml
sed -i "/<interserver_http_port>9010<\/interserver_http_port>/a\ <interserver_http_host>$local_ip<\/interserver_http_host>" /etc/clickhouse-server-2/config.xml
sed -i "/<\/max_thread_pool_size>/a\ <background_distributed_schedule_pool_size>$cpu_num2<\/background_distributed_schedule_pool_size>" /etc/clickhouse-server-2/config.xml
sed -i "/<\/max_thread_pool_size>/a\ <background_schedule_pool_size>$cpu_num2<\/background_schedule_pool_size>" /etc/clickhouse-server-2/config.xml
sed -i "/<\/max_thread_pool_size>/a\ <background_pool_size>$cpu_num2<\/background_pool_size>" /etc/clickhouse-server-2/config.xml
echo -e "\033[32m $current_time 成功修改副本节点config.xml文件 \033[0m"

# 修改副本2节点user.xml文件
echo -e "\033[32m $current_time 开始修改副本节点user.xml文件 \033[0m"
first=$(egrep -n '<default>' /etc/clickhouse-server/users.xml | head -1 | cut -d: -f1)
sed -i "$first a\ <max_memory_usage>$men1<\/max_memory_usage>" /etc/clickhouse-server-2/users.xml
sed -i "$first a\ <max_bytes_before_external_group_by>$men2<\/max_bytes_before_external_group_by>" /etc/clickhouse-server-2/users.xml
sed -i "$first a\ <max_execution_time>300<\/max_execution_time>" /etc/clickhouse-server-2/users.xml
sed -i "$first a\ <distributed_product_mode>local<\/distributed_product_mode>" /etc/clickhouse-server-2/users.xml
sed -i "$first a\ <async_insert>1<\/async_insert>" /etc/clickhouse-server-2/users.xml
sed -i "s#<password></password>#<password>$ck_password</password>#g" /etc/clickhouse-server-2/users.xml
sed -i "s#<!-- <access_management>1</access_management> -->#<access_management>1</access_management>#g" /etc/clickhouse-server-2/users.xml
echo -e "\033[32m $current_time 成功修改副本2节点user.xml文件 \033[0m"
fi

chown -R clickhouse:clickhouse $ck_mount_dir
}

function change_remote_servers_zk_mocros()
{
cat > /etc/clickhouse-server/metrika.xml <<EOF
<?xml version="1.0"?>
<yandex>
<zookeeper-servers>
</zookeeper-servers>

<macros>
<layer>1</layer>
<shard>1</shard>
<replica>clickhouse-1-1</replica>
</macros>

<clickhouse_remote_servers>
<!-- 集群配置 3分片2副本 -->
<perftest_3shards_2replicas>
</perftest_3shards_2replicas>
</clickhouse_remote_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>
EOF

cat /etc/clickhouse-server/metrika.xml > /etc/clickhouse-server-1/metrika.xml
if [[ $replicas = 3 ]];then
cat /etc/clickhouse-server/metrika.xml > /etc/clickhouse-server-2/metrika.xml
fi
#集群主机数量
nums=${#array[@]}

# 开始修改主节点metrika.xml文件配置
echo -e "\033[32m $current_time 开始修改主节点metrika.xml文件配置 \033[0m"
for ((i=0; i<$nums; i++))
do
sed -i "/<\/perftest_3shards_2replicas>/i\ <shard>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <internal_replication>true<\/internal_replication>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <weight>1<\/weight>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <replica>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <host>${array[$i]}<\/host>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <user>default<\/user>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <password>${ck_password}<\/password>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <port>9000<\/port>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <priority>1<\/priority>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <\/replica>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <replica>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <host>${array[$i-1]}<\/host>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <user>default<\/user>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <password>${ck_password}<\/password>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <port>9001<\/port>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <priority>1<\/priority>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <\/replica>" /etc/clickhouse-server/metrika.xml
if [[ $replicas = 3 ]];then
sed -i "/<\/perftest_3shards_2replicas>/i\ <replica>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <host>${array[$i-2]}<\/host>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <user>default<\/user>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <password>${ck_password}<\/password>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <port>9002<\/port>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <priority>1<\/priority>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <\/replica>" /etc/clickhouse-server/metrika.xml
fi
sed -i "/<\/perftest_3shards_2replicas>/i\ <\/shard>" /etc/clickhouse-server/metrika.xml
done
sed -i "s#\# 集群配置 3分片2副本#\# 集群配置 ${share}分片${replicas}副本#g" /etc/clickhouse-server/metrika.xml
sed -i "s#<perftest_3shards_2replicas>#<perftest_${share}shards_${replicas}replicas>#g" /etc/clickhouse-server/metrika.xml
sed -i "s#<\/perftest_3shards_2replicas>#<\/perftest_${share}shards_${replicas}replicas>#g" /etc/clickhouse-server/metrika.xml

#read -p "请输入当前主机IP: " local_ip
for ((i=0; i<$nums; i++))
do
if [[ ${array[$i]} = $local_ip ]];then
a=$((($i+1)%$share))
fi
done
if [[ $a = 0 ]];then
a=$share
fi
sed -i "s#<shard>1<\/shard>#<shard>${a}<\/shard>#g" /etc/clickhouse-server/metrika.xml
sed -i "s#<replica>clickhouse-1-1<\/replica>#<replica>clickhouse-${a}-1<\/replica>#g" /etc/clickhouse-server/metrika.xml
#zk数量
zk_nums=${#array_zk[@]}
for ((i=0; i<$zk_nums; i++))
do
sed -i "/<\/zookeeper-servers>/i\ <node>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/zookeeper-servers>/i\ <host>${array_zk[$i]}<\/host>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/zookeeper-servers>/i\ <port>${zookeeper_port}<\/port>" /etc/clickhouse-server/metrika.xml
sed -i "/<\/zookeeper-servers>/i\ <\/node>" /etc/clickhouse-server/metrika.xml
done
echo -e "\033[32m $current_time 主节点metrika.xml文件配置完成 \033[0m"

# 开始修改副本节点metrika.xml文件配置
echo -e "\033[32m $current_time 开始修改副本节点metrika.xml文件配置 \033[0m"
for ((i=0; i<$nums; i++))
do
sed -i "/<\/perftest_3shards_2replicas>/i\ <shard>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <internal_replication>true<\/internal_replication>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <weight>1<\/weight>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <replica>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <host>${array[$i]}<\/host>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <user>default<\/user>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <password>${ck_password}<\/password>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <port>9000<\/port>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <priority>1<\/priority>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <\/replica>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <replica>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <host>${array[$i-1]}<\/host>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <user>default<\/user>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <password>${ck_password}<\/password>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <port>9001<\/port>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <priority>1<\/priority>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <\/replica>" /etc/clickhouse-server-1/metrika.xml
if [[ $replicas = 3 ]];then
sed -i "/<\/perftest_3shards_2replicas>/i\ <replica>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <host>${array[$i-2]}<\/host>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <user>default<\/user>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <password>${ck_password}<\/password>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <port>9002<\/port>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <priority>1<\/priority>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <\/replica>" /etc/clickhouse-server-1/metrika.xml
fi
sed -i "/<\/perftest_3shards_2replicas>/i\ <\/shard>" /etc/clickhouse-server-1/metrika.xml
done
sed -i "s#\# 集群配置 3分片2副本#\# 集群配置 ${nums}分片${replicas}副本#g" /etc/clickhouse-server-1/metrika.xml
sed -i "s#<perftest_3shards_2replicas>#<perftest_${nums}shards_${replicas}replicas>#g" /etc/clickhouse-server-1/metrika.xml
sed -i "s#<\/perftest_3shards_2replicas>#<\/perftest_${nums}shards_${replicas}replicas>#g" /etc/clickhouse-server-1/metrika.xml

#read -p "请输入当前主机IP: " local_ip
for ((i=0; i<$nums; i++))
do
if [[ ${array[$i]} = $local_ip ]];then
a=$((($i+2)%$share))
fi
done
if [[ $a = 0 ]];then
a=$share
fi
sed -i "s#<shard>1<\/shard>#<shard>${a}<\/shard>#g" /etc/clickhouse-server-1/metrika.xml
sed -i "s#<replica>clickhouse-1-1<\/replica>#<replica>clickhouse-${a}-2<\/replica>#g" /etc/clickhouse-server-1/metrika.xml
#zk数量
zk_nums=${#array_zk[@]}
for ((i=0; i<$zk_nums; i++))
do
sed -i "/<\/zookeeper-servers>/i\ <node>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/zookeeper-servers>/i\ <host>${array_zk[$i]}<\/host>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/zookeeper-servers>/i\ <port>${zookeeper_port}<\/port>" /etc/clickhouse-server-1/metrika.xml
sed -i "/<\/zookeeper-servers>/i\ <\/node>" /etc/clickhouse-server-1/metrika.xml
done
echo -e "\033[32m $current_time 副本1节点metrika.xml文件配置完成 \033[0m"

if [[ $replicas = 3 ]];then
# 开始修改副本2节点metrika.xml文件配置
echo -e "\033[32m $current_time 开始修改副本节点metrika.xml文件配置 \033[0m"
for ((i=0; i<$nums; i++))
do
sed -i "/<\/perftest_3shards_2replicas>/i\ <shard>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <internal_replication>true<\/internal_replication>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <weight>1<\/weight>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <replica>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <host>${array[$i]}<\/host>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <user>default<\/user>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <password>${ck_password}<\/password>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <port>9000<\/port>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <priority>1<\/priority>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <\/replica>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <replica>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <host>${array[$i-1]}<\/host>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <user>default<\/user>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <password>${ck_password}<\/password>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <port>9001<\/port>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <priority>1<\/priority>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <\/replica>" /etc/clickhouse-server-2/metrika.xml
if [[ $replicas = 3 ]];then
sed -i "/<\/perftest_3shards_2replicas>/i\ <replica>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <host>${array[$i-2]}<\/host>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <user>default<\/user>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <password>${ck_password}<\/password>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <port>9002<\/port>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <priority>1<\/priority>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/perftest_3shards_2replicas>/i\ <\/replica>" /etc/clickhouse-server-2/metrika.xml
fi
sed -i "/<\/perftest_3shards_2replicas>/i\ <\/shard>" /etc/clickhouse-server-2/metrika.xml
done
sed -i "s#\# 集群配置 3分片2副本#\# 集群配置 ${nums}分片${replicas}副本#g" /etc/clickhouse-server-2/metrika.xml
sed -i "s#<perftest_3shards_2replicas>#<perftest_${nums}shards_${replicas}replicas>#g" /etc/clickhouse-server-2/metrika.xml
sed -i "s#<\/perftest_3shards_2replicas>#<\/perftest_${nums}shards_${replicas}replicas>#g" /etc/clickhouse-server-2/metrika.xml

#read -p "请输入当前主机IP: " local_ip
for ((i=0; i<$nums; i++))
do
if [[ ${array[$i]} = $local_ip ]];then
a=$((($i+3)%$share))
fi
done
if [[ $a = 0 ]];then
a=$share
fi
sed -i "s#<shard>1<\/shard>#<shard>${a}<\/shard>#g" /etc/clickhouse-server-2/metrika.xml
sed -i "s#<replica>clickhouse-1-1<\/replica>#<replica>clickhouse-${a}-3<\/replica>#g" /etc/clickhouse-server-2/metrika.xml
#zk数量
zk_nums=${#array_zk[@]}
for ((i=0; i<$zk_nums; i++))
do
sed -i "/<\/zookeeper-servers>/i\ <node>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/zookeeper-servers>/i\ <host>${array_zk[$i]}<\/host>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/zookeeper-servers>/i\ <port>${zookeeper_port}<\/port>" /etc/clickhouse-server-2/metrika.xml
sed -i "/<\/zookeeper-servers>/i\ <\/node>" /etc/clickhouse-server-2/metrika.xml
done
echo -e "\033[32m $current_time 副本2节点metrika.xml文件配置完成 \033[0m"
fi

chown -R clickhouse:clickhouse /var/log/clickhouse*
chown -R clickhouse:clickhouse /etc/clickhouse*
chown -R clickhouse:clickhouse /usr/bin/clickhouse*
rm -rf /etc/clickhouse-server/config.d/
rm -rf /etc/clickhouse-server-1/config.d/*
rm -rf /etc/clickhouse-server-2/config.d/*
echo -e "\033[32m $current_time 副本节点metrika.xml文件配置完成 \033[0m"
}

function create_systemctl_file()
{
cat > /etc/systemd/system/clickhouse-server.service <<EOF
[Unit]
Description=ClickHouse Server (analytic DBMS for big data)
Requires=network-online.target
After=network-online.target

[Service]
Type=simple
User=clickhouse
Group=clickhouse
Restart=always
RestartSec=30
RuntimeDirectory=clickhouse-server
ExecStart=/usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml --pid-file=$ck_mount_dir/clickhouse/data/clickhouse-server.pid
LimitCORE=infinity
LimitNOFILE=500000
CapabilityBoundingSet=CAP_NET_ADMIN CAP_IPC_LOCK CAP_SYS_NICE

[Install]
WantedBy=multi-user.target
EOF

echo -e "\033[32m $current_time clickhouse-server启动文件创建完成,可以通过systemctl start|stop|restart|status clickhouse-server启停clickhouse \033[0m"

cat > /etc/systemd/system/clickhouse-server-1.service <<EOF
[Unit]
Description=ClickHouse Server (analytic DBMS for big data)
Requires=network-online.target
After=network-online.target

[Service]
Type=simple
User=clickhouse
Group=clickhouse
Restart=always
RestartSec=30
RuntimeDirectory=clickhouse-server
ExecStart=/usr/bin/clickhouse-server --config=/etc/clickhouse-server-1/config.xml --pid-file=$ck_mount_dir/clickhouse-1/data/clickhouse-server.pid
LimitCORE=infinity
LimitNOFILE=500000
CapabilityBoundingSet=CAP_NET_ADMIN CAP_IPC_LOCK CAP_SYS_NICE

[Install]
WantedBy=multi-user.target
EOF
echo -e "\033[32m $current_time clickhouse-server-1启动文件创建完成,可以通过systemctl start|stop|restart|status clickhouse-server-1启停clickhouse副本 \033[0m"

if [[ $replicas = 3 ]];then
cat > /etc/systemd/system/clickhouse-server-2.service <<EOF
[Unit]
Description=ClickHouse Server (analytic DBMS for big data)
Requires=network-online.target
After=network-online.target

[Service]
Type=simple
User=clickhouse
Group=clickhouse
Restart=always
RestartSec=30
RuntimeDirectory=clickhouse-server
ExecStart=/usr/bin/clickhouse-server --config=/etc/clickhouse-server-2/config.xml --pid-file=$ck_mount_dir/clickhouse-2/data/clickhouse-server.pid
LimitCORE=infinity
LimitNOFILE=500000
CapabilityBoundingSet=CAP_NET_ADMIN CAP_IPC_LOCK CAP_SYS_NICE

[Install]
WantedBy=multi-user.target
EOF

echo -e "\033[32m $current_time clickhouse-server-2启动文件创建完成,可以通过systemctl start|stop|restart|status clickhouse-server-2启停clickhouse副本 \033[0m"
fi
rm -rf /usr/lib/debug/usr/bin/clickhouse.debug
chown -R clickhouse.clickhouse /usr/share/clickhouse
chmod 755 /etc/systemd/system/clickhouse*
systemctl daemon-reload
systemctl start clickhouse-server.service
systemctl start clickhouse-server-1.service
if [[ $replicas = 3 ]];then
systemctl start clickhouse-server-2.service
fi
}

function init_create_user()
{
sleep 30
cls_name=`clickhouse-client --password="$ck_password" -q "show clusters;"`
clickhouse-client --password="$ck_password" -q "create user if not exists aiuap identified WITH sha256_password BY '9#Osru6xRUMBt2t' on cluster $cls_name;"
clickhouse-client --password="$ck_password" -q "GRANT alter,alter user,create USER,DROP USER, SHOW USERS ON *.* TO aiuap on cluster $cls_name;"
}

function main()
{
while true
do
menu
selector
done
}

main



    软件存放目录:
   /data/clickhouse
   把脚本 ac_install_ck_cluster.sh 跟软件放同一个目录,  本测试是: 默认是2个节点 2个分片一副本

-rwxr-xr-x 1 clickhouse clickhouse 46706 6月 21 16:27 ac_install_ck_cluster.sh
-rw-r--r-- 1 clickhouse clickhouse 101629 6月 21 16:24 clickhouse-client-23.9.1.1854-amd64.tgz
-rw-r--r-- 1 clickhouse clickhouse 281894382 6月 21 16:24 clickhouse-common-static-23.9.1.1854-amd64.tgz
-rw-r--r-- 1 clickhouse clickhouse 1153277476 6月 21 16:24 clickhouse-common-static-dbg-23.9.1.1854-amd64.tgz
-rw-r--r-- 1 clickhouse clickhouse 125819 6月 21 16:25 clickhouse-server-23.9.1.1854-amd64.tgz
-rw-r--r-- 1 clickhouse clickhouse 228 6月 21 17:04 config
[root@node2 clickhouse]# pwd
/data/clickhouse

[root@node2 clickhouse]# cat config
ips=192.168.137.64,192.168.137.68
local_ip=192.168.137.68
ck_mount_dir=/data/clickhouse
package_dir=/data/clickhouse
ck_password=1mbi0ArnRthrWXBV
share=2
replicas=2
zookeeper_ip=192.168.137.68,192.168.137.64
zookeeper_port=2181


  脚本说明

1. 该集群部署脚本⼀共包含2部分

◦ :具体安装脚本,主要包含两个功能

▪ 修改操作系统相关配置:禁⽤⼤⻚、禁⽤swap、禁⽤SElinux、禁⽤iptables、取消打开⽂

件数限制、安装依赖、关闭numa。

▪ 安装clickhouse:解压安装包执⾏初始化脚本、根据分⽚以及副本数量修改config和user配置⽂件、⽣成集群配置⽂件、创建system启动⽂件。


 config:安装模板,包含集群的环境信息(请勿更改名字)。

2. 可通过变更安装模板config的信息来改变部署集群的规格(通过修改share和replicas),如下如下的配置信息为2分⽚2副本集群。

注意:⽬前仅⽀持多分⽚2副本、多分⽚2副本两种模式;config检查请勿出现空格。

◦ ips:ck部署机器ip

◦ local_ip:当前运⾏脚本的主机ip

◦ ck_mount_dirck:ck据据⽬录

◦ package_dirck:安装包

◦ ck_password:ck数据库⽤⼾default密码

◦ share:集群分⽚数量

◦ replicas:集群分⽚下的副本数量

◦ zookeeper_ip:zk集群ip

◦ zookeeper_port:zk端⼝1 ips=192.168.137.64,192.168.137.68


脚本使⽤

1. 在需要部署的机器上解压好ck安装包,上传部署脚本,编写config⽂件。


2. 赋予脚本可执⾏的权限后,便可直接运⾏ac_install_ck_cluster.sh,选择1修改系统环境,最后⼀项为退出,需要重启才⽣效,请选择是否⽴即重启。

1 [root@py install_ck]# ./ac_install_ck_cluster.sh


 -------------------菜单功能选项------------------------

  0 显⽰功能菜单

 1 修改操作系统相关配置

  2 安装clickhouse

  3 退出7 -------------------------------------------------------

 请输⼊要操作的菜单编号[0-3],查看功能菜单输⼊0:1

  2024-07-03 16:55:10 禁⽤透明⼤⻚成功

  vm.swappiness = 1

  2024-07-03 16:55:10 禁⽤swap成功

  setenforce: SELinux is disabled

  2024-07-03 16:55:10 修改SElinux配置⽂件disabled成功

  2024-07-03 16:55:10 ⽆iptables服务

 Generating grub configuration file ...

 Found linux image: /boot/vmlinuz-3.10.0-862.14.4.el7.x86_64

 Found initrd image: /boot/initramfs-3.10.0-862.14.4.el7.x86_64.img

 Found linux image: /boot/vmlinuz-0-rescue-5003025f93c1a84914ea5ae66519c100

 Found initrd image: /boot/initramfs-0-rescue-5003025f93c1a84914ea5ae66519c100.im

done

  numa已经关闭,是否⽴即重启主机,请输⼊y或者n: y

 2024-07-03 16:55:10 主机正在重启,请稍等

 Connection closing...Socket close.

 Connection closed by foreign host.

 Disconnected from remote host(py) at 16:55:21.

    继续选择2,安装ck集群,其中在安装 clcikhouse-server 过程中提⽰为 default ⽤⼾设置密码,直

接回⻋即可,请勿输⼊密码,default密码直接从config获取。

 [root@py install_ck]# ./ac_install_ck_cluster.sh

 -------------------菜单功能选项------------------------

 0 显⽰功能菜单

 1 修改操作系统相关配置

 2 安装clickhouse

 3 退出

请输?要操作的菜单编号[0-3],查看功能菜单输 :2

2024-07-03 11:11:18 创建clickhouse数据?录成功

2024-07-03 11:11:18 创建clickhouse-1数据?录成功

2024-07-03 11:11:18 创建clickhouse?志?录成功

2024-07-03 11:11:18 创建clickhouse-1?志?录成功

2024-07-03 11:11:18 进?安装包?录成功

2024-07-03 11:11:18 开始解压压缩包

.......

2024-07-03 11:11:18 开始拷?clickhouse-1副本?录。

2024-07-03 11:11:18 默认配置?录拷?成功

2024-07-03 11:11:18 ?志?录拷?成功

2024-07-03 11:11:18 ?件数限制?件拷?成功

2024-07-03 11:11:18 默认配置?录拷?成功21 2024-07-03 11:11:18 ?志?录拷?成功

2024-07-03 11:11:18 ?件数限制?件拷?成功

2024-07-03 11:11:18 副本tmp?录创建成功

2024-07-03 11:11:18 clickhouse-1副本?录拷?完成。

2024-07-03 11:11:18 开始修改主节点config.xml?件

2024-07-03 11:11:18 成功修改主节点config.xml?件

2024-07-03 11:11:18 开始修改主节点user.xml?件

2024-07-03 11:11:18 max_memory_usage计算成功

2024-07-03 11:11:18 max_bytes_before_external_group_by计算成功

2024-07-03 11:11:18 cpu核数计算成功

2024-07-03 11:11:18 成功修改主节点user.xml?件

2024-07-03 11:11:18 开始修改副本节点config.xml?件

2024-07-03 11:11:18 成功修改副本节点config.xml?件

2024-07-03 11:11:18 开始修改副本节点user.xml?件

2024-07-03 11:11:18 max_memory_usage计算成功

2024-07-03 11:11:18 max_bytes_before_external_group_by计算成功

2024-07-03 11:11:18 cpu核数计算成功

2024-07-03 11:11:18 成功修改副本节点user.xml?件

2024-07-03 11:11:18 开始修改副本节点config.xml?件

2024-07-03 11:11:18 成功修改副本节点config.xml?件

2024-07-03 11:11:18 开始修改副本节点user.xml?件

2024-07-03 11:11:18 max_memory_usage计算成功

2024-07-03 11:11:18 max_bytes_before_external_group_by计算成功

2024-07-03 11:11:18 cpu核数计算成功

2024-07-03 11:11:18 成功修改副本2节点user.xml?件

2024-07-03 11:11:18 开始修改主节点metrika.xml?件配置

2024-07-03 11:11:18 主节点metrika.xml?件配置完成

2024-07-03 11:11:18 开始修改副本节点metrika.xml?件配置

2024-07-03 11:11:18 副本1节点metrika.xml?件配置完成

2024-07-03 11:11:18 开始修改副本节点metrika.xml?件配置

2024-07-03 11:11:18 副本2节点metrika.xml?件配置完成

2024-07-03 11:11:18 副本节点metrika.xml?件配置完成

2024-07-03 11:11:18 clickhouse-server启动?件创建完成,可以通过systemctl start|sto

2024-07-03 11:11:18 clickhouse-server-1启动?件创建完成,可以通过systemctl start|st

2024-07-03 11:11:18 clickhouse-server-2启动?件创建完成,可以通过systemctl start|st

4. 依次在需要部署的机器上执⾏上述过程即可完成部署,部署好的环境信息如下

 ##配置⽂件

[root@py etc]# ll clickhouse-server*

clickhouse-server:

-r-------- 1 clickhouse clickhouse 62839 Apr 11 11:12 config.xml

-rw-r--r-- 1 clickhouse clickhouse 3827 Apr 11 11:12 metrika.xml

 dr-x------ 2 clickhouse clickhouse 6 Apr 11 11:11 users.d8 -r-------- 1 clickhouse clickhouse 6635 Apr 11 11:12 users.xml

clickhouse-server-1:

dr-x------ 2 clickhouse clickhouse 6 Apr 11 11:12 config.d

-r-------- 1 clickhouse clickhouse 62842 Apr 11 11:12 config.xml

-rw-r--r-- 1 clickhouse clickhouse 3827 Apr 11 11:12 metrika.xml

dr-x------ 2 clickhouse clickhouse 6 Apr 11 11:11 users.d

-r-------- 1 clickhouse clickhouse 6635 Apr 11 11:12 users.xml

dr-x------ 2 clickhouse clickhouse 6 Apr 11 11:12 config.d

-r-------- 1 clickhouse clickhouse 62778 Apr 11 11:12 config.xml

-rw-r--r-- 1 clickhouse clickhouse 3827 Apr 11 11:12 metrika.xml

dr-x------ 2 clickhouse clickhouse 6 Apr 11 11:11 users.d

-r-------- 1 clickhouse clickhouse 6635 Apr 11 11:12 users.xml


 ##数据⽬录

[root@py etc]# ll /opt/

total 0

drwxr-xr-x 4 clickhouse clickhouse 29 Apr 11 11:11 clickhouse

drwxr-xr-x 4 clickhouse clickhouse 29 Apr 11 11:11 clickhouse-1

drwxr-xr-x 4 clickhouse clickhouse 29 Apr 11 11:12 clickhouse-2


 ## 查看集群信息

   clickhouse-client --user default --password  xxxxxx --port=9000

SELECT  * FROM system.clusters

Query id: 4ce02271-897f-40a2-8b68-f2468abba6a8

 ┌─cluster────────────────────┬─shard_num─┬─shard_weight─┬─replica_num─┬─

 │ perftest_2shards_1replicas │ 1 │ 1 │ 1 │ 192.168.

 │ perftest_2shards_1replicas │ 1 │ 1 │ 2 │ 192.168.

 │ perftest_2shards_1replicas │ 2 │ 1 │ 1 │ 192.168.

 │ perftest_2shards_1replicas │ 2 │ 1 │ 2 │ 192.168.



        复制表会使用相同的zookeeper路径和不同的副本名称

        

      

        相同的zookeeper路径和不同的副本名称之间会相互复制

        

     

     clickhouse分布式总表

         1.分布式总表可以通过。(分布式总表不存储任何数据)


           create table my_db.hits_distributed on cluster cluster1 as my_db.his
           engine = distributed(cluster1,my_db,hits,rand());

          集群名称:cluster1

         数据库名称:my_db

        表名:hits

       分配数据的函数:rand()    

        

       如果使用分布式总表和rand()函数会平均分配所有分片。

       


      1.建表

         

     

     创建分布式总表

         


       clickhouse测试

        

      查看数据

        


  ####测试


每个分片和副本上都创建该库,该库的名字是由参数 /etc/clickhouse-server/metrika.xml
</perftest_2shards_1replicas> --定义的
</clickhouse_remote_servers>

create database perftest_2shards_1replicas;

create table goods_cluster on cluster perftest_2shards_1replicas (id int,name String,price int)ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/perftest_2shards_1replicas/goods_cluster','{replica}') ORDER BY id;

insert into goods_cluster values(4,'测试',8888);

CREATE TABLE goods_cluster_distributed ON CLUSTER perftest_2shards_2replicas AS perftest_2shards_2replicas.goods_cluster ENGINE = Distributed(perftest_2shards_1replicas, perftest_2shards_1replicas, goods_cluster,rand());

insert into goods_cluster_distributed values(11,'测试',11111);
insert into goods_cluster_distributed values(22,'测试',22222);
insert into goods_cluster_distributed values(33,'测试',33333);


查看表的数据分布

select * from system.replicas;
select * from system.replicas where table='goods_cluster';

查看 zookeeper

select * from system.zookeeper where path in ('/');

查看表是否会同步复制
select database,table,replica_is_active from system.replicas;


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论