MySQL集群搭建

主从复制

一、什么是主从复制?
主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。

二、主从复制的作用
1、做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
2、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
3、读写分离,使数据库能支撑更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。

三、主从复制的原理
1.数据库有个bin-log二进制文件,记录了所有sql语句。
2.我们的目标就是把主数据库的bin-log文件的sql语句复制过来。
3.让其在从数据的relay-log重做日志文件中再执行一次这些sql语句即可。
4.下面的主从配置就是围绕这个原理配置
5.具体需要三个线程来操作:
1.binlog输出线程:每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。在从库里,当复制开始的时候,从库就会创建两个线程进行处理:
2.从库I/O线程:当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。

3.从库的SQL线程:从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。

可以知道,对于每一个主从复制的连接,都有三个线程。拥有多个从库的主库为每一个连接到主库的从库创建一个binlog输出线程,每一个从库都有它自己的I/O线程和SQL线程

其他原理

第二点:mysql主从复制
数据库只有一台服务器,那么很容易产生单点故障的问题,比如这台服务器访问压力过大而没有响应或者奔溃,那么服务就不可用了,
再比如这台服务器的硬盘坏了,那么整个数据库的数据就全部丢失了,这是重大的安全事故.
为了避免服务的不可用以及保障数据的安全可靠性,我们至少需要部署两台或两台以上服务器来存储数据库数据,也就是我们需要将数据复制多份部署在多台不同的服务器上,即使有一台服务器出现故障了,其他服务器依然可以继续提供服务.
MySQL提供了主从复制功能以提高服务的可用性与数据的安全可靠性.主从复制是指服务器分为主服务器和从服务器,主服务器负责读和写,从服务器只负责读,主从复制也叫 master/slave,master是主,slave是从,但是并没有强制,也就是说从也可以写,主也可以读,只不过一般我们不这么做。
主从复制可以实现对数据库备份和读写分离
 一主多从
 双主双从
主从复制原理(流程|步骤)
当主服务器发生改变是生成一个二进制文件,从服务器会在一定时间间隔内对 master 主服务器上的二进制日志进行探测访问,要是日志文件发生改变,就会发送I/O Thread线程请求获取,主服务器启动一个dump Thread,用于向从发送二进制事件日志,从启动SQL Thread线程使日志文件一致,完成后I/O Thread 和 SQL Thread线程休眠

注意:主从复制的过程会有很小的延迟,基本没有影响

mysql主从搭建三步
登录上mysql服务器 设置mysql server端口 配置日记文件 设置主服务器的ip端口
3.5 主从设置(重要)
3.5.1 主服务器(3307)设置
需要登录到主服务器3307的客户端
在/usr/local/mysql-5.7.24/bin目录下执行 ./mysql -uroot -p -P3307 -h127.0.0.1
(1) 在主服务器上创建复制数据的账号并授权
grant replication slave on . to ‘copy’@’%’ identified by ‘123456’;
注意:该语句可完成授权、创建用户、修改密码操作
(2) 查看主服务器状态
show master status;
mysql主服务器默认初始值:
File:mysql-bin.000001
Position:154
(3) 如果主服务状态不是初始状态,需要重置状态
执行命令:reset master;

3.5.2 从服务器(3308|3309|3310)设置
需要登录到主服务器3308|3309|3310的客户端
在/usr/local/mysql-5.7.24/bin目录下执行
./mysql -uroot -p -P3308|3309|3310 -h127.0.0.1
(1) 查看从服务器状态
show slave status;
初始状态:Empty set
(2) 如果从服务器不是初始状态,建议重置一下
stop slave; #停止复制,相当于终止从服务器上的IO和SQL线程
reset slave;
(3) 设置从服务器的master
在从服务器客户端执行
change master to master_host=‘192.168.235.128’,master_user=‘copy’,
master_port=3307,master_password=‘123456’,
master_log_file=‘mysql-bin.000001’,master_log_pos=154;
(4) 在从机器上执行开始复制命令
start slave;
(5) 至此一个一主多从搭建完成
4.5.2 从服务器(3307|3308|3309|3310)设置
需要登录到主服务器3308|3309|3310的客户端
在/usr/local/mysql-5.7.24/bin目录下执行
./mysql -uroot -p -P3308|3309|3310 -h127.0.0.1
(1) 在从服务器上(3309、3310)停止复制并重置服务器状态:
stop slave;
reset slave;
(2) 设置从服务器的master(相当于是4台都需要设置)
注意:这里的IP和端口要根据自己的实际情况修改
A、 设置从服务器3308、3309的主,他们的主均为3307
即从服务器3308和3309客户端上执行如下操作
change master to master_host=‘192.168.235.128’,master_user=‘copy’,
master_port=3307,master_password=‘123456’,
master_log_file=‘mysql-bin.000001’,master_log_pos=154;
B、 设置从服务器3307、3310的主,他们的主均为3308
即从服务器3307和3310客户端上执行如下操作
change master to master_host=‘192.168.235.128’,master_user=‘copy’,
master_port=3308,master_password=‘123456’,
master_log_file=‘mysql-bin.000001’,master_log_pos=154;
(3) 在从机器上执行开始复制命令(4台MySQL上都执行)
start slave;
(4) 至此双主双从就搭建好了

读写分离

mycat读写分离,分库分表

一、MyCat简单介绍
MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理(类似于Mysql Proxy),用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。

MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。

Mycat可以简单概括为

  • 一个彻底开源的,面向企业应用开发的大数据库集群
  • 支持事务、ACID、可以替代MySQL的加强版数据库
  • 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
  • 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
  • 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
  • 一个新颖的数据库中间件产品
  • 二、为什么要用MyCat
    这里要先搞清楚Mycat和MySQL的区别(Mycat的核心作用)。我们可以把上层看作是对下层的抽象,例如操作系统是对各类计算机硬件的抽象。那么我们什么时候需要抽象?假如只有一种硬件的时候,我们需要开发一个操作系统吗?再比如一个项目只需要一个人完成的时候不需要leader,但是当需要几十人完成时,就应该有一个管理者,发挥沟通协调等作用,而这个管理者对于他的上层来说就是对项目组的抽象。

同样的,当我们的应用只需要一台数据库服务器的时候我们并不需要Mycat,而如果你需要分库甚至分表,这时候应用要面对很多个数据库的时候,这个时候就需要对数据库层做一个抽象,来管理这些数据库,而最上面的应用只需要面对一个数据库层的抽象或者说数据库中间件就好了,这就是Mycat的核心作用。所以可以这样理解:数据库是对底层存储文件的抽象,而Mycat是对数据库的抽象。

三、Mycat工作原理
Mycat的原理并不复杂,复杂的是代码。Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分
片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。