数据库的主从

数据库主从分离

数据库的读写分离的好处?

    1. 将读操作和写操作分离到不同的数据库上,避免主服务器出现性能瓶颈;

    2. 主服务器进行写操作时,不影响查询应用服务器的查询性能,降低阻塞,提高并发;

    3. 数据拥有多个容灾副本,提高数据安全性,同时当主服务器故障时,可立即切换到其他服务器,提高系统可用性;

读写分离的基本原理就是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE)操作,而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到其他从数据库。以SQL为例,主库负责写数据、读数据。读库仅负责读数据。每次有写库操作,同步更新到读库。写库就一个,读库可以有多个,采用日志同步的方式实现主库和多个读库的数据同步。

 

 Replication原理 
Mysql 的 Replication 是一个异步的复制过程,从一个MySQL节点(称之为Master)复制到另一个MySQL节点(称之Slave)。在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(SQL 线程和 I/O 线程)在 Slave 端,另外一个线程(I/O 线程)在 Master 端。 
  www.2cto.com  
要实现 MySQL 的 Replication ,首先必须打开 Master 端的 Binary Log,因为整个复制过程实际上就是 Slave 从 Master 端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。 

看上去MySQL的Replication原理非常简单,总结一下: 
* 每个从仅可以设置一个主。 
  * 主在执行sql之后,记录二进制log文件(bin-log)。 
  * 从连接主,并从主获取binlog,存于本地relay-log,并从上次记住的位置起执行sql,一旦遇到错误则停止同步。 
 
从这几条Replication原理来看,可以有这些推论: 
* 主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间,主从数据不一致。 
  * 如果主从的网络断开,从会在网络正常后,批量同步。 
  * 如果对从进行修改数据,那么很可能从在执行主的bin-log时出现错误而停止同步,这个是很危险的操作。所以一般情况下,非常小心的修改从上的数据。 
  * 一个衍生的配置是双主,互为主从配置,只要双方的修改不冲突,可以工作良好。 
  * 如果需要多主的话,可以用环形配置,这样任意一个节点的修改都可以同步到所有节点。

主从设置 

因为原理比较简单,所以Replication从MySQL 3就支持,并在所有平台下可以工作,多个MySQL节点甚至可以不同平台,不同版本,不同局域网。做Replication配置包括用户和my.ini(linux下为my.cnf)两处设置。 

首先在主MySQL节点上,为slave创建一个用户: 

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'192.168.1.10' IDENTIFIED BY 'slave'; 

实际上,为支持主从动态同步,或者手动切换,一般都是在所有主从节点上创建好这个用户。然后就是MySQL本身的配置了,这需要修改my.cnf或者my.ini文件。在mysqld这一节下面增加: 

server-id=1
auto-increment-increment=2 
auto-increment-offset=1 
log-bin 
binlog-do-db=mstest 
binlog_format=mixed 

master-host=192.168.1.62
master-user=slave 
master-password=slave 
replicate-do-db=mstest 

上面这两段设置,前一段是为主而设置,后一段是为从设置的。也就是说在两个MySQL节点上,各加一段就好。binlog-do-db和 replicate-do-db就是设置相应的需要做同步的数据库了,auto-increment-increment和auto- increment-offset是为了支持双主而设置的(参考下一节),在只做主从的时候,也可以不设置。 

双主的设置 

从原理论来看MySQL也支持双主的设置,即两个MySQL节点互为主备,不过虽然理论上,双主只要数据不冲突就可以工作的很好,但实际情况中还 是很容发生数据冲突的,比如在同步完成之前,双方都修改同一条记录。因此在实际中,最好不要让两边同时修改。即逻辑上仍按照主从的方式工作。但双主的设置 仍然是有意义的,因为这样做之后,切换主备会变的很简单。因为在出现故障后,如果之前配置了双主,则直接切换主备会很容易。 
  双主在设置时,只需将上面的一段设置复制一份,分别写入两个MySQL节点的配置文件,但要修改相应的server-id,auto- increment-offset和master-host。auto-increment-offset就是为了让双主同时在一张表中进行添加操作时不 会出现id冲突,所以在两个节点上auto-increment-offset设置为不同的值就好。  另:不要忘了,在两个节点上都为对方创建用户。应用层的负载均衡  本文只介绍了MySQL自身的Repilication配置,在上面的图中也可以看出,有了Replication,还需要应用层(或者中间件)做一个负载均衡,这样才能最大程度发挥MySQL Replication的优势,这些将在以后探讨。

 
Mysql的 Replication 是一个异步的复制过程,
从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql instance(我们称之 Slave)。在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程)在 Slave 端,另外一个线程(IO线程)在 Master 端。
要实现 MySQL 的 Replication ,首先必须打开 Master 端的Binary Log(mysql-bin.xxxxxx)功能,否则无法实现。因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全 顺序的执行日志中所记录的各种操作。打开 MySQL 的 Binary Log 可以通过在启动 MySQL Server 的过程中使用 “—log-bin” 参数选项,或者在 my.cnf 配置文件中的 mysqld 参数组([mysqld]标识后的参数部分)增加 “log-bin” 参数项。
  www.2cto.com  
  MySQL 复制的基本过程如下:
  1. Slave 上面的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
   2. Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO 线程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave 端的 IO 线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在 Master 端的 Binary Log 文件的名称以及在 Binary Log 中的位置;
### 数据库主从配置方案、教程、原理及相关问题 #### 主从配置的定义与重要性 数据库主从配置是一种常见的高可用性和高性能解决方案,尤其适用于中小型企业使用的MySQL数据库。这种架构能够有效提升系统的取能力并增强数据安全性[^3]。 #### 配置过程概述 为了实现主从复制,通常需要两台服务器:一台作为主服务器(Master),另一台或多台作为从服务器(Slave)。以下是具体的配置流程: 1. **主服务器设置** 修改`my.cnf`文件,在 `[mysqld]` 下添加以下内容以启用二进制日志记录和唯一的服务ID: ```ini server-id=1 log-bin=mysql-bin binlog-do-db=testdb ``` 这里的 `server-id` 是唯一的标识符,而 `log-bin` 则用于指定二进制日志文件名[^3]。 2. **授权远程访问权限** 在主服务器上运行 SQL 授权命令,允许从服务器连接: ```sql GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES; ``` 3. **获取主服务器状态** 使用以下命令查看当前的日志文件位置: ```sql SHOW MASTER STATUS; ``` 输出的结果将显示 `File` 和 `Position` 的值,这些信息将在后续步骤中被使用[^4]。 4. **从服务器设置** 编辑从服务器上的 `my.cnf` 文件,确保设置了不同的服务 ID: ```ini server-id=2 relay-log=mysql-relay-bin read-only=1 ``` 5. **建立主从关系** 执行以下 SQL 命令来告知从服务器如何连接到主服务器: ```sql CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='replication_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=2380; START SLAVE; ``` 替换其中的具体参数为实际环境中获得的数据[^4]。 6. **验证同步状态** 查看从服务器的状态确认是否正常工作: ```sql SHOW SLAVE STATUS\G ``` 如果一切顺利,“Slave_IO_Running” 和 “Slave_SQL_Running”的值都应为“Yes”。如果有任何错误,则需按照提示排查原因[^5]。 #### 主从复制的工作原理 MySQL 主从复制的核心机制依赖于二进制日志 (Binary Log),即每当在主节点上有事务提交时,该操作会被记录下来形成一系列事件存入 BinLog 中。随后,从节点通过 I/O 线程向主节点请求最新的 BinLog 并保存至本地 Relay Log;接着由 SQL 线程解析 Relay Log 内部的内容重放相同的 DML/DDL 操作,以此保持两者间的一致性[^3]。 #### 可能遇到的问题及其处理方法 - 当发现主从不同步或者无法启动同步进程时,可能是因为网络中断、认证失败或是某些特殊情况下产生的冲突所致。此时可尝试重新设定链接参数或检查是否有未解决的异常情况存在。 - 若因主节点发生故障而导致整个链路失效,则依据实际情况考虑恢复措施,比如切换备用主机接管角色等策略[^1]。 ```python def check_slave_status(): import pymysql connection = pymysql.connect(host="localhost", user="root", password="", database="") try: with connection.cursor() as cursor: sql_query = "SHOW SLAVE STATUS;" cursor.execute(sql_query) result = cursor.fetchone() io_running = result['Slave_IO_Running'] sql_running = result['Slave_SQL_Running'] if not(io_running and sql_running): print("Error detected, please review configuration.") finally: connection.close() check_slave_status() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值