美文网首页
win mycat及mysql主从库、读写分离的初使用

win mycat及mysql主从库、读写分离的初使用

作者: 曼昱的小蓝毛巾 | 来源:发表于2019-12-06 10:11 被阅读0次

    1、mysql主从复制。

    服务器信息如下:

    服务器主机名 ip 说明
    mycat-node 192.168.1.73 mycat服务器,连接时使用该服务器
    mycat-jessie 192.168.1.73 物理数据库1,作为主库master
    mycat-jyp 192.168.1.52 物理数据库2,作为从库slave
    备注:实验时,务必关闭关闭机器的iptables防火墙和selinux。
    a) 安装ysql,请自行安装。
    安装过程此处略...
    
    b) mysql主从复制。
    sql1: 登录用户名和密码:root/root
    sql2: 登录用户名和密码:root/123456
    

    1.1 主库master的配置

    1)、找到数据库的配置文件

    (my.cnf Linux系统)或者(my.ini win系统)
    
    C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
    

    2)、master配置:
    找到mysqld部分,插入如下内容:

    
    # 配置主从:
    # 唯一,要与slave的不同。
    server-id=1
    
    skip-grant-tables
    #(mysql路径)
    basedir = C:\ProgramData\MySQL\MySQL Server 5.7\
    #(data路径,存放日志文件)
    datadir = C:\ProgramData\MySQL\MySQL Server 5.7\Data\
    
    # 开启二进制日志
    log-bin = mysql-bin
    
    # 需要同步的数据库。如果是多个同步库,就以此格式另写几行即可。如果不指明对某个具体库同步,就去掉此行,表示同步所有库(除了ignore忽略的库)
    binlog-do-db=db_img_0
    binlog-do-db=db_img_1
    binlog-do-db=db_info_0
    binlog-do-db=db_info_1
    binlog-do-db=role
    binlog-do-db=role_user
    binlog-do-db=user
    # 表示不需要备份的数据库为mysql
    binlog-ignore-db=mysql
    
    

    3)、配置:

    a) 首先重启mysql服务,
    右键计算机管理---服务---mysql停止/启动。
    
    b) 创建用户:
    // CREATE USER ' 使用名 '@' 从库 IP 地址 ' IDENTIFIED BY ' 密码 ';
    mysql>create user 'ir'@'192.168.1.52' identified by '123456';
    
    c) 分配权限:
    // GRANT REPLICATION SLAVE ON . TO ' 使用名 '@' 备机 IP 地址 ';
    grant replication slave on *.* to 'ir'@'192.168.1.52';  
    
    d) 刷新权限:
    mysql> flush privileges; 
    
    e) 查看master状态:
    
                 File 的值为:    mysql-bin.000013;
             Position 的值为:    154;
         Binlog_Do_DB 的值为:    test;
     Binlog_Ignore_DB 的值为:    manual,mysql ;
    
    
    记下 File 、 Position 的值,配置从库要用到。
    
    

    1.2 主库master的配置

    1)、master配置:
    找到mysqld部分,插入如下内容:

    
    # 配置主从:
    # 与主库不同,
    server-id=2
    
    skip-grant-tables
    #(mysql文件夹路径)
    basedir = C:\ProgramData\MySQL\MySQL Server 5.7\
    #(data路径,存放日志文件)
    datadir = C:\ProgramData\MySQL\MySQL Server 5.7\Data\
    
    # 开启二进制日志
    log-bin = mysql-bin
    # 需要同步的数据库。
    binlog-do-db=db_img_0
    binlog-do-db=db_img_1
    binlog-do-db=db_info_0
    binlog-do-db=db_info_1
    binlog-do-db=role
    binlog-do-db=role_user
    binlog-do-db=user
    # 表示不需要备份的数据库为mysql
    binlog-ignore-db=mysql
    

    2)、配置:

    a) 首先重启mysql服务,
    右键计算机管理---服务---mysql停止/启动。
    
    b)、登录上Slave数据库。
    用户名改和密码:"root 123456"
    
    c)、停止同步。
    输入 "stop slave;"。
    
    d)、重置同步。
    输入"reset slave;"。
    
    e)、更改位置。(与Master查看的日志位置保持一致)
    CHANGE MASTER TO        
    MASTER_HOST='192.168.1.73',          # 主机的IP      
    MASTER_USER='ir',                    # 之前创建的用户名       
    MASTER_PASSWORD='123456',            # 之前创建的密码      
    MASTER_LOG_FILE='mysql-bin.000013',  # 主库中show master status---File下的那个值       
    MASTER_LOG_POS=154;                  # 主库中show master status---Position下的那个值       
    
    
    f)、启动同步。
    输入" start slave; "。
    
    g)、查看是否同步成功。
    输入" show slave status\G; "
    结果如下表格所示:
    
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    
    二者均为Yes表示成功啦!
    
    如果slave_SQL_Running提示为NO,请等待10-20分钟后再次输入"show slave status\G;"
    
    查看是否同步成功;若仍不成功,请检查之前操作是否存在问题。
    

    输出结果如下:

    
           Slave_IO_State: Waiting for master to send event                  
              Master_Host: 192.168.1.73                  
              Master_User: ir                  
              Master_Port: 3306                
            Connect_Retry: 60             
          Master_Log_File: mysql-bin.000003         
      Read_Master_Log_Pos: 154              
           Relay_Log_File: DESKTOP-6BJDELI-relay-bin.000004                
            Relay_Log_Pos: 147655155       
    Relay_Master_Log_File: mysql-bin.000013             
         Slave_IO_Running: Yes            
        Slave_SQL_Running: Yes              
          Replicate_Do_DB:           
      Replicate_Ignore_DB:  
    

    至此,mysql主从复制,配置完成啦!!!

    2、mycat的安装与使用。

    2.1.1 安装jdk

    因为 MyCat 是用 Java 开发的,因此 MyCat 运行需要安装 JDK(准确来说是 JRE 就够了),并且需要 JDK1.7 或以上版本。
    
    新建JAVA_HOME
    变量值为:C:\Program Files\Java\jdk1.8.0_121
    
    新建classpath
    值为:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
    
    编辑path
    后追加:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
    

    命令行输入:java -version

    C:\Users\sprivacy>java -version
    java version "1.8.0_121"
    Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
    Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
    
    安装成功!!!
    

    2.1.2 安装mycat

    官网下载地址: http://www.mycat.io/

    本文下载版本为1.6

    安装目录为:
    D:\soooooft\mycat\Mycat-server-1.6-RELEASE-20161028204710-win\mycat\
    
    设置环境变量:
    第一步:
        新建MYCAT_HOME
        变量值为:D:\soooooft\mycat\Mycat-server-1.6-RELEASE-20161028204710-win\mycat(mycat解压路径)
    
    第二步:
        编辑path
        后面追加" %MYCAT_HOME%\bin "
    
    

    进入mycat---bin目录下: .\mycat.bat start

    PS D:\soooooft\mycat\Mycat-server-1.6-RELEASE-20161028204710-win\mycat\bin> .\mycat.bat start
    wrapper  | Starting the Mycat-server service...
    wrapper  | Mycat-server started.
    
    安装成功。
    

    2.2 配置

    2.2.1 修改schema.xml

    数据库设置,name与server.xml中schema对应

        <schema name="db_im" checkSQLschema="false" sqlMaxLimit="100">
            <!-- 拆分写法 -->
            <table name="db_img" dataNode="dn11,dn21,dn31,dn41,dn51,dn61,dn71,dn81,dn91,dn101" rule="mod-long1" />
            <table name="db_info" dataNode="dn1,dn2,dn3,dn4,dn5,dn6,dn7,dn8,dn9,dn10" rule="mod-long1" />
            <table name="role_user" primaryKey="id" type="gloab" dataNode="dn11"/>
            <table name="role" primaryKey="id" type="gloab" dataNode="dn11">
                <!-- <childTable name="role_user" joinKey="role_id" parentKey="id"/> -->
            </table>
            <!-- 不拆分写法 -->
            <table name="user" primaryKey="id" type="gloab" dataNode="dn11"/>
        </schema>
    

    分片信息,分库相关配置

        <dataNode name="dn1" dataHost="localhost1" database="db_info_0" />
        <dataNode name="dn2" dataHost="localhost1" database="db_info_1" />
        <dataNode name="dn3" dataHost="localhost1" database="db_img_0" />
        <dataNode name="dn4" dataHost="localhost1" database="db_img_1" />
    

    物理数据库,真正存储数据的数据库,读写分离配置:

        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
                  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
            <heartbeat>select user()</heartbeat>
            <!-- can have multi write hosts -->
            <writeHost host="hostM1" url="192.168.1.73:3306" user="root"
                       password="root">
                <!-- can have multi read hosts -->
                <readHost host="hostS2" url="192.168.1.52:3306" user="root" password="123456" />
            </writeHost>
            <!-- <writeHost host="hostS1" url="localhost:3316" user="root"
                       password="123456" /> -->
            <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
        </dataHost>
    

    备注: schema.xml文件中有三点需要注意:balance="1",writeType="0" ,switchType="1"

    balance=1:readHost及备用的writeHost参与select的负载均衡。
    switchType=2:基于mysql主从同步的状态决定是否切换。
    hearHbeat:主从切换的心跳语句必须为show slave status;

    mycat主从分离只是在读的时候做了处理,写入数据的时候,只会写入到writeHost,需要通过mycat的主从复制将数据复制到readHost。

    如果mysql没有主从复制配置,mycat在读写分离后,数据写入writeHost后,readHost一直没有数据。

    2.2.2 修改rule.xml

    分库分表配置还需要配置rule文件:

        <tableRule name="mod-long">
            <rule>
                <columns>id</columns>
                <algorithm>mod-long</algorithm>
            </rule>
        </tableRule>
        // 此处需要修改,根据db_id取mod;如果还有分片的。复制此段代码继续添加。
        <tableRule name="mod-long1">
            <rule>
                <columns>db_id</columns>
                <algorithm>mod-long</algorithm>
            </rule>
        </tableRule>
        
        // 分片的规则为字符串时:
        <tableRule name="mod-long2">
            <rule>
                <columns>authentication_id</columns>
                <algorithm>partition-by-string-hash-function</algorithm>
            </rule>
        </tableRule>
    

    分片数量:

        <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
            <!-- how many data nodes -->
            <property name="count">4</property>
        </function>
    

    分片规则为字符串时:

        <tableRule name="mod-long3">
            <rule>
                <columns>client_id</columns>
                <algorithm>partition-by-string-hash-function</algorithm>
            </rule>
        </tableRule>
        
        <tableRule name="mod-long4">
            <rule>
                <columns>token_id</columns>
                <algorithm>partition-by-string-hash-function</algorithm>
            </rule>
        </tableRule>
    
    

    规则为字符串时,需要指定:

        <function name="partition-by-string-hash-function" class="io.mycat.route.function.PartitionByString">
            <property name="partitionLength">512</property> <!--求模基数  zero-based -->
            <property name="partitionCount">2</property> <!-- 分片数量  -->
            <property name="hashSlice">0:6</property> <!-- hash预算位  -->
        </function>
    

    2.2.3 修改server.xml

    server 文件跟读写分离关系不大,但是在这里需要该文件配置来连接mycat的用户及权限。

        <user name="root">
            <property name="password">root</property>
            <property name="schemas">db_im</property>
            
            <!-- 表级 DML 权限设置 -->
            <!--        
            <privileges check="false">
                <schema name="db_im" 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">db_im</property>
            <property name="readOnly">true</property>
        </user>
        
    

    备注:
    server文件里mycat的登录用户名和密码可以任意设置,该用户名及密码是作为登陆mycat时的账户信息。我这里配置的是root/root账户。

    我这里没有做特殊权限,这些可以自己根据需求定义。

    逻辑库名(即db_im)也即是登陆mycat后显示的库名,登陆后显示的就是代理的真是的mysql数据库的相关表,要和schema里的相对应。

    3、测试

    启动mycat服务

    // 进入mycat安装目录下的bin文件:输入 .\mycat.bat start
    
    PS D:\soooooft\mycat\Mycat-server-1.6-RELEASE-20161028204710-win\mycat\bin> .\mycat.bat start
    
    出现以下结果,表示启动成功:
    PS D:\soooooft\mycat\Mycat-server-1.6-RELEASE-20161028204710-win\mycat\bin> .\mycat.bat start
    wrapper  | Starting the Mycat-server service...
    wrapper  | Mycat-server started.
    

    navicat 连接mycat:

    连接名:    test_mycat
    ip:         192.168.1.73
    端口:      8066 (mycat默认端口)
    用户名:
    密码:      root
    

    连接成功,执行相关新增、删除、查询语句,可以实现读写分离相关功能。

    停止mycat服务

    // 进入bin文件输入:  .\mycat.bat stop
    PS D:\soooooft\mycat\Mycat-server-1.6-RELEASE-20161028204710-win\mycat\bin> .\mycat.bat stop
    wrapper  | Stopping the Mycat-server service...
    wrapper  | Mycat-server stopped.
    
    停止成功!
    

    相关文章

      网友评论

          本文标题:win mycat及mysql主从库、读写分离的初使用

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