• Mycat【Java提高】


    前言


    2022/8/23 8:41


    暑假持续学习ing


    推荐

    【尚硅谷】Mycat核心教程(mycat实战应用)

    Mycat的使用_尚硅谷视频学习笔记

    Mycat

    资源下载

    尚硅谷mycat配套资源.7z

    第一章 入门概述

    1.1 是什么

    Mycat是数据库中间件

    1、数据库中间件

    中间件:是一类连接软件和应用的计算机软件,以便软件各部件之间的沟通。
    例子:Tomcat, web中间件。
    数据库中间件:连接java应用的应用程序和数据库。

    2、为什么要用Mycat?

    1、java与数据库紧耦合
    2、高访问量高并发对数据库的压力
    3、读写请求数据不一致

    在这里插入图片描述

    3、数据库中间件对比

    在这里插入图片描述
    Cobar 属于阿里B2B事业群,始于2008年,在阿里服役3年多,接管3000+个MySQL数据库的schema,集群日处理在线SQL请求50亿次以上。由于Cobar发起人的离职,Cobar停止维护。

    Mycat 是开源社区在阿里cobar基础上进行二次开发,解决了cobar存在的问题,并且加入了许多新的功能在其中。青出于蓝而胜于蓝。

    OneProxy 基于MySQL官方的proxy思想利用c语言进行开发的,OneProxy是一款商业 收费 的中间件。舍弃了一些功能,专注在性能和稳定性上

    kingshard 由小团队用go语言开发,还需要发展,需要不断完善。

    Vitess 是Youtube生产在使用,架构很复杂。不支持MySQL原生协议,使用 需要大量改造成本

    Atlas 是360团队基于mysql proxy改写,功能还需完善,高并发下不稳定。

    MaxScale 是mariadb(MySQL原作者维护的一个版本) 研发的中间件

    MySQLRoute 是MySQL官方Oracle公司发布的中间件

    4、Mycat的官网

    http://www.mycat.io/

    http://dl.mycat.io

    1.2 干什么

    1、读写分离

    在这里插入图片描述
    在这里插入图片描述

    2、数据分片

    垂直拆分(分库)、 水平拆分(分表)、 垂直+水平拆分(分库分表)

    在这里插入图片描述
    1224

    3、多数据源整合
    1233

    1.3 原理

    Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库, 并将返回的结果做适当的处理,最终再返回给用户。

    在这里插入图片描述

    这种方式把数据库的分布式从代码中解耦出来,程序员察觉不出来后台使用 Mycat 还是MySQL。

    第二章 安装启动

    Linux下安装几种方法
    1、rpm万式
    	.rpm安装包,按顺序安装
    2、yum方式
    	需要连网
    3、解压后既可使用
    4、解压后编译安装
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.1 安装

    对应mysql5.7
    mysq8.0不好弄

    准备工作

    下载地址:https://github.com/MyCATApache
    下载版本:Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

    下载地址:http://dl.mycat.org.cn/1.6-RELEASE/
    源自Mycat-安装教程

    在这里插入图片描述

    克隆虚拟机【Linux】

    两个虚拟机
    mysql1  139 主机
    mysqlS1 140 从机
    
    
    • 1
    • 2
    • 3
    • 4

    1、 解压后即可使用:解压缩文件拷贝到 linux 下 /usr/local/

    解压

    [root@centos7-mysql-1 ~]# cd /opt
    [root@centos7-mysql-1 opt]# ll
    总用量 1560
    -rw-r--r--. 1 root root 1597440 823 10:59 Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
    drwxr-xr-x. 2 root root       6 1031 2018 rh
    [root@centos7-mysql-1 opt]# tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 
    mycat/bin/wrapper-linux-ppc-64
    mycat/bin/wrapper-linux-x86-64
    mycat/bin/wrapper-linux-x86-32
    mycat/bin/mycat
    mycat/lib/zookeeper-3.4.6.jar
    mycat/lib/jline-0.9.94.jar
    mycat/lib/ehcache-core-2.6.11.jar
    mycat/lib/log4j-1.2.17.jar
    mycat/lib/fastjson-1.2.12.jar
    mycat/lib/curator-client-2.11.0.jar
    mycat/lib/joda-time-2.9.3.jar
    mycat/lib/log4j-slf4j-impl-2.5.jar
    mycat/lib/libwrapper-linux-x86-32.so
    mycat/lib/netty-3.7.0.Final.jar
    mycat/lib/druid-1.0.26.jar
    mycat/lib/log4j-api-2.5.jar
    mycat/lib/mapdb-1.0.7.jar
    mycat/lib/slf4j-api-1.6.1.jar
    mycat/lib/univocity-parsers-2.2.1.jar
    mycat/lib/hamcrest-core-1.3.jar
    mycat/lib/Mycat-server-1.6-RELEASE.jar
    mycat/lib/objenesis-1.2.jar
    mycat/lib/leveldb-api-0.7.jar
    mycat/lib/hamcrest-library-1.3.jar
    mycat/lib/wrapper.jar
    mycat/lib/commons-lang-2.6.jar
    mycat/lib/reflectasm-1.03.jar
    mycat/lib/mongo-java-driver-2.11.4.jar
    mycat/lib/guava-19.0.jar
    mycat/lib/curator-recipes-2.11.0.jar
    mycat/lib/curator-framework-2.11.0.jar
    mycat/lib/libwrapper-linux-ppc-64.so
    mycat/lib/log4j-core-2.5.jar
    mycat/lib/leveldb-0.7.jar
    mycat/lib/sequoiadb-driver-1.12.jar
    mycat/lib/mysql-binlog-connector-java-0.4.1.jar
    mycat/lib/kryo-2.10.jar
    mycat/lib/jsr305-2.0.3.jar
    mycat/lib/commons-collections-3.2.1.jar
    mycat/lib/disruptor-3.3.4.jar
    mycat/lib/log4j-1.2-api-2.5.jar
    mycat/lib/velocity-1.7.jar
    mycat/lib/libwrapper-linux-x86-64.so
    mycat/lib/dom4j-1.6.1.jar
    mycat/lib/minlog-1.2.jar
    mycat/lib/asm-4.0.jar
    mycat/conf/wrapper.conf
    mycat/conf/
    mycat/conf/zkconf/
    mycat/conf/zkdownload/
    mycat/conf/sequence_time_conf.properties
    mycat/conf/sharding-by-enum.txt
    mycat/conf/migrateTables.properties
    mycat/conf/zkconf/sequence_time_conf.properties
    mycat/conf/zkconf/sharding-by-enum.txt
    mycat/conf/zkconf/ehcache.xml
    mycat/conf/zkconf/index_to_charset.properties
    mycat/conf/zkconf/partition-range-mod.txt
    mycat/conf/zkconf/sequence_db_conf.properties
    mycat/conf/zkconf/sequence_time_conf-mycat_fz_01.properties
    mycat/conf/zkconf/cacheservice.properties
    mycat/conf/zkconf/partition-hash-int.txt
    mycat/conf/zkconf/autopartition-long.txt
    mycat/conf/zkconf/server-mycat_fz_01.xml
    mycat/conf/zkconf/auto-sharding-long.txt
    mycat/conf/zkconf/rule.xml
    mycat/conf/zkconf/auto-sharding-rang-mod.txt
    mycat/conf/zkconf/sequence_distributed_conf.properties
    mycat/conf/zkconf/sequence_distributed_conf-mycat_fz_01.properties
    mycat/conf/zkconf/sequence_conf.properties
    mycat/conf/zkconf/schema.xml
    mycat/conf/zkconf/server.xml
    mycat/conf/ehcache.xml
    mycat/conf/index_to_charset.properties
    mycat/conf/partition-range-mod.txt
    mycat/conf/sequence_db_conf.properties
    mycat/conf/cacheservice.properties
    mycat/conf/partition-hash-int.txt
    mycat/conf/autopartition-long.txt
    mycat/conf/auto-sharding-long.txt
    mycat/conf/rule.xml
    mycat/conf/auto-sharding-rang-mod.txt
    mycat/conf/sequence_distributed_conf.properties
    mycat/conf/sequence_conf.properties
    mycat/conf/myid.properties
    mycat/conf/schema.xml
    mycat/conf/zkdownload/auto-sharding-long.txt
    mycat/conf/server.xml
    mycat/version.txt
    mycat/conf/log4j2.xml
    mycat/bin/init_zk_data.sh
    mycat/bin/startup_nowrap.sh
    mycat/bin/dataMigrate.sh
    mycat/bin/rehash.sh
    mycat/logs/
    mycat/catlet/
    [root@centos7-mysql-1 opt]# 
    
    [root@centos7-mycat opt]# ll
    总用量 1560
    drwxr-xr-x. 4 root root      28 823 11:02 mycat
    -rw-r--r--. 1 root root 1597440 823 10:59 Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
    drwxr-xr-x. 2 root root       6 1031 2018 rh
    [root@centos7-mysql-1 opt]# 
    
    
    
    • 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
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112

    拷贝

    [root@centos7-mycat opt]# cp -r mycat /usr/local/
    [root@centos7-mycat opt]# cd /usr/local/
    [root@centos7-mycat local]# ll
    总用量 0
    drwxr-xr-x. 2 root root  6 411 2018 bin
    drwxr-xr-x. 2 root root  6 411 2018 etc
    drwxr-xr-x. 2 root root  6 411 2018 games
    drwxr-xr-x. 2 root root  6 411 2018 include
    drwxr-xr-x. 2 root root  6 411 2018 lib
    drwxr-xr-x. 2 root root  6 411 2018 lib64
    drwxr-xr-x. 2 root root  6 411 2018 libexec
    drwxr-xr-x. 4 root root 28 823 11:04 mycat
    drwxr-xr-x. 2 root root  6 411 2018 sbin
    drwxr-xr-x. 5 root root 49 725 15:35 share
    drwxr-xr-x. 2 root root  6 411 2018 src
    
    [root@centos7-mysql-1 local]# cd mycat
    [root@centos7-mysql-1 mycat]# ll
    总用量 12
    drwxr-xr-x. 2 root root  209 823 11:33 bin
    drwxr-xr-x. 2 root root    6 823 11:33 catlet
    drwxr-xr-x. 4 root root 4096 823 11:33 conf
    drwxr-xr-x. 2 root root 4096 823 11:33 lib
    drwxr-xr-x. 2 root root    6 823 11:33 logs
    -rwxr-xr-x. 1 root root  217 823 11:33 version.txt
    [root@centos7-mysql-1 mycat]# 
    
    
    
    
    
    • 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

    2、 三个配置文件

    [root@centos7-mysql-1 mycat]# cd conf
    
    
    • 1
    • 2

    ① schema.xml: 定义逻辑库,表、分片节点等内容
    ② rule.xml: 定义分片规则
    ③ server.xml: 定义用户以及系统相关变量,如端口等

    2.2 启动

    1、 修改配置文件server.xml

    修改root用户信息name改为mycat,与MySQL区分, 如下:
    在这里插入图片描述

    
    mycat 用户 密码 123456
    …
    <user name="mycat">
    <property name="password">123456property>
    <property name="schemas">TESTDBproperty> 逻辑库
    user>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述
    2、修改配置文件 schema.xml

    删除< schema>标签间的表信息, < dataNode>标签只留一个,< dataHost> 标签只留一个, < WriteHost>< ReadHost>只留一对

    :set nu #vim 显示行号
    : d 27  #vim 删除从6到32
    dd #vim 删除当前行
    
    • 1
    • 2
    • 3
      <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
      </schema>
    
    
    • 1
    • 2
    • 3

    注意

    testdb 用于mycat操作真实数据库
    writeHost mysql root的密码是123456(我自己的)
    readHost  mysql root的密码是123456(我自己的)
    
    • 1
    • 2
    • 3

    完整

    
    DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    
            <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
            schema>
            <dataNode name="dn1" dataHost="host1" database="testdb" />
            <dataHost name="host1" maxCon="1000" minCon="10" balance="0"
                              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                    <heartbeat>select user()heartbeat>
                    
                    <writeHost host="hostM1" url="192.168.253.139:3306" user="root"
                                       password="123456">
                            
                            <readHost host="hostS1" url="192.168.253.140:3306" user="root" password="123456" />
                    writeHost>
            dataHost>
    mycat:schema>
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    另外:在wrapper.conf配置文件 添加

    wrapper.ping.timeout=120
    wrapper.startup.timeout=300
    
    • 1
    • 2

    3、 验证数据库访问情况
    Mycat 作为数据库中间件要和数据库部署在不同机器上,所以要验证远程访问情况。

    mysql -uroot -p123123 -h 192.168.140.128 -P 3306
    mysql -uroot -p123123 -h 192.168.140.127 -P 3306
    #如远程访问报错,请建对应用户
    grant all privileges on *.* to root@'缺少的host' identified by '123123';
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    root 密码123456

    远程访问 140 OK
    在这里插入图片描述
    远程访问 139 OK
    在这里插入图片描述

    4、 启动程序

    ① 控制台启动 : 去 mycat/bin 目录下执行 ./mycat console
    ② 后台启动 :去 mycat/bin 目录下 ./mycat start

    为了能第一时间看到启动日志,方便定位问题,我们选择①控制台启动。

    linux中六个特殊目录,不用加./
    bin       usr/bin    usr/local/bin
    sbin      usr/sbin   usr/local/sbin
    
    
    • 1
    • 2
    • 3
    • 4
    [root@centos7-mysql-1 /]# cd /usr/local/mycat/bin
    [root@centos7-mysql-1 bin]# ./mycat console
    ---
    jvm 1    | MyCAT Server startup successfully. see logs in logs/mycat.log
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5、 启动时可能出现报错

    如果操作系统是 CentOS6.8, 可能会出现域名解析失败错误,如下图

    在这里插入图片描述
    可以按照以下步骤解决
    ① 用 vim 修改 /etc/hosts 文件, 在 127.0.0.1 后面增加你的机器名
    请添加图片描述
    ② 修改后重新启动网络服务

    请添加图片描述

    2.3 登录

    1、登录后台管理窗口

    此登录方式用于管理维护 Mycat

    mysql -umycat -p123456 -P 9066 -h 192.168.253.132
    #常用命令如下:
    show database
    
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    show @@help;
    
    • 1

    在这里插入图片描述
    在这里插入图片描述

    2、登录数据窗口
    此登录方式用于通过 Mycat 查询数据,我们选择这种方式访问 Mycat

    mysql -umycat -p123456 -P 8066 -h 192.168.253.132   --default_auth=mysql_native_password
    
    • 1

    mysql8.0以上的版本,后边再加上 --default-auth=mysql_native_password

    [root@centos7-mysql-1 conf]# mysql -umycat -p123456 -h 192.168.253.132 -P 8066   --default-auth=mysql_native_password
    
    
    • 1
    • 2

    参考
    mysql 8驱动使用mycat_Mycat 整合 MySQL 8.x 踩坑实践
    总结一下mysql8使用mycat做主从复制的坑
    CentOS7 mycat 连接mysql8.x 配置及报错解决

    解决方法一:使用8.0的驱动&配置

    
    DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    
            <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
            schema>
            <dataNode name="dn1" dataHost="host1" database="testdb" />
            <dataHost name="host1" maxCon="1000" minCon="10" balance="0"
                              writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
                    <heartbeat>select user()heartbeat>
                    
                    <writeHost host="hostM1" url="jdbc:mysql://192.168.253.139:3306?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC" user="root"
                                       password="123456">
                            
                            <readHost host="hostS1" url="jdbc:mysql://192.168.253.140:3306?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC" user="root" password="123456" />
                    writeHost>
            dataHost>
    mycat:schema>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述

    解决方法二:使用5.7

    8.0报错,我后面使用5.7
    在这里插入图片描述

    第三章 搭建读写分离

    我们通过 Mycat 和 MySQL 的主从复制配合搭建数据库的读写分离, 实现 MySQL 的高可用性。我们将搭建:一主一从、双主双从两种读写分离模式。

    3.1 一主一从

    一个主机用于处理所有写请求,一台从机负责所有读请求,架构图如下

    0056

    1、 搭建 MySQL 数据库主从复制

    ① MySQL 主从复制原理
    0217

    如果你是克隆虚拟机
    请把mysql服务的UUID修改一下

    vim /var/lib/mysql/auto.cnf
    
    systemctl restart mysqld
    
    • 1
    • 2
    • 3

    否则会报错
    在这里插入图片描述

    ② 主机配置

    修改配置文件: vim /etc/my.cnf
    #主服务器唯一ID
    server-id=1
    #启用二进制日志
    log-bin=mysql-bin
    # 设置不要复制的数据库(可设置多个)
    binlog-ignore-db=mysql
    binlog-ignore-db=information_schema
    #设置需要复制的数据库
    binlog-do-db=testdb#需要复制的主数据库名字(还没创建的)
    #设置logbin格式
    binlog_format=STATEMENT
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    binlog 日志三种格式

    0311

    ③ 从机配置

    修改配置文件: vim /etc/my.cnf
    #从服务器唯一ID
    server-id=2
    #启用中继日志
    relay-log=mysql-relay
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    ④ 主机、从机重启 MySQL 服务

     systemctl restart mysqld
     systemctl status mysqld
    
    • 1
    • 2

    ⑤ 主机从机都关闭防火墙

    systemctl status firewalld
    ● firewalld.service - firewalld - dynamic firewall daemon
       Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
       Active: inactive (dead)
         Docs: man:firewalld(1)
    [root@centos7-mysql-2 bin]# 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    ⑥ 在主机上建立帐户并授权 slave

    #在主机MySQL里执行授权命令
    GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123123';
    
    • 1
    • 2
    #查询master的状态
    show master status;
    
    • 1
    • 2

    在这里插入图片描述

    #记录下File和Position的值
    #执行完此步骤后不要再操作主服务器MySQL,防止主服务器状态值变化
    
    
    • 1
    • 2
    • 3

    ⑦ 在从机上配置需要复制的主机

    #复制主机的命令
    CHANGE MASTER TO MASTER_HOST='主机的IP地址',
    MASTER_USER='slave',
    MASTER_PASSWORD='123123',
    MASTER_LOG_FILE='mysql-bin.具体数字',MASTER_LOG_POS=具体值;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    #复制主机的命令
    CHANGE MASTER TO MASTER_HOST='192.168.253.132',
    MASTER_USER='slave',
    MASTER_PASSWORD='123123',
    MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=430;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    如果出现以下错误,说明已经过配置主从复制

    #先结束
    stop slave;
    #再重新启动
    reset slave;
    #再去执行
    复制主机的命令
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    #启动从服务器复制功能
    start slave;
    #查看从服务器状态
    show slave status\G;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    #下面两个参数都是Yes,则说明主从配置成功!
    # Slave_IO_Running: Yes
    # Slave_SQL_Running: Yes
    
    
    • 1
    • 2
    • 3
    • 4

    如果出现以下错误
    我的是克隆虚拟机,所以mysql的服务uuid一样
    在这里插入图片描述

    必须先停止

    stop slave
    
    • 1

    修改MySQL Server 的UUID方式:

    vim /var/lib/mysql/auto.cnf
    
    systemctl restart mysqld
    
    • 1
    • 2
    • 3

    ⑧ 主机新建库、新建表、 insert 记录, 从机复制

    主机

    mysql> create database testdb;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> use testdb;
    Database changed
    mysql>  create table mytbl(id int,name varchar(20));
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> insert into mytbl values (1,'zhang3');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from mytbl;
    +------+--------+
    | id   | name   |
    +------+--------+
    |    1 | zhang3 |
    +------+--------+
    1 row in set (0.00 sec)
    
    mysql> 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    从机

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | dbtest1            |
    | dbtest2            |
    | mysql              |
    | performance_schema |
    | sys                |
    | testdb             |
    +--------------------+
    7 rows in set (0.01 sec)
    
    mysql> use testdb;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> select * from mytbl;
    +------+--------+
    | id   | name   |
    +------+--------+
    |    1 | zhang3 |
    +------+--------+
    1 row in set (0.00 sec)
    
    mysql> 
    
    
    • 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

    ⑨ 如何停止从服务复制功能

    stop slave;
    
    • 1

    ⑩ 如何重新配置主从

    stop slave;
    reset master;
    
    • 1
    • 2

    启动mycat
    登录mycat用户
    在这里插入图片描述
    2、 修改 Mycat 的配置文件 schema.xml

    之前的配置已分配了读写主机,是否已实现读写分离?

    验证读写分离
    (1) 在写主机插入: insert into mytbl values (1,@@hostname);
    主从主机数据不一致了
    (2) 在Mycat里查询: select * from mytbl;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    写主机
    在这里插入图片描述
    读从机
    在这里插入图片描述

    mycat查询的是写主机了,应该是读从机
    在这里插入图片描述
    修改的balance属性,通过此属性配置读写分离的类型

    负载均衡类型,目前的取值有4 种:
    (1) balance="0", 不开启读写分离机制, 所有读操作都发送到当前可用的 writeHost 上。
    (2) balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从
    模式(M1->S1, M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1,S2 都参与 select 语句的负载均衡。
    (3) balance="2",所有读操作都随机的在 writeHost、 readhost 上分发。
    (4) balance="3",所有读请求随机的分发到 readhost 执行, writerHost 不负担读压力
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    为了能看到读写分离的效果,把balance设置成2, 会在两个主机间切换查询
    先停止mycat,再去修改
    在这里插入图片描述

    3、 启动 Mycat

    4、 验证读写分离
    在这里插入图片描述

    3.2 双主双从

    一个主机 m1 用于处理所有写请求, 它的从机 s1 和另一台主机 m2 还有它的从机 s2 负责所有读请求。当 m1 主机宕机后, m2 主机负责写请求, m1、 m2 互为备机。 架构图如下

    0240

    编号角色IP地址机器名
    1Master1192.168.253.132mysql2
    2Slavel192.168.253.133mysqlS2-1
    3Master2 .192.168.253.134.mysql2-2
    4Slave2 .192.168.253.135,mysqlS2-2

    1、 搭建 MySQL 数据库主从复制(双主双从)

    先结束一主一从

    stop slave;
    reset master;
    
    • 1
    • 2

    删除dbtest

    ① 双主机配置

    Master1配置

    修改配置文件: vim /etc/my.cnf
    #主服务器唯一ID
    server-id=1
    #启用二进制日志
    log-bin=mysql-bin
    # 设置不要复制的数据库(可设置多个)
    binlog-ignore-db=mysql
    binlog-ignore-db=information_schema
    #设置需要复制的数据库 需要复制的主数据库名字(未创建的)
    binlog-do-db=testdb
    #设置logbin格式
    binlog_format=STATEMENT
    
    # 在作为从数据库的时候, 有写入操作也要更新二进制日志文件
    log-slave-updates
    #表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1, 取值范围是1 .. 65535
    auto-increment-increment=2
    # 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
    auto-increment-offset=1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    Master2配置

    修改配置文件: vim /etc/my.cnf
    #主服务器唯一ID
    server-id=3
    #启用二进制日志
    log-bin=mysql-bin
    # 设置不要复制的数据库(可设置多个)
    binlog-ignore-db=mysql
    binlog-ignore-db=information_schema
    #设置需要复制的数据库
    binlog-do-db=需要复制的主数据库名字
    #设置logbin格式
    binlog_format=STATEMENT
    # 在作为从数据库的时候,有写入操作也要更新二进制日志文件
    log-slave-updates
    #表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
    auto-increment-increment=2
    # 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
    auto-increment-offset=2
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    ② 双从机配置

    Slave1配置

    修改配置文件: vim /etc/my.cnf
    #从服务器唯一ID
    server-id=2
    #启用中继日志
    relay-log=mysql-relay
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Slave2配置

    修改配置文件: vim /etc/my.cnf
    #从服务器唯一ID
    server-id=4
    #启用中继日志
    relay-log=mysql-relay
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    ③ 双主机、 双从机重启 mysql 服务

    systemctl restart mysqld
    systemctl status mysqld
    
    • 1
    • 2

    ④ 主机从机都关闭防火墙

     systemctl status firewalld
    
    • 1

    ⑤ 在两台主机上建立帐户并授权 slave

    #在主机MySQL里执行授权命令
    GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123123';
    #查询Master1的状态
    show master status;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    主1
    在这里插入图片描述
    主2
    在这里插入图片描述

    ⑥ 在从机上配置需要复制的主机
    Slava1 复制 Master1, Slava2 复制 Master2

    从1

    CHANGE MASTER TO MASTER_HOST='192.168.253.132',
    MASTER_USER='slave',
    MASTER_PASSWORD='123123',
    MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=154;
    
    • 1
    • 2
    • 3
    • 4

    从2

    CHANGE MASTER TO MASTER_HOST='192.168.253.134',
    MASTER_USER='slave',
    MASTER_PASSWORD='123123',
    MASTER_LOG_FILE='mysql-bin.000006',MASTER_LOG_POS=154;
    
    • 1
    • 2
    • 3
    • 4
    mysql> start slave;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show slave status\G;
    
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ⑦ 两个主机互相复制
    Master2 复制 Master1, Master1 复制 Master2

    M1

    CHANGE MASTER TO MASTER_HOST='192.168.253.134',
    MASTER_USER='slave',
    MASTER_PASSWORD='123123',
    MASTER_LOG_FILE='mysql-bin.000006',MASTER_LOG_POS=154;
    
    • 1
    • 2
    • 3
    • 4
    mysql> start slave;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show slave status\G;
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.253.134
                      Master_User: slave
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000006
              Read_Master_Log_Pos: 154
                   Relay_Log_File: centos7-mysql-2-relay-bin.000002
                    Relay_Log_Pos: 320
            Relay_Master_Log_File: mysql-bin.000006
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB: 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    M2

    CHANGE MASTER TO MASTER_HOST='192.168.253.132',
    MASTER_USER='slave',
    MASTER_PASSWORD='123123',
    MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=154;
    
    • 1
    • 2
    • 3
    • 4
    mysql> start slave;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show slave status\G;
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.253.132
                      Master_User: slave
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000004
              Read_Master_Log_Pos: 154
                   Relay_Log_File: centos7-mysql-2-2-relay-bin.000002
                    Relay_Log_Pos: 320
            Relay_Master_Log_File: mysql-bin.000004
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB: 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    ⑨ 如何停止从服务复制功能

    stop slave;
    
    • 1

    ⑩ 如何重新配置主从

    stop slave;
    reset master;
    
    • 1
    • 2

    ⑧ Master1 主机新建库、新建表、 insert 记录, Master2 和从机复制

    M1

    mysql> create database testdb;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> use testdb;
    Database changed
    mysql> create table mytbl(id int,name varchar(20));
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> insert into mytbl values (1,'zhang3');
    Query OK, 1 row affected (0.02 sec)
    
    mysql> 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    其他

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | dbtest1            |
    | dbtest2            |
    | mysql              |
    | performance_schema |
    | sys                |
    | testdb             |
    +--------------------+
    7 rows in set (0.01 sec)
    
    mysql> use testdb;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> select * from mytbl;
    +------+--------+
    | id   | name   |
    +------+--------+
    |    1 | zhang3 |
    +------+--------+
    1 row in set (0.01 sec)
    
    mysql> 
    
    
    • 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

    2、 修改 Mycat 的配置文件 schema.xml

    修改的balance属性,通过此属性配置读写分离的类型

    负载均衡类型,目前的取值有4 种:
    (1) balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
    (2) balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从
    模式(M1->S1, M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1,S2 都参与 select 语句的负载均衡。
    (3) balance="2",所有读操作都随机的在 writeHost、 readhost 上分发。
    (4) balance="3",所有读请求随机的分发到 readhost 执行, writerHost 不负担读压力
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    为了双主双从读写分离balance设置为1

    
    DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    
            <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
            schema>
            <dataNode name="dn1" dataHost="host1" database="testdb" />
            <dataHost name="host1" maxCon="1000" minCon="10" balance="1"
                              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                    <heartbeat>select user()heartbeat>
                    
                    <writeHost host="hostM1" url="192.168.253.132:3306" user="root"
                                       password="123456">
                            
                            <readHost host="hostS1" url="192.168.253.133:3306" user="root" password="123456" />
                    writeHost>
                    <writeHost host="hostM2" url="192.168.253.133:3306" user="root"
                                       password="123456">
                            
                            <readHost host="hostS2" url="192.168.253.135:3306" user="root" password="123456" />
                    writeHost>
    
            dataHost>
    mycat:schema>
    
    #balance="1": 全部的readHost与stand by writeHost参与select语句的负载均衡。
    #writeType="0": 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个
    #writeType="1",所有写操作都随机的发送到配置的 writeHost, 1.5 以后废弃不推荐
    #writeHost,重新启动后以切换后的为准,切换记录在配置文件中:dnindex.properties 。
    #switchType="1": 1 默认值,自动切换。
    # 				-1 表示不自动切换
    # 				 2 基于 MySQL 主从同步的状态决定是否切换。
    
    
    
    
    • 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

    在这里插入图片描述
    3、 启动 Mycat

    出现

    wrapper  | Startup failed: Timed out waiting for a signal from the JVM.
    wrapper  | JVM did not exit on request, terminated 
    wrapper  | JVM exited on its own while waiting to kill the application. wrapp
    
    • 1
    • 2
    • 3

    在wrapper.conf配置文件 添加

    wrapper.ping.timeout=120
    wrapper.startup.timeout=300
    
    • 1
    • 2

    4、 验证读写分离

    #在写主机Master1数据库表mytbl中插入带系统变量数据, 造成主从数据不一致
    INSERT INTO mytbl VALUES(2,@@hostname);
    
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    5、 抗风险能力

    #停止数据库Master1
    
    • 1

    在这里插入图片描述

    #在Mycat里插入数据依然成功, Master2自动切换为写主机
    INSERT INTO mytbl VALUES(3,@@hostname);
    
    • 1
    • 2
    #启动数据库Master1
    
    
    • 1
    • 2

    在这里插入图片描述

    #在Mycat里查询mytbl表,可以看到查询语句在Master1 、 Slava1 、 Slava2 主从三个主机间切换
    
    • 1

    在这里插入图片描述
    结果应该和接入点有关

    第四章 垂直拆分——分库

    一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同 的数据库上面,这样也就将数据或者说压力分担到不同的库上面,如下图:

    0302
    系统被切分成了,用户,订单交易,支付几个模块。

    4.1 如何划分表

    一个问题:在两台主机上的两个数据库中的表,能否关联查询?
    答案:不可以关联查询
    分库的原则: 有紧密关联关系的表应该在一个库里,相互没有关联关系的表可以分到不同的库里。

    #客户表 rows:20万
    CREATE TABLE customer(
    	id INT AUTO_INCREMENT,
    	NAME VARCHAR(200),
    	PRIMARY KEY(id)
    );
    #订单表 rows:600万
    CREATE TABLE orders(
    	id INT AUTO_INCREMENT,
    	order_type INT,
    	customer_id INT,
    	amount DECIMAL(10,2),
    	PRIMARY KEY(id)
    );
    #订单详细表 rows:600万
    CREATE TABLE orders_detail(
    	id INT AUTO_INCREMENT,
    	detail VARCHAR(2000),
    	order_id INT,
    	PRIMARY KEY(id)
    );
    #订单状态字典表 rows:20
    CREATE TABLE dict_order_type(
    	id INT AUTO_INCREMENT,
    	order_type VARCHAR(200),
    	PRIMARY KEY(id)
    );
    
    
    • 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

    以上四个表如何分库?客户表分在一个数据库,另外三张都需要关联查询,分在另外一个数据库。

    0506

    4.2 实现分库

    1、 修改 schema 配置文件

    
    DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    
            <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
    		<table name="customer" dataNode="dn2" >table>
            schema>
            <dataNode name="dn1" dataHost="host1" database="orders" />
    	  <dataNode name="dn2" dataHost="host2" database="orders" />
            <dataHost name="host1" maxCon="1000" minCon="10" balance="0"
                              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                    <heartbeat>select user()heartbeat>
                    
                    <writeHost host="hostM1" url="192.168.253.132:3306" user="root"
                                       password="123456">               
                    writeHost>
    	
            dataHost>
    	<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
                              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                    <heartbeat>select user()heartbeat>
                    
                    <writeHost host="hostM1" url="192.168.253.133:3306" user="root"
                                       password="123456">               
                    writeHost>
    	
            dataHost>
    mycat:schema>
    
    
    • 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

    2、 新增两个空白库

    分库操作不是在原来的老数据库上进行操作,需要准备两台机器分别安装新的数据库

    #在数据节点 dn1、 dn2 上分别创建数据库 orders
    CREATE DATABASE orders;
    
    
    • 1
    • 2
    • 3

    3、 启动 Mycat

    ./mycat console
    
    • 1

    4、 访问 Mycat 进行分库

    #访问 Mycat
    mysql -umycat -p123456 -h192.168.253.132 -P8066
    #切换到 TESTDB
    #创建 4 张表
    
    
    #查看表信息,可以看到成功分库
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    #客户表 rows:20万
    CREATE TABLE customer(
    	id INT AUTO_INCREMENT,
    	NAME VARCHAR(200),
    	PRIMARY KEY(id)
    );
    
    #订单表 rows:600万
    CREATE TABLE orders(
    	id INT AUTO_INCREMENT,
    	order_type INT,
    	customer_id INT,
    	amount DECIMAL(10,2),
    	PRIMARY KEY(id)
    );
    #订单详细表 rows:600万
    CREATE TABLE orders_detail(
    	id INT AUTO_INCREMENT,
    	detail VARCHAR(2000),
    	order_id INT,
    	PRIMARY KEY(id)
    );
    #订单状态字典表 rows:20
    CREATE TABLE dict_order_type(
    	id INT AUTO_INCREMENT,
    	order_type VARCHAR(200),
    	PRIMARY KEY(id)
    );
    
    • 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

    mycat
    在这里插入图片描述

    dn1
    在这里插入图片描述
    dn2
    在这里插入图片描述

    第五章 水平拆分——分表

    相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中 包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分 到一个数据库,而另外的某些行又切分到其他的数据库中,如图:

    请添加图片描述

    5.1 实现分表

    1、 选择要拆分的表

    MySQL 单表存储数据条数是有瓶颈的,单表达到 1000 万条数据就达到了瓶颈,会影响查询效率,需要进行水平拆分(分表) 进行优化。
    例如:例子中的 orders、 orders_detail 都已经达到 600 万行数据,需要进行分表优化。

    2、 分表字段

    以 orders 表为例,可以根据不同自字段进行分表

    编号分表字段效果
    1id(主键、 或创建时间)查询订单注重时效,历史订单被查询的次数少,如此分片会造成一个节点访问多,一个访问少,不平均。
    2customer_id(客户 id)根据客户 id 去分,两个节点访问平均,一个客户的所 有订单都在同一个节点

    3、 修改配置文件 schema.xml

    #为 orders 表设置数据节点为 dn1、 dn2, 并指定分片规则为 mod_rule(自定义的名字)
    <table name="orders" dataNode="dn1,dn2" rule="mod_rule" ></table>
    #如下图
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    4、 修改配置文件 rule.xml

    #在 rule 配置文件里新增分片规则 mod_rule,并指定规则适用字段为 customer_id,
    #还有选择分片算法 mod-long(对字段求模运算) , customer_id 对两个节点求模,根据结果分片
    #配置算法 mod-long 参数 count 为 2,两个节点
    <tableRule name="mod_rule">
    	<rule>
    	<columns>customer_id</columns>
    	<algorithm>mod-long</algorithm>
    	</rule>
    </tableRule><!-- 不需自己写,需修改count -->
    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
    	<!-- how many data nodes -->
    	<property name="count">2</property>
    </function>
    #如下图:
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述
    在这里插入图片描述

    5、 在数据节点 dn2 上建 orders 表

    #订单表 rows:600万
    CREATE TABLE orders(
    	id INT AUTO_INCREMENT,
    	order_type INT,
    	customer_id INT,
    	amount DECIMAL(10,2),
    	PRIMARY KEY(id)
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    6、 重启 Mycat,让配置生效

    ./mycat console
    
    • 1

    7、 访问 Mycat 实现分片

    mysql> use TESTDB;
    #在 mycat 里向 orders 表插入数据, INSERT 字段不能省略
    INSERT INTO orders(id,order_type,customer_id,amount) VALUES (1,101,100,100100);
    INSERT INTO orders(id,order_type,customer_id,amount) VALUES(2,101,100,100300);
    INSERT INTO orders(id,order_type,customer_id,amount) VALUES(3,101,101,120000);
    INSERT INTO orders(id,order_type,customer_id,amount) VALUES(4,101,101,103000);
    INSERT INTO orders(id,order_type,customer_id,amount) VALUES(5,102,101,100400);
    INSERT INTO orders(id,order_type,customer_id,amount) VALUES(6,102,100,100020);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    #在mycat、 dn1、 dn2中查看orders表数据,分表成功
    
    • 1

    是根据mod_rule规则分的

    mycat
    在这里插入图片描述
    dn1 customer_id=100
    在这里插入图片描述
    dn2 customer_id=101
    在这里插入图片描述
    在这里插入图片描述

    5.2 Mycat 的分片 “join”

    Orders 订单表已经进行分表操作了,和它关联的 orders_detail 订单详情表如何进行 join 查询。我们要对 orders_detail 也要进行分片操作。 Join 的原理如下图:
    0941
    1、 ER 表
    Mycat 借鉴了 NewSQL 领域的新秀 Foundation DB 的设计思路, Foundation DB 创新性的提出了 Table Group 的概念,其将子表的存储位置依赖于主表,并且物理上紧邻存放,因此彻底解决了JION 的效率和性能问 题,根据这一思路,提出了基于 E-R 关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上。

    #修改 schema.xml 配置文件<table name="orders" dataNode="dn1,dn2" rule="mod_rule" >
    	<childTable name="orders_detail" primaryKey="id" joinKey="order_id" parentKey="id" />
    </table>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    #在dn2 创建 orders_detail 表
    #订单详细表 rows:600万
    CREATE TABLE orders_detail(
    	id INT AUTO_INCREMENT,
    	detail VARCHAR(2000),
    	order_id INT,
    	PRIMARY KEY(id)
    );
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    #重启 Mycat
    #访问 Mycat 向 orders_detail 表插入数据
    mysql> use TESTDB;
    
    INSERT INTO orders_detail(id,detail,order_id) values(1,'detail1',1);
    INSERT INTO orders_detail(id,detail,order_id) VALUES(2,'detail1',2);
    INSERT INTO orders_detail(id,detail,order_id) VALUES(3,'detail1',3);
    INSERT INTO orders_detail(id,detail,order_id) VALUES(4,'detail1',4);
    INSERT INTO orders_detail(id,detail,order_id) VALUES(5,'detail1',5);
    INSERT INTO orders_detail(id,detail,order_id) VALUES(6,'detail1',6);
    
    #在mycat、 dn1、 dn2中运行两个表join语句
    Select o.*,od.detail from orders o inner join orders_detail od on o.id=od.order_id;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    mycat
    在这里插入图片描述

    在这里插入图片描述

    2、 全局表

    在分片的情况下,当业务表因为规模而进行分片以后,业务表与这些附属的字典表之间的关联,就成了比较 棘手的问题,考虑到字典表具有以下几个特性:
    ① 变动不频繁
    ② 数据量总体变化不大
    ③ 数据规模不大,很少有超过数十万条记录

    鉴于此, Mycat 定义了一种特殊的表,称之为“全局表”,全局表具有以下特性:
    ① 全局表的插入、更新操作会实时在所有节点上执行,保持各个分片的数据一致性
    ② 全局表的查询操作,只从一个节点获取
    ③ 全局表可以跟任何一个表进行 JOIN 操作

    将字典表或者符合字典表特性的一些表定义为全局表,则从另外一个方面,很好的解决了数据JOIN 的难题。 通过全局表+基于 E-R 关系的分片策略, Mycat 可以满足 80%以上的企业应用开发

    #修改 schema.xml 配置文件<table name="orders" dataNode="dn1,dn2" rule="mod_rule" >
    	<childTable name="orders_detail" primaryKey="id" joinKey="order_id" parentKey="id" />
    </table>
    <table name="dict_order_type" dataNode="dn1,dn2" type="global" ></table>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    #在dn2 创建 dict_order_type 表
    #订单状态字典表 rows:20
    CREATE TABLE dict_order_type(
    	id INT AUTO_INCREMENT,
    	order_type VARCHAR(200),
    	PRIMARY KEY(id)
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    #重启 Mycat
    #访问 Mycat 向 dict_order_type 表插入数据
    mysql> use TESTDB;
    
    INSERT INTO dict_order_type(id,order_type) VALUES(101,'type1');
    INSERT INTO dict_order_type(id,order_type) VALUES(102,'type2');
    #在Mycat、 dn1、 dn2中查询表数据
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    mycat
    在这里插入图片描述
    dn1
    在这里插入图片描述

    dn2
    在这里插入图片描述

    5.3 常用分片规则

    1、 取模
    此规则为对分片字段求摸运算。 也是水平分表最常用规则。 5.1 配置分表中, orders 表采用了此规则。

    2、 分片枚举
    通过在配置文件中配置可能的枚举 id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省份或区县来做保存,而全国省份区县固定的,这类业务使用本条规则。

    #(1) 修改schema.xml配置文件
    <table name="orders_ware_info" dataNode="dn1,dn2" rule="sharding_by_intfile" ></table>
    
    • 1
    • 2

    在这里插入图片描述

    #(2) 修改rule.xml配置文件
    <tableRule name="sharding_by_intfile">
    	<rule>
    		<columns>areacodecolumns>
    		<algorithm>hash-intalgorithm>
    	rule>
    tableRule>
    …
    #修改
    <function name="hash-int"
    class="io.mycat.route.function.PartitionByFileMap">
    	<property name="mapFile">partition-hash-int.txtproperty>
    	<property name="type">1property>
    	<property name="defaultNode">0property>
    function>
    # columns:分片字段, algorithm:分片函数
    # mapFile: 标识配置文件名称, type: 0为int型、 非0为String,
    #defaultNode: 默认节点:小于 0 表示不设置默认节点,大于等于 0 表示设置默认节点,
    # 设置默认节点如果碰到不识别的枚举值,就让它路由到默认节点,如不设置不识别就报错
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    #(3) 修改partition-hash-int.txt配置文件
    vim partition-hash-int.txt
    110=0
    120=1
    #(4) 重启 Mycat
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    #(5) 访问Mycat创建表
    #订单归属区域信息表
    mysql> use TESTDB;
    CREATE TABLE orders_ware_info
    (
    	`id` INT AUTO_INCREMENT comment '编号',
    	`order_id` INT comment '订单编号',
    	`address` VARCHAR(200) comment '地址',
    	`areacode` VARCHAR(20) comment '区域编号',
    	PRIMARY KEY(id)
    );
    #(6) 插入数据
    INSERT INTO orders_ware_info(id, order_id,address,areacode) VALUES (1,1,'北京','110');
    INSERT INTO orders_ware_info(id, order_id,address,areacode) VALUES (2,2,'天津','120');
    #(7) 查询Mycat、 dn1、 dn2可以看到数据分片效果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    mycat
    在这里插入图片描述
    dn1
    在这里插入图片描述
    dn2
    在这里插入图片描述
    3、 范围约定

    此分片适用于,提前规划好分片字段某个范围属于哪个分片。

    #(1) 修改schema.xml配置文件
    <table name="payment_info" dataNode="dn1,dn2" rule="auto_sharding_long" ></table>
    
    • 1
    • 2

    在这里插入图片描述

    #(2) 修改rule.xml配置文件
    <tableRule name="auto_sharding_long">
    	<rule>
    		<columns>order_id</columns>
    		<algorithm>rang-long</algorithm>
    	</rule>
    </tableRule><function name="rang-long"
    	class="io.mycat.route.function.AutoPartitionByLong">
    	<property name="mapFile">autopartition-long.txt</property>
    	<property name="defaultNode">0</property>
    </function>
    # columns:分片字段, algorithm:分片函数
    # mapFile: 标识配置文件名称
    #defaultNode: 默认节点:小于 0 表示不设置默认节点,大于等于 0 表示设置默认节点,
    # 设置默认节点如果碰到不识别的枚举值,就让它路由到默认节点,如不设置不识别就报错
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    #(3) 修改autopartition-long.txt配置文件
    0-102=0
    103-200=1
    #(4) 重启 Mycat
    
    • 1
    • 2
    • 3
    • 4
    #(5) 访问Mycat创建表
    #支付信息表
    mysql> use TESTDB;
    
    CREATE TABLE payment_info
    (
    	`id` INT AUTO_INCREMENT comment '编号',
    	`order_id` INT comment '订单编号',
    	`payment_status` INT comment '支付状态',
    	PRIMARY KEY(id)
    );
    #(6) 插入数据
    INSERT INTO payment_info (id,order_id,payment_status) VALUES (1,101,0);
    INSERT INTO payment_info (id,order_id,payment_status) VALUES (2,102,1);
    INSERT INTO payment_info (id,order_id ,payment_status) VALUES (3,103,0);
    INSERT INTO payment_info (id,order_id,payment_status) VALUES (4,104,1);
    #(7) 查询Mycat、 dn1、 dn2可以看到数据分片效果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    mycat
    在这里插入图片描述
    dn1
    在这里插入图片描述
    dn2
    在这里插入图片描述
    4、 按日期(天)分片

    此规则为按天分片。 设定时间格式、范围

    #(1) 修改schema.xml配置文件
    <table name="login_info" dataNode="dn1,dn2" rule="sharding_by_date" ></table>
    
    • 1
    • 2

    在这里插入图片描述

    #(2) 修改rule.xml配置文件
    <tableRule name="sharding_by_date">
    	<rule>
    		<columns>login_datecolumns>
    		<algorithm>shardingByDatealgorithm>
    	rule>
    tableRule>
    …
    #需要自己实现
    <function name="shardingByDate" class="io.mycat.route.function.PartitionByDate">
    	<property name="dateFormat">yyyy-MM-ddproperty>
    	<property name="sBeginDate">2019-01-01property>
    	<property name="sEndDate">2019-01-04property>
    	<property name="sPartionDay">2property>
    function>
    # columns:分片字段, algorithm:分片函数
    #dateFormat :日期格式
    #sBeginDate :开始日期
    #sEndDate:结束日期,则代表数据达到了这个日期的分片后循环从开始分片插入
    #sPartionDay :分区天数,即默认从开始日期算起,分隔 2 天一个分区
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    #(3) 重启 Mycat
    #(4) 访问Mycat创建表
    #用户信息表
    mysql> use TESTDB;
    
    CREATE TABLE login_info
    (
    	`id` INT AUTO_INCREMENT comment '编号',
    	`user_id` INT comment '用户编号',
    	`login_date` date comment '登录日期',
    	PRIMARY KEY(id)
    );
    #(6) 插入数据
    INSERT INTO login_info(id,user_id,login_date) VALUES (1,101,'2019-01-01');
    INSERT INTO login_info(id,user_id,login_date) VALUES (2,102,'2019-01-02');
    INSERT INTO login_info(id,user_id,login_date) VALUES (3,103,'2019-01-03');
    INSERT INTO login_info(id,user_id,login_date) VALUES (4,104,'2019-01-04');
    INSERT INTO login_info(id,user_id,login_date) VALUES (5,103,'2019-01-05');
    INSERT INTO login_info(id,user_id,login_date) VALUES (6,104,'2019-01-06');
    #(7) 查询Mycat、 dn1、 dn2可以看到数据分片效果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    mycat
    在这里插入图片描述
    dn1
    在这里插入图片描述
    dn2
    在这里插入图片描述

    总结

    
    DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    
            <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
    		<table name="customer" dataNode="dn2" >table>
    		<table name="orders" dataNode="dn1,dn2" rule="mod_rule" >  
    			<childTable name="orders_detail" primaryKey="id" joinKey="order_id" parentKey="id" /> 
    		table>	
    		<table name="dict_order_type" dataNode="dn1,dn2" type="global" >table>
    		<table name="orders_ware_info" dataNode="dn1,dn2" rule="sharding_by_intfile" >table>
    		<table name="payment_info" dataNode="dn1,dn2" rule="auto_sharding_long" >table> 
    		<table name="login_info" dataNode="dn1,dn2" rule="sharding_by_date" >table>
            schema>
            <dataNode name="dn1" dataHost="host1" database="orders" />
    	  <dataNode name="dn2" dataHost="host2" database="orders" />
            <dataHost name="host1" maxCon="1000" minCon="10" balance="0"
                              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                    <heartbeat>select user()heartbeat>
                    
                    <writeHost host="hostM1" url="192.168.253.132:3306" user="root"
                                       password="123456">               
                    writeHost>
    	
            dataHost>
    	<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
                              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                    <heartbeat>select user()heartbeat>
                    
                    <writeHost host="hostM1" url="192.168.253.133:3306" user="root"
                                       password="123456">               
                    writeHost>
    	
            dataHost>
    mycat:schema>
    
    • 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

    5.4 全局序列

    在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此, Mycat 提供了全局 sequence,并且提供了包含本地配置和数据库配置等多种实现方式

    1、 本地文件
    此方式 Mycat 将 sequence 配置到文件中,当使用到 sequence 中的配置后, Mycat 会更下classpath 中的 sequence_conf.properties 文件中 sequence 当前的值。
    ① 优点: 本地加载,读取速度较快
    ② 缺点: 抗风险能力差, Mycat 所在主机宕机后,无法读取本地文件。

    2、 数据库方式(推荐)
    利用数据库一个表 来进行计数累加。但是并不是每次生成序列都读写数据库,这样效率太低。Mycat 会预加载一部分号段到 Mycat 的内存中,这样大部分读写序列都是在内存中完成的。如果内存中的号段用完了 Mycat 会再向数据库要一次。
    问:那如果 Mycat 崩溃了 ,那内存中的序列岂不是都没了?
    是的。如果是这样,那么 Mycat 启动后会向数据库申请新的号段,原有号段会弃用。
    也就是说如果 Mycat 重启,那么损失是当前的号段没用完的号码,但是不会因此出现主键重复

    ① 建库序列脚本

    #在 dn1 上创建全局序列表
    CREATE TABLE MYCAT_SEQUENCE (NAME VARCHAR(50) NOT NULL,current_value INT NOT
    NULL,increment INT NOT NULL DEFAULT 100, PRIMARY KEY(NAME)) ENGINE=INNODB;
    
    #创建全局序列所需函数
    DELIMITER $$
    CREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50)) RETURNS VARCHAR(64)
    DETERMINISTIC
    BEGIN
    DECLARE retval VARCHAR(64);
    SET retval="-999999999,null";
    SELECT CONCAT(CAST(current_value AS CHAR),",",CAST(increment AS CHAR)) INTO retval FROM
    MYCAT_SEQUENCE WHERE NAME = seq_name;
    RETURN retval;
    END $$
    DELIMITER ;
    
    DELIMITER $$
    CREATE FUNCTION mycat_seq_setval(seq_name VARCHAR(50),VALUE INTEGER) RETURNS
    VARCHAR(64)
    DETERMINISTIC
    BEGIN
    UPDATE MYCAT_SEQUENCE
    SET current_value = VALUE
    WHERE NAME = seq_name;
    RETURN mycat_seq_currval(seq_name);
    END $$
    DELIMITER ;
    
    DELIMITER $$
    CREATE FUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS VARCHAR(64)
    DETERMINISTIC
    BEGIN
    UPDATE MYCAT_SEQUENCE
    SET current_value = current_value + increment WHERE NAME = seq_name;
    RETURN mycat_seq_currval(seq_name);
    END $$
    DELIMITER ;
    
    #初始化序列表记录
    INSERT INTO MYCAT_SEQUENCE(NAME,current_value,increment) VALUES ('ORDERS', 400000,
    100);
    
    
    • 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

    在这里插入图片描述
    ② 修改 Mycat 配置

    #修改sequence_db_conf.properties
    vim sequence_db_conf.properties
    #意思是 ORDERS这个序列在dn1这个节点上,具体dn1节点是哪台机子,请参考schema.xml
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    #修改server.xml
    vim server.xml
    #全局序列类型: 0-本地文件, 1-数据库方式, 2-时间戳方式。此处应该修改成1。
    <property name="sequnceHandlerType">1</property>
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    #重启Mycat
    
    • 1

    ③ 验证全局序列

    
    #登录 Mycat,插入数据
    insert into orders(id,amount,customer_id,order_type) values(next value for MYCATSEQ_ORDERS,1000,101,102);
    insert into orders(id,amount,customer_id,order_type) values(next value for MYCATSEQ_ORDERS,1000,101,102);
    #查询数据
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    #重启Mycat后,再次插入数据,再查询
    
    • 1

    在这里插入图片描述

    3、 时间戳方式
    全局序列ID= 64 位二进制 (42(毫秒)+5(机器 ID)+5(业务编码)+12(重复累加) 换算成十进制为 18 位数的long 类型,每毫秒可以并发 12 位二进制的累加。
    ① 优点: 配置简单
    ② 缺点: 18 位 ID 过长

    4、 自主生成全局序列
    可在 java 项目里自己生成全局序列,如下:
    ① 根据业务逻辑组合
    ② 可以利用 redis 的单线程原子性 incr 来生成序列,但,自主生成需要单独在工程中用 java 代码实现, 还是推荐使用 Mycat 自带全局序列。

    第六章 基于 HA 机制的 Mycat 高可用

    在实际项目中, Mycat 服务也需要考虑高可用性,如果 Mycat 所在服务器出现宕机,或 Mycat 服务故障,需要有备机提供服务,需要考虑 Mycat 集群。

    6.1 高可用方案

    我们可以使用 HAProxy + Keepalived 配合两台 Mycat 搭起 Mycat 集群,实现高可用性。 HAProxy实现了 MyCat 多节点的集群高可用和负载均衡, 而 HAProxy 自身的高可用则可以通过 Keepalived 来实现。

    请添加图片描述

    编号角色IP 地址机器名
    1Mycat1192.168.253.132mysq2
    2Mycat2192.168.253.133mysqlS2-1
    3HAProxy (master)192.168.253.134mysql2-2
    4Keepalived(master)192.168.253.134mysql2-2
    5HAProxy(backup)192.168.253.135mysqlS2-2
    6Keepalived(backup)192.168.253.135mysqlS2-2

    6.2 安装配置 HAProxy

    还需安装gcc编译

    yum install gcc-c++
    
    • 1

    yum安装保证自己有网
    拿浏览器试一下
    在这里插入图片描述


    如果是静态ip配置错了

    请看:如何配置静态ip

    在VMware中给Linux虚拟机配置静态IP的详细步骤(CentOs 7)

    或者
    先改为动态ip


    安装gcc出现错误-----正在尝试其他镜像

    #进入镜像目录
    cd /etc/yum.repos.d/
    #可以查看 所有的镜像
    ls 
    #删除全部镜像
    rm -rf *.repo 
    
    #配置aliyun的镜像
    #CentOS 5
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo
    
    #CentOS 6
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
    
    #CentOS 7
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    CentOS 7 下载yum源报错:正在解析主机 mirrors.aliyun.com (mirrors.aliyun.com)… 失败:未知的名称或服务。

    登录root用户,用vim /etc/resolv.conf ,打开rsolv.conf,添加DNS地址

    nameserver 8.8.8.8 
    nameserver 8.8.4.4
    nameserver 223.5.5.5
    nameserver 223.6.6.6
    #(nameserver 223.5.5.5 和 nameserver 223.6.6.6选择其中一个添加即可)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    修改centOS6和centOS7的yum源为阿里源 mirrors.aliyun.com

    GATEWAY=192.168.126.2
    DNS1=8.8.8.8
    DNS2=114.114.114.114
    
    • 1
    • 2
    • 3

    最后发现我配置的静态ip连上网但是浏览器百度不了
    又改了一下ip配置,动态ip
    就好了

    在这里插入图片描述

    后面我又重新配置静态ip

    如何配置静态ip

    在VMware中给Linux虚拟机配置静态IP的详细步骤(CentOs 7)


    1、 安装 HAProxy
    下载地址:https://src.fedoraproject.org/repo/pkgs/haproxy/
    下载版本:haproxy-1.5.18.tar.gz

    #1准备好HAProxy安装包,传到/opt目录下
    
    #2解压到/usr/local/src
    tar -zxvf haproxy-1.5.18.tar.gz -C /usr/local/src
    
    #3进入解压后的目录,查看内核版本, 进行编译
    cd /usr/local/src/haproxy-1.5.18
    uname -r
    make TARGET=linux310 PREFIX=/usr/local/haproxy ARCH=x86_64
    
    # ARGET=linux310,内核版本,使用uname -r查看内核,如: 3.10.0-514.el7,此时该参数就为linux310;
    #ARCH=x86_64,系统位数;
    #PREFIX=/usr/local/haprpxy #/usr/local/haprpxy,为haprpxy安装路径。
    
    #4编译完成后,进行安装
    make install PREFIX=/usr/local/haproxy
    
    #5安装完成后, 创建目录、 创建HAProxy配置文件
    mkdir -p /usr/data/haproxy/
    vim /usr/local/haproxy/haproxy.conf
    
    #6向配置文件中插入以下配置信息,并保存
    global
    	log 127.0.0.1 local0
    	#log 127.0.0.1 local1 notice
    	#log loghost local0 info
    	maxconn 4096
    	chroot /usr/local/haproxy
    	pidfile /usr/data/haproxy/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.140.128:8066 check inter 10s  #修改192.168.253.132:8066
    		server mycat_2 192.168.140.127:8066 check inter 10s  #修改192.168.253.133:8066
    
    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
    
    
    • 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

    2、 启动验证

    先启动两个mycat

    两个mycat一模一样的配置
    把conf文件夹复制一下

    或者直接复制整个mycat到第二天机器上

    第二个mycat
    在这里插入图片描述

    #1启动HAProxy
    /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.conf
    
    #2查看HAProxy进程
    ps -ef|grep haproxy
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    #3打开浏览器访问
    http://192.168.140.125:7777/admin  #http://192.168.253.134:7777/admin
    #在弹出框输入用户名: admin密码: 123123  #我的123456
    #如果Mycat主备机均已启动,则可以看到如下图
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    #4验证负载均衡,通过HAProxy访问Mycat
    mysql -umycat -p123456 -h 192.168.253.132 -P 48066
    
    • 1
    • 2

    6.3 配置 Keepalived

    下载地址:https://www.keepalived.org/download.html
    下载版本:keepalived-1.4.2.tar.gz

    1、 安装 Keepalived

    #1准备好Keepalived安装包,传到/opt目录下
    
    #2解压到/usr/local/src
    tar -zxvf keepalived-1.4.2.tar.gz -C /usr/local/src
    
    #3安装依赖插件
    yum install -y gcc openssl-devel popt-devel
    
    #如果./configure --prefix=/usr/local/keepalived出现错误
    ---
    checking for openssl/ssl.h... no
    configure: error: 
      !!! OpenSSL is not properly installed on your system. !!!
      !!! Can not include OpenSSL headers files.            !!!
    ---
    
    #3进入解压后的目录, 进行配置, 进行编译
    cd /usr/local/src/keepalived-1.4.2
    ./configure --prefix=/usr/local/keepalived
    
    #4进行编译, 完成后进行安装
    make 
    make install
    
    #5运行前配置
    cp /usr/local/src/keepalived-1.4.2/keepalived/etc/init.d/keepalived /etc/init.d/
    mkdir /etc/keepalived
    cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
    cp /usr/local/src/keepalived-1.4.2/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
    cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
    
    #6修改配置文件
    vim /etc/keepalived/keepalived.conf
    
    #修改内容如下
    ! Configuration File for keepalived
    
    global_defs {
    	notification_email {
    		xlcocoon@foxmail.com
    	}
    	notification_email_from keepalived@showjoy.com
    	smtp_server 127.0.0.1
    	smtp_connect_timeout 30
    	router_id LVS_DEVEL
    	vrrp_skip_check_adv_addr
    	vrrp_garp_interval 0
    	vrrp_gna_interval 0
    }
    
    vrrp_instance VI_1 {
    	#主机配MASTER,备机配BACKUP
    	state MASTER
    	#所在机器网卡
    	interface ens33
    	virtual_router_id 51
    	#数值越大优先级越高
    	priority 100
    	advert_int 1
    	authentication {
    		auth_type PASS
    		auth_pass 1111
    	}
    	virtual_ipaddress {
    		#虚拟IP
    		192.168.140.200  #我的 192.168.253.200
    	}
    }
    
    virtual_server 192.168.140.200 48066 {
    	delay_loop 6
    	lb_algo rr
    	lb_kind NAT
    	persistence_timeout 50
    	protocol TCP
    	real_server 192.168.140.125 48066 {
    		weight 1
    		TCP_CHECK {
    			connect_timeout 3
    			retry 3
    			delay_before_retry 3
    		}
    	}
    	real_server 192.168.140.126 48600 {
    		weight 1
    		TCP_CHECK {
    			connect_timeout 3
    			nb_get_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
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93

    2、 启动验证

    两个HAProxy启动
    135的
    在这里插入图片描述

    #1启动Keepalived
    service keepalived start
    
    #2登录验证
    mysql -umycat -p123456 -h 192.168.140.200 -P 48066
    # mysql -umycat -p123456 -h 192.168.253.200 -P 48066
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    在这里插入图片描述

    6.4 测试高可用

    1、 测试步骤

    #1关闭mycat
    132的mycat
    
    #2通过虚拟ip查询数据
    mysql -umycat -p123456 -h 192.168.140.200 -P 48066
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    在这里插入图片描述

    第七章 Mycat 安全设置

    7.1 权限配置

    1、 user 标签权限控制

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

    #server.xml配置文件user部分
    <user name="mycat">
    	<property name="password">123456property>
    	<property name="schemas">TESTDBproperty>
    user>
    <user name="user">
    	<property name="password">userproperty>
    	<property name="schemas">TESTDBproperty>
    	<property name="readOnly">trueproperty>
    user>
    #如下图
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    配置说明

    标签属性说明
    name应用连接中间件逻辑库的用户名
    password该用户对应的密码
    TESTDB应用当前连接的逻辑库中所对应的逻辑表。 schemas 中可以配置一个或多个
    readOnly应用连接中间件逻辑库所具有的权限。 true 为只读, false 为读写都有,默认为 false

    测试案例

    #测试案例一
    # 使用user用户,权限为只读(readOnly: true)
    # 验证是否可以查询出数据, 验证是否可以写入数据
    #1、用user用户登录,运行命令如下:
    mysql -uuser -puser -h 192.168.253.132 -P8066
    #2、切换到TESTDB数据库,查询orders表数据,如下:
    use TESTDB
    select * from orders;
    #3、可以查询到数据,如下图
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    在这里插入图片描述

    #4、执行插入数据sql,如下:
    insert into orders(id,order_type,customer_id,amount) values(7,101,101,10000);
    #5、 可看到运行结果,插入失败, 只有只读权限, 如下图:
    
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    #测试案例二
    # 使用mycat用户,权限为可读写(readOnly: false)
    # 验证是否可以查询出数据, 验证是否可以写入数据
    #1、用mycat用户登录,运行命令如下:
    mysql -umycat -p123456 -h 192.168.140.128 -P8066
    #2、切换到TESTDB数据库,查询orders表数据,如下:
    use TESTDB
    select * from orders;
    #3、可以查询到数据,如下图
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    #4、执行插入数据sql,如下:
    insert into orders(id,order_type,customer_id,amount) values(7,101,101,10000);
    #5、 可看到运行结果,插入成功,如下图:
    
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    2、 privileges 标签权限控制

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

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

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

    #server.xml配置文件privileges部分
    #配置orders表没有增删改查权限
    <user name="mycat">
    	<property name="password">123456property>
    	<property name="schemas">TESTDBproperty>
    	
    	<privileges check="true">
    		<schema name="TESTDB" dml="1111" >
    			<table name="orders" dml="0000">table>
    			
    		schema>
    	privileges>
    user>
    #如下图
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    配置说明

    DML 权限增加(insert)更新(update)查询(select)删除(select)
    0000禁止禁止禁止禁止
    0010禁止禁止可以禁止
    1110可以禁止禁止禁止
    1111可以可以可以可以

    重启报错

    我给MyCat修复了一个bug,cloumnNuber: 9;元素类型为“user“的内容必须匹配“(property)+“
    在这里插入图片描述

    测试案例

    #测试案例一
    # 使用mycat用户, privileges配置orders表权限为禁止增删改查(dml="0000")
    # 验证是否可以查询出数据, 验证是否可以写入数据
    
    #1、 重启mycat, 用mycat用户登录,运行命令如下:
    mysql -umycat -p123456 -h 192.168.140.128 -P8066
    
    #2、切换到TESTDB数据库,查询orders表数据,如下:
    use TESTDB
    select * from orders;
    
    #3、 禁止该用户查询数据,如下图
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    #4、执行插入数据sql,如下:
    insert into orders(id,order_type,customer_id,amount) values(7,101,101,10000);
    #5、 可看到运行结果,插入失败, 只有只读权限, 如下图:
    
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    #测试案例二
    # 使用mycat用户, privileges配置orders表权限为可以增删改查(dml="1111")
    # 验证是否可以查询出数据, 验证是否可以写入数据
    #1、 重启mycat, 用mycat用户登录,运行命令如下:
    mysql -umycat -p123456 -h 192.168.140.128 -P8066
    #2、切换到TESTDB数据库,查询orders表数据,如下:
    use TESTDB
    select * from orders;
    #3、可以查询到数据,如下图
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    请添加图片描述

    #4、执行插入数据sql,如下:
    insert into orders(id,order_type,customer_id,amount) values(8,101,101,10000);
    #5、 可看到运行结果,插入成功,如下图:
    
    
    • 1
    • 2
    • 3
    • 4

    请添加图片描述

    #4、执行插入数据sql,如下:
    delete from orders where id in (7,8);
    #5、 可看到运行结果,插入成功,如下图:
    
    
    • 1
    • 2
    • 3
    • 4

    请添加图片描述

    7.2 SQL 拦截

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

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

    #设置白名单
    #server.xml配置文件firewall标签
    #配置只有192.168.140.128主机可以通过mycat用户访问
    <firewall>
    	<whitehost>
    		<host host="192.168.140.128" user="mycat"/>
    	whitehost>
    firewall>
    #如下图
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    #重启Mycat后, 192.168.140.128主机使用mycat用户访问
    mysql -umycat -p123456 -h 192.168.140.128 -P 8066
    #可以正常访问, 如下图
    
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    在这里插入图片描述

    [root@centos7-mysql-S2-1 ~]# mysql -umycat -p123456 -P8066 -h192.168.253.133
    mysql: [Warning] Using a password on the command line interface can be insecure.
    ERROR 1045 (HY000): Access denied for user 'mycat' with host '192.168.253.133'
    
    
    • 1
    • 2
    • 3
    • 4

    2、 黑名单

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

    #设置黑名单
    #server.xml配置文件firewall标签
    #配置禁止mycat用户进行删除操作
    <firewall>
    	<whitehost>
    		<host host="192.168.140.128" user="mycat"/>
    	</whitehost>
    	<blacklist check="true">
    		<property name="deleteAllow">false</property>
    	</blacklist>
    </firewall>
    #如下图
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    #重启Mycat后, 192.168.140.128主机使用mycat用户访问
    mysql -umycat -p123456 -h 192.168.140.128 -P 8066
    #可以正常访问, 如下图
    
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    #切换TESTDB数据库后,执行删除数据语句
    delete from orders where id=7;
    #运行后发现已禁止删除数据,如下图
    
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    可以设置的黑名单 SQL 拦截功能列表

    配置项缺省值描述
    selelctAllowtrue是否允许执行 SELECT 语句
    deleteAllowtrue是否允许执行 DELETE 语句
    updateAllowtrue是否允许执行 UPDATE 语句
    insertAllowtrue是否允许执行 INSERT 语句
    createTableAllowtrue是否允许创建表
    setAllowtrue是否允许使用 SET 语法
    alterTableAllowtrue是否允许执行 Alter Table 语句
    dropTableAllowtrue是否允许修改表
    commitAllowtrue是否允许执行 commit 操作
    rollbackAllowtrue是否允许执行 roll back 操作

    第八章 Mycat 监控工具

    8.1 Mycat-web 简介

    Mycat-web 是 Mycat 可视化运维的管理和监控平台,弥补了 Mycat 在监控上的空白。帮 Mycat 分担统计任务和配置管理任务。 Mycat-web 引入了 ZooKeeper 作为配置中心,可以管理多个节点。Mycat-web 主要管理和监控 Mycat 的流量、连接、活动线程和内存等,具备 IP 白名单、邮件告警等模块,还可以统计 SQL 并分析慢 SQL 和高频 SQL 等。为优化 SQL 提供依据。

    请添加图片描述

    8.2 Mycat-web 配置使用

    1、 ZooKeeper 安装

    安装步骤如下:

    #1下载安装包http://zookeeper.apache.org/
    #http://archive.apache.org/dist/zookeeper/
    #2 安装包拷贝到Linux系统/opt目录下,并解压
    tar -zxvf zookeeper-3.4.11.tar.gz
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    mkdir /myzookeeper
    cp -r zookeeper-3.4.11 /myzookeeper/
    cd /myzookeeper/
    ll
    总用量 4
    drwxr-xr-x. 10 root root 4096 825 16:36 zookeeper-3.4.11
    cd zookeeper-3.4.11/
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    #3 进入ZooKeeper解压后的配置目录(conf) ,复制配置文件并改名
    cd conf
    cp zoo_sample.cfg zoo.cfg
    #4 进入ZooKeeper的命令目录(bin) ,运行启动命令
    cd..
    cd bin
    ./zkServer.sh start
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    #5 ZooKeeper服务端口为2181,查看服务已经启动
    ps -ef|grep zookeeper
    netstat -ant | grep 2181
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2、 Mycat-web 安装

    安装步骤如下:

    #1下载安装包http://www.mycat.io/
    #http://dl.mycat.org.cn/mycat-web-1.0/
    #2 安装包拷贝到Linux系统/opt目录下,并解压 另一台
    tar -zxvf Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz
    #3 拷贝mycat-web文件夹到/usr/local目录下
    cp -r mycat-web /usr/local
    #4 进入mycat-web的目录下运行启动命令
    cd /usr/local/mycat-web/
    ./start.sh &
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    #5 Mycat-web服务端口为8082,查看服务已经启动
    netstat -ant | grep 8082
    
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    #6 通过地址访问服务
    http://192.168.253.133:8082/mycat/
    
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    3、 Mycat-web 配置

    先保证mycat启动

    安装步骤如下:

    #1 先在注册中心配置ZooKeeper地址,配置后刷新页面,可见
    
    
    • 1
    • 2

    在这里插入图片描述

    #2 新增Mycat监控实例
    
    • 1

    在这里插入图片描述
    防火墙没关
    在这里插入图片描述
    linux的防火墙
    mycat的防火墙
    在这里插入图片描述

    成功

    在这里插入图片描述

    8.3 Mycat 性能监控指标

    在 Mycat-web 上可以进行 Mycat 性能监控,例如:内存分享、流量分析、连接分析、活动线程分析等等。

    在这里插入图片描述

    在这里插入图片描述

    最后


    Markdown 54164 字数 2663 行数
    HTML 41749 字数 1681 段落


    2022/8/25 17:02


  • 相关阅读:
    【ARC与MRC的相互兼容 Objective-C语言】
    Spring源码-总体架构体系和源码环境搭建
    HTML—CSS盒子模型(Box Model)
    Python上下文管理和with
    第七章:面向对象编程(中级部分)
    《单链表》的实现(不含哨兵位的单向链表)
    【node进阶】深入浅出---MVC设计模式&RESTful风格
    Docker /var/lib/docker数据目录迁移
    以MapBox为核心构建Vue地图组件库教程
    VSCode搭建内核源码阅读开发环境
  • 原文地址:https://blog.csdn.net/qq_51625007/article/details/126477509