什么是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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> start slave;
Query OK, 0 rows affected (0.02 sec)
mysql> show slave status\G
*************************** 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用到的数据库用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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,来方便之后我们的读写分离校验

验证读写分离效果

写操作

主节点上:

1
2
3
4
5
6
7
8
9
mysql> show global status like '%Com_in%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| Com_insert         | 13    |
| Com_insert_select  | 0     |
| Com_install_plugin | 0     |
+--------------------+-------+
rows in set (0.00 sec)

从节点上:

1
2
3
4
5
6
7
8
9
mysql> show global status like '%Com_in%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| Com_insert         | 13    |
| Com_insert_select  | 0     |
| Com_install_plugin | 0     |
+--------------------+-------+
rows in set (0.00 sec)

写入insert:

1
2
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之前

主节点:

1
2
3
4
5
6
7
mysql> show global status like 'Com_select';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select    | 1334  |
+---------------+-------+
1 row in set (0.00 sec)

从节点:

1
2
3
4
5
6
7
mysql> show global status like 'Com_select';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select    | 385   |
+---------------+-------+
1 row in set (0.00 sec)

执行select语句:

1
2
3
4
5
6
7
mysql> select from travelrecord where id=1;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | aaa  | NULL |
+----+------+------+
1 row in set (0.00 sec)

主节点:

1
2
3
4
5
6
7
mysql> show global status like 'Com_select';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select    | 1334  |
+---------------+-------+
1 row in set (0.00 sec)

从节点:

1
2
3
4
5
6
7
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服务

1
2
3
4
5
6
[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文件内容是否变化

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 |
+---------+-------+------+
rows in set (0.00 sec)

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

转自:

mycat读写分离与主从切换 - 贺磊的技术博客 - 51CTO技术博客
http://suifu.blog.51cto.com/9167728/1854298?utm_source=tuicool&utm_medium=referral

mycat读写分离与主从切换【转】的更多相关文章

  1. Mycat读写分离、主从切换学习(转)

    http://blog.csdn.net/zhanglei_16/article/details/50707487 Mycat读写分离.主从切换学习问题一:分表.分库的优缺点,以及分表无法成为主流分表 ...

  2. Mycat读写分离、主从切换、分库分表的操作记录

    系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一 ...

  3. mycat读写分离与主从切换

    1, 分库分表的优缺点.以及为什么分表方式无法成为主流? 分表:在台server上,长处是易维护,相似表分区.缺点是在一台dbserver上.无法分担IO.负载集中. 分库:在多台server上,长处 ...

  4. myCat读写分离+传统主从

    1 Mycat介绍: mycat是最近很火的一款国人发明的分布式数据库中间件,它是基于阿里的cobar的基础上进行开发的 准备环境: db01主   10.0.0.51 db02备   10.0.0. ...

  5. redis的主从复制,读写分离,主从切换

    当数据量变得庞大的时候,读写分离还是很有必要的.同时避免一个redis服务宕机,导致应用宕机的情况,我们启用sentinel(哨兵)服务,实现主从切换的功能. redis提供了一个master,多个s ...

  6. Redis哨兵模式(sentinel)部署记录(主从复制、读写分离、主从切换)

    部署环境: CentOS7.5  192.168.94.11 (master) 192.168.94.22 (slave0) 192.168.94.33 (slave1) 192.168.94.44 ...

  7. Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)

    Redis的集群方案大致有三种:1)redis cluster集群方案:2)master/slave主从方案:3)哨兵模式来进行主从替换以及故障恢复. 一.sentinel哨兵模式介绍Sentinel ...

  8. [转]Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)

    Redis的集群方案大致有三种:1)redis cluster集群方案:2)master/slave主从方案:3)哨兵模式来进行主从替换以及故障恢复. 一.sentinel哨兵模式介绍Sentinel ...

  9. redis的主从复制(读写分离)/哨兵(主从切换)配置

    准备两个redis服务,两台机器,依次命名文件夹子master,slave1 10.10.10.7 10.10.10.8 1.master修改配置文件 [root@db2 conf]# cat 637 ...

随机推荐

  1. 文件同步工具 lsyncd2.1.6 安装使用问题

    项目有文件实时同步备份的需求,做了一下调查,比较好的解决方法是使用lsyncd工具.这里主要记录一下遇到的问题及解决方法. lsyncd 的相关介绍和对比可见: lsyncd实时同步搭建指南——取代r ...

  2. Jackson 使用

    // 序列化出来的 JSON, 不包含值为 NULL 类型字段. mapper.setSerializationInclusion(Include.NON_NULL); Jackson provide ...

  3. NAT alg 和 ASPF

    NAT alg 和 ASPF 参考:https://handbye.cn/719.html 来源:https://www.jianshu.com/p/8a8eb36eef7d NAT的部署已经在企业网 ...

  4. TJOI2013数字根

    题面链接 洛谷 sol 我们先不考虑\(0\),发现数字根\(=\)它\(mod 9\). 我们前缀和一波,把区间和变成两数相减. 对于每个\(v\in\{0-8\}\),(这里面的\(mod 9=0 ...

  5. 【转】arm-none-linux-gnueabi-gcc下载

    arm-none-linux-gnueabi-gcc是 Codesourcery 公司(目前已经被Mentor收购)基于GCC推出的的ARM交叉编译工具.可用于交叉编译ARM系统中所有环节的代码,包括 ...

  6. Fowsniff: 1靶机入侵

    一.信息收集 1.存活主机扫描 arp-scan  -l 发现192.168.1.13是目标靶机的IP地址 2.端口扫描 接下来用nmap神器来扫描目标IP地址,命令如下: root@kali2018 ...

  7. Android 程序架构: MVC、MVP、MVVM、Unidirectional、Clean...

    摘选自:GUI 应用程序架构的十年变迁:MVC.MVP.MVVM.Unidirectional.Cleanhttps://zhuanlan.zhihu.com/p/26799645 MV* in An ...

  8. fzyzojP1876 天津——泥人张

    思路一: 考虑lucas定理,mod 4意义下,每一个组合数都不能是0 所以,把n变成四进制数,然后数位dp即可 f[i][0/1][0/1/2/3]表示,前i位,有没有限制,mod 4 的值是0/1 ...

  9. 【左偏树】【P3261】 [JLOI2015]城池攻占

    Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其 ...

  10. PPTP协议握手流程分析--转载

    一  PPTP概述   PPTP(Point to Point Tunneling Protocol),即点对点隧道协议.该协议是在PPP协议的基础上开发的一种新的增强型安全协议,支持多协议虚拟专用网 ...