MyCat的高可用及安全

一、MyCat高可用

1.MyCat高可用概述

  • 通过MyCat来实现MySQL的读写分离,从而完成MySQL集群的负载均衡
    但是以上架构存在问题,由于MyCat中间件时单节点的服务,前端客户端所有的压力过来都直接请求这一台MyCat,存在单点故障。这时就需要考虑MyCat的集群。

  • MyCat集群架构,通过MyCat来实现后端MySQL的负载均衡,再通过HAProxy来实现MyCat集群的负载均衡。
    HAProxy负责将请求分发到MyCat上,起到负载均衡的作用,同时HAProxy也能检测到MyCat是否存活,HAProxy只会将请求转发到存活的MyCat上。如果一台MyCat服务器宕机,那么HAProxy转发请求时不会转发到该宕机的MyCat上,所以MyCat依然可用。

  • HAProxy是一个开源的、高性能的基于TCP(第四层)和HTTP(第七层)应用的负载均衡软件。使用HAProxy可以快速、可靠地实现基于TCP和HTTP应用的负载均衡解决方案。
    因为客户端请求都是先到达HAProxy,再由HAProxy将请求向下转发,如果HAProxy宕机的话,就会造成整个MyCat集群不能正常运行,依然存在单点故障。

  • 实现原理

    1. HAProxy实现了MyCat多节点的集群高可用和负载均衡,而HAProxy自身的高可用则可以通过Keepalived来实现。因此,HAProxy主机上要同时安装HAProxy和Keepalived,Keepalived负责为该服务器抢占vip(虚拟ip),抢占到vip后,对该主机的访问可以通过原来的ip访问,也可以直接通过vip访问。
    2. HAProxy负责将对vip的请求分发到MyCat集群节点上,起到负载均衡的作用。同时HAProxy也能检测到MyCat是否存活,HAProxy只会将请求转发给存活的MyCat。
    3. 如果Keepalived+HAProxy高可用集群中的一台服务器宕机,集群中另外一台服务器上的Keepalived会理科抢占vip并接管服务,此时抢占了vip的HAProxy节点可以继续提供服务。
    4. 如果一台MyCat服务器宕机,HAProxy转发请求时不会转发给宕机的MyCat上,索引MyCat依然可用。
  • keepalived,是一种基于VRRP协议来实现的高可用方案,可以利用其避免单点故障。通常有两台甚至多台服务器运行Keepalived,一台为主服务器(Master),其他为备份服务器,但是对外表现为一个虚拟IP(VIP),主服务器会发送特定的消息给备份服务器,当备份服务器接收不到这个消息时,即认为主服务器宕机,备份服务器就会接管虚拟IP,继续提供服务,从而保证了整个集群的高可用。

2.搭建HAProxy

  • 将MySQL服务master1上的JDK和MyCat发送到MySQL服务master2上,进入/usr/local/目录下:
    scp -r jdk-11.0.15.1/ 192.168.126.19:$PWD
    scp -r mycat/ 192.168.126.19:$PWD
    $PWD,即跟随master1当前目录
  • 配置环境变量,编辑/etc/profile
    export JAVA_HOME=/usr/local/jdk-11.0.15.1
    export MYCAT_HOME=/usr/local/mycat
    export PATH=$PATH:$JAVA_HOME/bin:$MYCAT_HOME/bin
    
  • 生效环境变量:source /etc/profile
  • 如果出现OpenJDK,则进行如下操作:
    • 查看OpenJDK相关文件:rpm -qa |grep java
    • 卸载所有相关文件:rpm -e --nodeps 文件名
    • 生效profile文件:source /etc/profile
    • 查看jdk的版本号:java -version
  • 启动mycat:mycat start
  • 查看列表:yum list | grep haproxy
  • 在两台有mycat的服务器中,安装haproxy:yum -y install haproxy
  • 进入到 /etc/haproxy/目录下,备份haproxy.cfg:cp haproxy.cfg haproxy.cfg.bak
  • HAProxy配置文件主要由全局设定和代理设定两部分组成,包含5个域:global、default、frontend、backend、listen。
    1. global,即全局配置,通常是一些进程级别的配置,与操作系统相关。
    2. default,即默认参数配置,主要是涉及公共配置,在defaults中一次性添加。frontend、backend、listen未配置时,都可以默认使用defaults中的参数配置,若配置了则覆盖。
    3. frontend可以看做是前端接收请求的部分,内部指定后端。
    4. backend可以看作是后端服务接收请求的部分。
    5. listen是frontend和backend的组合,haproxy的监控ui可以通过这个进行配置。
  • 修改配置文件haproxy.cfg,删除原配置:vim haproxy.cfg,添加如下配置
global
  log 127.0.0.1 local0
  #log 127.0.0.1 local1 notice
  #log loghost local0 info
  maxconn 4096
  chroot /var/lib/haproxy
  pidfile /var/run/haproxy.pid
  #uid 99
  #gid 99
  daemon
  #debug
  #quiet
 
defaults
  log global
  mode tcp
  option abortonclose
  option redispatch
  retries 3
  maxconn 2000
  timeout connect 5000
  timeout client 50000
  timeout server 50000
 
listen proxy_status 
   bind :48066
    mode tcp
    balance roundrobin
    server mycat_1 192.168.126.17:8066 check inter 10s
    server mycat_2 192.168.126.19:8066 check inter 10s
frontend admin_stats 
  bind :7777
   mode http
   stats enable
   option httplog
   maxconn 10
   stats refresh 30s
   stats uri /admin
   stats auth admin:123123
   stats hide-version
   stats admin if TRUE
  • 启动HAProxy:haproxy -f /etc/haproxy/haproxy.cfg
  • 查看是否启动成功:lsof -i:7777
  • 通过浏览器访问HAProxy:192.168.126.17:7777/admin
    在弹出框输入账号密码即可访问
    在这里插入图片描述
  • 通过HAProxy访问MyCat:mysql -uroot -p123456 -h 192.168.126.17 -P 48066

3.搭建Keepalived

  • 启动另外一台HAProxy:haproxy -f /etc/haproxy/haproxy.cfg
    此时如果另外一台没有安装HAProxy,也可以通过远程拷贝,进入到etc目录:scp -r haproxy/ 192.168.126.19:$PWD

  • 查看列表:yum list | grep keepalived

  • 通过yum指令安装keepalived:yum install -y keepalived

  • 查看通过yum安装的keepalived配置文件:rpm -ql keepalived

  • 进入到/etc/keepalived目录,修改主节点192.168.126.17的配置文件:vim keepalived.conf,修改如下:

    ! Configuration File for keepalived
    global_defs {
    ## keepalived 自带的邮件提醒需要开启 sendmail 服务。建议用独立的监控或第三方 SMTP
        router_id mysql## 标识本节点的字条串,通常为 hostname
    }
    ## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。
    ## 如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。
    ## 如果脚本执行结果非 0,并且 weight 配置的值小于 0,则优先级相应的减少。
    ## 其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
    vrrp_script chk_haproxy {
        script "/etc/keepalived/haproxy_check.sh" ## 检测 haproxy 状态的脚本路径
        interval 2 ## 检测时间间隔
        weight 2 ## 如果条件成立,权重+2
    }
    ## 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
    vrrp_instance VI_1 {
        state MASTER ## 默认主设备(priority 值大的)和备用设备(priority 值小的)都设置为 BACKUP,
        ## 由 priority 来控制同时启动情况下的默认主备,否则先启动的为主设备
        interface ens33 ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同,我的是 eth3
        virtual_router_id 35 ## 虚拟路由的 ID 号,两个节点设置必须一样,可选 IP 最后一段使用,
        ## 相同的 VRID 为一个组,他将决定多播的 MAC 地址
        priority 120 ## 节点优先级,值范围 0-254, MASTER 要比 BACKUP 高
        nopreempt ## 主设备(priority 值大的)配置一定要加上 nopreempt,否则非抢占也不起作用
        advert_int 1 ## 组播信息发送间隔,两个节点设置必须一样,默认 1s
        ## 设置验证信息,两个节点必须一致
        authentication {
            auth_type PASS
            auth_pass 1111 ## 真实生产,按需求对应该过来
        }
        ## 将 track_script 块加入 instance 配置块
        track_script {
            chk_haproxy ## 检查 HAProxy 服务是否存活
        }
        ## 虚拟 IP 池, 两个节点设置必须一样
        virtual_ipaddress {
            192.168.126.200 
        }
    }
    
  • 进入到/etc/keepalived目录,修改主节点192.168.126.19的配置文件:vim keepalived.conf,修改如下:

    ! Configuration File for keepalived
    global_defs {
        router_id mysql3
    }
    vrrp_script chk_haproxy {
        script "/etc/keepalived/haproxy_check.sh"
        interval 2
        weight 2
    }
    vrrp_instance VI_1 {
        state BACKUP
        interface ens33
        virtual_router_id 35
        priority 110
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        track_script {
            chk_haproxy
        }
        virtual_ipaddress {
            192.168.126.200
        }
    }
    
  • 在两台haproxy服务器上,编写HAProxy状态检测脚本haproxy_check.sh:

    #!/bin/bash
    START_HAPROXY="/usr/sbin/haproxy start"
    STOP_HAPROXY="/usr/sbin/haproxy stop"
    LOG_FILE="/usr/local/keepalived/log/haproxy-check.log"
    HAPS=`ps -C haproxy --no-header |wc -l`
    date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE
    echo "check haproxy status" >> $LOG_FILE
    if [ $HAPS -eq 0 ];then
    echo $START_HAPROXY >> $LOG_FILE
    $START_HAPROXY >> $LOG_FILE 2>&1
    sleep 3
    if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
    echo "start haproxy failed, killall keepalived" >> $LOG_FILE
    killall keepalived
    fi
    fi
    

    即haproxy 如果停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程,keepalied将虚拟 ip 绑定到 BACKUP 机器上。

  • 给脚本加权限:chmod +x haproxy_check.sh

  • 在两台haproxy服务器上,创建keepalived日志文件夹:mkdir -p /usr/local/keepalived/log

  • 在两台haproxy服务器上,启动keepalived:service keepalived start

二、MyCat安全设置(server.xml)

1.user标签权限控制

  • 目前MyCat对于中间件的连接控制并没有做太复杂的控制,目前只做了中间件逻辑库级别的读写权限控制。是通过server.xml的user标签进行配置。
    user标签参数
    • name:应用连接中间件逻辑库的用户名
    • paasword:该用户对应的密码
    • schemas:应用当前连接的逻辑库中的其中一个;schemas可以配置一个或多个
    • readOnly:应用连接中间件逻辑库所具有的权限。true为只读,false为读写都有,默认为false。

2.privileges标签权限控制

  • 在user标签下的privileges标签可以对逻辑库(schema)、表(table)进行精细化的DML(数据库操作语言)权限控制。
  • DML权限(insert、update、select、delete)
    0代表禁止,1代表可以;分别有4种,对应上面的权限
    • 0000,全禁止
    • 0010,仅查询
    • 1000,仅插入
    • 1111,全可以

可以对指定的逻辑库及下面的表做增删改查的权限控制。

3.SQL拦截白名单(针对主机IP)

  • firewall标签用来定义防火墙;firewall下的whitehost标签用来定义IP白名单,blacklist用来定义SQL黑名单。
  • 设置了白名单,那么只有白名单内的主机IP能够访问MyCat

4.SQL拦截黑名单(针对SQL操作)

  • 所有操作的默认值为true;通过blacklist下的property标签的name属性来指定对应的拦截功能。
  • 黑名单拦截功能
    • selectAllow:是否允许执行select语句
    • selectColumnAllow:是否允许执行select *操作
    • selectIntoAllow:是否允许select语句中包含into子句
    • deleteAllow:是否允许执行delete语句
    • updateAllow:是否允许执行update语句
    • insertAllow:是否允许执行insert语句
    • replaceAllow:是否允许执行replace语句
    • createTableAllow:是否允许创建表
    • setAllow:是否允许使用set语法
    • truncateAllow:是否允许执行truncate语句
    • alterTableAllow:是否允许执行alter table语句
    • dropTableAllow:是否允许修改表
    • commitAllow:是否允许执行commit操作
    • rollbackAllow:是否允许执行rollback操作
    • useAllow:是否允许执行use语句
    • describeAllow:是否允许执行describe操作
    • showAllow:是否允许执行show语句

三、MyCat性能监控及优化

1.Mycat-web安装使用

  • Mycat-web是MyCat可视化运维的管理和监控平台。Mycat-web引入了Zookeeper作为配置中心,可以管理多个节点。
  • Mycat-web主要管理和监控Mycat的流量、连接、活动线程和内存等,具备IP白名单、邮件告警等模块,还可以统计SQL并分析慢SQL和高频SQL等。为优化SQL提供依据。
  • 通过Docker安装Zookeeper:docker run --name zk -d -p 2181:2181 zookeeper:3.7.0
  • 在mycat官网下载Mycat-web:http://dl.mycat.org.cn/mycat-web-1.0/
  • 上传该压缩包到/opt目录下,解压Mycat-web:tar -zxvf Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz -C /usr/local/
  • 修改Zookeeper的地址:vim /usr/local/mycat-web/mycat-web/WEB-INF/classes/mycat.propertieszookeeper=192.168.126.17:2181
  • 进入到/usr/local/mycat-web目录下,启动mycat-web:./start.sh &
  • 因为是jdk11,需要修改start.sh脚本的jvm参数:
    nohup java -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m  -XX:+UseG1GC   -XX:SurvivorRatio=8   -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar start.jar
    
  • 查看8082端口服务状态:lsof -i:8082
  • 通过浏览器访问mycat-web:http://192.168.126.17:8082/mycat/
  • 在mycat-web中新增mycat实例,如下
    在这里插入图片描述

2.MyCat性能调优

JVM调优

  • JAVA堆内存和直接内存映射,建议堆内存大小适度,直接映射的内存尽可能大,总计占用操作系统50%~67%的内存。
  • 示例,16G内存的服务器,MyCat堆内存为4G,直接内存映射为6G,修改文件/usr/local/mycat/bin/startup_nowrap.sh:JAVA_OPTS="-server -Xms4G -Xmx2G -XX:MaxPermSize=64m -XX:+AggressiveOpts -XX:MaxDirectMemorySize=6G"

MyCat调优

  • MyCat的所有调优参数都可以在server.xml文件中找到。
  • processors数值的影响范围。
    参数
    • processors:CPU核心数越多,可以越大,当发现系统CPU压力很小的情况下,可以适当调大此参数,如4核心的4CPU,可以设置为16;24核心的可以最大设置为128
    • processorExecutor:每个processor的线程池大小,建议是16~64,根据系统能力来测试和确定。
  • 设置连接数,最大连接数maxCon的值可以改为1000~2000,同一个MySQL实例上的所有dataNode节点共享本dataHost上的所有物理连接。

3.MyCat实施指南

  • 分库分表原则

    • 原则一:能不分就部分;
    • 原则二:分片数量尽量少
    • 原则三:分片规则需要慎重选择
    • 原则四:SQL尽量不要在一个事务中跨越多个分片
    • 原则五:查询条件尽量优化
  • 分片规则的选择,例如某个表的数据有明显的时间特征,比如订单、交易记录等,则它们通常比较适合用时间范围分片,因为它们是具有时效性的数据。

  • 数据拆分原则

    • 达到一定数量级才拆分(800W)
    • 不到800W但跟大表(超800W的表)有关联查询的表也要拆分,在此成为大表关联表
    • 小于100W的使用全局表
    • 大于100W小于800W跟大表使用同样的拆分策略

总结

  1. MyCat高可用,通过HAProxy来实现MyCat高可用。
    即Keepalived对外提供一个虚拟IP(VIP),并检测HAProxy是否宕机;Keepalived使用主从的架构,如果Keepalived的主节点宕机,则从节点会抢占虚拟IP,让抢占的从节点的HAProxy顶上;当主节点好了以后,VIP又回到主节点。如果是HAProxy宕机,则会尝试启动HAProxy,启动失败则会杀死本机的keepalived进程。
    HAProxy则检测MyCat是否存活,转发请求时会避开宕机的。MyCat则实现MySQL的读写分离、负载均衡、高可用,同时也会检测MySQL的主节点是否宕机,宕机则会进行主从切换。
    HAProxy技术的主要作用是实现MyCat的负载均衡;Keepalived技术的主要作用是对外提供一个虚拟IP(VIP)。
    即通过keepalived+HAProxy的架构来实现MyCat的高可用。
  2. 使用user标签设置用户名和密码,以及指定逻辑库和逻辑库的读写权限。
    而privileges标签可以更细粒度的做DML权限控制,即对逻辑库及下面的表做增删改查的权限控制。
    check=“true”,是指对连接的参数或者主机的信息进行检查,false则不检查。
    白名单是对指定的IP地址放行;黑名单则是对具体的SQL操作进行拦截并处理。
  3. 通过JVM调优映射的内存,总计占用操作系统50%~67%的内存。
    MyCat的分表分库技术最重要的原则是能不分就不分;达到800W数量级才拆分。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值