MySQL数据库之mycat读写分离与主从切换
小标 2019-06-24 来源 : 阅读 1241 评论 0

摘要:本文主要向大家介绍了MySQL数据库之mycat读写分离与主从切换 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。

本文主要向大家介绍了MySQL数据库之mycat读写分离与主从切换 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。

MySQL数据库之mycat读写分离与主从切换

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


本文的环境信息:

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 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用到的数据库用户

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标签中的writeHosturl 
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<    

本文由职坐标整理并发布,希望对同学们学习MySQL有所帮助,更多内容请关注职坐标数据库MySQL数据库频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程