MySQL读写分离(三)——原理概述

     利用主从数据库来实现读写分离,从而分担主数据库的压力。在多个服务器上部署mysql,将其中一台认为主数据库,而其他为从数据库,实现主从同步。其中主数据库负责主动写的操作,而从数据库则只负责主动读的操作(slave从数据库仍然会被动的进行写操作,为了保持数据一致性),这样就可以很大程度上的避免数据丢失的问题,同时也可减少数据库的连接,减轻主数据库的负载。

一、数据库主从同步

 

详解MySQL实现主从复制过程及mycat读写分离步骤

Binary log:主数据库的二进制日志
Relay log:从服务器的中继日志
第一步:master在每个事务更新数据完成之前,将该操作记录串行地写入到binlog文件中。
第二步:salve开启一个I/O Thread,该线程在master打开一个普通连接,主要工作是binlog dump process。如果读取的进度已经跟上了master,就进入睡眠状态并等待master产生新的事件。I/O线程最终的目的是将这些事件写入到中继日志中。
第三步:SQL Thread会读取中继日志,并顺序执行该日志中的SQL事件,从而与主数据库中的数据保持一致。

二、主从同步复制有以下几种方式:

(1)同步复制,master的变化,必须等待slave-1,slave-2,...,slave-n完成后才能返回。

(2)异步复制,master只需要完成自己的数据库操作即可,至于slaves是否收到二进制日志,是否完成操作,不用关心。MYSQL的默认设置。

(3)半同步复制,master只保证slaves中的一个操作成功,就返回,其他slave不管。这个功能,是由google为MYSQL引入的。

 

三、读写分离的实现方案

在应用和数据库之间增加代理层,代理层接收应用对数据库的请求,根据不同请求类型转发到不同的实例,在实现读写分离的同时可以实现负载均衡。

目前常用的mysql的读写分离中间件有MySQL-Proxy,奇虎360的Atlas,amoeba, MaxScale

### MySQL 读写分离集群配置与实现最佳实践 #### 配置概述 为了提高数据库性能,在高并发读取的情况下,可以通过设置主从架构来分担压力。具体来说,所有的写入操作都发生在主节点上,而读取请求则由多个从节点承担[^2]。 #### 主要组成部分 - **Master Server (主服务器)**:负责处理所有数据更新(INSERT, UPDATE, DELETE)以及部分或全部的数据检索工作。 - **Slave Servers (从服务器)**:主要用于执行来自客户端的应用程序发出的选择语句(SELECT),并接收来自于Master的日志事件以保持其副本的一致性。 #### 实现过程详解 ##### 安装准备阶段 对于每台参与构建集群的机器都需要先完成MySQL服务端软件包的部署。这通常涉及到下载对应版本的RPM文件,并通过命令行工具进行安装: ```bash [root@master1 ~]# tar xvf MySQL-5.6.15-1.el6.x86_64.rpm-bundle.tar // 解压软件包. [root@master1 ~]# rpm -Uvh MySQL-*.rpm // 安装MySQL. [root@master1 ~]# service mysql start Starting MySQL... [确定] ``` 上述指令展示了如何在一个名为`master1`的主机上展开tarball压缩包、升级已有的RPM包至最新版并且启动mysqld进程[^3]。 ##### Master-Slave 复制设定 为了让Slave能够实时获取到来自主库的变化记录,需要开启binlog日志功能并在my.cnf配置文件里指定唯一的server-id参数值;与此同时也要确保Replication User拥有足够的权限去访问必要的表结构信息和变更历史。 在完成了初步的安全性和网络层面调整之后,就可以利用CHANGE MASTER TO语法指明源地址和其他连接细节从而建立起稳定可靠的异步复制链路了。 ##### 应用层面上的优化措施 当物理上的多实例搭建完毕以后,还需要考虑应用程序怎样合理分配SQL查询给不同的DBMS实体。一种常见的方式是在业务逻辑内部加入路由机制判断当前会话属于哪种类型的操作进而决定发送目标——比如采用中间件ProxySQL来进行动态负载均衡或是直接修改ORM框架内的DataSource定义指向特定host/port组合[^4]。 ```python def get_db_connection(is_write_operation=False): """根据是否为写操作返回相应的数据库连接""" if is_write_operation: return create_engine('mysql+pymysql://user:password@master_host/dbname') else: slaves = ['slave1', 'slave2'] chosen_slave = random.choice(slaves) return create_engine(f'mysql+pymysql://user:password@{chosen_slave}/dbname') ``` 此Python函数示范了一个简单的策略用于区分读写路径,它依据传入布尔型变量is_write_operation选择合适的backend作为持久化载体。 #### 性能考量因素 除了以上提到的技术要点外,还有几个方面值得注意: - 数据一致性模型的选择; - 网络延迟对同步效率的影响程度评估; - 故障转移方案的设计原则及其实施效果验证等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值