mysql主从复制,读写分离配置流程的理解,分库分表原理

为什么需要主从复制?

  1. 在进行事务写入的时候,语句需要锁表,这样的话,这时候就没法进行读操作了,这样影响业务性能。
  2. 可以进行数据的热备份,主服务器挂了,从服务器还在。
  3. 业务量大的时候,如果只有一个服务器,那么进行读写都在这个服务器上,IO访问频率高,性能下降,如果有多个服务器分散操作,就可以降低单个服务器的磁盘IO频率,提升单个机器的IO性能。

主从复制
MYSQL主从复制时指数据可以从服务器主节点复制到一个或多个从节点,MySQL 默认采用异步复制方式。

原理

  1. 主服务器的数据变化都会写入到一个二进制binlog日志文件中,
  2. 从服务器每隔一个时间间隔就会去探测binlog日志文件是否发生改变,如果发生改变,就会启动一个IO线程向主服务器请求二进制事件。
  3. 主服务器收到该请求之后会为该请求分配一个dump线程,将二进制事件发送给该从节点,然后将其保存在relay
    log(中继日志)文件中,从节点就会启动SQL线程,将从中继日志文件读取二进制日志,获得sql并在本地执行,使得其数据和主服务器一致。最后两个IO线程和SQL线程都会进入睡眠,等待下一次被唤醒。

配置流程

  1. 首先在两台服务器中创建数据库
  2. 配置主服务器的配置文件:
    #修改配置文件,执行以下命令打开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 #同步的数据库名称
  3. 配置从服务器登录主服务器的账号授权:
    –授权操作
    set global validate_password_policy=0;
    set global validate_password_length=1;
    grant replication slave on . to ‘root’@’%’ identified by ‘123456’;
    –刷新权限
    flush privileges;
  4. 从服务器配置:
    #修改配置文件,执行以下命令打开mysql配置文件
    vi /etc/my.cnf
    #在mysqld模块中添加如下配置信息
    log-bin=master-bin #二进制文件的名称
    binlog-format=ROW #二进制文件的格式
    server-id=2 #服务器的id
  5. 重启主服务器mysql:
    #重启mysql服务
    service mysqld restart
    #登录mysql数据库
    mysql -uroot -p
    #查看master的状态
    show master status;
  6. 重启从服务器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(注意没有分号)
  7. 验证是否成功

读写分离
读写分离是基于主从复制的,在主服务器节点进行写操作,在从节点进行读操作。这样双方操作互不影响。
实现:一般是在主从服务器前面再多加一层服务器,在该层处理请求,把写请求发送到主服务器,把读请求发送到从服务器,实现读写分离。
可以用proxy实现,不过不稳定不推荐。
另外一种是用阿里巴巴的amoeba。(推荐)

什么是amoeba?

  • Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发。座落与Client、DB
    Server(s)之间。对客户端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。

主要解决:

  1. 降低 数据切分带来的复杂多数据库结构
  2. 提供切分规则并降低 数据切分规则 给应用带来的影响
  3. 降低db 与客户端的连接数
  4. 读写分离

配置过程

  1. 安装JDK
  2. 配置dbServers.xml
    配置端口,数据库名,数据库用户名,密码,主从服务器的IP地址,
  3. 配置amoeba.xml
    配置IP地址,账户,密码,以及读写库。
  4. 启动amoeba
    /root/amoeba-mysql-3.0.5-RC/bin/launcher
  5. 测试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来划分。不同的划分方式适合不同的业务场景。例如按取模划分不适合范围查找。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值