Mysql读写分离+分表分库

Mysql读写分离的概述

简介:Mysql作为世界上使用最广泛的免费数据库,从事系统运维工程师的都一定接触过,但是实际的生产环境中,由于单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等方面。
因此,一般来说他都是通过主从复制(Master-slave)的方式来同步数据,再通过读写分离(Mysql-proxy/Amoeba)来提升数据库的并发负载能力,这样的方式来进行部署与实施的。

读写分离的工作原理

基本的原理是让主数据库处理事务的(insert/update/delete),而从数据库处理select查询操作,数据库复制被用来把事务操作导致的变更同步到集群中的从数据库中。

为什要读写分离?

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

  • 1.主从只负责各自的读和写,极大程度的缓解X锁和S锁的争用。

  • 2.从库可配置myisam引擎,提升查询性能,以及节约系统开销

  • 3.增加冗余,提高性能

实现读写分离的方式

  • 1.应用程序层实现,网站的程序实现

  • 2.应用程序层实现指:在应用程序内部及其连接器中指向一台服务器实现读写分离

2.中间层实现

中间件Mycat是什么?

  • 基于Java的分布式数据库系统中间层,为高并发下的分布式提供解决方案

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

  • 支持事务、ACID、可以替代Mysql的加强版数据

  • 一个可以视为Mysql集群的企业数据库、用来替代昂贵的oracle集群

Mycat可以实现什么?

  • – 支持JDBC形式连接
  • – 支持MySQL、Oracle、Sqlserver、Mongodb等
  • – 提供数据读写分离服务
  • – 可以实现数据库服务器的高可用
  • – 提供数据分片服务
  • – 基于阿里巴巴Cobar进行研发的开源软件
  • – 适合数据大量写入数据的存储需求

Mycat提供的算法

  • 1.枚举法 sharding-by-intfile
  • 2.固定分片hash算法 rule1
  • 3.范围约定 auto-sharding-long
  • 4.求模法 mod-log
  • 5.日期列分区法 sharding-by-date
  • 6.通配取模 sharding-by-pattern
  • 7.ASCII码求模通配 sharding-by-prefixpattern
  • 8.编程指定 sharding-by-substring
  • 9.字符串拆分hash解析 sharding-by-stringhash
  • 10.一致性hash sharding-by-murmur

Mycat重要的文件

  • server.xml 设置连接mycat服务的账号 、密码等
  • schema.xml 配置mycat使用的真实数据库和表rule.xml
  • 定义mycat分片规则

Mycat的安装部署

  • 官方下载主页http://www.mycat.io

1.环境部署:

mycat需要运行JDK1.7以上的版本
java --version  # 查询当前的系统版本
mkdir -pv /usr/java
mkdir -pv /usr/local/mycat
systemctl stop firewalld.service

2.解压配置环境变量:

rz jdk-8u131-linux-x64.tar.gz
tar -zxf jdk-8u131-linux-x64.tar.gz -C /usr/java
rz Mycat-server-1.5-RELEASE-20160301083012-linux.tar.gz
tar -zxf Mycat-server-1.5-RELEASE-20160301083012-linux.tar.gz -C /usr/local/mycat
------------------------配置环境变量----------------------
vim /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
    MYCAT_HOME=/usr/local/mycat
source /etc/profile   # 重载配置文件

3.主从服务器的配置:

1.事先安装好三台服务器: 
    192.168.175.204     mycat-master
    192.168.175.205     mycat-slave
    192.168.175.206     mycat-demo
2.登入主从Mysql配置:
    <主>:
        编辑配置文件:vim /etc/my.cnf
        [mysql]
            symbolic-links=0
            server-id=1
            log-bin=mysql-bin-master
            binlog-do-db=HA
        grant all on *.* to 'mycat'@'192.168.175.206' identified by '123456';   # 赋予mycat权限
        grant replication slave on *.* to slave@'从服务器IP' identified by '123456';   # 赋予从服务权限
        flush privileges;
        show master status;     # 查看master状态
        show binlog events\G    # 所有的命令记录查看
        select host,password from mysql.user;    #查看当前的用户状态
    <从>:
        编辑配置文件:vim /etc/my.cnf
        [mysql]
            server-id=2
        change master to master_host='主ip',master_user='slave',master_password='123456';
        grant replication slave@'123456' identified by '123456';
        flush priviegles;
        start slave;
        show slave status\G;

3.配置mycat读写分离:

vim /usr/local/mysql/mysql/conf/server.xml
    </system>
    <user name="root">
            <property name="password">123456</property>
            <property name="schemas">HA</property>
    </user>

    <user name="user">
            <property name="password">user</property>
            <property name="schemas">HA</property>
            <property name="readOnly">true</property>
    </user>

vim /usr/local/mycat/mycat/conf/schema.xml  
    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://org.opencloudb/">
            <schema name="HA" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'>
            </schema>
            <dataNode name="dn1" dataHost="dthost" database="HA"/>
            <dataHost name="dthost" maxCon="500" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
            <heartbeat>select user()</heartbeat>
            <writeHost host="mycat-master.cn" url="192.168.175.205:3306" user="mycat" password="123456">
            </writeHost>
            <writeHost host="mycat-slave.cn" url="192.168.175.204:3306" user="mycat" password="123456" />
            </dataHost>
    </mycat:schema>

schema的参数详细:
> 有两个参数需要注意,balance和 switchType。
> 其中,balance指的负载均衡类型,目前的取值有4种:
> 1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
> 2. balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
> 3. balance="2",所有读操作都随机的在writeHost、readhost上分发。
> 4. balance="3",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力
> switchType指的是切换的模式,目前的取值也有4种:
> 1. switchType='-1' 表示不自动切换
> 2. switchType='1' 默认值,表示自动切换
> 3. switchType='2' 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
> 4. switchType='3'基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like 'wsrep%'。

4.启动Mycat:

    [mycat-demo]mycat start
    netstat -anput # Mycat监控的是8066端口

5.日志模式修改为debug模式:

vim /usr/local/mycat/mycat/conf/log4j.xml
    <37> <level value="debug" />
mycat restart   #即可
tailf /usr/local/mycat/mycat/logs/mycat.log  #即可

6.如果master或slave停止运行会导致什么结果?

  • master掉线后,不影响读取,但是无法写入数据了。
  • slave掉线后,无任何影响,只是主服务器的负担加重。

Mysql读写分离+分表分库》有1个想法

发表评论