美文网首页MySQL
MySQL读写分离精简版

MySQL读写分离精简版

作者: 你笑的那么美丶 | 来源:发表于2019-03-12 20:03 被阅读16次

    一. 部署环境

    1. 准备

    MySQL-master 192.168.78.128
    MySQL-slave 192.168.78.129
    Mycat 192.168.78.130
    关闭防火墙

    systemctl stop firewalld
    setenforce 0  或者 vim /etc/selinux/config
    SELINUX=disabled
    

    reboot 重启生效

    2. 下载 jdk
    wget https://download.oracle.com/otn-pub/java/jdk/8u201-b09/42970487e3af4f5aa5bca3f542482c60/jdk-8u201-linux-x64.tar.gz
    
    image.png
    3. 解压文件
    shell> tar -xf -C jdk-8u201-linux-x64.tar.gz /usr/local/
    shell> ln -s /usr/local/jdk1.8.0_201/ /usr/local/java
    
    4. 配置环境变量
    shell> vi /etc/profile.d/java.sh
    export JAVA_HOME=/usr/local/java
    export PATH=$JAVA_HOME/bin:$PATH
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    

    注意 CLASSPATH 中有个点. 不要省略

    5. 使环境变量生效
    // 立刻在当前的 shell 会话中生效
    shell> source /etc/profile
    

    全部生效需要重启机器

    二. 部署Mycat

    1. 下载
    wget http://dl.mycat.io/1.6.6.1/Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz
    
    2. 解压
    shell> tar -xf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz -C /usr/local/
    shell> ls /usr/local/mycat/
    bin  catlet  conf  lib  logs  version.txt
    
    3. 配置 server.xml
            <user name="mycatdb">
                    <property name="password">123456</property>
                    <property name="schemas">wsl</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>
    </mycat:server>
    

    <user name="mycatdb" # mycatdb 为登陆mycat的用户名 mysql -umycatdb -p'密码' -P8066 -h'ip地址'
    <property name="schemas">wsl</property> #wsl 为用户访问的逻辑库

    ==上面的配置中,假如配置了用户访问的逻辑库,那么必须在 schema.xml 文件中也配置这个逻辑库,否则报错,启动 mycat 失败==

    4. 配置 schema.xml
    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    
            <schema name="wsl"                         // 逻辑库名称
                    checkSQLschema="false"             // 不检查
                    sqlMaxLimit="100"                  // 最大连接数 
                    dataNode='dn1'                     // 数据节点名称
            >
            </schema>
            <dataNode name="dn1"                       // 此数据节点的名称
                      dataHost="localhost1"            // 主机组
                      database="test" />               // 真实的数据库名称test为mysql-master中真实存在的数据库名
            <dataHost name="localhost1"
                      maxCon="1000" minCon="10"        // 连接
                      balance="3"                      // 负载均衡
                      writeType="0"                    // 写模式配置
                      dbType="mysql" dbDriver="native" // 数据库配置
                      switchType="1" slaveThreshold="100"
            >
            <heartbeat>select user()</heartbeat>
            <writeHost host="hostM1"
                       url="192.168.78.128:3306" 
                       user="root"
                       password="123"
            >
            <readHost host="hostS2"
                      url="192.168.78.129:3306"
                      user="root"
                      password="123" />
            </writeHost>
            </dataHost>
    </mycat:schema>
    

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

    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,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准.
    2. writeType="1",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。
    5. 配置 log4j2.xml
       <asyncRoot level="debug" includeLocation="true">
    

    将默认info 改为 debug

    6. 启动 Mycat
    shell> /usr/local/mycat/bin/mycat  start
    
    支持一下参数
    start | restart |stop | status
    
    7. 在真实的 master 数据库上给用户授权
    mysql> grant all on test.* to root@'%' identified by '123';
    mysql> flush privileges;
    

    或者

    mysql> grant all on *.* to root@'192.168.78.%' identified by '123';
    mysql> flush privileges;
    

    三. 测试

    在 mycat 的机器上测试用户权限有效性

    测试是否能正常登录上 主服务器

    shell> mysql -uroot -p'123' -h192.168.78.128
    

    继续测试是否能登录上从服务器

    shell> mysql -uroot -p'123' -h192.168.78.129
    

    通过客户端进行测试是否能登录到 mycat 上

    192.168.78.130 是 mycat 的主机地址

    shell > mysql -umycatdb -p123456 -P8066 -h192.168.78.130
    mysql> show databases;
    +----------+
    | DATABASE |
    +----------+
    | wsl      |
    +----------+
    1 row in set (0.01 sec)
    

    此为mycat 看到的test数据库中的表信息

    mysql> use wsl;
    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> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | class          |
    | class2         |
    | student        |
    +----------------+
    3 rows in set (0.01 sec)
    

    此为主数据库(mysql-master)中的表信息

    mysql> use test;
    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> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | class          |
    | class2         |
    | student        |
    +----------------+
    3 rows in set (0.00 sec)
    

    然后在mycat中创建一个表检测在主从数据库中是否都能成功查询到

    mysql> create table mycat( id int);
    Query OK, 0 rows affected (0.14 sec)
    
    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | class          |
    | class2         |
    | mycat          |
    | student        |
    +----------------+
    4 rows in set (0.01 sec)
    
    此为mycat中创建
    
    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | class          |
    | class2         |
    | mycat          |
    | student        |
    +----------------+
    4 rows in set (0.00 sec)
    
    主数据库中查询到这个在mycat中创建表
    

    从数据库查询一下也会存在 只有主从复制没问题

    相关文章

      网友评论

        本文标题:MySQL读写分离精简版

        本文链接:https://www.haomeiwen.com/subject/pgvnpqtx.html