精华内容
下载资源
问答
  • Mycat 读写分离

    2018-12-10 17:23:00
    Mycat 是 MySQL中间件,Mycat原理中最重要的一个动词就是'拦截',它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实...

    简介

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

    强烈推荐阅读官方PDF,中文版下载地址:http://www.mycat.io/document/mycat-definitive-guide.pdf

     

    Mycat 可以对mysql进行分片路由,我这里数据还没到达数据需要分片的量级,所以这里只说读写分离。

     

     

    之前使用mysql的中间件是 amoeba, 日常使用中,经常出现突然异常,表现为:端口正常,但是无法路由到后端mysql,因此前端程序出现大量的无法连接数据库的报错,因此准备切换到 mycat ,后续继续爬坑。

     

    mycat读写分离配置

    基本信息

     

    1. 安装MySQL

    以下操作在MySQL 两个节点上执行:

    [root@192.168.118.16 ~]#yum install mariadb-server mysql -y
    [root@192.168.118.16 ~]#systemctl start mariadb ; systemctl enable mariadb

     

     

    2. 配置mysql主从复制

    (推荐查看下mysql GTID方式的主从配置)
    主从配置不再赘述,具体请参考:https://www.cnblogs.com/hukey/p/5912874.html

    这里在主mysql中创建 sbtest库,并且创建该库所有权的用户,该用户必须能够查看到 show slave status 主从同步状态,因为后面 mycat 监控主从状态需要使用到。

    [root@192.168.118.16 ~]#mysql
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 9
    Server version: 5.5.35-MariaDB-log MariaDB Server
    
    Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]> create database sbtest;  # 创建库
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sbtest             |
    | test               |
    +--------------------+
    5 rows in set (0.00 sec)
    MariaDB [(none)]> grant all privileges on sbtest.* to 'sbtest'@'%' identified by 'sbtest' with grant option;  # 添加所有权的用户
    Query OK, 0 rows affected (0.01 sec)
    
    MariaDB [(none)]> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> grant replication client on *.* to sbtest;  # 设置可以查看复制权限,这里一定要设定,否则后面配置mycat监控主从时,会报错。
    Query OK, 0 rows affected (0.00 sec)

     

     

     3. 配置mycat

     (所有软件包官网都可以下载到)

     首先安装 jdk

    [root@192.168.118.15 /usr/local/src/mycat_tools]#tar xf jdk-8u77-linux-x64.tar.gz -C /usr/local/
    [root@192.168.118.15 /usr/local/src/mycat_tools]#vim /etc/profile
    
    # jdk
    JAVA_HOME=/usr/local/jdk1.8.0_77
    JAVA_BIN=$JAVA_HOME/bin
    PATH=$PATH:$JAVA_BIN
    CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export JAVA_HOME JAVA_BIN PATH CLASSPATH
    # --------------
    [root@192.168.118.15 /usr/local/src/mycat_tools]#. /etc/profile

     

     修改mycat配置:

    mycat中主要有两个配置文件:

    [root@192.168.118.15 /usr/local/src/mycat_tools]#tar xf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz -C /usr/local/
    [root@192.168.118.15 /usr/local/src/mycat_tools]#cd /usr/local/mycat/conf/
    [root@192.168.118.15 /usr/local/mycat/conf]#vim schema.xml
      1 <?xml version="1.0"?>
      2 <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
      3 <mycat:schema xmlns:mycat="http://io.mycat/">
      4 
      5         <schema name="sbtest" checkSQLschema="false" sqlMaxLimit="100" dataNode="sbtest">
      6         </schema>
      7         <dataNode name="sbtest" dataHost="sbtest" database="sbtest" />
      8         <dataHost name="sbtest" maxCon="1000" minCon="10" balance="1"
      9                           writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">
     10                 <heartbeat>show slave status</heartbeat>
     11                 <!-- can have multi write hosts -->
     12                 <writeHost host="hostM1" url="192.168.118.16:3306" user="sbtest"
     13                                    password="sbtest">
     14                         <!-- can have multi read hosts -->
     15                         <readHost host="hostS2" url="192.168.118.17:3306" user="sbtest" password="sbtest" />
     16                 </writeHost>
     17         </dataHost>
     18 </mycat:schema>

     

     

    在上面的配置中,特别要注意标黄的部分:

    balance

    balance="1"

    负载均衡类型,目前的取值有 3 种:

    • balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
    • balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
    • balance="2",所有读操作都随机的在 writeHost、readhost 上分发。
    • balance="3",所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。

    这里只有将 balance 设置为 1 才开启读写分离。

     

    switchType

    switchType="2"

    • switchType="1" 默认值,自动切换
    • switchType="2" 基于 MySQL 主从同步的状态决定是否切换 心跳语句为 show slave status
    • switchType="3" 基于 MySQL galary cluster 的切换机制(适合集群)(1.4.1)心跳语句为 show status like ‘wsrep%’

    如果mycat通过查看 show slave status 查看主从down掉或者超过设置的 slaveThreshold 时,说明这时的数据同步不准确或者无法访问从节点

    switchType="1" 时,mycat不会出现任何切换,读请求依然路由到从节点,无法访问最新的数据;

    switchType="2" 时,mycat会自动剔除从节点,因为这时的从节点无法保证和主节点的一致性,读写都会路由到主节点保证数据的准确。

     

    其他具体参数参考:https://www.processon.com/view/5bfd0f54e4b00684ca0bed1f  写成树形图更能清晰查看。

     

    修改 server.xml 为逻辑添加用户和规则

    [root@192.168.118.15 /usr/local/mycat/conf]#vim server.xml
            # 修改如下
            <firewall>
               <whitehost>
                  <host host="*" user="sbtest"/>    # 可以限制指定的ip访问
               </whitehost>
           <blacklist check="true">
               <property  name ="selectAllColumnAllow">false</property>    # 禁止 select * 访问数据库
           </blacklist>
            </firewall>
            ...
            
            <user name="sbtest">
                    <property name="password">sbtest</property>
                    <property name="schemas">sbtest</property>
                    <!--<property name="readOnly">true</property> -->
            </user>

     

     

    在 firewall 规则里,可以限定 ip 和 具体规则, 这里做了禁止 select * 的操作,有些程序员写的SQL真的很令人费解,其他具体的限定规则,请参考上面分享的官网 PDF

    启动服务

    [root@192.168.118.15 /usr/local/mycat/conf]#/usr/local/mycat/bin/mycat start
    Starting Mycat-server...
    [root@192.168.118.15 /usr/local/mycat/conf]#netstat -ntplu | egrep "8066|9066"
    tcp        0      0 0.0.0.0:8066            0.0.0.0:*               LISTEN      11023/java          
    tcp        0      0 0.0.0.0:9066            0.0.0.0:*               LISTEN      11023/java
     
    8066: mycat服务端口
    9066: mycat管理端口

     

    到此,mycat读写分离已经配置完毕。

    [root@192.168.118.15 /usr/local/mycat/logs]#ls
    mycat.log  mycat.pid  wrapper.log
    
    # wrapper.log mycat启动日志,启动报错查看该日志
    # mycat.log mycat运行日志

     

     

    性能测试

     

    MySQL主节点:

    [root@192.168.118.16 ~]#yum install sysbench -y    # 需要配置 epel源
    # 添加测试数据 创建10张表,每张表里10万条数据
    [root@192.168.118.16 ~]#sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --mysql-host=192.168.118.16 --mysql-port=3306 --mysql-user=sbtest --mysql-password=sbtest --db-driver=mysql --oltp_tables_count=10 --oltp-table-size=100000 --rand-init=on prepare    
    
    # 开始测试
    [root@192.168.118.16 ~]#sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --mysql-host=192.168.118.16 --mysql-port=3306 --mysql-user=sbtest --mysql-password=sbtest --db-driver=mysql --oltp_tables_count=10 --oltp-table-size=100000 --num-threads=8 --max-time=120 --report-interval=10 --rand-init=on run

     

     

    每次测试完毕,记得清理数据

    [root@192.168.118.16 ~]#sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --mysql-host=192.168.118.16 --mysql-port=3306 --mysql-user=sbtest --mysql-password=sbtest --db-driver=mysql --oltp_tables_count=10 --oltp-table-size=100000 --num-threads=8 --max-time=120 --report-interval=10 --rand-init=on cleanup

     

     

     mycat 节点

    [root@192.168.118.15 ~]#yum install sysbench -y    # 需要配置 epel源
    # 添加测试数据 创建10张表,每张表里10万条数据
    [root@192.168.118.15 ~]#sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --mysql-host=192.168.118.15 --mysql-port=8066 --mysql-user=sbtest --mysql-password=sbtest --db-driver=mysql --oltp_tables_count=10 --oltp-table-size=100000 --rand-init=on prepare    
    
    # 开始测试
    [root@192.168.118.15 ~]#sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --mysql-host=192.168.118.15 --mysql-port=8066 --mysql-user=sbtest --mysql-password=sbtest --db-driver=mysql --oltp_tables_count=10 --oltp-table-size=100000 --num-threads=8 --max-time=120 --report-interval=10 --rand-init=on run

     

     

    清除数据

    [root@192.168.118.15 ~]#sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --mysql-host=192.168.118.15 --mysql-port=8066 --mysql-user=sbtest --mysql-password=sbtest --db-driver=mysql --oltp_tables_count=10 --oltp-table-size=100000 --num-threads=8 --max-time=120 --report-interval=10 --rand-init=on cleanup

     

     

    通过简单的对比,mycat对性能的消耗很小。这只是个简单的例子,如果要求准确性,最少得30分钟以上的测试数据。

     

    Mycat-web 的安装使用

    安装步骤:

    1. 安装 zookeeper 并启动服务
    2. 安装 mycat-web 并启动服务

     

    安装 zookeeper 并启动服务

    [root@192.168.118.15 /usr/local/src/mycat_tools]#tar xf zookeeper-3.4.6.tar.gz -C /usr/local/
    [root@192.168.118.15 /usr/local/src/mycat_tools]#cd /usr/local/zookeeper-3.4.6/conf/
    [root@192.168.118.15 /usr/local/zookeeper-3.4.6/conf]#mv zoo_sample.cfg zoo.cfg
    [root@192.168.118.15 /usr/local/zookeeper-3.4.6/bin]#./zkServer.sh start
    JMX enabled by default
    Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
    Starting zookeeper ... STARTED
    [root@192.168.118.15 /usr/local/zookeeper-3.4.6/bin]#netstat -ntplu | egrep 2181  # zookeeper 默认端口2181,启动成功
    tcp        0      0 0.0.0.0:2181            0.0.0.0:*               LISTEN      12661/java

     

     

     安装 mycat-web 并启动服务

    [root@192.168.118.15 /usr/local/src/mycat_tools]#tar xf Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz -C /usr/local/
    [root@192.168.118.15 /usr/local/src/mycat_tools]#cd /usr/local/mycat-web/
    [root@192.168.118.15 /usr/local/mycat-web]#nohup sh start.sh &  # 启动日志可以直接查看 nohup.out
    [root@192.168.118.15 /usr/local/mycat-web]#netstat -ntplu | egrep 8082  # mycat-web默认端口8082
    tcp        0      0 0.0.0.0:8082            0.0.0.0:*               LISTEN      12695/java

     

     

    现在就可以通过浏览器直接访问 mycat-web

     

     Mycat-配置 --> mycat服务配置 --> 新增

     

     这一步注意:点击保存,如果一直在loading 状态没有反应,就是版本的问题,如果没问题会直接提示添加成功,这里是个坑。

     

    添加mysql节点的管理

    Mycat配置 --> mysql管理 --> 新增

     

     

    其他的监控项可以自行研究了,mycat-web获取数据真的很慢,感觉 mycat-web 是比较鸡肋的。

     

    转载于:https://www.cnblogs.com/hukey/p/10097678.html

    展开全文
  • 读写分离概述1)工作原理读写分离是让主数据库处理事务性增删改操作(insert、delete、update),让从数据库处理查询查询操作(select)。2)作用1.分担负载2.主从只负责各自的写和读,极大的缓解X锁和S锁争用3.从库可配置...

    (1).读写分离概述

    1)工作原理

    读写分离是让主数据库处理事务性增删改操作(insert、delete、update),让从数据库处理查询查询操作(select)。

    2)作用

    1.分担负载

    2.主从只负责各自的写和读,极大的缓解X锁和S锁争用

    3.从库可配置MyISAM引擎,提升查询性能以及节约系统开销

    4.增加冗余,提高可用性

    3)实现方法

    一、应用程序和网站程序的实现。指的是在应用程序内部及连接器中实现读写分离。

    优点:1.应用程序内部实现读写分离,安装就可以使用;2. 减少一定部署难度;3.访问压力在一定级别以下,性能很好。

    缺点:1.架构一旦调整,代码要跟着变;2.难以实现高级应用,如自动分库,分表;3.无法适用大型应用场景。

    二、中间件实现。指的是在外部中间件程序实现读写分离。

    优点:1.架构设计更灵活;2.可以在程序上实现一些高级控制,如:透明化水平拆分,failover,监控;3.可以依靠些技术手段提高mysql性能;4.对业务代码的影响小,同时也安全

    缺点:需要一定的开发运维团队的支持。

    4)常见的Mysql中间键

    Cobar、MyCAT、OneProxy、Vitess、Kingshard、Atlas、MaxScale与MySQL Route。

    使用mycat原因是这是一款开源的免费的Mysql中间件,基于Cobar基础上二次开发,其功能也是相当完善。而且目前Mycat社区很活跃,支持度比较高,维护短期内应该不会中断。

    (2).实验环境

    youxi1  192.168.5.101  CentOS7.5  Mysql5.7.16  Mysql端口3306  Mycat中间件

    youxi2  192.168.5.102  CentOS7.5  Mysql5.7.16  Mysql端口3306  Master

    youxi3  192.168.5.103  CentOS7.5  Mysql5.7.16  Mysql端口3306  Slave

    (3).Mycat服务的安装与配置

    使用mycat中间件搭建读写分离,那么应访问的是mycat中间件,再由mycat访问主从服务器。

    Mycat的官网是

    Mycat需要安装JDK1.7或以上版本,我下载的是jdk-8u191-linux-x64.tar.gz,然后上传到youxi1服务器上。

    然后解压到/usr/local/目录下

    [root@youxi1 ~]# tar zxf Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz -C /usr/local/

    [root@youxi1 ~]# ls /usr/local/

    bin etc games include lib lib64 libexec mycat sbin share src

    [root@youxi1 logs]# ls /usr/local/mycat/

    bin catlet conf lib version.txt

    [root@youxi1 logs]# mkdir /usr/local/mycat/logs  //少一个logs目录就创建一个

    添加mysql用户以及修改文件夹权限

    [root@youxi1 ~]# useradd mycat

    [root@youxi1 ~]# echo "mycat:123456" | chpasswd

    [root@youxi1 ~]# chown -R mycat:mycat /usr/local/mycat/

    [root@youxi1 ~]# ll /usr/local/mycat/

    总用量 12

    drwxr-xr-x 2 mycat mycat 190 6月 18 15:30 bin

    drwxrwxrwx 2 mycat mycat 6 2月 13 14:46 catlet

    drwxrwxrwx 4 mycat mycat 4096 6月 18 15:30 conf

    drwxr-xr-x 2 mycat mycat 4096 6月 18 15:30 lib

    drwxr-xr-x 2 mycat mycat 6 6月 20 15:09 logs

    -rwxrwxrwx 1 mycat mycat 185 2月 13 15:02 version.txt

    说明:bin 程序目录,存放了封装成服务的版本,还存放了nowrap的shell脚本命令,方便大家选择和修改。mycat支持的命令有{ console | start | stop | restart | status | dump }

    conf目录下存放了配置文件,其中server.xml是Mycat服务器参数调整和用户授权的配置文件,schema.xml是逻辑库、表和分片定义的配置文件,rule.xml是分片规则的配置文件。另外分片规则的一些具体参数信息单独作为一个文件,也是存放在这个目录下。配置文件修改后,需要重启Mycat或者通过9066端口reload。

    lib目录下主要存放mycat依赖的一些jar文件。

    另外mycat启动后还会生成${sys:MYCAT_HOME}/logs/mycat.log,日志会存放在其中(默认250M上限,时间上限为1天,超出会创建新的日志文件,并且会自动备份),可以在conf/log4j.xml中配置日志文件,默认输出级别为info,可以调整为debug,输出更多信息方便排错。

    注意:Linux下部署安装MySQL,默认不忽略表名大小写,需要手动到/etc/my.cnf下配置lower_case_table_names=1,使Linux环境下MySQL忽略表名大小写,否则使用MyCAT的时候会提示找不到表的错误!

    解压JDK,添加jdk的环境变量文件,然后加载环境变量

    [root@youxi1 ~]# mkdir /usr/local/java/

    [root@youxi1 ~]# tar xf jdk-8u191-linux-x64.tar.gz -C /usr/local/java/

    [root@youxi1 ~]# ls /usr/local/java/

    jdk1.8.0_191

    [root@youxi1 ~]# vim /etc/profile.d/java.sh  //配置环境变量

    JAVA_HOME=/usr/local/java/jdk1.8.0_191

    PATH=$JAVA_HOME/bin:$PATH

    CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar

    export PATH JAVA_HOME CLASSPATH

    [root@youxi1 ~]# source /etc/profile.d/java.sh  //加载环境变量

    [root@youxi1 ~]# java -version  //查看是否生效

    java version "1.8.0_191"

    Java(TM) SE Runtime Environment (build 1.8.0_191-b12)

    Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

    (4).Mycat启动

    添加mycat的环境变量文件,然后加载环境变量

    [root@youxi1 ~]# vim /etc/profile.d/mycat.sh

    MYCAT_HOME=/usr/local/mycat

    PATH=$MYCAT_HOME/bin:$PATH

    [root@youxi1 ~]# source /etc/profile.d/mycat.sh

    注意:JDK的环境变量和Mycat的环境变量也可以一次性添加到/etc/profile文件中,然后重新加载。不过没有分开编辑好管理。

    配置mycat本身的用户信息server.xml文件

    [root@youxi1 ~]# vim /usr/local/mycat/conf/server.xml

    //直接拉到最后修改部分,设置访问mycat的用户信息,以及其能够访问的逻辑库

      //设置用户名。如果存在defaultAccount="true",则表示在不指定用户的情况下,默认以该用户访问mycat。

    123456  //设置当前用户的密码

    TESTDB  //能够访问的逻辑库(虚拟库),逻辑库需要在同目录下的schema.xml定义

    //没有设置任何权限,则默认具有所有权限

      //设置用户名

    123456  //设置当前用户的密码

    TESTDB  //能够访问的逻辑库(虚拟库)

    true  //设置只读权限

    配置schema.xml文件,定义逻辑库信息

    [root@youxi1 ~]# cp /usr/local/mycat/conf/schema.xml /usr/local/mycat/conf/schema.xml.bak  //提供的是分库分表,用法比较高级了

    [root@youxi1 ~]# vim /usr/local/mycat/conf/schema.xml

      //框定服务配置范围

    /*schema标签用于定义mycat中的逻辑库。

    *name是逻辑库名;

    *checkSQLschema默认为false,含义为是否去掉表名前的逻辑库名,只能去除当前定义的逻辑库名;

    *sqlMaxLimit是隐式limit,如果查询没有定义limit,则自动加上limit;

    *dataNode指定所属的数据节点,也就是常说的数据分片。*/

    //dataNote标签用于定义数据节点。name是数据节点名称;dataHost指定所属数据库实例;database指定数据库实例上的实际数据库名(要和真实数据库一样的名字)。

    /*dataHost标签用于定义数据库实例。

    *name数据库实例名称;

    *maxCon指定每个读写实例连接池的最大连接;

    *minCon指定每个读写实例连接池的最小连接,初始化连接池的大小

    *balance和writeType请看下方说明;

    *dbType指定后端连接的数据库类型,支持二进制的mysql协议,以及其他使用JDBC连接的数据库,例如mongodb、oracle、spark等;

    *dbDriver指定后端数据库使用的驱动,可选值JDBC和native,其中native对应二进制的mysql协议,即mysql和maridb,其余都使用JDBC;

    *switchType请看下发说明

    *slaveThreshold slave服务器读的安全边界,如果Seconds_Behind_Master大于这个值,这台slave服务器会被临时剔除,以免被读。*/

    //heartbeat标签用于定义心跳语句,用语句执行成功与否来判断数据库的可用性

    select user()

    /*writeHost和readHost标签都指定数据库的相关配置,用于实例化后端连接池。writeHost定义写实例,readHost定义读实例。

    *host是writeHost或readHost的名称,也是唯一标识;

    *usrl指定后端实例连接地址;

    *user指定后端存储实例需要的用户名(数据库的用户名);

    *password指定后端存储实例需要的密码(数据库用户的密码);

    *weight权重,是配置在readHost中作为读节点的权重*/

    注意:如果使用readHost标签,请使用writeHost标签将readHost标签包裹。

    说明:

    balance负载均衡类型。0表示不开启读写分离,所有读操作(select查询)都发送到当前writeHost上。1表示全部的readHost和备用writeHost都参与读操作(select查询)的负载均衡。2表示读操作随机在writeHost和readHost上发布。3表示所有读操作随机分发到当前writeHost对应的readHost上执行,writeHost不用执行。

    writeType负载均衡类型。0表示所有写操作发送到配置的第一个writeHost,挂了后切换到还生存的第二个writeHost,重新启动后以切换后的为准,切换记录在配置文件dnindex.properties中。1表示所有写操作都随机发送到配置的writeHost,mycat1.5以后已经废弃。

    switchType切换类型。-1表示不自动切换。1表示自动切换,默认值。2表示基于Mysql主从同步状态决定是否切换,心跳语句为show slave status。3表示基于MySQL galary cluster的切换机制(适合集群),心跳语句为show status like 'wsrep%'。

    启动测试Mycat,并设置开机自启

    [root@youxi1 conf]# mycat start  //因为已经配置环境变量,所以可以不写绝对路径

    Starting Mycat-server...

    [root@youxi1 conf]# tail /usr/local/mycat/logs/wrapper.log

    STATUS | wrapper | 2019/06/20 15:26:47 | --> Wrapper Started as Daemon

    STATUS | wrapper | 2019/06/20 15:26:47 | Launching a JVM...

    INFO | jvm 1 | 2019/06/20 15:26:47 | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0

    INFO | jvm 1 | 2019/06/20 15:26:48 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org

    INFO | jvm 1 | 2019/06/20 15:26:48 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.

    INFO | jvm 1 | 2019/06/20 15:26:48 |

    INFO | jvm 1 | 2019/06/20 15:26:57 | MyCAT Server startup successfully. see logs in logs/mycat.log  //成功启动

    [root@youxi1 conf]# echo "/usr/local/mycat/bin/mycat start" >> /etc/rc.local

    [root@youxi1 conf]# chmod +x /etc/rc.d/rc.local

    [root@youxi1 conf]# vim /usr/local/mycat/conf/wrapper.conf

    wrapper.java.command=/usr/local/java/jdk1.8.0_191/bin/java  //第5行,指向java

    注意:如果防火墙是打开的,记得添加mysql的端口号。

    [root@youxi1 ~]# firewall-cmd --permanent --zone=public --add-port=8066/tcp

    success

    [root@youxi2 ~]# firewall-cmd --reload

    success

    [root@youxi2 ~]# firewall-cmd --zone=public --list-ports

    8066/tcp

    (5).配置主从复制

    1)youxi2上操作

    创建mycat中schema.xml文件设置的用户名和密码,以及指定的数据库。创建复制用的用户

    mysql> grant all privileges on *.* to 'mycat'@'192.168.5.%' identified by '123456';  //mycat指定的用户

    Query OK, 0 rows affected, 1 warning (0.01 sec)

    mysql> grant replication slave on *.* to 'slave'@'192.168.5.%' identified by '123456';  //复制用的用户

    Query OK, 0 rows affected, 1 warning (0.00 sec)

    mysql> flush privileges;  //刷新权限表

    Query OK, 0 rows affected (0.00 sec)

    mysql> create database ha;  //mycat指定的数据库

    Query OK, 1 row affected (0.00 sec)

    修改配置文件,并重启

    [root@youxi2 ~]# vim /etc/my.cnf

    server-id=1

    log-bin=mysql-bin-master

    binlog-do-db=ha

    [root@youxi2 ~]# systemctl restart mysqld

    查看master状态

    mysql> show master status\G

    *************************** 1. row ***************************

    File: mysql-bin-master.000001

    Position: 154

    Binlog_Do_DB: ha

    Binlog_Ignore_DB:

    Executed_Gtid_Set:

    1 row in set (0.00 sec)

    注意:如果防火墙是打开的,记得添加mysql的端口号。

    [root@youxi2 ~]# firewall-cmd --permanent --zone=public --add-port=3306/tcp

    success

    [root@youxi2 ~]# firewall-cmd --reload

    success

    [root@youxi2 ~]# firewall-cmd --zone=public --list-ports

    3306/tcp

    2)youxi3上操作

    创建mycat中schema.xml文件设置的用户名和密码,以及指定的数据库。

    mysql> grant all privileges on *.* to 'mycat'@'192.168.5.%' identified by '123456';  //mycat指定的用户

    Query OK, 0 rows affected, 1 warning (0.01 sec)

    mysql> flush privileges;  //刷新权限表

    Query OK, 0 rows affected (0.00 sec)

    mysql> create database ha;  //mycat指定的数据库

    Query OK, 1 row affected (0.01 sec)

    修改配置文件

    [root@youxi3 ~]# vim /etc/my.cnf

    server-id=2

    [root@youxi3 ~]# systemctl restart mysqld

    配置master信息

    mysql> stop slave;

    Query OK, 0 rows affected (0.01 sec)

    mysql> change master to master_host='192.168.5.102',master_user='slave',master_password='123456',master_log_file='mysql-bin-master.000001',master_log_pos=154;

    Query OK, 0 rows affected, 2 warnings (0.01 sec)

    mysql> start slave;

    Query OK, 0 rows affected (0.00 sec)

    查看slave状态

    mysql> show slave status\G

    *************************** 1. row ***************************

    Slave_IO_State: Waiting for master to send event

    Master_Host: 192.168.5.102

    Master_User: slave

    Master_Port: 3306

    Connect_Retry: 60

    Master_Log_File: mysql-bin-master.000001

    Read_Master_Log_Pos: 154

    Relay_Log_File: youxi3-relay-bin.000003

    Relay_Log_Pos: 327

    Relay_Master_Log_File: mysql-bin-master.000001

    Slave_IO_Running: Yes

    Slave_SQL_Running: Yes

    注意:如果防火墙是打开的,记得添加mysql的端口号。

    [root@youxi3 ~]# firewall-cmd --permanent --zone=public --add-port=3306/tcp

    success

    [root@youxi3 ~]# firewall-cmd --reload

    success

    [root@youxi3 ~]# firewall-cmd --zone=public --list-ports

    3306/tcp

    (6).测试

    在youxi1上连接mycat,当然也可以使用软件客户端远程连接mycat。并创建测试数据

    [root@youxi1 ~]# mysql -uroot -p123456 -h192.168.5.101 -P8066  //这边的用户名和密码必须是mycat配置文件server.xml中定义的用户

    mysql> show databases;  //注意这里显示的是mycat定义的逻辑库TESTDB

    +----------+

    | DATABASE |

    +----------+

    | TESTDB |

    +----------+

    1 row in set (0.00 sec)

    mysql> use TESTDB;

    Database changed

    mysql> show tables;

    Empty set (0.00 sec)

    mysql> create table user_tb(user int,name varchar(20));

    Query OK, 0 rows affected (0.03 sec)

    mysql> insert into user_tb values(1,'zhangsan');

    Query OK, 1 row affected (0.05 sec)

    再到youxi2和yousi3上查看

    [root@youxi2 ~]# mysql -uroot -p123456

    mysql> select * from ha.user_tb;  //查询时需要查询实际存在的数据库

    +------+----------+

    | user | name |

    +------+----------+

    | 1 | zhangsan |

    +------+----------+

    1 row in set (0.00 sec)

    [root@youxi3 ~]# mysql -uroot -p123456

    mysql> select * from ha.user_tb;

    +------+----------+

    | user | name |

    +------+----------+

    | 1 | zhangsan |

    +------+----------+

    1 row in set (0.01 sec)

    再试一下只读用户user

    [root@youxi1 ~]# mysql -uuser -p123456 -h192.168.5.101 -P8066

    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> insert into user_tb values(2,'lisi');

    ERROR 1495 (HY000): User readonly

    如果master服务器youxi2宕机,那么mycat将只能读不能写。

    //youxi2上停止mysqld,模拟宕机

    [root@youxi2 ~]# systemctl stop mysqld

    //此时的再进行测试

    [root@youxi1 logs]# mysql -uroot -p123456 -h192.168.5.101 -P8066

    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 user_tb;

    +------+----------+

    | user | name |

    +------+----------+

    | 1 | zhangsan |

    +------+----------+

    1 row in set (0.03 sec)

    mysql> insert into user_tb values(2,'lisi');

    ERROR 1184 (HY000): java.net.ConnectException: 拒绝连接

    注意:再次启动mysqld,能够恢复正常

    展开全文
  • 实现mycat读写分离

    2020-10-31 18:34:33
    众所周知,随着用户量的增多,数据库操作往往会成为一个系统的瓶颈所在,而且一般的系统“读”的压力远远大于“写”,因此我们可以通过实现数据库的读写分离来提高系统的性能。 基础知识 要实现读写分离,就要解决...

    前言

    众所周知,随着用户量的增多,数据库操作往往会成为一个系统的瓶颈所在,而且一般的系统“读”的压力远远大于“写”,因此我们可以通过实现数据库的读写分离来提高系统的性能。

    基础知识

    要实现读写分离,就要解决主从数据库数据同步的问题,在主数据库写入数据后要保证从数据库的数据也要更新。

    实现思路

    一个主数据库用来写数据,一个或多个从数据库用来读数据,将主数据库的数据同步到从数据库中。

    一,主从同步的原理

    在这里插入图片描述
    主服务器master记录数据库操作日志到Binary log,从服务器开启i/o线程将二进制日志记录的操作同步到relay log(存在从服务器的缓存中),另外sql线程将relay log日志记录的操作在从服务器执行。
    在这里插入图片描述

    备库B和主库A之间维持了一个长连接。主库A内部有一个线程,专门用于服务备库B的这个长连接。一个事务日志同步的完整过程如下:
    1.在备库B上通过change master命令,设置主库A的IP、端口、用户名、密码,以及要从哪个位置开始请求binlog,这个位置包含文件名和日志偏移量

    2.在备库B上执行start slave命令,这时备库会启动两个线程,就是图中的io_thread和sql_thread。其中io_thread负责与主库建立连接

    3.主库A校验完用户名、密码后,开始按照备库B传过来的位置,从本地读取binlog,发给B

    4.备库B拿到binlog后,写到本地文件,称为中转日志

    5.sql_thread读取中转日志,解析出日志里的命令,并执行

    由于多线程复制方案的引入,sql_thread演化成了多个线程。主备的并行复制能力,要关注的就是上图中黑色的两个箭头。一个代表客户端写入主库,另一个代表备库上sql_thread执行中转日志
    在MySQL5.6版本之前,MySQL只支持单线程复制,由此在主库并发高、TPS高时就会出现严重的主备延迟问题,多线程复制机制都是把只有一个线程的sql_thread拆成多个线程,都符合下面这个模型:
    在这里插入图片描述
    coordinator就是原来的sql_thread,不过现在它不再直接更新数据了,只负责读取中转日志和分发事务。真正更新日志的,变成了worker线程。而worker线程的个数就是由参数slave_parallel_workers决定的。

    本部分参考《MySQL主备、主从、读写分离详解》,关于循环复制,主备延迟,切换策略等更多内容可参考此文章。

    二,主从同步实现

    1,修改主库配置

    1,修改my.ini配置文件
    2.在主服务器master上配置开启Binary log,主要是在[mysqld]下面添加:

    server-id=1
    log-bin=master-bin
    log-bin-index=master-bin.index
    

    3.重启mysql服务
    4.检查配置效果,进入主数据库并执行

    mysql> SHOW MASTER STATUS;
    

    输出如下图,记录下file的名字,这个就是log文件的名字,配置从服务器时需要使用
    在这里插入图片描述

    2,修改从库配置

    1.配置从服务器的 my.ini

    server-id=2
    relay-log-index=slave-relay-bin.index
    relay-log=slave-relay-bin
    

    注:这里面的server-id 一定要和主库的不同
    2.完成后重启从mysql服务

    3,配置两个数据库的关联

    1,连接主数据库执行以下操作:

    	//1,在主库创建账号,用于从库的连接
    	//2,赋予新建的账户从库权限(不同版本设置方式不同,此处为mysql8)
     mysql> CREATE USER qiao IDENTIFIED BY '123456';
     mysql>  grant replication slave on *.* to 'qiao'@'%';
     mysql> flush privileges;
    

    2,连接从库执行以下操作

    change master to master_host='127.0.0.1',
    master_port=3307,
    master_user='qiao',
    master_password='123456',
    master_log_file='master-bin.000001',
    master_log_pos=0;
    

    master_host:主库的ip
    master_port:主库的端口,
    master_user:连接主库的账号’,
    master_password:账号的密码,
    master_log_file:log文件名,
    master_log_pos=0;//写0会赋予默认值

    4,查看从库状态

    mysql> start slave ;//启动同步
    mysql> show slave status\G //查看启动状态,注意不要加分号
    mysql> stop slave ; //停止同步
    
    

    查看状态后如下图所示,当Slave_Log_Running和Slave_SQL_Running都为Yes时表示同步启动成功。
    在这里插入图片描述
    这里看到从数据库已经在等待主库的消息了,接下来在主库的操作,在从库都会执行了。我们可以主库负责写,从库负责读(不要在从库进行写操作),达到读写分离的效果。

    三,实现读写分离

    在应用中直接进行读写分离
    添加mycat中间件,可屏蔽读写分离,数据源选择等业务,减小代码量。
    在这里插入图片描述

    1,读写分离实现方式

    1,应用本身通过代码实现,例如基于动态数据源、AOP的原理来实现写操作时用主数据库,读操作时用从数据库。此方法可参考《MySQL:MyCat中间件实现动态数据源、读写分离,分库分表》
    2,通过中间件的方式实现,例如通过Mycat,即中间件会分析对应的SQL,写操作时会连接主数据库,读操作时连接从数据库。
    3,配置多数据源,获取不同的DAO。

    2,mycat安装(windous)

    注:linux下安装配置可参考《linux安装mycat》
    1,下载
    https://github.com/MyCATApache/Mycat-Server/releases
    2,解压
    在这里插入图片描述
    3,配置环境变量

    %MYCAT_HOME%/bin
    

    4.接下来要修改mycat/conf下面的几个配置文件
    wrapper.conf 红字修改为自己的jdk的路径
    在这里插入图片描述
    5,在打开的cmd命令行窗口中,执行如下命令安装mycat(注意需要管理员账户登录,如果不是请使用管理员身份运行cmd打开命令行窗口):

    mycat.bat install
    

    6、启动和停止
    可以使用如下命令启动mycat服务

    mycat.bat start
    

    启动后可以通过如下命令查看mycat的运行状态:

    mycat.bat status
    

    可以使用如下命令停止mycat服务

    mycat.bat stop
    

    3,mycat配置读写分离

    1,修改server.xml
    最主要的看下面的配置,这是连接mycat的时候的用户名和密码

    <user name="root">
            <property name="password">123456</property>
            <property name="schemas">TESTDB</property>
            
            <!-- 表级 DML 权限设置 -->
            <!--         
            <privileges check="false">
                <schema name="TESTDB" dml="0110" >
                    <table name="tb01" dml="0000"></table>
                    <table name="tb02" dml="1111"></table>
                </schema>
            </privileges>        
             -->
        </user>
    
        <user name="user">
            <property name="password">user</property>
            <property name="schemas">TESTDB</property>
            <property name="readOnly">true</property>
        </user>
    

    2,修改schema.xml
    详细配置可参考《schema.xml配置详解》

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    
    	<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
    		<!-- auto sharding by id (long) -->
    		<!--splitTableNames 启用<table name 属性使用逗号分割配置多个表,即多个表使用这个配置-->
    		<!--fetchStoreNodeByJdbc 启用ER表使用JDBC方式获取DataNode  rule="sharding-by-intfile"   autoIncrement="true"  fetchStoreNodeByJdbc="true"-->
    		<table name="testtable" primaryKey="id" dataNode="dn1" ruleRequired="fasle">
    			<!-- <childTable name="customer_addr" primaryKey="id" joinKey="customer_id" parentKey="id"> </childTable> -->
    		</table>
    		<!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
    			/> -->
    	</schema>
    	<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
    		/> -->
    	<dataNode name="dn1" dataHost="localhost1" database="test" />
    <!-- 	<dataNode name="dn2" dataHost="localhost1" database="test" />
    	<dataNode name="dn3" dataHost="localhost1" database="test" />
    	<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />
    	<dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
    	<dataNode	name="jdbc_dn2" dataHost="jdbchost" database="db2" />
    	<dataNode name="jdbc_dn3" 	dataHost="jdbchost" database="db3" /> -->
    	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
    			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
    		<heartbeat>select user()</heartbeat>
    		<!-- can have multi write hosts -->
    		<writeHost host="hostM1" url="jdbc:mysql://localhost:3307?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF8&amp;serverTimezone=UTC" user="root" password="123456">
    				<readHost host="hostS1" url="jdbc:mysql://localhost:3308?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF8&amp;serverTimezone=UTC" user="root" password="123456"/>   
    		</writeHost>
    		<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
    	</dataHost>
    </mycat:schema>
    
    1. schema 标签用于定义MyCat 实例中的逻辑库,MyCat 可以有多个逻辑库,每个逻辑库都有自己的相关配置。可以使用schema 标签来划分这些不同的逻辑库。
    2. dataNode 标签定义了MyCat 中的数据节点,也就是我们通常说所的数据分片。一个dataNode 标签就是一个独立的数据分片(几个DataNode就是把一个表分成几部分存储)。
    3. dataHost标签直接定义了具体的数据库实例、读写分离配置和心跳语句。其中有几个重要的属性:
    balance属性
    负载均衡类型,目前的取值有3 种:
    balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上。
    balance="1",全部的readHost 与stand by writeHost 参与select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1 与M2 互为主备),正常情况下,M2,S1,S2 都参与select 语句的负载均衡。
    balance="2",所有读操作都随机的在writeHost、readhost 上分发。
    balance="3",所有读请求随机的分发到wiriterHost 对应的readhost 执行,writerHost 不负担读压
    力,注意balance=3 只在1.4 及其以后版本有,1.3 没有。
    
    writeType 属性
    负载均衡类型,目前的取值有3 种:
    writeType="0", 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个
    writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
    writeType="1",所有写操作都随机的发送到配置的writeHost,1.5 以后废弃不推荐。
    

    4,启动mycat

    mycat.bat start
    

    5,连接mycat测试

    读库,写库,mycat对应的表结构

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201102083001909.png#pic_center

    测试结果

    当关闭主从同步后,在mycat的testTable中插入一条记录,write数据库的testTable中出现新添加的记录,刷新mycat的testTable表记录消失。

    以下情况不建议用Mycat分库分表

    1.非分片字段查询,
    2.分页排序
    3.任意表JOIN
    4.分布式事务
    具体参考《mycat从入门到放弃》

    展开全文
  • Mycat读写分离及HA

    2018-05-17 17:05:00
    MyCat读写分离是基于后端MySQL集群的主从同步来实现的,而MyCat提供语句的分发功能。MyCat1.4开始支持MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠。 原理  上述图片里,Orders表被分为三个分片...

     

    一、概述

    MyCat的读写分离是基于后端MySQL集群的主从同步来实现的,而MyCat提供语句的分发功能。MyCat1.4开始支持MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠。

    原理

     

     

      上述图片里,Orders表被分为三个分片datanode(简称dn),这三个分片是分布在两台MySQL Server上(DataHost),即datanode=database@datahost方式,因此你可以用一台到N台服务器来分片,分片规则为(sharding rule)典型的字符串枚举分片规则,一个规则的定义是分片字段(sharding column)+分片函数(rule function),这里的分片字段为prov而分片函数为字符串枚举方式。

      当Mycat收到一个SQL时,会先解析这个SQL,查找涉及到的表,然后看此表的定义,如果有分片规则,则获取到SQL里分片字段的值,并匹配分片函数,得到该SQL对应的分片列表,然后将SQL发往这些分片去执行,最后收集和处理所有分片返回的结果数据,并输出到客户端。以select * from Orders where prov=?语句为例,查到prov=wuhan,按照分片函数,wuhan返回dn1,于是SQL就发给了MySQL1,去取DB1上的查询结果,并返回给用户。如果上述SQL改为select * from Orders where prov in (‘wuhan’,‘beijing’),那么,SQL就会发给MySQL1与MySQL2去执行,然后结果集合并后输出给用户。但通常业务中我们的SQL会有Order By 以及Limit翻页语法,此时就涉及到结果集在Mycat端的二次处理,这部分的代码也比较复杂,而最复杂的则属两个表的Jion问题,为此,Mycat提出了创新性的ER分片、全局表、HBT(Human Brain Tech)人工智能的Catlet、以及结合Storm/Spark引擎等十八般武艺的解决办法。

    二、MyCat环境部署

    MyCat的读写分离是基于后端MySQL集群的主从同步来实现的,而MyCat提供语句的分发功能。MyCat1.4开始支持MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠。

     

    环境介绍

    主机名

    IP地址

    系统

    服务名

    Mycat-A

    192.168.200.103

    CentOS 6.5

    Mycat

    Mysql-A

    192.168.200.104

    CentOS 6.5

    Mysql

    Mysql-B

    192.168.200.105

    CentOS 6.5

    Mysql

     

    1. 服务器基本配置

    配置本地解析文件:

    vim /etc/hosts
    
    192.168.200.103 MyCat-A
    
    192.168.200.104 Mysql-A
    
    192.168.200.105 Mysql-B

     

    配置主机名:

    hostname MyCat-A/Mysql-A/Mysql-B

     

    Mysql主从复制部署

    Mysql-A安装配置:

    [root@Mysql-A ~]# yum -y install mysql-server
    
    [root@Mysql-A ~]# vim /etc/my.cnf
    
    log-bin=mysql-bin
    
    server-id=1
    
    log_bin_trust_function_creators=true
    
    lower_case_table_names=1
    
    [root@Mysql-A ~]# service mysql start

     

     

     

    Mysql-B安装配置:

    [root@Mysql-B ~]# yum -y install mysql-server
    
    [root@Mysql-B ~]# vim /etc/my.cnf
    
    server-id=2
    
    relay-log=relay-log
    
    log-bin=mysql-bin
    
    log_bin_trust_function_creators=true
    
    lower_case_table_names=1
    
    [root@Mysql-B ~]# service mysql start

     

     

     

    Mysql-A:

    [root@Mysql-A ~]# mysqladmin -uroot password "123456"
    
    [root@Mysql-A ~]# mysql -uroot -p123456
    
    mysql> grant replication slave on *.* to 'repu'@'192.168.200.%' identified by '123456';
    
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> show master status;
    
    +------------------+----------+--------------+------------------+
    
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    
    +------------------+----------+--------------+------------------+
    
    | mysql-bin.000004 |      461 |              |                  |
    
    +------------------+----------+--------------+------------------+
    
    1 row in set (0.00 sec)

     

    Mysql-B:

    [root@Mysql-B ~]# mysqladmin -uroot password "123456"
    
    [root@Mysql-B ~]# mysql -uroot -p123456
    
    mysql> change master to
    
        -> master_host='192.168.200.104',
    
        -> master_user='repu',
    
        -> master_password='123456',
    
        -> master_log_file='mysql-bin.000004',
    
        -> master_log_pos='461';
    
    1 row in set (0.00 sec)
    
    mysq>slave start;
    
    1 row in set (0.00 sec)
    
    mysql>show slave status\G
    
                 Slave_IO_Running: Yes
    
                Slave_SQL_Running: Yes
    
    1 row in set (0.00 sec)

     

     

    MyCat安装

    下载地址:http://dl.mycat.io/

     

    [root@MyCat-A ~]# tar xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/

     

    配置MyCat

    1. server.xml

    [root@MyCat-A ~]# cp /usr/local/mycat/conf/server.xml{,.bak}
    
    [root@MyCat-A ~]# vim /usr/local/mycat/conf/server.xml//修改文件末端user项
    
     <user name="readuser">//用户名
    
      <property name="password">readuser</property>//密码
    
       <property name="schemas">mytest</property>//虚拟数据库名
    
        <property name="readOnly">true</property>//只读
    
         </user>
    
     <user name="writeuser">
    
      <property name="password">writeuser</property>
    
       <property name="schemas">mytest</property>
    
    </user>

     

     

     

    1. schema.xml

    [root@MyCat-A ~]# cp /usr/local/mycat/conf/schema.xml{,.bak}
    
    [root@MyCat-A ~]# vim /usr/local/mycat/conf/schema.xml
    
    <?xml version="1.0"?>//该行前面不能有任何内容否则服务启动会报错
    
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    
    <mycat:schema xmlns:mycat="http://io.mycat/">
    
     
    
    <schema name="mytest" checkSQLschema="false" sqlMaxLimit="100" dataNode="my1" />//定义虚拟数据库名
    
    <dataNode name="my1" dataHost="test1" database="test" />//真实数据库名
    
    <dataHost name="test1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" >
    
    <heartbeat>select user()</heartbeat>
    
    <writeHost host="hostM1" url="192.168.200.104:3306" user="tank" password="123456" >//真是数据库连接方式
    
     <readHost host="hostS1" url="192.168.200.105:3306" user="tank" password="123456" />
    
    //同上
    
      </writeHost>
    
       </dataHost>
    
     
    
    </mycat:schema>

     

     

     

    mycat的配置参数,相当的多。重点说一下 balance="1"与writeType="0"

    • 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", 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有, 1.3 没有。
    • writeType 属性

        负载均衡类型,目前的取值有 3 种:

    1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个
    2. writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
    3. writeType="1",所有写操作都随机的发送到配置的 writeHost。
    4. writeType="2",没实现。

     

    具体参数:http://mycat.io/document/Mycat_V1.6.0.pdf

     

    2. log4j2.xml(可选)

    [root@MyCat-A ~]# vim /usr/local/mycat/conf/log4j2.xml
    
     value=”info” 修改为”debug”     

     

     

    验证

    [root@MyCat-A ~]# netstat -antup | egrep ":(8066|9066)"
    
    tcp        0      0 0.0.0.0:8066                0.0.0.0:*                   LISTEN      2077/java           
    
    tcp        0      0 0.0.0.0:9066                0.0.0.0:*                   LISTEN      2077/java  

     

     

    [root@MyCat-A ~]# mysql -uwriteuser -pwriteuser -P 8066 -h 192.168.200.103
    
    mysql> show databases;
    
    +----------+
    
    | DATABASE |
    
    +----------+
    
    | mytest   |
    
    +----------+
    
    1 row in set (0.06 sec)
    
     
    
    mysql> use mytest
    
    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
    >CREATE TABLE IF NOT EXISTS `user` ( -> `id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'ID', -> `name` varchar(20) NOT NULL DEFAULT '' COMMENT '姓名', -> `create_time` int(10) NOT NULL DEFAULT '0' COMMENT '创建时间', -> PRIMARY KEY (`id`) -> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 1 row in set (0.06 sec)
    # 插入数据 mysql
    > INSERT INTO `user` (`id` ,`name`)VALUES ('1', 'msl23'); 1 row in set (0.06 sec) mysql> select * from user; +----+-------+-------------+ | id | name | create_time | +----+-------+-------------+ | 1 |msl23 | 0 | +----+-------+-------------+ 2 rows in set (0.14 sec)

     

     

     

    三、使用HAproxy部署MyCat高可用

    MyCat-B和Mycat-A配置相同:

    1. 主机名
    2. hosts文件更新为:
    [root@MyCat-B ~]# vim /etc/hosts
    
    192.168.200.103 MyCat-A
    
    192.168.200.104 Mysql-A
    
    192.168.200.105 Mysql-B
    
    192.168.200.102 MyCat-B
    
    192.168.200.101 HAproxy

     

     

     

    简介

     

    HAProxy官网:http://www.haproxy.org/ (可能需要FQ)

    HAProxy各版本的官方文档:http://cbonte.github.io/haproxy-dconv/index.html

    HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。

    HAProxy目前主要有三个版本:1.41.51.6CentOS6.6自带的RPM包为1.5的。

    HAProxy1.5版开始,支持SSLDDoS防护等功能,可看官网说明:

    version 1.5 : the most featureful version, supports SSL, IPv6, keep-alive, DDoS protection, etc...

    MyCat官方推荐使用HAProxyMyCat的高可用负载均衡代理。

     

         HAProxy支持TCP(第四层)和HTTP(第七层)应用的代理,本节课程我们使用HAProxy来做MyCat的负载均衡代理使用的是TCP模式。在4层模式下HAProxy仅在客户端和服务器之间转发双向流量。HAProxy配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障,HAProxy会自动将该服务器摘除,故障恢复后会自动将该服务器加入进来。

     

    架构图

     

    配置MyCatABA/B配置相同)

    配置服务检查状态:

      MyCat服务主机(MyCat-A,MyCat-B)上需要增加mycat服务的状态检测脚本,并开放相应的检测端口,以提供给HAProxy对MyCat的服务状态进行检测判断。可以使用xinetd来实现,通过xinetd,HAProxy可以用httpchk来检测MyCat的存活状态。(xinetd即extended internet daemon,xinetd是新一代的网络守护进程服务程序,又叫超级Internet服务器。经常用来管理多种轻量级Internet服务。xinetd提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。xinetd为linux系统的基础服务)

     

    1. 配置

    [root@MyCat-A ~]# yum install xinetd
    
    [root@MyCat-A ~]# vim /etc/xinetd.d/mycat_status
    
    service mycat_status
    
    {
    
            flags           = REUSE
    
    ## 使用该标记的socket_type为stream,需要设置wait为no
    
            socket_type     = stream ## 封包处理方式,Stream为TCP数据包
    
            port            = 48700  ## 服务监听端口
    
            wait            = no     ## 表示不需等待,即服务将以多线程的方式运行
    
            user            = root   ## 执行此服务进程的用户
    
            server          =/usr/local/bin/mycat_status    ## 需要启动的服务脚本
    
            log_on_failure  += USERID    ## 登录失败记录的内容
    
            disable         = no     ## 要启动服务,将此参数设置为no
    
    }
    
     
    
    [root@MyCat-A ~]# vim /usr/local/bin/mycat_status
    
    mycat=`/usr/local/mycat/bin/mycat status | grep 'not running' | wc -l`
    
    if [ "$mycat" = "0" ]; then
    
        /bin/echo -e "HTTP/1.1 200 OK\r\n"
    
    else
    
        /bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n"
    
    fi
    
     
    
    [root@MyCat-A ~]# chmod a+x /usr/local/bin/mycat_status
    
    [root@MyCat-A ~]# vim /etc/services//添加
    
    mycat_status    48700/tcp               # mycat_status
    
    [root@MyCat-A ~]# service xinetd restart

     

    2. 验证

    [root@MyCat-A ~]# netstat -antup|grep 48700
    
    tcp        0      0 0.0.0.0:48700               0.0.0.0:*                   LISTEN      2193/xinetd

     

    配置HAproxy

    1. 安装

    [root@HAproxy ~]# yum install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
    
    [root@HAproxy ~]# tar xf haproxy-1.5.19.tar.gz
    
    [root@HAproxy ~]# cd haproxy-1.5.19
    
    [root@HAproxy haproxy-1.5.19]# make  TARGET=linux2628  ARCH=x86_64  USE_PCRE=1  USE_OPENSSL=1  USE_ZLIB=1  PREFIX=/usr/local/haproxy
    
    [root@HAproxy haproxy-1.5.19]# mkdir /usr/local/haproxy
    
    [root@HAproxy haproxy-1.5.19]# make install PREFIX=/usr/local/haproxy

     

    准备配置文件

    [root@HAproxy haproxy-1.5.19]# cp examples/haproxy.cfg /usr/local/haproxy/conf/

     

    准备错误文件

    [root@HAproxy haproxy-1.5.19]# cp -r examples/errorfiles/ /usr/local/haproxy/

     

    准备开机启动文件

    [root@HAproxy haproxy-1.5.19]# cp examples/haproxy.init /etc/init.d/
    
    [root@HAproxy haproxy-1.5.19]# chmod a+x /etc/init.d/haproxy
    
    [root@HAproxy haproxy-1.5.19]# chkconfig --add haproxy
    
    [root@HAproxy haproxy-1.5.19]# chkconfig haproxy on

     

     

    2. 配置HAproxy

    修改haproxy.cfg文件

    [root@HAproxy ~]# vim /usr/local/haproxy/conf/haproxy.cfg
    
    #---------------------------------------------------------------------  
    
    # Global settings  
    
    #---------------------------------------------------------------------  
    
    global   
    
      log 127.0.0.1 local0 ##记日志的功能  
    
      maxconn 4096       ##最大连接数,默认4000  
    
      #chroot /usr/local/haproxy  
    
      user root       #所属用户  
    
      group root      #所属组  
    
      daemon             ###创建1个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon"  
    
      
    
    defaults  
    
      log global         ###采用全局定义的日志  
    
      option dontlognull    ###不记录健康检查的日志信息  
    
      retries 3          ###3次连接失败就认为服务不可用,也可以通过后面设置  
    
      option redispatch   ###serverId对应的服务器挂掉后,强制定向到其他健康的服务器  
    
      maxconn 2000       ###最大连接数  
    
      timeout connect 5000ms                   ##contimeout 5000    连接超时  
    
      timeout client  50000ms                  ##clitimeout 50000   客户端连接超时  
    
      timeout server  50000ms                  ##srvtimeout 50000   服务器连接超时  
    
      ##listen admin_status 192.168.200.101:48800 ##VIP  
    
      ##stats uri/admin-status #统计页面  
    
      ##stats auth admin:admin  
    
      mode http          ###默认的模式,tcp是4层,http是7层,health只会返回OK 若是混合模式则 mode 不需要设置  
    
      option httplog     ###日志类别http日志格式 混合模式 此处还需要加上 tcplog   
    
        
    
      ## HAProxy的状态信息统计页面  
    
    listen admin_stats  
    
        bind  :48800  ## 绑定端口  
    
        stats uri /admin-status     ##统计页面  
    
        stats auth admin:admin ## 设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可  
    
        mode  http  
    
        option     httplog    ## 启用日志记录HTTP请求  
    
        
    
    listen allmycat_service ##192.168.200.101:8096 ##转发到mycat的8066端口,即mycat的服务端口  
    
      bind 192.168.200.101:8096  
    
      mode tcp  
    
      option tcplog  
    
      option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www  
    
      balance roundrobin  
    
      server mycat_161 192.168.200.102:8066 check port 48700 inter 5s rise 2 fall 3  
    
      server mycat_165 192.168.200.103:8066 check port 48700 inter 5s rise 2 fall 3  
    
      #srvtimeout 20000  
    
      timeout server 20000  
    
        
    
    listen allmycat_admin ##192.168.200.101:8097 ##转发到mycat的9066端口,及mycat的管理控制台端口  
    
      bind 192.168.200.101:8097  
    
      mode tcp  
    
      option tcplog  
    
      option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www  
    
      balance roundrobin  
    
      server mycat_161 192.168.200.102:9066 check port 48700 inter 5s rise 2 fall 3  
    
      server mycat_165 192.168.200.103:9066 check port 48700 inter 5s rise 2 fall 3  
    
      #srvtimeout 20000  
    
      timeout server 20000

     

     

    3. 配置rsyslog

    默认haproxy是不记录日志的,为了记录日志还需要配置syslog模块,在Linux下是rsyslogd服务

     

    [root@HAproxy ~]# yum -y install rsyslog
    
    [root@HAproxy ~]# vim /etc/rsyslog.d/haproxy.conf
    
    $ModLoad imudp
    
            $UDPServerRun 514
    
           local0.* /var/log/haproxy.log
    
    [root@HAproxy ~]# vim /etc/rsyslog.conf
    
    # Save boot messages also to boot.log
    
    local7.*                                               /var/log/boot.log
    
    local0.*                                               /var/log/haproxy.log
    
    [root@HAproxy ~]# service rsyslog restart

     

     

     

     

    启动HAproxy

    检查HAproxy配置文件是否正确

    [root@HAproxy ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -c

     

    启动HAproxy

    [root@HAproxy ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg 

     

    验证

    通过HAproxy登陆MyCat

    [root@HAproxy ~]#  mysql -uwriteuser -pwriteuser -h192.168.200.101 -P8096
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
     
    
    mysql> show databases;
    
    +----------+
    
    | DATABASE |
    
    +----------+
    
    | mytest   |
    
    +----------+
    
    1 row in set (0.00 sec)

     

     

    查看状态访问http://192.168.200.101:48800/admin-status

    账号密码为:

    listen admin_stats
    
        bind  :48800  # 绑定端口  
    
        stats uri /admin-status     #统计页面  
    
        stats auth admin:admin # 设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可  
    
        mode  http
    
        option     httplog    #启用日志记录HTTP请求  

     

    转载于:https://www.cnblogs.com/msl23/p/9052037.html

    展开全文
  • mycat读写分离配置

    千次阅读 2017-01-29 15:17:04
    原理:提供了3 倍的数据库读的并发能力.galera for mysql 集群这种方式,是牺牲了数据的写入速度,以换取最大程度的数据并发访问能力,类似Mycat里的全局表,并且保证了数据同时存在几个有效的副本,从而具有非常高...
  • 读写分离原理2.读写分离配置3.验证读写分离四、MySQL双主双从搭建1.架构2.双主双从配置五、MyCat双主双从读写分离1.配置2. 读写分离验证3.可用性验证 一、MySQL主从复制原理 复制是指将主数据库的 DDL 和 DML 操作...
  • 1.MyCat简介 MyCAT是一款由阿里Cobar演变而来的...MyCAT原理MyCat主要是通过对SQL的拦截,然后经过一定规则的分片解析、路由分析、读写分离分析、缓存分析等,然后将SQL发给后端真实的数据块,并将返回的结果做...
  • 学完本套课程将学习基于binlog二进制与GTID技术主从复制,双主复制、一主多从、多主一从、多线程复制、无损复制、结合keepalived实现mysql双主高可用、LVS双主mysql负载均衡以及使用MyCat数据库中间件实现读写分离。...
  • mycat的配置文件schema.xml <table name="employee" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" /> <dataNode name="dn1" dataHost="localhost1" database="db1" /> <...
  • Mycat完成读写分离

    2020-12-03 12:37:50
    Mycat完成读写分离 ...读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
  • Linux上实现Mysql的主从复制(为Mycat读写分离作准备)在上一篇文章中,我们在两个服务器使用同版本的操作系统和mysql:服务器1:centos7.3,mysql5.6服务器2:centos7.3,mysql5.6接下来,我们来看一下实现读写分离的...
  • 基于Mycat读写分离

    2020-08-15 17:23:45
    文章目录1 读写分离原理2 实现方式3. mycat介绍3.1 概述3.2 功能3.3 mycat原理3.4 mycat应用场景4. mycat安装配置4.1 安装JDK4.2 创建mycat用户4.3 下载软件包解压并赋予权限4.4 配置环境变量4.5 配置文件详解(/usr...
  • 应用实现读写分离至少有两种方法:应用本身通过代码实现,例如基于动态数据源、AOP的原理来实现写操作时用主数据库,读操作时用从数据库。通过中间件的方式实现,例如通过Mycat,即中间件会分析对应的SQL,写操...
  • Mycat读写分离

    2019-02-16 16:02:00
    Mycat实现读写分离的部署: https://www.cnblogs.com/softidea/p/5447566.html springboot动态数据源的原理以及配置: Spring内置了一个AbstractRoutingDataSource,它可以把多个数据源配置成一个Map,然后,根据...
  • Mycat实现读写分离

    2019-05-02 18:00:00
    随着应用的访问量并发量的增加,应用读写分离是很有必要的。当然应用要实现读写分离,首先数据库层要先做到主从配置。 应用实现读写分离至少有两种方法: 应用本身通过代码实现,例如基于动态数据源、AOP的原理...
  • mycat实现读写分离/分库分表/分片 原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL 语句,首先对SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL 发往后...
  •  MyCAT原理MyCAT主要是通过对SQL的拦截,然后经过一定规则的分片解析、路由分析、读写分离分析、缓存分析等,然后将SQL发给后端真实的数据块,并将返回的结果做适当处理返回给客户端。 2.基于MyCat实现读写分离  ...
  • 随着应用的访问量并发量的增加,应用读写分离是很有必要的。当然应用要实现读写分离,首先数据库层要先做到主从配置,本人前一篇文章介绍了mysql数据库的主从配置...本篇文章是介绍通过Mycat中间件的方式实现读写分离
  • 配置MyCat读写分类前需要先配置MySQL的主从复制,参考我上一... MyCAT原理MyCAT主要是通过对SQL的拦截,然后经过一定规则的分片解析、路由分析、读写分离分析、缓存分析等,然后将SQL发给后端真实的数据块,并将返回...
  • MyCat介绍 MyCat是一款由阿里Cobar演变...mycat原理主要是通过对sql的拦截,然后经过一定规则的分片解析、路由分析、读写分离分析、缓存分析等,然后将sql发给后端真实的数据块,并将返回的结果做适当处理返回给客...
  • MyCat之搭建读写分离

    2021-02-06 09:41:54
    正在上传…重新上传取消我们通过 Mycat 和 MySQL 的主从复制配合搭建数据库的读写分离,实现 MySQL 的高可用性。我们将搭建:一主一从、双主双从两种读写分离模式。 1.搭建一主一从 一个主机用于处理所有写请求...
  • mycat使用MYSQL读写分离

    2019-07-31 22:14:53
    读写分离工作原理: 基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 MyCAT在Linux中...
  • 第二种方式就是基于MyCat中间件来实现读写分离的效果;这两种方式我都会在这篇博客中进行详细地介绍、搭建,并且分析其中的优劣。 原理初探 从MySQL的主从同步开始谈起,最开始我们的数据库架构是这样的。 主库...
  • 1,先说下同步数据库原理,其实很简单.就是在主库做数据库操作的时候,会生成一个本地日志,日志会在my.ini当中配置看图一,读库会实时去扫描日志,如果有更新就直接在读库执行. 这个是主库my.ini配置 然后下载...
  • Mycat入门+读写分离

    2019-12-12 11:02:49
    读写分离 数据分片(水平+垂直拆分) 多数据源整合 Mycat的配置文件 schema.xml:定义逻辑库,表、分片节点等内容 rule.xml:定义分片规则 server.xml:定义用户以及系统相关变量,如端口等. 原理 ...
  • 什么是读写分离 在数据库集群架构中,让主库负责处理事务性查询,而从库只负责处理select查询,让两者分工明确达到提高数据库整体读写性能。当然,主数据库另外一个功能就是负责将事务性查询导致的数据变更同步到从...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 206
精华内容 82
关键字:

mycat读写分离原理