技术博客 技术博客
  • JAVA
  • 仓颉
  • 设计模式
  • 人工智能
  • Spring
  • Mybatis
  • Maven
  • Git
  • Kafka
  • RabbitMQ
  • RocketMQ
  • Redis
  • Zookeeper
  • Nginx
  • 数据库套件
  • MySQL
  • Elasticsearch
  • MongoDB
  • Hadoop
  • ClickHouse
  • Hbase
  • Hive
  • Flink
  • Flume
  • SQLite
  • linux
  • Docker
  • Jenkins
  • Kubernetes
  • 工具
  • 前端
  • AI
GitHub (opens new window)
  • JAVA
  • 仓颉
  • 设计模式
  • 人工智能
  • Spring
  • Mybatis
  • Maven
  • Git
  • Kafka
  • RabbitMQ
  • RocketMQ
  • Redis
  • Zookeeper
  • Nginx
  • 数据库套件
  • MySQL
  • Elasticsearch
  • MongoDB
  • Hadoop
  • ClickHouse
  • Hbase
  • Hive
  • Flink
  • Flume
  • SQLite
  • linux
  • Docker
  • Jenkins
  • Kubernetes
  • 工具
  • 前端
  • AI
GitHub (opens new window)
  • kafka

    • kafka-2.7.0 基本概念
    • Kafka-2.7.0 搭建及参数解析
    • kafka-2.7.0 spring boot 集成 kafka
    • kafka-2.7.0 kafka Connect
    • kafka-2.7.0 Kafka Streams 流处理
  • RabbitMQ

    • rabbitmq 简介
  • RocketMQ

    • RocketMQ 基础概念
    • RocketMQ 搭建
    • RocketMQ 整合spring boot
  • redis

    • Redis 介绍及安装
    • Redis 命令介绍
    • Redis 分布式锁介绍
    • Redis 事务介绍
    • Redis 的key失效通知介绍
    • Redis 配置文件解读
    • Redis 记一次宕机排查
    • Redis 高可用(一) 主从理论
    • Redis 高可用(二) 哨兵理论
    • Redis 高可用(三) 搭建
    • Redis 集群搭建
  • zookeeper

    • Zookeeper 介绍及安装
    • Zookeeper 做为锁使用
  • nginx

    • nginx-1.18.0 安装
    • nginx 常见问题总结
    • nginx 高可用
  • 数据库套件

    • MyCat 1.6.7(一)MySQL高可用及分库分表
    • MyCat 1.6.7(二)高可用及权限
      • 高可用
        • 安装
        • haproxy安装
      • 权限
        • user标签权限控制
        • privileges 标签权限控制
        • SQL拦截
        • 白名单
        • 黑名单
    • shardingsphere 4.x(一)Sharding-JDBC使用
    • shardingsphere 4.x(二)Sharding-Proxy使用
目录

MyCat 1.6.7(二)高可用及权限

# 高可用

官方建议是采用基于硬件的负载均衡器或者软件方式的 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
1
2
3
4
5
6
7
8
9
10
11
12
13

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以后版本)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

启动

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

验证负载均衡

mysql 0umycat -p123456 -h IP -P 48066
1

除了以上 haproxy 做 Mysql 的负载均衡,其实 Nginx 也可以做,Nginx1.9 以上支持 TCP 协议,需要装一个插件,具体的 Nginx 安装可以看 nginx-1.18.0 安装 (opens new window),至于 keepalived 大家可以参考 keepalived (一) 安装教程 (opens new window)。对于 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
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

# 权限

# 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>
1
2
3
4
5
6

# 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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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>
1
2
3
4
5
6
7
8
9
10
11
12

# 黑名单

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

<firewall>
   <whitehost>
      <host host="1*7.0.0.*" user="mycat"/>
   </whitehost>
    <!-- 黑名单开启 -->
    <blacklist check="true">
      <!-- 不允许使用删除操作 -->
      <property name="deleteAllow">false</property>
    </blacklist>
</firewall>
1
2
3
4
5
6
7
8
9
10
配置项 缺省值 描述
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 操作
上次更新: 6/11/2025, 4:10:30 PM
MyCat 1.6.7(一)MySQL高可用及分库分表
shardingsphere 4.x(一)Sharding-JDBC使用

← MyCat 1.6.7(一)MySQL高可用及分库分表 shardingsphere 4.x(一)Sharding-JDBC使用→

Theme by Vdoing | Copyright © 2023-2025
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式