• ADADADADAD

    怎么理解Mycat读写分离[ mysql数据库 ]

    mysql数据库 时间:2024-11-26 22:12:36

    作者:文/会员上传

    简介:

    1 MySQL读写分离的概述Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。

    1 MySQL读写分离的概述

    Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。

    因此,一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy/Amoeba)来提升数据库的并发负载能力,这样的方案来进行部署与实施的。

    1.1 读写分离工作原理:

    基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。

    数据内部交换过程:

    1.2 为什么要读写分离:

    1)面对越来越大的访问压力,单台的服务器的性能成为瓶颈,需要分担负载;

    2)主从只负责各自的写和读,极大程度的缓解X锁和S锁争用;

    3)从库可配置myisam引擎,提升查询性能以及节约系统开销;

    4)增加冗余,提高可用性。

    1.3 实现读写分离的方式:

    一般有两种方式实现

    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:对业务代码的影响小,同时也安全。

    缺点:

    需要一定的开发运维团队的支持。

    2 什么是MYCAT

    一个彻底开源的,面向企业应用开发的大数据库集群;

    支持事务、ACID、可以替代MySQL的加强版数据库;

    一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群;

    一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server;

    结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品;

    一个新颖的数据库中间件产品。

    3 服务安装与配置

    实验架构

    服务器

    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。

    3.1 文件结构

    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分片(分库分表)规则


    3.2 mycat安装 (xuegod65)1.安装JDK 1.7 或者以上版本

    第一步:下载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


    2.解压mycat 安装


    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.63xuegod63.cn xuegod63

    192.168.1.64xuegod64.cn xuegod64

    192.168.1.65xuegod65.cn xuegod65


    4 服务启动与启动设置

    (mycat的用户账号和授权信息是在conf/server.xml文件中配置

    [root@xuegod65 ~]#Vim /usr/local/mycat/conf/server.xml

    druidparser

    <user name="root">

    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 主从同步的状态决定是否切换




    5 配置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<ha.sql

    授权给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

    测试读写分离

    6 当我们slave挂掉后咋样呢

    模拟故障:从服务器挂掉了

    [root@xuegod64 ~]# systemctl stop mysqld

    在客户端上测试读写

    [root@xuegod66 ~]# mysql -uroot -p123456 -h 192.168.1.65-P8066

    mysql> use ha;

    mysql> select * from t1;

    说明读操作的路由切换到master上了,对外没有任何影响!

    7 当我们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读写分离.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: mycat