十、读写分离

作者: 胖虎喜欢小红 | 来源:发表于2020-01-29 14:54 被阅读0次

    1.什么是读写分离

    • 在数据库集群架构中,让主库负责处理写入操作,而从库只负责处理select查询,让两者分工明确达到提高数据库整体读写性能。当然,主数据库另外一个功能就是负责将数据变更同步到从库中,也就是写操作。

    2. 读写分离的好处

    1. 分摊服务器压力,提高机器的系统处理效率
    2. 在写入不变,大大分摊了读取,提高了系统性能。另外,当读取被分摊后,又间接提高了写入的性能。所以,总体性能提高了。
    3. 增加冗余,提高服务可用性,当一台数据库服务器宕机后可以调整另外一台从库以最快速度恢复服务
    
    程序上面也可以做读写分离,开发可以直接写在代码里。
    

    Mycat 数据库中间件

    Mycat 是一个开源的数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有存 储引擎,所以并不是完全意义的数据库系统。 那么 Mycat 是什么?Mycat 是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服 务是实现对主从数据库的读写分离、读的负载均衡。

    常见的数据库中间件:

    1566542554311.png

    MyCAT 是使用 JAVA 语言进行编写开发,使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性,所以要求必须在 JDK7 以上的版本上运行。

    1567094359891.png

    3、实战

    环境准备

    准备三台机器:
    mysql_master  192.168.1.10
    mysql_slave   192.168.1.11
    mycat_server  192.168.1.6
    并将三台机器互做本地解析
    
    vim /etc/hosts
    192.168.1.10 mysql_master
    192.168.1.11 mysql_slave
    192.168.1.6 mycat_server
    
    一、将mysql_master、mysql_slave两台机器做成主从

    配置master

    1、在主服务器上,必须启用二进制日志记录并配置唯一的服务器ID。需要重启服务器。

    编辑主服务器的配置文件my.cnf,添加如下内容

    log-bin=/var/log/mysql/mysql-bin
    server-id=8110
    

    2、创建日志目录并赋予权限

    [root@mysql_master ~]# mkdir /var/log/mysql
    [root@mysql_master ~]# chown mysql.mysql /var/log/mysql
    

    3、重启服务

    [root@mysql_master ~]# systemctl restart mysqld
    

    4、登陆mysql

    [root@mysql_master ~]# mysql -uroot -pDuan@123
    mysql> grant replication  slave,reload,super on *.*  to 'duan'@'%' identified by 'Duan@123';
    mysql> flush privileges;
    mysql> show master status\G
    
    image.png

    配置slave

    [root@mysql_slave ~]# vim /etc/my.cnf
    server-id=8111
    [root@mysql_slave ~]# systemctl restart mysqld
    [root@mysql_slave ~]# mysql -uroot -pDuan@123
    mysql> \e
    change master to
    master_host='mysql_master',
    master_user='duan',
    master_password='Duan@123',
    master_log_file='mysql-bin.000001',
    master_log_pos=604;
        -> ;
    mysql> start slave;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show slave status\G
    
    image.png

    测试

    master
    mysql> create database test;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> create table test.t1(id int,name varchar(30));
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> insert into test.t1 values(1,'tom'),(1,'jack');
    Query OK, 2 rows affected (0.03 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    slave
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | test               |
    +--------------------+
    5 rows in set (0.00 sec)
    
    mysql> select * from test.t1;
    +------+------+
    | id   | name |
    +------+------+
    |    1 | tom  |
    |    1 | jack |
    +------+------+
    2 rows in set (0.00 sec)
    
    二、配置mycat_server

    1.安装jdk

    下载jdk账号:
    账号:liwei@xiaostudy.com
    密码:OracleTest1234
    将jdk上传到服务器中,
    [root@mycat_server ~]# tar xzf jdk-8u221-linux-x64.tar.gz -C /usr/local/
    [root@mycat_server ~]# cd /usr/local/
    [root@mycat_server local]# mv jdk1.8.0_221/ java 
    设置环境变量
    [root@mycat_server local]# vim /etc/profile  #添加如下内容,
    JAVA_HOME=/usr/local/java
    PATH=$JAVA_HOME/bin:$PATH
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    [root@mycat_server local]# source /etc/profile
    

    2.部署mycat

    1566543702789.png
    网址:http://dl.mycat.io
    下载
    [root@mycat_server ~]# wget http://dl.mycat.io/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
    解压
    [root@mycat_server ~]# tar -xf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /usr/local
    

    3.认识mycat配置文件

    MyCAT 目前主要通过配置文件的方式来定义逻辑库和相关配置:
    
    /usr/local/mycat/conf/server.xml  #定义用户以及系统相关变量,如端口等。其中用户信息是前端应用程序连接 mycat 的用户信息。
    /usr/local/mycat/conf/schema.xml  #定义逻辑库,表、分片节点等内容。
    

    server.xml

    以下为代码片段
    下面的用户和密码是应用程序连接到 MyCat 使用的,可以自定义配置
    而其中的schemas 配置项所对应的值是逻辑数据库的名字,也可以自定义,但是这个名字需要和后面 schema.xml 文件中配置的一致。

    ...
      <!--下面的用户和密码是应用程序连接到 MyCat 使用的.schemas 配置项所对应的值是逻辑数据库的名字,这个名字需要和后面 schema.xml 文件中配置的一致。-->     
      name='root'  mycat的虚拟用户名
      Duan@123    用于登陆这个虚拟用户的密码
      testdb       虚拟库
      
      
      
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mycat:server SYSTEM "server.dtd">
    <mycat:server xmlns:mycat="http://io.mycat/">
    
            <user name="root" defaultAccount="true">
                    <property name="password">Duan@123</property>
                    <property name="schemas">testdb</property>
                    <property name="defaultSchema">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>
            <!--
    <!--下面是另一个用户,并且设置的访问 TESTED 逻辑数据库的权限是 只读。可以注释掉
            <user name="user">
                    <property name="password">user</property>
                    <property name="schemas">TESTDB</property>
                    <property name="readOnly">true</property>
            </user>
             -->
    </mycat:server>
    

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

    schema.xml

    逻辑库和分表设置
    
        <schema name="testdb"           // 逻辑库名称,与server.xml的一致
                checkSQLschema="false"    // 不检查sql
                sqlMaxLimit="100"         // 最大连接数
                dataNode="dn1">        //  数据节点名称
        <!--这里定义的是分表的信息-->        
        </schema>
        
    
    数据节点
    
        <dataNode name="dn1"             // 此数据节点的名称
                  dataHost="localhost1"     // 主机组虚拟的
                  database="testdb" />  // 真实的数据库名称
        
    
    主机组
    
        <dataHost name="localhost1"                       // 主机组
                  maxCon="1000" minCon="10"               // 连接
                  balance="0"                             // 负载均衡
                  writeType="0"                           // 写模式配置
                  dbType="mysql" dbDriver="native"        // 数据库配置
                  switchType="1"  slaveThreshold="100">
        <!--这里可以配置关于这个主机组的成员信息,和针对这些主机的健康检查语句-->
        </dataHost>
        
    
        balance 属性
        负载均衡类型,目前的取值有 3 种:
        1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
        2. balance="1", 全部的 readHost 与  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 属性
        负载均衡类型
        1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切换到还生存的第二个writeHost,重新启动后已切换后的为准.
        2. writeType="1",所有写操作都随机的发送到配置的 writeHost,#版本1.5 以后废弃不推荐。
    
    健康检查
    
        <heartbeat>select user()</heartbeat>    #对后端数据进行检测,执行一个sql语句,user()内部函数
        
    
    读写配置
    
        <writeHost host="hostM1" url="192.168.1.10:3306" user="mycat" password="Duan@123">
                                <!-- can have multi read hosts -->
        <readHost host="hostS1" url="192.168.1.11:3306" user="mycat" password="Duan@123" />
        </writeHost> 
    

    4.配置server.xml

    [root@mycat_server ~]# cd /usr/local/mycat/conf/
    [root@mycat_server conf]# cp server.xml server.xml.bak
    [root@mycat_server conf]# vim server.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mycat:server SYSTEM "server.dtd">
    <mycat:server xmlns:mycat="http://io.mycat/">
            <user name="root" defaultAccount="true">
                    <property name="password">Duan@123</property>
                    <property name="schemas">testdb</property>
                    <property name="defaultSchema">testdb</property>
            </user>
    </mycat:server>
    
    #备份一个配置文件,然后把注释和其他用不上的配置信息删除
    

    5.配置schema.xml

    [root@mycat_server conf]# cp schema.xml schema.xml.bak
    [root@mycat_server conf]# vim schema.xml
    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    
            <schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'>
            </schema>
            <dataNode name="dn1" dataHost="localhost1" database="test" />
            <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                    <heartbeat>select user()</heartbeat>
                    <writeHost host="mysql_master" url="mysql_master:3306" user="mycat"
                                       password="Duan@123">
                            <readHost host="mysql_slave" url="mysql_slave:3306" user="mycat" password="Duan@123" />
                    </writeHost>
            </dataHost>
    </mycat:schema>
    

    6.调整JVM

    [root@mycat_server conf]# vim wrapper.conf 
    #wrapper.java.additional.1=
    wrapper.startup.timeout=300 
    wrapper.ping.timeout=120
    
    三、mysql_master端授权
    mysql> grant all on test.* to mycat@'%' identified by 'Duan@123';
    Query OK, 0 rows affected, 1 warning (0.03 sec)
    
    mysql> flush privileges;
    Query OK, 0 rows affected (0.02 sec)
    
    四、启动Mycat
    [root@mycat_server conf]# /usr/local/mycat/bin/mycat start
    [root@mycat_server conf]# jps    #查看mycat是否启动
    3420 WrapperSimpleApp
    3486 Jps   
    [root@mycat_server conf]# netstat -lntp | grep java
    
    image.png
    五、测试
    随便找一台机器当客户端测试
    [root@client ~]# mysql -uroot -h 192.168.1.6 -p'Duan@123' -P 8066
    mysql> show databases;
    +----------+
    | DATABASE |
    +----------+
    | test     |
    +----------+
    1 row in set (0.00 sec)
    
    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 |
    +----------------+
    | t1             |
    +----------------+
    1 row in set (0.00 sec)
    
    mysql> select * from t1;
    +------+------+
    | id   | name |
    +------+------+
    |    1 | tom  |
    |    1 | jack |
    +------+------+
    2 rows in set (0.01 sec)
    

    如果在show table报错:

    mysql> show tables;

    ERROR 3009 (HY000): java.lang.IllegalArgumentException: Invalid DataSource:0

    解决方式:
    登录master服务将mycat的登录修改为%
    mysql> update user set Host = '%' where User = 'mycat' and Host = 'localhost';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> flush privileges;
    或者在授权用户mycat权限为*.*
    

    相关文章

      网友评论

        本文标题:十、读写分离

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