数据库一些收藏Mysql

MyCat 1.6.7(二)高可用及权限

2022-05-30  本文已影响0人  _大叔_

高可用

官方建议是采用基于硬件的负载均衡器或者软件方式的HAproxy,HAProxy相比LVS的使用要简单很多,功能方面也很丰富,免费开源,稳定性也是非常好,可以与LVS相媲美,根据官方文档,HAProxy可以跑满10Gbps-New benchmark of HAProxy at 10 Gbps using Myricom’s 10GbE NICs (Myri-10G PCI-Express),这个作为软件级负载均衡,也是比较惊人的,下图是HAproxy+Mycat集群+MySQL主从所组成的高可用性方案

如果还担心HAproxy的稳定性和单点问题,则可以用keepalived的VIP的浮动功能,加以强化

安装

  1. keepalived和haproxy必须装在同一台机器上(如172.17.210.210.83机器上,keepalived和haproxy都要安装),keepalived负责为该服务器抢占vip(虚拟ip),抢占到vip后,对该主机的访问可以通过原来的ip(172.17.210.210.83)访问,也可以直接通过vip(172.17.210.210.103)访问。
  2. 172.17.210.64上的keepalived也会去抢占vip,抢占vip时有优先级,配置keepalived.conf中的(priority 150 #数值愈大,优先级越高,172.17.210.64上改为120,master和slave上该值配置不同)决 定。但是一般哪台主机上的keepalived服务先启动就会抢占到vip,即使是slave,只要先启动也能抢到。
  3. haproxy负责将对vip的请求分发到mycat上。起到负载均衡的作用,同时haproxy也能检测到mycat是否存活,haproxy只会将请求转发到存活的mycat上。
  4. 如果一台服务器(keepalived+haproxy服务器)宕机,另外一台上的keepalived会立刻抢占vip并接管服务。
    如果一台mycat服务器宕机,haporxy转发时不会转发到宕机的mycat上,所以mycat依然可用。
haproxy安装
# 下载解压并安装
wget http://haproxy.1wt.eu/download/1.5/src/haproxy-1.5.18.tar.gz
tar zxvf haproxy-1.5.18.tar.gz
cd haproxy-1.5.18
# 查看READ,里面有描述 TARGET版本,安装参数等
less README
# linux26=linux 2.6(内核),linux 2628=linux2.6.28,ARCH 代表架构
make TARGET=linux310 PREFIX=/usr/local/haproxy ARCH=x86_64
make install PREFIX=/usr/local/haproxy    

# pid文件存放目录
mkdir -p /usr/data/haproxy/
vim /usr/local/haproxy/haproxy.conf

haproxy.conf

global
         log 127.0.0.1 local3        #定义haproxy日志输出设置
         log 127.0.0.1   local1 notice        
         #log loghost    local0 info # 定义haproxy 日志级别
         ulimit-n 82000              # 设置每个进程的可用的最大文件描述符
         maxconn 20480               # 默认最大连接数
         chroot /usr/local/haproxy   # chroot运行路径
         uid 99                      # 运行haproxy 用户 UID
         gid 99                      # 运行haproxy 用户组gid
         daemon                      # 以后台形式运行harpoxy
         nbproc 1                    # 设置进程数量
         pidfile /usr/local/haproxy/haproxy.pid  # haproxy 进程PID文件
         #debug                      # haproxy调试级别,建议只在开启单进程的时候调试
         #quiet

defaults
         log    global         #引入global定义的日志格式
         mode    tcp           #所处理的类别(7层代理http,4层代理tcp)
         maxconn 50000         #最大连接数
         option abortonclose   # 当haproxy负载很高时,自动结束掉当前队列处理比较久的链接
         option redispatch      #当与上游服务器的会话失败(服务器故障或其他原因)时,
                                # 把会话重新分发到其他健康的服务器上,当原来故障的服务器恢复时,
                                # 会话又被定向到已恢复的服务器上。还可以用”retries”关键字来设定在判定会话失败时的尝试连接的次数。
         retries 3             #3次连接失败就认为服务器不可用,也可以通过后面设置
         timeout connect         10s  #默认连接超时时间
         timeout client          1m   #默认客户端超时时间
         timeout server          1m   #默认服务器超时时间
         balance roundrobin           # 设置负载算法为:轮询算法rr

listen   mycat_status           # Frontend和Backend的组合体,监控组的名称,按需自定义名称 
         bind 0.0.0.0:48066              #监听端口 
         mode tcp                      # http的7层模式 tcp4层
         balance roundrobin           # 设置负载算法为:轮询算法rr
         server mycat_1 IP1:8066 check inter 10s
         server mycat_2 IP2:8066 check inter 10s

frontend admin_stats
         bind 0.0.0.0:7777    #设置监听端口,即haproxy提供的web服务端口,和lvs的vip 类似
         mode http          #http 的7层模式
         log 127.0.0.1 local3 err       #错误日志记录 
         stats refresh 5s               #每隔5秒自动刷新监控页面 
         stats uri /admin?stats         #监控页面的url访问路径 
         stats realm itnihao\ welcome   #监控页面的提示信息 
         stats auth admin:admin         #监控页面的用户和密码admin,可以设置多个用户名 
         stats auth admin1:admin1       #监控页面的用户和密码admin1 
         stats hide-version             #隐藏统计页面上的HAproxy版本信息  
         stats admin if TRUE            #手工启用/禁用,后端服务器(haproxy-1.4.9以后版本)

启动

/usr/data/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.conf

验证负载均衡

mysql 0umycat -p123456 -h IP -P 48066

除了以上 haproxy 做 Mysql 的负载均衡,其实 Nginx 也可以做,Nginx1.9 以上支持 TCP 协议,需要装一个插件,具体的 Nginx 安装可以看 nginx-1.18.0 安装,至于 keepalived 大家可以参考 keepalived(一) 安装教程。对于 haproxy 和 Nginx 性能对比,大家可以看这篇博客 https://zhuanlan.zhihu.com/p/41354937

keepalived 的配置

# 全局配置
global_defs {
    # 同一组的广播地址
   vrrp_mcast_group4 224.0.0.18
   router_id LVS_DEVEL
}

#vrrp 实例部分定义,VI_1自定义名称
vrrp_instance VI_1 {
    # 指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
    state MASTER
    # 网卡设置,lvs需要绑定在网卡上,RealServer 绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
    interface eth0
    # 虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
    virtual_router_id 51
    # 定义优先级,数字越大,优先级越高。
    priority 100
    # 设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
    advert_int 1
    # 设置验证类型和密码,两个节点必须一致
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
    virtual_ipaddress {
        192.168.200.16
    }
}

# 定义RealServer 对应的VIP及服务端口,IP和端口之间用空格隔开
virtual_server 192.168.200.16 48066 {
    # 健康检查时间间隔
    delay_loop 6
    # lvs调度算法rr wrr lc wlc lblc sh dh
    lb_algo rr
    # 负载均衡转发规则 NAT DR RUN
    lb_kind NAT
    # 同一IP的连接50秒内被分配到同一台realserver
    persistence_timeout 50
    # 使用的协议
    protocol TCP
    # 备用机,所有realserver失效后启用
    sorry_server 192.168.200.200 48066

    real_server 192.168.200.2 48066 {
        # 权重,最大越高,lvs就越优先访问
        weight 1
        # keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
        TCP_CHECK {
            # 3秒无响应超时
            connect_timeout 3
            # 重连次数3次
            retry 3
            # 重连间隔时间
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 48066 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}

权限

user标签权限控制

目前Mycat对于中间件的连续控制并没有做太复杂的控制,目前只做了中间件逻辑库级别的读写权限控制。是通过 server.xml 的 user 标签进行配置

<user name="user">
    <property name="password">user</property>
    <property name="schemas">TESTDB</property>
    <!-- 只读权限,默认false,可读可写 -->
    <property name="readOnly">true</property>
</user>

privileges 标签权限控制

在 user 标签下的 privileges 标签可以对逻辑库(schema)、表(table)进行精细化的DML权限控制。

privileges 标签下的 check 属性,如为 true 开启权限检查,为 false 不开启,默认为 false。

由于 Mycat 一个用户的 schemas 属性可配置多个逻辑库(schema),所以 privileges 的下级节点 schema 节点同样可配置多个,对多库多表进行细粒度的 DML 权限控制。

<user name="mycat" defaultAccount="true">
    <!-- 密码 -->
    <property name="password">123456</property>
    <!-- 逻辑库名称 -->
    <property name="schemas">TESTDB</property>
    <!-- 默认逻辑库  -->
    <property name="defaultSchema">TESTDB</property>
    <!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->

    <!-- 表级 DML 权限设置 -->
    <privileges check="true">
        
        <schema name="TESTDB" dml="0110" >
                <table name="tb01" dml="0000"></table>
                <table name="tb02" dml="1111"></table>
        </schema>
    </privileges>

</user>
CML权限 增加(insert) 修改(update) 查询(select) 删除(delete)
0000 禁止 禁止 禁止 禁止
0010 禁止 禁止 可以 禁止
1110 可以 可以 可以 禁止
1111 可以 可以 可以 可以

SQL拦截

firewall 标签用来定义防火墙;firewall 下 whitehost 标签用来定义 IP 白名单,blacklist 用来定义 SQL 黑名单。

白名单

可以通过设置白名单,实现某主机某用户可以访问Mycat,而其他主机用户禁止访问

<!-- 全局SQL防火墙设置 -->
<!--白名单可以使用通配符%或着*-->
<!--例如<host host="127.0.0.*" user="root"/>-->
<!--例如<host host="127.0.*" user="root"/>-->
<!--例如<host host="127.*" user="root"/>-->
<!--例如<host host="1*7.*" user="root"/>-->
<!--这些配置情况下对于127.0.0.1都能以root账户登录-->
<firewall>
   <whitehost>
      <host host="1*7.0.0.*" user="mycat"/>
   </whitehost>
</firewall>
黑名单

可以设置黑名单,实现Mycat对具体SQL操作的拦截,如增删改查等操作的拦截

<firewall>
   <whitehost>
      <host host="1*7.0.0.*" user="mycat"/>
   </whitehost>
    <!-- 黑名单开启 -->
    <blacklist check="true">
      <!-- 不允许使用删除操作 -->
      <property name="deleteAllow">false</property>
    </blacklist>
</firewall>
配置项 缺省值 描述
selectAllow true 是否允许执行SELECT语句
deleteAllow true 是否允许执行DELETE语句
updateAllow true 是否允许执行UPDATE语句
insertAllow true 是否允许执行INSERT语句
createTableAllow true 是否允许创建表
setAllow true 是否允许使用SET语句
alterTableAllow true 是否允许执行Alter Table语句
dropTableAllow true 是否允许删除表
commitAllow true 是否允许执行commit操作
rollbackAllow true 是否允许执行rollback操作
上一篇下一篇

猜你喜欢

热点阅读