这篇文章主要介绍“怎么理解Mycat读写分离”,在日常操作中,相信很多人在怎么理解Mycat读写分离问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解Mycat读写分离”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
为独山等地区用户提供了全套网页设计制作服务,及独山网站建设行业解决方案。主营业务为成都网站设计、成都网站制作、独山网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。
因此,一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy/Amoeba)来提升数据库的并发负载能力,这样的方案来进行部署与实施的。
基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
数据内部交换过程:
|
1)面对越来越大的访问压力,单台的服务器的性能成为瓶颈,需要分担负载;
2)主从只负责各自的写和读,极大程度的缓解X锁和S锁争用;
3)从库可配置myisam引擎,提升查询性能以及节约系统开销;
4)增加冗余,提高可用性。
一般有两种方式实现
1)应用程序层实现,网站的程序实现;
2)应用程序层实现指的是在应用程序内部及连接器中实现读写分离。
优点:
A:应用程序内部实现读写分离,安装既可以使用;
B:减少一定部署难度;
C:访问压力在一定级别以下,性能很好。
缺点:
A:架构一旦调整,代码要跟着变;
B:难以实现高级应用,如自动分库,分表;
C:无法适用大型应用场景。
中间件层实现
中间件层实现是指在外部中间件程序实现读写分离
常见的中间件程序:
|
Cobar:
阿里巴巴B2B开发的关系型分布式系统,管理将近3000个MySQL实例。在阿里经受住了考验,后面由于作者的走开的原因cobar没有人维护了,阿里也开发了tddl替代cobar。
MyCAT:
社区爱好者在阿里cobar基础上进行二次开发,解决了cobar当时存在的一些问题,并且加入了许多新的功能在其中。目前MyCAT社区活跃度很高,目前已经有一些公司在使用MyCAT。总体来说支持度比较高,也会一直维护下去,
OneProxy:
数据库界大牛,前支付宝数据库团队领导楼总开发,基于mysql官方的proxy思想利用c进行开发的,OneProxy是一款商业收费的中间件,楼总舍去了一些功能点,专注在性能和稳定性上。有朋友测试过说在高并发下很稳定。
Vitess:
这个中间件是Youtube生产在使用的,但是架构很复杂。与以往中间件不同,使用Vitess应用改动比较大要使用他提供语言的API接口,我们可以借鉴他其中的一些设计思想。
Kingshard:
Kingshard是前360Atlas中间件开发团队的陈菲利用业务时间用go语言开发的,目前参与开发的人员有3个左右,目前来看还不是成熟可以使用的产品,需要在不断完善。
Atlas:
360团队基于mysql proxy 把lua用C改写。原有版本是支持分表,目前已经放出了分库分表版本。在网上看到一些朋友经常说在高并发下会经常挂掉,如果大家要使用需要提前做好测试。
MaxScale与MySQL Route:
这两个中间件都算是官方的,MaxScale是mariadb (MySQL原作者维护的一个版本)研发的,目前版本不支持分库分表。MySQL Route是现在MySQL官方Oracle公司发布出来的一个中间件。
优点:
A:架构设计更灵活;
B:可以在程序上实现一些高级控制,如:透明化水平拆分,failover,监控;
C:可以依靠些技术手段提高mysql性能;
D:对业务代码的影响小,同时也安全。
缺点:
需要一定的开发运维团队的支持。
一个彻底开源的,面向企业应用开发的大数据库集群;
支持事务、ACID、可以替代MySQL的加强版数据库;
一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群;
一个融合内存缓存技术、NOSQL技术、HDFS大数据的新型SQL Server;
结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品;
一个新颖的数据库中间件产品。
实验架构
服务器 | IP | 说明 |
xuegod65 | 192.168.1.65 | mycat服务器,连接数据库时,连接此服务器 |
xuegod63 | 192.168.1.63 | 物理数据库1,master |
xuegod64 | 192.168.1.64 | 物理数据库2,slave |
MyCAT有提供编译好的安装包,支持windows、Linux、Mac、Solaris等系统上安装与运行。官方下载主页http://www.mycat.io。
linux下可以下载Mycat-server-xxxxx.linux.tar.gz 解压在某个目录下,注意目录不能有空格,
在Linux(Unix)下,建议放在/usr/local/Mycat目录下,
目录 | 说明 |
bin | mycat命令,启动、重启、停止等 |
catlet | catlet为Mycat的一个扩展功能 |
conf | Mycat 配置信息,重点关注 |
lib | Mycat引用的jar包,Mycat是java开发的 |
logs | 日志文件,包括Mycat启动的日志和运行的日志。 |
文件 | 说明 |
server.xml | Mycat的配置文件,设置账号、参数等 |
schema.xml | Mycat对应的物理数据库和数据库表的配置 |
rule.xml | Mycat分片(分库分表)规则 |
第一步:下载jdk-8u131-linux-x64.tar.gz文件 http://haixi.sfkcn.com:8080/201704/tools/jdk-linux-x64.tar.gz 第二步:新建/usr/java文件夹,将jdk-8u131-linux-x64.tar.gz放到该文件夹中,并解压到当前目录下 第三步:配置环境变量 在/etc/profile底部加入如下内容: JAVA_HOME=/usr/java/jdk1.8.0_131 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar export PATH JAVA_HOME CLASSPATH [root@xuegod65 java]# source /etc/profile #使环境变量生效 查看java –version |
linux下可以下载Mycat-server-xxxxx.linux.tar.gz 解压到/usr/local/,注意目录不能有空格
创建mycat用户,并修改密码 useradd mycat
修改权限 chown – R mycat.mycat /usr/local/mycat
配置环境变量
1) vi /etc/profile,在系统环境变量文件中增加
MYCAT_HOME=/usr/local/mycat
PATH=$MYCAT_HOME/bin:$PATH
2) 执行 source /etc/profile 命令,使环境变量生效。
编辑hosts文件
192.168.1.63 xuegod63.cn xuegod63
192.168.1.64 xuegod64.cn xuegod64
192.168.1.65 xuegod65.cn xuegod65
(mycat的用户账号和授权信息是在conf/server.xml文件中配置
[root@xuegod65 ~]#Vim /usr/local/mycat/conf/server.xml
druidparser
123456 ha
user ha true
|
参数说明 |
user 用户配置节点 |
--name 登录的用户名,也就是连接Mycat的用户名,这里就是对于外部应用 |
--password 登录的密码,也就是连接Mycat的密码 |
--schemas 数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如需要这个用户需要管理两个数据库db1,db2,则配置db1,dbs |
--privileges 配置用户针对表的增删改查的权限,具体见文档吧 |
编辑MyCAT的配置文件schema.xml,关于dataHost的配置信息如下:
[root@xuegod65 ~]#vim /usr/local/mycat/conf/schema.xml
select user()
|
以下是一个模版解释
select user()
|
|
balance 属性负载均衡类型,目前的取值有 4 种: |
balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上。 |
balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1,S2 都参与 select 语句的负载均衡。 |
balance="2", 所有读操作都随机的在 writeHost、 readhost 上分发。 |
balance="3", 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有, 1.3 没有。 |
writeType 属性,负载均衡类型,目前的取值有 3 种: |
writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties . |
writeType="1",所有写操作都随机的发送到配置的 writeHost。 |
writeType="2",没实现。 |
switchType 属性 |
-1 表示不自动切换 |
1 默认值,自动切换 |
2 基于MySQL 主从同步的状态决定是否切换 |
xuegod63上创建数据库和表,用于实现写操作:
[root@xuegod63 ~]# mysql -uroot -p123456
mysql> create database ha;
mysql> use ha;
mysql> create table test(id int,name varchar(20));
mysql> insert into test values(1,'man');
授权给mycat登陆数据库使用的帐号
mysql> grant all privileges on *.* to mycat@'%' identified by '123456';
mysql> grant replication slave on *.* to slave@"192.168.1.%" identified by "123456";
mysql>flush privileges;
mysqldump –uroot –p123456 -B ha>ha.sql #导出给从库
scp ha.sql xuegod64.cn:/root
[root@xuegod64 ~]# vim /etc/my.cnf
log-bin=mysql-bin-master #启用二进制日志
server-id=1 #本机数据库ID 标示
binlog-do-db=HA #可以被从服务器复制的库, 二进制需要同步的数据库名
binlog-ignore-db=mysql #不可以被从服务器复制的库
如需关闭密码强度审计,在my.cnf添加validate-password=off
[root@xuegod64 ~]# systemctl restart mysqld
xuegod64上导入数据库和表,用于实现读操作:
[root@xuegod64 ~]# mysql -uroot -p123456 授权给mycat登陆数据库使用的帐号 mysql> grant all privileges on *.* to mycat@'%' identified by '123456'; mysql>flush privileges; [root@xuegod64 ~]# vim /etc/my.cnf server-id=2 #本机数据库ID 标示 [root@xuegod64 ~]# systemctl restart mysqld mysql>stop slave; #停止slave mysql> change master to master_host='192.168.1.63',master_user='slave',master_password='123456'; mysql> start slave; #启动slave mysql> show slave status\G 查看状态,有两个yes主从同步成功! 启动服务mycat服务 [root@xuegod65~]# /usr/local/mycat/bin/mycat start 测试读写分离 模拟故障:从服务器挂掉了 [root@xuegod64 ~]# systemctl stop mysqld 在客户端上测试读写 [root@xuegod66 ~]# mysql -uroot -p123456 -h 192.168.1.65-P8066 mysql> use ha; mysql> select * from t1; 说明读操作的路由切换到master上了,对外没有任何影响! 模拟故障:主服务器挂掉了 [root@xuegod63 ~]# systemctl stop mysqld 在客户端上测试读写 [root@xuegod66 ~]# mysql -uroot -p123456 -h 192.168.1.65 -P8066 mysql> create table t3(id int); ERROR 1184 (HY000): 拒绝连接 #主数据库停止了,是无法写操作的,但不影响读. mysql> use ha; mysql> select * from t1; 到此,关于“怎么理解Mycat读写分离”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!
6 当我们slave挂掉后咋样呢
7 当我们master挂掉后咋样呢
分享标题:怎么理解Mycat读写分离
本文路径:http://kswsj.cn/article/ipjgdj.html