mycat读写分离与主从切换

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:





什么是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表,以及分片规则和片键


wKioL1ffkGnSgtVAAADhJlCky8Y859.png

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

wKiom1ffj-KRq-rjAACwDD2_qEI607.png



启动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

wKioL1ffkUzCVPSuAABpI9njY4E418.png





配置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,来方便之后我们的读写分离校验

wKioL1ffmzqDXCsOAABjNYo2wyM603.png


验证读写分离效果

写操作


主节点上:

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  table insert  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无需重启,对前端应用是透明的。





 本文转自 dbapower 51CTO博客,原文链接:http://blog.51cto.com/suifu/1854298,如需转载请自行联系原作者

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
SQL 存储 关系型数据库
MySQL主从复制、读写分离
MySQL主从复制、读写分离
130 0
|
8天前
|
中间件 数据库
mycat2.X读写分离
mycat2.X读写分离
27 9
|
8月前
|
SQL 缓存 关系型数据库
|
8月前
|
SQL 关系型数据库 MySQL
Mycat的读写分离
MySQL主从复制原理
58 1
|
XML SQL 负载均衡
MyCat - 高级 - 读写分离 - 一主一从读写分离配置 | 学习笔记
快速学习MyCat - 高级 - 读写分离 - 一主一从读写分离配置
356 0
MyCat - 高级 - 读写分离 - 一主一从读写分离配置 | 学习笔记
|
运维 关系型数据库 MySQL
MyCat-架构剖析-MyCat 主从切换实现 | 学习笔记
快速学习 MyCat-架构剖析-MyCat 主从切换实现
579 0
MyCat-架构剖析-MyCat 主从切换实现 | 学习笔记
|
关系型数据库 MySQL Java
MySQL主从复制+读写分离(二)
MySQL主从复制+读写分离(二)
MySQL主从复制+读写分离(二)
|
SQL 存储 关系型数据库
|
关系型数据库 MySQL 数据库
mysql主从复制与读写分离(二)
mysql主从复制与读写分离(二)
120 0
mysql主从复制与读写分离(二)
|
SQL 存储 运维
mysql主从复制与读写分离(一)
mysql主从复制与读写分离(一)
201 0
mysql主从复制与读写分离(一)