mycat基于postgreSQL主从读写分离及mycat容器化部署
总阅读 次
mycat基于postgreSQL集群实现读写分离
写在前面
Mycat作为独立的数据库中间件,我们只需要进行相关的配置,就可以非常方便的帮我们实现水平切分、垂直切分、读写分离等功能,但PostgreSQL的主从复制需要我们通过其它方式实现。这里假设我们已经搭建好相关的环境,下面就开始我们的实践!
mycat下载地址:http://dl.mycat.org.cn
准备环境
PostgreSQL(Version : 12)主从环境搭建
对应数据库建立(以下例子中使用的都是默认存在的postgres_test数据库,可以不用额外添加)
配置server.xml
1 | <user name="postgres_app"> |
配置schema.xml
1 | <schema name="postgres_test" checkSQLschema="true" sqlMaxLimit="1000" randomDataNode="dp1"> |
踩坑记录:
1.dbDriver 属性
指定连接后端数据库使用的 Driver,目前可选的值有 native 和 jdbc。使用 native 的话,因为这个值执行的是二进制的 mysql 协议,所以可以使用 mysql 和 maridb。其他类型的数据库则需要使用 JDBC 驱动来支持
引述《Mycat权威指南》里面的原话:
从 1.6 版本开始支持 postgresql 的 native 原始协议。
如果使用 JDBC 的话需要将符合 JDBC4 标准的驱动 JAR 包放到 MYCAT\lib 目录下,并检查驱动 JAR 包中
包括如下目录结构的文件:META-INF\services\java.sql.Driver。在这个文件内写上具体的 Driver 类名,例如:
com.mysql.jdbc.Driver。
亲测当使用native协议时,即使postgresql的密码配置正确,mycat仍无法正常连接到PG,除非在PG的配置文件中忽略掉该端请求的密码校验。所以建议使用jdbc驱动,需要提前下载好postgre的jar包,直接置于mycat的lib目录下即可。
2.关于postgre的schema的配置
这个是与mysql不同的概念,postgresql中,用户创建的所有对象都被创建在指定的schema(或namespace)中。其他用户可能拥有、也可能不拥有访问这些对象的权限,甚至都不可以在对应的schema中创建对象。当未配置schema时,启动mycat,创建表时会报no schema has been selected to create in,除非在表名前指定schema,默认为public也要指定。以及查询表时也需要显式指定。这就带来了麻烦。这里schema的配置是在dataNode标签的database属性中,而实际的数据库名在writeHost和readHost的jdbc连接url中定义。
配置rule.xml
因未涉及到分库分表,仅仅读写分离,所以不需要额外配置rule规则,配置方式同mysql。
按上述配置好后,启动mycat便可以实现postgre的读写分离。
K8s容器化部署
镜像制作
MyCAT 是使用 JAVA 语言进行编程开发,使用前需要安装 JAVA 运行环境(JRE) 。
提前下载好 jdk,mycat包,以及postgre的驱动包(使用jdbc的连接方式)。
另外准备好server.xml,schema.xml,log4f2.xml三个配置文件,并已经正确配置好逻辑库,登录账户密码,postgreSQL的连接。
编写dockerfile:1
2
3
4
5
6
7
8
9
10
11
12FROM centos:centos7
ADD Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz /
ADD jdk-8u151-linux-x64.tar.gz /
ADD postgresql-42.1.4.jar /mycat/lib/
ENV JAVA_HOME /jdk1.8.0_151
ENV MYCAT_HOME /mycat
ENV PATH /usr/bin:$JAVA_HOME/bin:$MYCAT_HOME/bin:PATH
CMD mycat console
根据dockerfile生成本地镜像:
docker build -t mycat-server . (根据Dockerfile起镜像)
本地启动docker容器调试
1 | docker run -d --name mycat-server -p 8066:8066 -p 9066:9066 -v /mycat/postgres-mycat/server.xml:/mycat/conf/server.xml -v /mycat/postgres-mycat/schema.xml:/mycat/conf/schema.xml -v /mycat/postgres-mycat/log4j2.xml:/mycat/conf/log4j2.xml mycat-server |
便可以通过本地的mysql客户端连接:
mysql -h 127.0.0.1 -P 8066 -u postgres_app -pSofttek@123
####推送至镜像仓库1
2docker tag mycat-server harbor.local.irain.top/sbux/mycat
docker push harbor.local.irain.top/sbux/mycat:latest
部署k8s
1.创建项目mycat
2.在该项目下创建镜像仓库的密钥,方便拉取镜像
3.新增三个配置,用户将客制化的server.xml,schema.xml,log4f2.xml配置记载到容器的服务中
4.新建无状态服务,指定好刚刚推送的镜像
5.以及配置好使用的资源上限
6.访问的策略,暴露出8066和9066端口
7.挂载上刚刚新建的三个配置文件到容器中/mycat/conf目录下,用于替换掉原始的配置
8.待服务启动成功,配置好外网访问即可
即可通过mysql -h 172.16.98.152 -P 31062 -u postgres_app -pSofttek@123 连接测试。
关于监控
日记层面:mycat的日记文件位于 /mycat/logs/mycat.log 文件,可通过log4j2.xml配置日记等级为info或debug。sql异常或者postgre服务异常导致不可用,均在日记中有异常抛出。可采集该日记文件,基于elk做监控。
运行态:k8s容器的弹性伸缩有效的防止了一些高并发下导致的资源不足问题,其他依赖于对于服务器cpu,内存的实时监控工具。
应用端改造( springboot)
需要改用连mysql的方式去配置,Mycat会在后端做好对其它数据库的连接。
原本直连postgre配置如下:1
2
3
4
5spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:postgresql://172.16.98.236:5432/postgres_test?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8&useServerPrepStmts=true&allowMultiQueries=true
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.datasource.driver-class-name=org.postgresql.Driver
改直连mycat,使用mysql方式如下:1
2
3
4
5spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://172.16.98.152:31062/postgres_test?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8&useServerPrepStmts=true&allowPublicKeyRetrieval=true
spring.datasource.username=postgres_app
spring.datasource.password=Softtek@123
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
maven加上对于mysql的驱动依赖,其他无变动,当然如果应用部署在K8s容器平台,和mycat同一个项目下,就可通过服务名+端口8066来连接,不需要通过外网的方式访问,实验接口前后返回一致,如下:
本示例仅在java springboot框架下,其他语言框架可参考。