mysql高级技术之mycat读写分离技术实践
Posted AAA教育张晨光
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql高级技术之mycat读写分离技术实践相关的知识,希望对你有一定的参考价值。
1,课程回顾
2,本章重点
mysql 主从原理,好处
mycat 概念,读写分离好处,读写分离的实现
3,具体内容
3.1 mysql 主从
3.1.1 linux下mysql安装
以mysql5.6为例
1)修改IP地址,修改主机名称
vim /etc/sysconfig/network-scripts/ifcfg-ens33
vim /etc/hostname
2)安装mysql
查看已经安装mysql组件:(centos6.9 需要卸载原来的mysql组件)
yum list installed | grep mysql
卸载:
yum -y remove mysql-libs.x86_64
centos7.0之后,上面两句可以省略
如果wget没有安装
yum -y install wget
下载yum源
wget [http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm](http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm)
安装yum源
rpm -ivh mysql-community-release-el6-5.noarch.rpm
查看yum源中mysql有效版本
yum repolist all | grep mysql
使用下载yum源安装
yum install mysql-community-server -y
查看mysql服务是否启动
service mysqld status
启动mysql服务
service mysqld start
使用mysql客户端命令,连接mysql,默认密码为空
mysql -u root -p 回车 再回车(默认密码为空)
查看所有数据库
show databases;
选择数据库:
use mysql;
查看所有表:
show tables;
查看表结构:
desc user; //两个命令都可以
describe user;
修改密码(使用空密码不太好):
update user set password=password('tiger') where user='root';
password('tiger') 加密,把tiger密码加密存储
刷新权限,让密码生效:
flush privileges;
退出:
quit
再次连接:
msyql -uroot -ptiger;
远程使用navicat连接时报错(默认安装msql后,只允许localhost和127.0.0.1连接):
修改允许远程连接为统配符%,这样远程的IP就可以连接
update user set host=‘%’ where host=‘::1’;
刷新权限(让修改生效):
flush privileges;
3.1.2 mysql主从及双主双从配置
1)双主双从规划图:
2)具体实现:
以mysql1为基础,克隆出mysql2,mysql3,mysql4 修改IP及主机名称
vim /etc/sysconfig/network-scripts/ifcfg-ens33
vim /etc/hostname
配置主从:
master:
主服务器上修改配置文件,添加日志操作
vim /etc/my.cnf mysql1操作
修改第12行 binary.log 日志文件名称可以随便起
log_bin=binary_log
添加一行当前服务器唯一识别
server-id=111
重启服务,让修改生效
service mysqld restart
登录mysql
mysql -uroot -ptiger
查看master状态
show master status;
slave:
vim /etc/my.cnf
添加一行
server-id=112
重启服务,让修改生效
service mysqld restart
登录mysql
mysql -uroot -ptiger
关闭slave(第一次操作不需要,但是以后如果修改该服务器为其他服务的从节点时,需要先停止slave服务)
stop slave;
配置当前服务器为master(111)服务器的从机
change master to master_host='192.168.170.111',master_user='root',master_password='tiger',master_log_file='binlog.000001',master_log_pos=120;
启动slave服务:
start slave;
查看slave的状态
show slave status \\G;
没有错最好(两台机子都全新安装mysql),克隆时,会报下面错误:
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
原因因为克隆机子,两边的sever-uuid完全一致,所以错误
cat /var/lib/mysql/auto.cnf 在all session 中运行,发现4台mysql的uuid都一样 删除后3台的uuid 并重启服务
在mysql2,mysql3,mysql4都执行:
rm -rf /var/lib/mysql/auto.cnf
service mysqld restart
再次查看uuid是否一致(发现不同):
cat /var/lib/mysql/auto.cnf
在mysql2上再次连接
mysql -uroot -ptiger
再次执行命令,发现IO,SQL线程都是正常,说明主从配置成功
show slave status \\G;
测试主从:
在mysql1上创建库,创建表,添加数据 发现mysql2都有!
配置mysql3和mysql4主从:
同上
配置mysql1和mysql2互为主从:
在mysql1和mysql3上, 新加一些配置
vim /etc/my.cnf
在配置文件中添加(让从机作为其他主机的从机进行写操作时,该从机的从机也会进行写操作)
log-slave-updates
修改配置重启服务
测试:
在mysql1和mysql3进行任意写操作,4台服务器都进行了同步
3.1.3 主从配置原理
1,主服务器(master)进行写操作时,会把所有的更新语句以二进制日志(binary log)的形式存储
2,从服务器(slave)中有一个i/o线程,会读取主服务器上的二进制日志文件到中继文件中(relay log)
3, 从服务器(slave)中另外一个sql线程,会读写中继文件中的语句,执行并持久化到从服务器的数据库文件中,从而实现了主从复制的功能
3.1.4 好处
负载均衡 :业务量增大时,I/O读写频率变高,单机可能无法满足需求,使用主从,让从服务器分担读压力,实现负载均衡
数据备份 : 传统的备份,都是本地备份,但是存在弊端,无法防止服务器本身出问题,配置主从,可以把本地数据备份到其他服务器
提高可用性 : 一旦主服务器出现问题,可以直接使用从服务器进行更新或者查询
3.2 mycat 读写分离,自动容错
3.2.1 mycat 概念,原理
概念:
mycat 是活跃的、性能好的数据库中间件,是mysql集群数据库中间件。基于心跳的自动故障切换,支持读写分离。支持分表分库。支持全局序列号,解决分布式下的主键生成问题。mycat 是阿里的开源数据库中间件cobar为基础,所以站在巨人肩膀。
原理:
Mycat 的原理并不复杂,复杂的是代码,如果代码也不复杂,那么早就成为一个传说了。
Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL 语句做了 一些特定的分析:如分片分析、路由分析、读写分离分析(看是select 还是 insert,update,delete操作)、缓存分析等,然后将此 SQL 发往后端的真实数据库, 并将返回的结果做适当的处理,最终再返回给用户。
3.2.2 mycat 读写分离配置
1),拿最基础的机子克隆一台mycat服务器 ,修改IP,修改主机名称。
依赖jdk
vim /etc/sysconfig/network-scripts/ifcfg-ens33
vim /etc/hostname
2),下载,解压mycat,配置环境变量
从官网下载相关版本,使用xftp上传到linux服务器
解压:
tar -xzvf /root/software/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/
配置环境变量:
vim /etc/profile
复制下面内容:
export MYCAT_HOME=/usr/mycat
export PATH=$PATH:$JAVA_HOME/bin:$MYCAT_HOME/bin
让配置文件生效:
source /etc/profile
测试:
echo $MYCAT_HOME
3), server.xml配置
server.xml 几乎保存了所有 mycat 需要的系统配置信息(全局配置,在server.xml配置可以全局产生影响)。其在代码内直接的映射类为 SystemConfig 类。server.xml 中的标签本就不多,这个标签主要用于定义登录 mycat 的用户(密码)和权限(能问那些表,以及针对该表的访问权限)。
vim /usr/mycat/conf/server.xml
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)
4), schema.xml配置
Schema.xml 作为 MyCat 中重要的配置文件之一,管理着 MyCat 的逻辑库、表、分片规则、DataNode(数据节点,分表分库专用) 以及 DataSource(数据源)。弄懂这些配置,是正确使用 MyCat 的前提。这里就一层层对该文件进行解析。
vim /usr/mycat/conf/schema.xml
![图片]
删除了6到32行
底行模式中使用 :6,32d
http://dl.mycat.org.cn/mycat-definitive-guide.pdf
5)读写分离测试
3.2.3 mycat 读写分离,自动容错测试
让M1宕机 如果M1宕机,写操作切换到M2(第一个还生存writehost上),M2进行写操作,M2下的S2进行读 整个数据库不会宕机(注意:虽然S1正常,但S1包含M1下的读节点,所以S1不参与读)
让M1恢复 M2继续写,M1,S1和S2参与读的负载均衡。。。。
实践:
在mysql1上执行: service mysqld stop
– 执行查询
select * from tb_dept;
正常 ,但是所有的读数据都是S2的
– 继续执行添加
insert into tb_dept(dname,loc) values(‘dev7’,‘zz7’);
insert into tb_dept(dname,loc) values(‘dev8’,‘zz8’);
M1宕机恢复后
select * from tb_dept;
insert into tb_dept(dname,loc) values(‘dev9’,‘zz9’);
insert into tb_dept(dname,loc) values(‘dev10’,‘zz10’);
3.2.4 读写分离的好处
读写分离就是数据的写操作(insert udpate delete create alter drop等等)和查询(select等)让不同的数据库服务器执行。
数据库读写分离对于大型系统或者访问量(并发量)很高的互联网应用来说,是必不可少的一个重要功能。 从数据库的角度来说,对于大多数应用来说,从集中到分布,最基本的一个需求不是数据存储(写)的瓶颈,而是在于计算(读)的瓶颈,即SQL查询的瓶颈,我们知道,正常情况下,Insert SQL就是几十个毫秒的时间内写入完成,而系统中的大多数Select SQL则要几秒到几分钟才能有结果,很多复杂的SQL,其消耗服务器CPU的能力超强,不亚于死循环的威力。在没有读写分离的系统上,很可能高峰时段的一些复杂SQL查询就导致数据库服务器CPU爆表,系统陷入瘫痪,严重情况下可能导致数据库崩溃。
4,知识点总结
5,本章面试题
以上是关于mysql高级技术之mycat读写分离技术实践的主要内容,如果未能解决你的问题,请参考以下文章