SpringBoot+druid+dynamic+clickhouse+mysql实现读写分离
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以上,否则会启动失败