为什么需要主从复制?
- 在进行事务写入的时候,语句需要锁表,这样的话,这时候就没法进行读操作了,这样影响业务性能。
- 可以进行数据的热备份,主服务器挂了,从服务器还在。
- 业务量大的时候,如果只有一个服务器,那么进行读写都在这个服务器上,IO访问频率高,性能下降,如果有多个服务器分散操作,就可以降低单个服务器的磁盘IO频率,提升单个机器的IO性能。
主从复制
MYSQL主从复制时指数据可以从服务器主节点复制到一个或多个从节点,MySQL 默认采用异步复制方式。
原理
- 主服务器的数据变化都会写入到一个二进制binlog日志文件中,
- 从服务器每隔一个时间间隔就会去探测binlog日志文件是否发生改变,如果发生改变,就会启动一个IO线程向主服务器请求二进制事件。
- 主服务器收到该请求之后会为该请求分配一个dump线程,将二进制事件发送给该从节点,然后将其保存在relay
log(中继日志)文件中,从节点就会启动SQL线程,将从中继日志文件读取二进制日志,获得sql并在本地执行,使得其数据和主服务器一致。最后两个IO线程和SQL线程都会进入睡眠,等待下一次被唤醒。
配置流程
- 首先在两台服务器中创建数据库
- 配置主服务器的配置文件:
#修改配置文件,执行以下命令打开mysql配置文件
vi /etc/my.cnf
#在mysqld模块中添加如下配置信息
log-bin=master-bin #二进制文件名称
binlog-format=ROW #二进制日志格式,有row、statement、mixed三种格式,row指的是把改变的内容复制过去,而不是把命令在从服务器上执行一遍,statement指的是在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。mixed指的是默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
server-id=1 #要求各个服务器的id必须不一样
binlog-do-db=msb #同步的数据库名称 - 配置从服务器登录主服务器的账号授权:
–授权操作
set global validate_password_policy=0;
set global validate_password_length=1;
grant replication slave on . to ‘root’@’%’ identified by ‘123456’;
–刷新权限
flush privileges; - 从服务器配置:
#修改配置文件,执行以下命令打开mysql配置文件
vi /etc/my.cnf
#在mysqld模块中添加如下配置信息
log-bin=master-bin #二进制文件的名称
binlog-format=ROW #二进制文件的格式
server-id=2 #服务器的id - 重启主服务器mysql:
#重启mysql服务
service mysqld restart
#登录mysql数据库
mysql -uroot -p
#查看master的状态
show master status; - 重启从服务器mysql并连接主服务器:
#重启mysql服务
service mysqld restart
#登录mysql
mysql -uroot -p
#连接主服务器
change master to master_host=‘192.168.150.11’,master_user=‘root’,master_password=‘123456’,master_port=3306,master_log_file=‘master-bin.000001’,master_log_pos=334;
#启动slave
start slave
#查看slave的状态
show slave status\G(注意没有分号) - 验证是否成功
读写分离
读写分离是基于主从复制的,在主服务器节点进行写操作,在从节点进行读操作。这样双方操作互不影响。
实现:一般是在主从服务器前面再多加一层服务器,在该层处理请求,把写请求发送到主服务器,把读请求发送到从服务器,实现读写分离。
可以用proxy实现,不过不稳定不推荐。
另外一种是用阿里巴巴的amoeba。(推荐)
什么是amoeba?
- Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发。座落与Client、DB
Server(s)之间。对客户端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。
主要解决:
- 降低 数据切分带来的复杂多数据库结构
- 提供切分规则并降低 数据切分规则 给应用带来的影响
- 降低db 与客户端的连接数
- 读写分离
配置过程
- 安装JDK
- 配置dbServers.xml
配置端口,数据库名,数据库用户名,密码,主从服务器的IP地址, - 配置amoeba.xml
配置IP地址,账户,密码,以及读写库。 - 启动amoeba
/root/amoeba-mysql-3.0.5-RC/bin/launcher - 测试amoeba
–测试的sql
–在安装amoeba的服务器上登录mysql
mysql -h192.168.85.13 -uroot -p123 -P8066
–分别在master、slave、amoeba上登录mysql
use msb
select * from user;
–在amoeba上插入数据
insert into user values(2,2);
–在master和slave上分别查看表中的数据
select * from user;
–将master上的mysql服务停止,继续插入数据会发现插入不成功,但是能够查询
–将master上的msyql服务开启,停止slave上的mysql,发现插入成功,但是不能够查询
ps:具体想看的可以去B站看马士兵老师的视频拿笔记,我只是把流程记一下。
分库就是按照某些规则将不同的表存在不同的数据库。分库包括垂直分库和水平分库。
垂直分库就是按照业务模块来划分数据库,例如:商场订单模块放主机1中数据库, 商品模块放主机2中数据库。
水平分库就是按照一定规则进行分库,例如时间或id序列值等进行数据的拆分。不同数据库的表结构是一样的,只是根据规则存放在不同的数据库。
分表就是按照某些规则将一个表分成多个表。相当于在表前面加多一层,每次进行表操作的时候,sql语句到了该层,该层将sql语句按照某些规则拆分成不同的sql语句,然后分别在各个表执行,来完成sql语句的执行。例如可以按照取模来划分,也可以按照主键id来划分。不同的划分方式适合不同的业务场景。例如按取模划分不适合范围查找。