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
|
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 |+--------------------+-------+3 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 |+--------------------+-------+3 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 2016localhost1=0[root@HE3 conf]# /etc/init.d/mysqld stopShutting down MySQL............ SUCCESS! |
观察dnindex.properties文件内容是否变化
|
1
2
3
4
|
[root@HE3 conf]# cat dnindex.properties #update#Mon Sep 12 18:32:28 PDT 2016localhost1=1 |
当前可用节点只剩下原从节点,期望结果是之后的写入操作全部落到原从节点,验证:
|
1
2
3
4
|
mysql> insert into travelrecord values(3,'helei',25);ERROR 1064 (HY000): partition table, insert must provide ColumnListmysql> 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 namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> 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无需重启,对前端应用是透明的。
转自:
mycat读写分离与主从切换 - 贺磊的技术博客 - 51CTO技术博客
http://suifu.blog.51cto.com/9167728/1854298?utm_source=tuicool&utm_medium=referral
mycat读写分离与主从切换【转】的更多相关文章
- Mycat读写分离、主从切换学习(转)
http://blog.csdn.net/zhanglei_16/article/details/50707487 Mycat读写分离.主从切换学习问题一:分表.分库的优缺点,以及分表无法成为主流分表 ...
- Mycat读写分离、主从切换、分库分表的操作记录
系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一 ...
- mycat读写分离与主从切换
1, 分库分表的优缺点.以及为什么分表方式无法成为主流? 分表:在台server上,长处是易维护,相似表分区.缺点是在一台dbserver上.无法分担IO.负载集中. 分库:在多台server上,长处 ...
- myCat读写分离+传统主从
1 Mycat介绍: mycat是最近很火的一款国人发明的分布式数据库中间件,它是基于阿里的cobar的基础上进行开发的 准备环境: db01主 10.0.0.51 db02备 10.0.0. ...
- redis的主从复制,读写分离,主从切换
当数据量变得庞大的时候,读写分离还是很有必要的.同时避免一个redis服务宕机,导致应用宕机的情况,我们启用sentinel(哨兵)服务,实现主从切换的功能. redis提供了一个master,多个s ...
- Redis哨兵模式(sentinel)部署记录(主从复制、读写分离、主从切换)
部署环境: CentOS7.5 192.168.94.11 (master) 192.168.94.22 (slave0) 192.168.94.33 (slave1) 192.168.94.44 ...
- Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)
Redis的集群方案大致有三种:1)redis cluster集群方案:2)master/slave主从方案:3)哨兵模式来进行主从替换以及故障恢复. 一.sentinel哨兵模式介绍Sentinel ...
- [转]Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)
Redis的集群方案大致有三种:1)redis cluster集群方案:2)master/slave主从方案:3)哨兵模式来进行主从替换以及故障恢复. 一.sentinel哨兵模式介绍Sentinel ...
- redis的主从复制(读写分离)/哨兵(主从切换)配置
准备两个redis服务,两台机器,依次命名文件夹子master,slave1 10.10.10.7 10.10.10.8 1.master修改配置文件 [root@db2 conf]# cat 637 ...
随机推荐
- c语言宏定义#define
1. 利用define来定义 数值宏常量 #define 宏定义是个演技非常高超的替身演员,但也会经常耍大牌的,所以我们用它要慎之又慎.它可以出现在代码的任何地方,从本行宏定义开始,以后的代码就就都认 ...
- MT【161】韦恩图
(清华2017.4.29标准学术能力测试25) 若$N$的三个子集$A,B,C$满足$|A\cap B|=|B\cap C|=|C\cap A|=1$,且$A\cap B\cap C=\varnoth ...
- 【刷题】BZOJ 3626 [LNOI2014]LCA
Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1. 设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先. ...
- tarjan解决路径询问问题
好久没更新了,就更一篇普及组内容好了. 首先我们考虑如何用tarjan离线求出lca,伪代码大致如下: def tarjan(x): 将x标记为已访问 for c in x的孩子: tarjan(c) ...
- 一个非典型的Linux路由配置方案
上周帮人解决了一个问题,这个问题绝对是非典型性的,采用了非常规的方法.虽然最终的方案非常不符合常规,非常不通用,充满了各种藏得很深的技巧或者说是trick,但是这个问题却是一个学习Linux路由的绝好 ...
- 【BZOJ2733】永无乡(线段树,并查集)
[BZOJ2733]永无乡(线段树,并查集) 题面 BZOJ 题解 线段树合并 线段树合并是一个很有趣的姿势 前置技能:动态开点线段树 具体实现:每次合并两棵线段树的时候,假设叫做\(t1,t2\), ...
- 51nod 1563 坐标轴上的最大团(今日gg模拟第一题) | 线段覆盖 贪心 思维题
51nod 1563 坐标轴上的最大团 坐标轴上有n个点,每个点有一个权值.第i个点的坐标是 xi ,权值是 wi .现在对这些点建图.对于点对 (i,j) ,如果 |xi−xj|≥wi+wj ,那么 ...
- JS的关键字this
1.关于this this关键字是JavaScript中最复杂的机制之一.它是一个很特别的关键字,被自动定义在所有函数的作用域中. 1.1 为什么要用this? this提供了一种更优雅的方式来隐式地 ...
- Android Studio 换主题 + 背景图片 + 去掉白色竖线
1.去掉AS编辑区域右边的白色竖线: 把right margin 设置的大一点就可以了,默认是120 ,设置成 1200就ok了 2.AS主题下载换装 可以去如下网站下载,然后导入jar, 具体用法百 ...
- 【树上莫队】【SP10707】 COT2 - Count on a tree II
Description 给定一棵 \(n\) 个点的树,每个节点有一个权值,\(m\) 次询问,每次查询两点间路径上有多少不同的权值 Input 第一行是 \(n\) 和 \(m\) 第二行是 \(n ...