文章目录
  1. 1. mycat基于postgreSQL集群实现读写分离
    1. 1.0.1. 写在前面
    2. 1.0.2. 准备环境
    3. 1.0.3. 配置server.xml
    4. 1.0.4. 配置schema.xml
    5. 1.0.5. 配置rule.xml
  • 2. K8s容器化部署
    1. 2.0.1. 镜像制作
    2. 2.0.2. 本地启动docker容器调试
    3. 2.0.3. 部署k8s
    4. 2.0.4. 关于监控
  • 3. 应用端改造( springboot)
  • mycat基于postgreSQL集群实现读写分离

    写在前面

      Mycat作为独立的数据库中间件,我们只需要进行相关的配置,就可以非常方便的帮我们实现水平切分、垂直切分、读写分离等功能,但PostgreSQL的主从复制需要我们通过其它方式实现。这里假设我们已经搭建好相关的环境,下面就开始我们的实践!

    mycat下载地址:http://dl.mycat.org.cn

    准备环境

    PostgreSQL(Version : 12)主从环境搭建

    对应数据库建立(以下例子中使用的都是默认存在的postgres_test数据库,可以不用额外添加)

    配置server.xml

    1
    2
    3
    4
    5
    6
    <user name="postgres_app">
    <property name="password">Softtek@123</property>
    <property name="schemas">postgres_test</property>
    <property name="readOnly">false</property>
    <property name="defaultSchema">postgres_test</property>
    </user>

    配置schema.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <schema name="postgres_test" checkSQLschema="true" sqlMaxLimit="1000" randomDataNode="dp1">
    <table name="test_ms" dataNode="dp1" />
    </schema>

    <dataNode name="dp1" dataHost="postgres1" database="public" />

    <!-- 数据源 -->
    <dataHost name="postgres1" maxCon="2000" minCon="10" balance="3" writeType="0" dbType="postgresql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
    <heartbeat>select user</heartbeat>
    <!-- can have multi write hosts -->
    <writeHost host="hostM1" url="jdbc:postgresql://172.16.98.236:5432/postgres_test" user="postgres" password="postgres">
    <!-- 读库 -->
    <readHost host="hostS1" url="jdbc:postgresql://172.16.98.239:5432/postgres_test" user="postgres" password="postgres" />
    </writeHost>
    </dataHost>

    踩坑记录:
    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
    12
    FROM 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
    2
    docker tag mycat-server harbor.local.irain.top/sbux/mycat
    docker push harbor.local.irain.top/sbux/mycat:latest

    部署k8s

    1.创建项目mycat
    image

    2.在该项目下创建镜像仓库的密钥,方便拉取镜像
    image

    3.新增三个配置,用户将客制化的server.xml,schema.xml,log4f2.xml配置记载到容器的服务中
    image

    4.新建无状态服务,指定好刚刚推送的镜像
    image

    5.以及配置好使用的资源上限
    image

    6.访问的策略,暴露出8066和9066端口
    image

    7.挂载上刚刚新建的三个配置文件到容器中/mycat/conf目录下,用于替换掉原始的配置
    image

    8.待服务启动成功,配置好外网访问即可
    image

    即可通过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
    5
    spring.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
    5
    spring.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

    image

    maven加上对于mysql的驱动依赖,其他无变动,当然如果应用部署在K8s容器平台,和mycat同一个项目下,就可通过服务名+端口8066来连接,不需要通过外网的方式访问,实验接口前后返回一致,如下:

    image

    本示例仅在java springboot框架下,其他语言框架可参考。

    文章目录
    1. 1. mycat基于postgreSQL集群实现读写分离
      1. 1.0.1. 写在前面
      2. 1.0.2. 准备环境
      3. 1.0.3. 配置server.xml
      4. 1.0.4. 配置schema.xml
      5. 1.0.5. 配置rule.xml
  • 2. K8s容器化部署
    1. 2.0.1. 镜像制作
    2. 2.0.2. 本地启动docker容器调试
    3. 2.0.3. 部署k8s
    4. 2.0.4. 关于监控
  • 3. 应用端改造( springboot)