首页 > 运维 > Linux > mysql主从热备,分库分表,读写分离
2018
07-18

mysql主从热备,分库分表,读写分离

mysql安装请看这里 传送门 这里不做赘述

这张图是网上找的,我觉得画的很好,简单明了的解释出mysql数据库读写分离的全过程

  • Java web app:是客户端请求,会对数据库发起读写操作请求,具体是发送SQL指令
  • Mysql Proxy:对读写操作请求的SQL指令进行路由,使得读写分离
  • direct:一个负载分发引擎,对Mysql Proxy分发得读操作,按照一定得算法进行分发至后端得从服务器
  • master:主服务器,主要接受用户的写操作,并且负责将二进制日志同步给从服务器
  • slave-n:从服务器,主要负责用户的读操作(分担主服务器的读写压力),并且负责重放master的写操作,还能实现容灾能力,保证高可用(如果主服务器挂掉,slvae顶上去)

mysql主从复制

配置主master服务器使之具备以下能力

  • 记录二进制日志
  • 为从服务提供一个用户(设置密码),提高二进制日志同步得安全性

配置从服务器slave使之具备以下能力

  • 记录中继日志
  • 连接到mysql可以启动SLAVE功能,并且设置Master信息,通过配置信息,开启IO_THREAD和SQL_THREAD线程

重启mysql服务

systemctl restart mysqld.service

在主机 maser上建立账户并授权slave

告知从服务器(122)二进制文件名与位置

查看从服务器状态

测试主从复制是否成功

在master中创建数据库并创建数据表并且插入一条语句

在Slave中查询这个数据库,查询这条数据 

至此,MySQL主从复制就实现了。

主从热备常用语句

mysql数据库分库分表读写分离

使用Mycat实现读写分离

Mycat需要jvm支持,安装前请先安装JDK

1.下载安装Mycat

  • Mycat官网:http://www.mycat.io/
    可以了解下Mycat的背景和应用情况,这样使用起来比较有信心。
  • Mycat下载地址:http://dl.mycat.io/
    官网有个文档,属于详细的介绍,初次入门,看起来比较花时间。

建议大家选择 1.6.5之后的 版本,1.6.5之前不支持AX事务,会让你很蛋疼,特别是做集群。

安装

根据不同的系统选择不同的版本。包括linux、windows、mac,作者考虑还是非常周全的,当然,也有源码版的。 

Mycat的安装其实只要解压下载的目录就可以了,非常简单。
安装完成后,目录如下:

配置
Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件:

Mycat的架构其实很好理解,Mycat是代理,Mycat后面就是物理数据库。和Web服务器的Nginx类似。对于使用者来说,访问的都是Mycat,不会接触到后端的数据库。 
我们现在做一个主从、读写分离,简单分表的示例。结构如下图: 

Mycat作为主数据库中间件,肯定是与代码弱关联的,所以代码是不用修改的,使用Mycat后,连接数据库是不变的,默认端口是8066。连接方式和普通数据库一样,如:jdbc:mysql://192.168.0.2:8066

配置Mycat

我们只针对mycat实现简单的分库分表和,数据库读写分离。
  

mysql分库分表(数据库读写分离在后边,先看分库分表然后再看数据库读写分离更好理解)

我们真实的物理数据库名称为 wechat,包含了一些表(如下图),以免大家对后面的配置不明白。

server.xml

解释:

schema.xml是最主要的配置项,首先看我的配置文件

每个节点属性逐一说明

schema:

table:

dataNode:

dataHost:

我在192.168.6.121 ,192.168.6.122 ,192.168.6.123 都有数据库webchat

主要关注rule属性,rule属性的内容来源于rule.xml这个文件,Mycat支持10种分表分库的规则,基本能满足你所需要的要求,这个必须赞一个,其他数据库中间件好像都没有这么多。

table中的rule属性对应的就是rule.xml文件中tableRule的name,具体有哪些分表和分库的实现,建议还是看下文档。我这里选择的mod-long就是将数据平均拆分。因为我后端是三台物理库,所以rule.xml中mod-long对应的function count为3,见下面部分代码:

注意看下rule.xml 这几行配置是否正确

数据库读写分离(配置)

前面的server.xml配置都相同

schema.xml如下

dataHost配置详解:

这样的配置与前一个示例配置改动如下:
删除了table分配的规则,以及dataNode只有一个
dataHost也只有一台,但是writeHost总添加了readhost, balance改为1,表示读写分离。
以上配置达到的效果就是102.168.6.121为主库,(192.168.6.122,192.168.6.123)为从库。

注意:Mycat主从分离只是在读的时候做了处理,写入数据的时候,只会写入到writehost,需要通过mysql的主从复制功能将数据复制到readhost,这个问题我纠结了好久,数据写入writehost后,readhost一直没有数据,以为是自己配置的问题,后面才发现Mycat本身没有实现主从复制的功能,毕竟数据库本身自带的主从复制功能才是最高效稳定的。

至于其他的场景,如同时主从和分表分库也是支持的了,只要了解这个实现以后再去修改配置,都是可以实现的。而热备及故障转移官方推荐使用haproxy配合mycat一起使用,大家可以试试。

最后加入配置文件的test1主机名 到hosts

Mycat的启动

建立软件连接

如果在启动时发现异常,在logs目录中查看日志。

  • wrapper.log 为程序启动的日志,启动时的问题看这个
  • mycat.log 为脚本执行时的日志,SQL脚本执行报错后的具体错误内容,查看这个文件。mycat.log是最新的错误日志,历史日志会根据时间生成目录保存。

mycat启动后,执行命令不成功,可能实际上配置有错误,导致后面的命令没有很好的执行。

启动成功

Mycat带来的最大好处就是使用是完全不用修改原有代码的,在mycat通过命令启动后,你只需要将数据库连接切换到Mycat的地址就可以了。如下面就可以进行连接了:

测试(数据库)读写分离

写:这个没啥测的,登录主master插入一条数据,看看从库是不是同步过去了

查看日志

这个错误是说mysql连接失败了,具体原因是mysql只能通过localhost访问登录,而不能使用本机ip访问的问题。

解决办法:

1.或者你在schema.xml 把ip改成localhost或者127.0.0.1

2.或者你不改ip访问,执行如下语句

3.Mycat启动报NumberFormatException解决方案(原因:server内存太大)

3.连接myCat

mycat服务默认的数据端口是8066 , 而9066端口则是mycat管理端口,用于管理mycat的整个集群状态。监听的端口可以在server.xml配置文件中修改 (注意不要在9066端口上查询语句啊 执行mysql语句,他只是管理,不支持那些操作,想要插入数据,请移步8066)

连接8066 向wp_user表插入一条语句

插入成功

然后看下另外两台从机器,数据是否已经同步过去了(这里要说明,主从复制不止mycat的功能,是因为前面我们一开始我们配置的主从复制作用的)

192.168.6.122-slave 已同步
192.168.6.123 -slave 已同步

测试读:(我们修改从机器的插入数据的name 然后在主机器读这条数据,如果能读到并且是修改过的 说明读走的是从机器,与主机器master无关)

修改192.168.6.122机器的数据 将user_login修改为rabbit

然后在主机器master(192.168.6.121)查看该条数据

已然读取了从机器的数据

到此mysql 读(slave)写(master)分离完结

补充内容:9066管理端的一些常用命令

reload命令

show命令

SQL统计命令

最后编辑:
作者:shooter
这个作者貌似有点懒,什么都没有留下。