为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL中间件Cetus

标签:
MySQL
  • 近期由于工作需要会对一些MySQL对中间件进行一些评估,在这里也记录一下各种中间件的功能和优缺点

  • 项目地址

  • 特点

    • 高可用
    • 高性能
    • 读写分离
      读写分离版本支持的主要特点:
      1.支持读写分离
      2.支持MGR集群
      3.支持域名连接后端(可以配合目前基于域名的高可用架构)
      4.支持SSL/TLS
    
    • 分库
       分库版本的主要特点:
       1.支持读写分离
       2.支持分库
       3.支持分布式事务
       4.支持SSL/TLS
       5.支持域名连接后端(可以配合目前基于域名的高可用架构)
       6.支持MGR集群
    
    • 连接池
         在管理端口
         config set pool.default_pool_size 100 设置默认连接池
         config set pool.max_pool_size 最大连接池
         config set pool.max_resp_len 最大结果集长度
         config set pool.master_preferred 是否只允许走主库
      
    • 管理功能
      • 通过管理端口可以对实例进行配置管理,无需重启服务
  • 安装

     测试架构:
       Cetus:192.168.1.11
       MySQL-M:192.168.1.12
       MySQL-S:192.168.1.13
  • 准备:读写分离版本

      1.配置好MySQL主从
      2.建立cetus访问数据库的账号
      GRANT USAGE ON *.* TO 'cetus_app'@'192.168.1.11' identified by 'cetus_app';
      GRANT all ON `testdb`.* TO 'cetus_app'@'192.168.1.11';
      3.创建心跳库和表(用于主从延迟检测)
      create database if not exists proxy_heart_beat;
      use proxy_heart_beat;       
      CREATE TABLE if not exists `tb_heartbeat` (
       `p_id` varchar(128) NOT NULL ,
       `p_ts` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
       PRIMARY KEY (`p_id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     
      GRANT ALL ON `proxy_heart_beat`.* TO 'cetus_app'@'192.168.1.11';
      
      3.安装依赖包
      yum install cmake gcc glib2-devel flex mysql-devel gperftools-libs zlib-devel -y 
    
    • 编译安装
    wget https://github.com/cetus-tools/cetus/archive/v2.3.7.tar.gz
    tar zxf v2.3.7.tar.gz
    cd /tools/cetus-2.3.7/
    mkdir build
    cd build
    #读写分离版本
    CFLAGS='-g -Wpointer-to-int-cast' cmake ../ -DCMAKE_BUILD_TYPE=release  -DCMAKE_INSTALL_PREFIX=/home/cetus237_rw -DSIMPLE_PARSER=ON -DWITH_OPENSSL=ON
    #分库版本
    CFLAGS='-g -Wpointer-to-int-cast' cmake ../ -DCMAKE_BUILD_TYPE=release  -DCMAKE_INSTALL_PREFIX=/home/cetus237_shard -DSIMPLE_PARSER=OFF -DWITH_OPENSSL=ON
    
    make install 
    cd /home
    ln -s cetus237_rw/ cetus
    
    • 配置Cetus
    #配置文件目录:/home/cetus/conf
    #users.json 用户设置文件
    #proxy.conf 读写分离代理配置
    #sharding.json 分库规则配置(分库版)
    #shard.conf 分库版本启动配置文件(分库版)
    #variables.json 变量处理配置文件(可选)
    https://github.com/cetus-tools/cetus/blob/master/doc/cetus-rw-profile.md
    
    • user.json
    {
         "users":        [{
                         "user": "root",
                         "client_pwd":   "123456",
                         "server_pwd":   "654321"
                 }, {
                         "user": "cetus_app",
                         "client_pwd":   "123456",
                         "server_pwd":   "cetus_app"
                 }]
    }     
    # user :数据库中建立的用户名
    # client_pwd:前端应用连接cetus的密码
    # server_pwd:cetus访问数据库的密码
    
    • proxy.conf
     [cetus]
     # For mode-switch
     daemon = true
     
     # Loaded Plugins
     plugins=proxy,admin
     
     # Defines the number of worker processes.不能超过CPU个数
     #每个线程都会向后端数据库建立default-pool-size个连接
     worker-processes=1
     
     # Proxy Configuration, For example: MySQL master and salve host ip are both 192.0.0.1
     proxy-address=192.168.1.11:3306
     proxy-backend-addresses=192.168.1.12:3306
     proxy-read-only-backend-addresses=192.168.1.13:3306
     
     # Admin Configuration
     admin-address=0.0.0.0:7001
     admin-username=admin
     admin-password=admin
     
     # Backend Configuration, use test db and username created
     default-db=testdb
     default-username=cetus_app
     default-pool-size=100
     max-resp-size=10485760
     long-query-time=100
     
     # File and Log Configuration, put log in /data and marked by proxy port, /data/cetus needs to be created manually an
     d has rw authority for cetus os user
     max-open-files = 65536
     pid-file = cetus6001.pid
     plugin-dir=lib/cetus/plugins
     log-file=/home/cetus/logs/cetus_6001.log
     log-level=debug
     
     # Check salve delay
     disable-threads=false
     check-slave-delay=true
     slave-delay-down=5
     slave-delay-recover=1
     
     # For trouble
     keepalive=true
     verbose-shutdown=true
     log-backtrace-on-crash=true
     
     # For performance
     enable-tcp-stream=true
     enable-fast-stream=true
     
     # For MGR
     group-replication-mode=0
    
    
    • 启动cetus
       chmod 600 conf/proxy.conf
       bin/cetus --default-file=conf/proxy.conf
    
    • 访问cetus
       客户端访问:
       mysql -ucetus_app -p123456 -h192.168.1.11 -P3306
    
    • 管理Cetus
      mysql --prompt="cetus>" -uadmin -padmin -h192.168.1.11 -P7001    
      #用户名密码由proxy.conf文件进行配置
      
      1.用户管理
      -- cetus到mysql的用户
      update user_pwd set password='1q2w3e4r' where user='xes_test'
      -- app 到 cetus的用户
      update app_user_pwd set password='123456' where user='xes_test'
      #说明:以上操作添加或是修改了xes_test用户的后端连接密码为1q2w3e4r前端应用访问cetus的密码为123456
      -- 查看用户
      select * from user_pwd
      
      2.后端服务器管理
      -- 查看后端服务器
      select * from backends
      -- 查看后端连接状态
      select conn_details from backends
      -- 添加读写类型的后端
      add master '<ip:port>'
      -- 添加Slave
      add slave '<ip:port>'
      -- 删除后端服务器
     delete from backends where address = '<ip:port>'
     -- 修改后端状态
     update backends set (type|state)='<value>' WHERE (backend_ndx=<index>|address='<ip:port>')
     状态说明
      unknown:     后端初始状态,还未建立连接;
      up:          能与后端正常建立连接;
      down:        与后端无法联通(如果开启后端状态检测,能连通后自动变为UP);
      maintaining: 后端正在维护,无法建立连接或自动切换状态(此状态由管理员手动设置);
      deleted:      后端已被删除,无法再建立连接。
    
  • 不支持的操作

  1.不支持批量SQL语句
  2.不支持TLS
  3.不支持将LAST_INSERT_ID 嵌套在INSERT或者其他的语句中
  4.不支持客户端的change user命令
  
  https://github.com/cetus-tools/cetus/blob/master/doc/cetus-constraint.md
  • 思考
    • 数据库用户授权只需要对cetus服务IP授权,怎么在Cetus端控制可访问数据库的IP白名单?
      Proxy端口IP白名单
      show allow_ip #查看IP白名单
      add allow_ip "cetus@192.168.1.*" #允许cetus用户从192.168.1网段访问
      delete allow_ip "cetus@192.168.1.*" #删除cetus白名单
      
      Proxy端口IP黑名单
      show deny_ip
      add deny_ip "cetus@192.168.1.*" #拒绝用户cetus从192.168.1.网段访问
      delete deyn_ip "cetus@192.168.1.*" #删除cetus用户IP黑名单 
    
    • 一个proxy是否可以管理多个集群?
    • 如何解决cetus 本身单点问题
       cetus没有原生的集群部署方案,只能通过部署多个cetus实例来保证高可用,这就需要解决几个问题:
       1.同一MySQL集群的多个cetus之间的配置统一问题
         (需要开发cetus控制平台对多个cetus进行多写)
       2.当某一个cetus不可访问时如何从cetus的可访问列表问摘除的问题
         (cetus1--keepalived--cetus2--keepalived---cetus3)
         
       
    
    • 对于延迟敏感的应用户如何处理强制读主库?
       使用注释/*#mode=READWRITE*/可强行路由到主库
    
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
数据库工程师
手记
粉丝
1.5万
获赞与收藏
721

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消