SpringBoot+druid+dynamic+clickhouse+mysql实现读写分离

背景

由于系统数据量过大,查询条件自定义过多,mysql在查询时响应太慢,所以使用clickhouse作为读数据库,实现读写分离

配置mysql

这里使用mysql8.0及以上,mysql需要配置开始binlog日志,并且修改远程访问的密码加密方式
修改mysql的配置文件 vi /etc/my.cnf

	# 配置远程访问的密码加密方式
	default_authentication_plugin=mysql_native_password
	# 设置服务ID
	server-id=1
	# 开启binlog日志 用来clickhouse读取数据
	log-bin=mysql-bin
	binlog_format=ROW
	gtid-mode=on
	enforce-gtid-consistency=1 # 设置为主从强一致性
	log-slave-updates=1 # 记录日志

安装clickhouse

这里使用rpm安装,步骤为官方文档步骤

	sudo yum install -y yum-utils
	sudo yum-config-manager --add-repo https://packages.clickhouse.com/rpm/clickhouse.repo
	sudo yum install -y clickhouse-server clickhouse-client
	
	sudo /etc/init.d/clickhouse-server start

安装完成后,如果我们要使用DBeaver远程连接的方式,需要在配置文件中增加如下内容

vi /etc/clickhouse-server/config.xml
在下图所示位置加入
 <listen_host>::</listen_host>
 然后重启服务即可

在这里插入图片描述

使用可视化工具连接clickhouse

官方文档推荐了很多种工具,这里使用DBeaver
第一步 :
在这里插入图片描述
第二步 :
在这里插入图片描述
填写主机IP地址,端口,数据库可以不填,
用户名默认 : default
用户密码默认是没有的,需要密码可以配置如下 :

# 编辑clickhouse配置文件
vi /etc/clickhouse-server/users.xml

在这里插入图片描述
找到箭头所指这一块,可能会在注视中,要放开注释,填入密码,修改后要重启哦

修改clickhouse配置

vi /etc/clickhouse-server/users.xml
在下图红框位置添加如下配置
<allow_experimental_database_materialized_mysql>1</allow_experimental_database_materialized_mysql>

在这里插入图片描述

创建clickhouse的数据库并连接mysql

创建连接数据库
CREATE DATABASE IF NOT EXISTS dataBaseName
ENGINE = MaterializeMySQL('ip:port', 'mysqlDataBaseName', 'root', 'pwd')

dataBaseName : 在clickhouse创建的数据库名称
ip : 目标myql服务的IP地址
port : 目标myql服务的端口号
mysqlDataBaseName : 需要连接mysql的哪个库的名称
root : 目标mysql的账号
pwd : 目标mysql的密码

注意1: 如果需要同步的mysql的库数据量过大的话,创建clickhouse库后,需要一定时间同步,请耐心等待或者刷新可视化工具(DBeaver)查看
注意2: 需要同步的mysql的表,必须带有主键,没有主键会出现同步好数据后,查看不了数据

SpringBoot+druid+dynamic配置多数据源实现读写分离

依赖包:
druid:
		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.2</version>
        </dependency>
dynamic : 
		<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.5.0</version>
        </dependency>
clickhouse-jdbc:
		<dependency>
            <groupId>ru.yandex.clickhouse</groupId>
            <artifactId>clickhouse-jdbc</artifactId>
            <version>0.3.2</version>
        </dependency>
配置文件修改
  datasource:
    dynamic:
      primary: mysql #设置默认主数据库名
      datasource:
        mysql: #主数据库名
          driverClassName: com.mysql.cj.jdbc.Driver
          url: ${MYSQL_URL:jdbc:mysql://ip:port/zwpan_mes?useUnicode=true&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&allowMultiQueries=true}
          username: root
          password: 123456
        clickhouse:
          driverClassName: ru.yandex.clickhouse.ClickHouseDriver
          url: jdbc:clickhouse://ip:port/mes
          username: default
          password: 123456
      druid:
        initialSize: 5  #初始建立连接数量
        minIdle: 5  #最小连接数量
        maxActive: 20 #最大连接数量
        maxWait: 10000  #获取连接最大等待时间,毫秒
        testOnBorrow: true #申请连接时检测连接是否有效
        testOnReturn: false #归还连接时检测连接是否有效
        timeBetweenEvictionRunsMillis: 60000 #配置间隔检测连接是否有效的时间(单位是毫秒)
        minEvictableIdleTimeMillis: 300000  #连接在连接池的最小生存时间(毫秒)

在这里插入图片描述
在接口方法或者类上直接加@DS注解就可以指定数据源读取数据啦

注意: 可能是版本不兼容,druid版本必须1.2.2以上.dynamic版本必须3.5.0以上,否则会启动失败