zoukankan      html  css  js  c++  java
  • mycat读写分离与主从切换

    什么是mycat,以及mycat的优点和特性本文不做赘述,本文继续本着实战的态度,来分享一些个人对mycat的基础功能实践。本文mycat的读写分离和主从切换的环境为mysql主从环境。

    如何安装mysql数据库可以参考: http://suifu.blog.51cto.com/9167728/1846671

    如何构建mysql主从环境可以参考: http://suifu.blog.51cto.com/9167728/1812535

    本文的环境信息:

    192.168.1.248 slave

    192.168.1.250 master

    主从配置完成后,Slave_IO_Running和Slave_SQL_Running状态都为yes

    mysql> start slave;
    Query OK, 0 rows affected (0.02 sec)
    mysql> show slave statusG
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.1.250
                      Master_User: mysync
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000004
              Read_Master_Log_Pos: 429
                   Relay_Log_File: HE1-relay-bin.000002
                    Relay_Log_Pos: 592
            Relay_Master_Log_File: mysql-bin.000004
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes

    创建 mycat 用到的 dataNode 对应的数据库及 mycat 用到的数据库用户

    mysql> grant all privileges on *.* to 'mycat'@'%' identified by 'MANAGER';
    Query OK,0 rows affected (0.01 sec)
     
    mysql> flush privileges;
    Query OK,0 rows affected (0.00 sec)
     
    mysql> create database db1;
    Query OK,1 row affected (0.00 sec)
     
    mysql> create database db2;
    Query OK,1 row affected (0.01 sec)
     
    mysql> create database db3;
    Query OK,1 row affected (0.01 sec)

    配置环境变量

    [root@HE3 ~]# echo export PATH=$PATH:/usr/local/mycat/bin >>/etc/profile

    [root@HE3 ~]# echo export MYCAT_HOME=/usr/local/mycat >> /etc/profile

    [root@HE3 ~]# source /etc/profile

    配置 /etc/my.cnf 中增加参数并重启数据库服务

    lower_case_table_names=1

    安装 jdk7

    [root@HE3 ~]# rpm -ivh jdk-7u79-linux-x64.rpm

    Preparing...                ########################################### [100%]

    1:jdk                    ########################################### [100%]

    Unpacking JAR files...

    rt.jar...

    jsse.jar...

    charsets.jar...

    tools.jar...

    localedata.jar...

    jfxrt.jar...

    安装 mycat

    [root@HE3 ~]# tar xvf Mycat-server-1.5.1-RELEASE-20160816173057-linux.tar.gz -C /usr/local

    [root@HE3 ~]# groupadd mycat -g 910

    [root@HE3 ~]# useradd  mycat -g 910

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

    修改必要的配置并启动

    [root@HE3 ~]# cd  /usr/local/mycat/conf

    [root@HE3 conf]# vim schema.xml

    配置 table ,来决定 table 分片对应哪个 dataNode 还是 global 表,以及分片规则和片键

    修改第 43 行的 dataHost 标签中的 writeHost url  10.10.10.250 及用户名 mycat 和密码 MANAGER

    启动 mycat

    [root@HE3 bin]# cd /usr/local/mycat/bin

    [root@HE3 bin]# mycat start

    Starting Mycat-server...

    观察 wrapper.log 文件中提示启动成功即可

    [root@HE3 bin]# cd /usr/local/mycat/log

    配置mycat

    [root@HE3 conf]# vi /usr/local/mycat/conf/schema.xml

    因为要涉及到实验主节点失败,write节点指向原从节点,所以要把主从节点都设置成writeHost

    有关读写分离分发规则的相关dataHost标签属性balance值:

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

    (1) balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。

    (2) balance="1",全部的readHost与stand by writeHost 参与select语句负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与M2互为主备),正常情�晗拢�M2,S1,S2 都参与select语句的负载

    均衡。(类似于balance=3,读操作只分发到除了真正的主节点之外的所有节点)

    (3) balance="2",所有读操作都随机的在 writeHost、 readhost 上分发。(常用些,在所有主从节点上分发读请求)

    (4) balance="3",所有读请求随机的分发到 writeHost 对应的readhost执行,writeHost不负担读压

    力,注意 balance=3 �吃� 1.4 及其以后版本有,1.3 没有。(常用些,只在从节点上分发读请求)

    注:事务内的sql,默认走写节点,以注释/*balance*/开头,则会根据balance值决定

    在本例中balance值设置为1,但是这个场景设置成3效果应该是一样的

    有关主从(读写角色)切换设置属性规则的相关dataHost标签属性switchType值:

    (1)-1表示不自动切换

    (2)1默认值,自动切换

    (3)2基于mysql主从同步的状态决定是否切换

    (4)3基于cluster的切换,心跳语句要改成show status like 'wsrep%',这个里面配置的都是writehost

    在本例中switchType值设置为1,表示自动切换,某些对主从数据一致要求较高的场景,建议使用2判断主从状态后再切换,或者使用galera cluster保证各节点数据一致然后将此值设置为3

    切换的触发条件为主节点mysql服务崩溃或停止(暂时是这么理解的,希望批改的同学能给我解答一下)。

    slaveThreshold 主从的延迟在多少秒以内,则把读请求分发到这个从节点,否则不往这个节点分发,假设生产环境能容忍的主从延时为60秒,则设置此值为60,此例中设置值为100

    有关写请求是否分发到多个写节点规则的相关dataHost标签属性writeType值:

    (1) 值0表示只分发到当前的主节点

    (2) 值1表示分发到所有设定为writeHost的节点,不推荐使用,好像现在版本已经废除

    此例中writeType值使用默认值0,写请求只分发到主节点,不会分发到其他的writeHost上

    这里我们变更45行的心跳检测为show slave status,来方便之后我们的读写分离校验

    验证读写分离效果

    写操作

    主节点上:

    mysql> show global status like '%Com_in%';
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | Com_insert         | 13    |
    | Com_insert_select  | 0     |
    | Com_install_plugin | 0     |
    +--------------------+-------+
    3 rows in set (0.00 sec)

    从节点上:

    mysql> show global status like '%Com_in%';
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | Com_insert         | 13    |
    | Com_insert_select  | 0     |
    | Com_install_plugin | 0     |
    +--------------------+-------+
    3 rows in set (0.00 sec)

    写入insert:

    mysql> insert into travelrecord(id,name)values(10000005,'ddd');
    Query OK, 1 row affected (0.00 sec)

    可以看到几次插入的结果都落到了节点192.168.1.250也就是master上

    也可以使用show global status like ‘Com_insert’;查看主从mysql上的insert请求,如果两者都增加,说明请求分发到了主上,并复制到了从上,如果请求分发到了从上,那么就不会复制到主上,结果就是主上的这个状态变量不会增加,只有从上的这个状态变量会增加。

    读操作

    执行select之前

    主节点:

    mysql> show global status like 'Com_select';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | Com_select    | 1334  |
    +---------------+-------+
    1 row in set (0.00 sec)

    从节点:

    mysql> show global status like 'Com_select';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | Com_select    | 385   |
    +---------------+-------+
    1 row in set (0.00 sec)

    执行select语句:

    mysql> select * from travelrecord where id=1;
    +----+------+------+
    | id | name | age  |
    +----+------+------+
    |  1 | aaa  | NULL |
    +----+------+------+
    1 row in set (0.00 sec)

    主节点:

    mysql> show global status like 'Com_select';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | Com_select    | 1334  |
    +---------------+-------+
    1 row in set (0.00 sec)

    从节点:

    mysql> show global status like 'Com_select';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | Com_select    | 386   |
    +---------------+-------+
    1 row in set (0.00 sec)

    都落在了hostS1也就是slave上

    多测几次也是以上的效果,说明符合了balance=1的效果,读请求分发到了除主节点以外的节点(即从节点)。

    验证自动切换

    停止当前主节点mysql服务

    [root@HE3 conf]# cat dnindex.properties 
    #update
    #Mon Sep 12 00:28:33 PDT 2016
    localhost1=0
    [root@HE3 conf]# /etc/init.d/mysqld stop
    Shutting down MySQL............ SUCCESS!

    观察dnindex.properties文件内容是否变化

    [root@HE3 conf]# cat dnindex.properties 
    #update
    #Mon Sep 12 18:32:28 PDT 2016
    localhost1=1

    当前可用节点只剩下原从节点,期望结果是之后的写入操作全部落到原从节点,验证:

    mysql> insert into travelrecord values(3,'helei',25);
    ERROR 1064 (HY000): partition table, insert must provide ColumnList
    mysql> insert into travelrecord(id,name,age) values(3,'helei',25);
    Query OK, 1 row affected (0.37 sec)

    登录原从节点,观察数据变化:

    mysql> use db1;
    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_db1 |
    +---------------+
    | travelrecord  |
    +---------------+
    1 row in set (0.00 sec)
    mysql> select * from travelrecord;
    +---------+-------+------+
    | id      | name  | age  |
    +---------+-------+------+
    |       1 | aaa   | NULL |
    |       2 | asd   | NULL |
    |       3 | helei |   25 |
    | 5000000 | bbb   |   11 |
    +---------+-------+------+
    4 rows in set (0.00 sec)

    说明此时写入节点已经切换为配置好的第二个writeHost,也就是原从节点,此时如果想要将原失败节点重新加入集群,需要重做主从,将原主节点作为从节点加入到集群中,mycat无需重启,对前端应用是透明的。

    http://www.tuicool.com/articles/vEZnuiE

  • 相关阅读:
    antdesign vue 官网地址
    WMS智能仓储管理系统-干货-产品介绍
    C# 判断文件夹与文件是否存在
    C# 获取文件大小,创建时间,文件信息,FileInfo类的属性表
    问题2:采购发票、材料出库单、到货单,打开时提示某某插件是否安装! 问题
    问题一:u813.0销售出库单-EAI接口报-在对应所需名称或序数的集合中,未找到项目
    SqlServer数据库sa登录失败,错误18456
    解决<compilation debug="true" targetFramework="4.0"> 问题
    SQL Server 2005无法远程连接的解决方法
    Windows Server 2008 IIS 7.5 HTTP 错误 404.3
  • 原文地址:https://www.cnblogs.com/seasonzone/p/6707892.html
Copyright © 2011-2022 走看看