三步将MySql数据同步到ClikeHouse

前言

有很多同学就会问,为什么MySql数据要放到ClikeHouse。有这样一个业务场景在MySQL环境中生成有关年终分析数据的大量报告,查询非常缓慢且费力。主要问题:

1.报告主要集中在两个较大的日志表(emp_Report_model,emp_details)上。

2.报告生成(过程)正在使用Count(*)语句来刺激每次调用时的聚合数据。

3.在MySQL中(使用MySQL 5.7),Count(*)非常慢,因为它需要对表中的所有行进行计数。(MySQL 8.0具有Innodb并行读取线程,可以使count(*)更快)

4.MySQL INDEX无法提供帮助,因为我们正在汇总完整的数据(每个调用中90%的数据),查询将是全表扫描(FTS)

因此Mydbops提供了一种解决方案:可以在Clickhouse的帮助下克服该问题 并将数据迁移到Clickhouse。

 

对此很多同学有疑问什么是ClikeHouse,为什么要使用ClikeHouse?

简单说一下ClickHouse是一个开源的面向列的数据库管理系统,能够使用SQL查询实时生成分析数据报告。相比MySql是关系型数据库在Count(*)上有天然的优势。

关于ClickHouse是什么请自行查阅官网:https://clickhouse.yandex/

ClickHouse官方性能测试:https://clickhouse.yandex/benchmark.html

 

测试环境准备

服务器:1台

操作系统:Centos7

安装服务:ClikeHouse,MySql,Miniconda3

 

安装Miniconda3 

安装Miniconda3

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
/root/.bashrc 

conda -V查看是否安装成功

conda -V

如果找不到conda命令,可以手动配置环境变量

PATH=$PATH:/opt/conda3/miniconda3/bin  #路径名跟自己实际情况而定
export PATH

创建Python3.6环境

conda create -n py36 python=3.6

切换环境

source activate py36

 

ClikeHouse安装

安装非常简单,可在Clickhouse官方网站上找到这些步骤。

yum install rpm-build epel-release
curl -s https://packagecloud.io/install/repositories/altinity/clickhouse/script.rpm.sh | sudo bash
yum install -y mysql-community-devel python34-devel python34-pip gcc python-devel libevent-devel gcc-c++ kernel-devel libxslt-devel libffi-devel openssl-devel python36 python36-devel python36-libs python36-tools

安装Clickhouse服务

yum install -y clickhouse-server clickhouse-client

引入最为关键的ClikeHouse-MySql

pip install clickhouse-mysql

如报以下错误

Collecting clickhouse-mysql
  Using cached clickhouse_mysql-0.0.20200128-py3-none-any.whl (56 kB)
Requirement already satisfied: setuptools in ./envs/py36/lib/python3.6/site-packages (from clickhouse-mysql) (46.0.0.post20200309)
Collecting clickhouse-driver
  Downloading clickhouse_driver-0.1.3-cp36-cp36m-manylinux2010_x86_64.whl (595 kB)
     |████████████████████████████████| 595 kB 12 kB/s 
Collecting mysql-replication
  Downloading mysql-replication-0.21.tar.gz (38 kB)
Collecting mysqlclient
  Downloading mysqlclient-1.4.6.tar.gz (85 kB)
     |████████████████████████████████| 85 kB 9.7 kB/s 
    ERROR: Command errored out with exit status 1:
     command: /opt/conda/miniconda3/envs/py36/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-je5bg2oz/mysqlclient/setup.py'"'"'; __file__='"'"'/tmp/pip-install-je5bg2oz/mysqlclient/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-install-je5bg2oz/mysqlclient/pip-egg-info
         cwd: /tmp/pip-install-je5bg2oz/mysqlclient/
    Complete output (12 lines):
    /bin/sh: mysql_config: 未找到命令
    /bin/sh: mariadb_config: 未找到命令
    /bin/sh: mysql_config: 未找到命令
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-je5bg2oz/mysqlclient/setup.py", line 16, in <module>
        metadata, options = get_config()
      File "/tmp/pip-install-je5bg2oz/mysqlclient/setup_posix.py", line 61, in get_config
        libs = mysql_config("libs")
      File "/tmp/pip-install-je5bg2oz/mysqlclient/setup_posix.py", line 29, in mysql_config
        raise EnvironmentError("%s not found" % (_mysql_config_path,))
    OSError: mysql_config not found
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

引入mysql依赖即可

yum install python-devel mysql-devel

启动ClikeHouse服务

/etc/init.d/clickhouse-server start

测试连接

clickhouse-client

 

第一步:从MySQL转储基于Clickhouse的架构结构

clickhouse-mysql  --src-host=192.168.0.20 --src-user=root --src-password=123456 --create-table-sql-template --with-create-database --src-tables=userlog_db.HttpLogInfo20200310 >HttpLogInfo20200310.sql

测试转储是否成功

less HttpLogInfo20200310.sql | grep CREATE
cat HttpLogInfo20200310.sql | head -n7

 

第二步将架构结构导入Clickhouse

这一步最容易报错,定义主键及分区列错误分区列必须是Date类型

clickhouse-client -mn < HttpLogInfo20200310.sql 

 

第三步迁移数据并保持复制同步

在进行最终同步之前,我们需要开启mysql的二进制日志

server-id = 1
binlog_format = ROW
binlog_row_image = FULL

到目前为止我们有两种方式配置复制:

  • 迁移现有数据,然后配置复制
  • 迁移现有数据并一步配置复制

 

迁移现有数据

clickhouse-mysql  --src-host=192.168.0.2  --src-user=root  --src-password=123456 --migrate-table  --src-tables=userlog_db.HttpLogInfo20200310 --dst-host=127.0.0.1  --dst-schema userlog_db  --dst-table HttpLogInfo20200310  --log-file=HttpLogInfo20200310.log
less HttpLogInfo20200310.log | grep -i migra

配置复制

clickhouse-mysql --src-host=192.168.0.12 --src-user=root --src-password=123456 --src-tables=userlog_db.HttpLogInfo20200310 --dst-host=127.0.0.1 --dst-schema userlog_db --dst-table HttpLogInfo20200310 --src-resume --src-wait --nice-pause=1 --log-level=info --csvpool --mempool-max-flush-interval=60 --mempool-max-events-num=1000 --pump-data --src-server-id=1 --log-file=HttpLogInfo20200310.log

迁移现有数据并一步配置复制,在这里,我们需要使用复制命令定义标志–migrate-table。

clickhouse-mysql --src-host=192.168.0.12 --src-user=root --src-password=123456 --src-tables=userlog_db.HttpLogInfo20200310 --dst-host=127.0.0.1 --dst-schema userlog_db --dst-table HttpLogInfo20200310 --src-resume --src-wait --nice-pause=1 --log-level=info --csvpool --mempool-max-flush-interval=60 --mempool-max-events-num=1000 --pump-data --src-server-id=1 --migrate-table --log-file=HttpLogInfo20200310.log &

 

 

 

社区交流群:964347070

posted @ 2019-09-10 17:00  sudt  阅读(689)  评论(0编辑  收藏  举报