首页 > 数据库 >MySQL主从架构

MySQL主从架构

时间:2024-12-28 19:54:09浏览次数:5  
标签:架构 log 数据库 MySQL 节点 mysql 服务器 日志 主从

MySQL主从架构

MySQL主从架构(Master-Slave Architecture)是一种常见的数据库高可用性和负载均衡的设计模式,通常用于提高系统的可伸缩性和可靠性。它基于数据复制(replication)机制,其中“主”服务器负责处理所有的写操作,而“从”服务器则通过复制主服务器的数据来保持数据一致性,主要用于读取操作,从而减轻主服务器的负担。

MYSQL REPLICATION的作用

1、读写分离,提供查询服务

使用主从复制,让主库负责写,从库负责读。这样,即使主库进行数据更新操作出现了锁表的情景,通过读从库也可以保证业务的正常运作。

2、实时灾备,用于故障切换。

当系统中某个节点发生故障时,可以方便的故障切换,实现高可用(HA)。例如,做数据的热备,slave作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。

3、水平扩展数据库的负载能力

随着系统中业务访问量的增大,如果是单机部署数据库,就会导致I/O访问频率过高。有了主从复制,增加多个数据存储节点,将负载分布在多个从节点上,降低单机磁盘I/O访问的频率,提高单个机器的I/O性能。

MYSQL REPLICATION支持的复制类型

Statement:即基于语句的复制,会将对数据库操作的sql语句写入到binlog中,效率比较高。

row:即基于行的复制,会将每一条数据的变化写入到binlog中。

mixed:即混合模型的复制,statement与row的混合,MySQL会根据执行的SQL语句选择日志保存方式。即交替使用行和语句、由mysql服务器自行判断。

Statement-Based Replication (SBR) — 基于语句的复制

在基于语句的复制模式下,MySQL 会将执行的 SQL 语句(即查询语句)记录到 binlog 中,而不是记录数据变化本身。简单来说,主服务器记录下它执行的每个 SQL 语句,然后从服务器接收到这些 SQL 语句后再执行,从而实现数据的同步。

特点:

  • 记录内容:记录的内容是执行的 SQL 语句,比如 INSERTUPDATEDELETE 等操作。
  • 效率:这种方式通常效率较高,因为日志记录的是 SQL 语句,而不是具体的数据行。
  • 数据同步:从服务器根据这些 SQL 语句重放操作来保持与主服务器的数据一致性。

优点:

  • 磁盘空间小:记录的是 SQL 语句,而不是每一行数据的变化,因此相较于基于行的复制,binlog 的大小会比较小。
  • 易于理解和调试:因为记录的是 SQL 语句,可以更容易地理解执行的操作,尤其是在故障排查时。

缺点:

  • 不完全一致性:某些 SQL 语句在不同的环境下(例如在主从数据库的时间差异或者配置不同的情况下)可能会表现不同,导致从服务器的执行结果与主服务器不完全一致。例如,某些非确定性 SQL 语句(如 RAND()NOW())在主从服务器执行时可能会产生不同的结果。
  • 复杂的语句问题:如果 SQL 语句依赖于某些特定的数据库状态(比如表的行顺序),可能会导致从服务器上执行时的行为与主服务器不一致。

Row-Based Replication (RBR) — 基于行的复制

在基于行的复制模式下,MySQL 会将每一条受影响的数据行的变化记录到 binlog 中,而不是记录执行的 SQL 语句。也就是说,每次数据发生变化时,MySQL 会记录数据的行级变化,如插入、更新或删除操作中每一行的具体变化。

特点:

  • 记录内容:记录的是数据的变化,具体来说是被修改、插入或删除的行的内容和行的主键。
  • 效率:这种方式相较于基于语句的复制模式来说,可能会消耗更多的存储空间,因为每次数据发生变化时,都会记录整个数据行的变动。
  • 数据同步:从服务器会根据主服务器上记录的数据变化来重放操作,以保证数据一致性。

优点:

  • 更高的准确性:因为记录的是每一行数据的具体变化,基于行的复制通常能更好地保证主从数据库的准确一致性,避免了基于语句复制可能引发的不一致问题。
  • 更适用于复杂操作:对于某些复杂的查询(例如使用了非确定性函数的查询)或者批量插入数据,基于行的复制能够避免主从不一致的情况。

缺点:

  • 磁盘空间大:记录的是每一条数据的变化,因此在数据量较大时,binlog 文件会变得很大。
  • 性能开销:每次执行数据库操作时,都需要记录每一行的具体变化,可能会比基于语句的复制产生更多的性能开销。

例子:

假设主服务器上的某个表有以下内容:

id name age
1 Alice 30
2 Bob 25

假设在主服务器上执行了以下 SQL 操作:

sql


复制代码
UPDATE users SET age = 31 WHERE id = 1;

在基于行的复制模式下,binlog 会记录 受影响的行数据。例如,MySQL 会记录以下内容:

plaintext


复制代码
UPDATE users SET age = 31 WHERE id = 1;

但这条日志实际上会包含更具体的内容,像这样:

plaintext复制代码UPDATE users SET age = 31 WHERE id = 1;
Old Values: id = 1, name = Alice, age = 30
New Values: id = 1, name = Alice, age = 31

从服务器接收到这些行数据后,会执行相同的 UPDATE 操作,确保将 id=1 这一行的 age 列从 30 更新为 31

Mixed-Based Replication (MBR) — 混合模式复制

混合模式复制是 MySQL 5.1 引入的一种新的复制方式,它结合了基于语句和基于行的复制。MySQL 会根据执行的 SQL 语句的类型自动选择使用基于语句的复制或基于行的复制。这种模式的目的是结合两者的优点,在确保数据一致性的同时尽可能减少日志文件的大小和提高效率。

特点:

  • 自动选择:MySQL 会根据具体的 SQL 语句自动决定是使用基于语句的复制(SBR)还是基于行的复制(RBR)。通常,简单的 INSERTUPDATEDELETE 语句会使用基于语句的复制,而涉及到可能存在不确定性的操作(如UPDATE语句中使用了函数RAND()NOW()等)时,则会使用基于行的复制。
  • 灵活性:这种方式让 MySQL 在不同的场景下能够根据具体情况选择最合适的日志记录方式,力求在性能和一致性之间找到平衡。

优点:

  • 自动选择最优日志记录方式:MySQL 自动根据不同情况选择使用哪种复制方式,使得在保证数据一致性的同时,能够优化性能。
  • 减少空间和开销:对于可以安全地使用基于语句的复制的情况,它会选择这种方式,从而减少磁盘空间和性能开销;而对于需要更高一致性的操作,则会使用基于行的复制。

缺点:

  • 复杂性:这种模式需要 MySQL 做更多的判断和优化,可能会增加配置和调试的复杂性。

主从复制的工作过程

1. 主服务器的操作

主服务器负责处理所有的写操作,并将这些写操作记录到二进制日志中(binary log)。这些写操作可以是插入、更新或删除操作。主服务器的主要任务是:

  • 记录写操作。
  • 将写操作的日志内容同步给从服务器。

主服务器的具体步骤:

  1. 执行客户端操作:当客户端在主服务器上执行写操作(如 INSERTUPDATEDELETE)时,这些操作会首先被写入到主服务器的二进制日志(binary log)中。
  2. 生成二进制日志事件:每个写操作都会被封装成一个二进制日志事件,并追加到主服务器的日志文件中。日志文件的格式通常为 mysql-bin.000001mysql-bin.000002 等。
  3. 记录二进制日志位置:每次写操作都会记录当前二进制日志的文件名和位置,这些信息非常重要,用于从服务器准确定位需要复制的数据。

2. 从服务器的操作

从服务器负责从主服务器获取二进制日志,并执行相应的操作来同步数据。它会保持与主服务器的连接,读取日志文件中的操作并执行,确保数据一致性。

从服务器的具体步骤:

  1. 从主服务器获取二进制日志信息:从服务器通过 IO_THREAD 线程向主服务器发送请求,请求主服务器的二进制日志文件。

    从服务器连接主服务器后,使用 CHANGE MASTER TO 语句指定主服务器的地址、复制用户、日志文件名和位置等信息。

  2. 获取二进制日志并存储: 从服务器的 IO_THREAD 线程从主服务器获取二进制日志内容,并将这些日志内容写入到从服务器本地的中继日志(relay log)中。中继日志存储了从主服务器接收到的二进制日志内容。

  3. 执行中继日志中的操作: 从服务器的 SQL_THREAD 线程会读取中继日志中的内容,并按照日志中的顺序执行这些操作(例如 INSERTUPDATEDELETE)。通过执行这些操作,从服务器的数据状态与主服务器保持一致。

3. 主从复制的实时同步

主从复制通过主服务器和从服务器之间的通信实现数据的实时同步。

详细流程:

1、主节点 binary log dump 线程

当从节点连接主节点时,主节点会创建一个binlog dump 线程,用于发送bin-log的内容。在读取bin-log中的操作时,此线程会对主节点上的bin-log加锁,当读取完成,在发送给从节点之前,锁会被释放。

2、从节点I/O线程

当从节点上执行start slave命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。I/O线程接收到主节点binlog dump 线程发来的更新之后,保存在本地relay-log中。

3、从节点SQL线程

SQL线程负责读取relay log中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。

注:对于每一个主从连接,都需要三个线程来完成。当主节点有多个从节点时,主节点会为每一个当前连接的从节点建一个binlog dump 线程,而每个从节点都有自己的I/O线程,SQL线程。

部署MYSQL主从同步(一主一从)

1.主库开启binlog日志
[root@server1 ~]# cat /etc/my.cnf 
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql/data
port=3306
socket=/usr/local/mysql/mysql.sock
symbolic-links=0
character-set-server=utf8
log-error=/data/mysql/log/mysqld.log
pid-file=/usr/local/mysql/mysqld.pid

log-bin=/data/mysql/log/mysql_bin
server-id=1
2.创建用户并授权
mysql> grant replication slave on *.* to 'slave'@'192.168.5.%' identified by '123456'; 
刷新生效
mysql> flush privileges;
3.从节点开启relay-log
[root@server2 ~]# cat /etc/my.cnf 
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql/data
port=3306
socket=/usr/local/mysql/mysql.sock
symbolic-links=0
character-set-server=utf8
log-error=/data/mysql/log/mysqld.log
pid-file=/usr/local/mysql/mysqld.pid
server-id=2    
relay-log=/data/mysql/log/reley_log_bin
4.从节点修改slave状态
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> change master to master_host='192.168.5.101',master_user='slave',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=4;
Query OK, 0 rows affected, 2 warnings (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| dbtest             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

#检查同步是否成功
mysql> show slave status\G
查看mysqldump进程信息
mysql> show processlist\G
*************************** 1. row ***************************
     Id: 4
   User: slave
   Host: 192.168.5.102:55036
     db: NULL
Command: Binlog Dump
   Time: 816
  State: Master has sent all binlog to slave; waiting for more updates
   Info: NULL
*************************** 2. row ***************************
     Id: 5
   User: root
   Host: localhost
     db: dbtest
Command: Query
   Time: 0
  State: starting
   Info: show processlist
2 rows in set (0.00 sec)

#检查同步是否成功

mysql> show slave status\G

删除配置

stop slave

reset slave

部署MYSQL主主双向主从复制 M-M

1.部署好主从之后在从节点上开启binlog

vim /etc/my.cnf
log-bin=/data/mysql/log/mysql_bin

2.在从节点创建用户

mysql> grant replication slave on *.* to 'slave'@'192.168.1.%' identified by '123456'; 
刷新生效
mysql> flush privileges;

3.主库开启relaylog日志

vim /etc/my.cnf
relay-log=/data/mysql/log/reley_log_bin

4.主节点修改slave状态

mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>  change master to master_host='192.168.5.102',master_user='slave',master_password='123456',master_log_file='mysql_bin.000001',mmaster_log_pos=600;
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

部署M-S-S级联复制

级联复制时主节点修改数据库内容不会写入从节点binlog日志中而是写入relaylog日志中,所以如果在主节点修改数据库第二个从节点不会被同步

此时修改第一个从节点的配置文件

级联复制服务器
vim /etc/my.cnf
log-slave-updates=1    #表示把从主库读取的binlog日志内容也执行在本地的额binlog日志当中。

mysql读写分离 mycat

x锁和s锁

1. X锁(排它锁,Exclusive Lock)

  • 作用:当一个事务对数据加上排它锁时,其他事务不能对该数据加任何类型的锁(包括共享锁和排它锁)。换句话说,只有持有排它锁的事务可以修改数据,其他事务只能等待。
  • 特点
    • 允许事务对数据进行更新、删除、插入等修改操作。
    • 如果一个事务持有X锁,其他事务只能等待,不能读取或修改该数据。
    • 是一种严格的锁,保证了数据的独占访问,防止其他事务的干扰。
  • 使用场景:通常用于执行数据修改操作时,确保数据在修改期间不被其他事务干扰。

2. S锁(共享锁,Shared Lock)

  • 作用:当一个事务对数据加上共享锁时,其他事务仍然可以对该数据加共享锁,但不能加排它锁。换句话说,多个事务可以并发读取数据,但不能修改数据,直到所有共享锁被释放。
  • 特点
    • 允许事务读取数据,但不能对数据进行修改。
    • 多个事务可以同时持有同一个数据的共享锁。
    • 其他事务可以继续读取数据,但不能对数据进行修改,直到共享锁释放。
  • 使用场景:通常用于执行数据读取操作时,确保多个事务可以并发读取数据,而不会发生冲突或不一致性。

Mycat应用场景

高可用性与MySQL读写分离
利用Mycat可以轻松实现热备份,当一台服务器停机时,可以由双机或集群中的另一台服务器自动接管其业务,从而在无须人工干预的情况下,保证系统持续提供服务。这个切换动作由Mycat自动完成。

100亿大表水平分表、集群并行计算
数据切分是Mycat的核心功能,是指通过某种特定的条件,将存放在同一个数据库中的数据分散存放在多个数据库(主机)中,以达到分散单台设备负载的效果。

数据切分有两种切分模式

  • 按照不同的表将数据切分到不同的数据库中,这种切分可以叫作数据的垂直切分。
  • 根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多个数据库中,这种切分叫作数据的水平切分。当数据量超过800万行且需要做分片时,可以利用Mycat实现数据切分。

数据库路由器
Mycat基于MySQL 实例的连接池复用机制,可以让每个应用最大程度地共享一个MySQL实例的所有连接池,让数据库的并发访问能力大大提升。

整合多种数据源
当一个项目需要用到多种数据源如Oracle、MySQL、SQL Server、PostgreSQL时,可以利用Mycat进行整合,只需访问Mycat 这一个数据源就行。

逻辑库schema
业务开发人员通常在实际应用中并不需要知道中间件的存在,只需要关注数据库,所以数据库中间件可以被当作一个或多个数据库集群构成的逻辑库。

Mycat原理

Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL 语句

流程:
首先对 SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离 分析、缓存分析等,然后将此 SQL 发 往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。

配置mycat

首先安装java环境
[root@server4 ~]# tar -zxvf jdk-8u171-linux-x64.tar.gz
配置全局环境变量/etc/profile
JAVA_HOME=/usr/local/bin/jdk1.8.0_171
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
解压mycat包并配置环境变量
[root@server4 /]# tar -xzvf root/Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz 
[root@server4 ~]# ln -s mycat/bin/*  /usr/local/bin/ -r 
mycat的目录结构
[root@server4 ~]# ls mycat/
bin  catlet  conf  lib  logs  version.txt

bin:可执行命令
conf:配置文件
lib:存放jar包
logs:日志信息
tmlogs:临时日志
version.txt:版本信息
此时mycat配置完成

启动mycat,由于配置好了环境变量,直接启动

[root@server4 logs]# mycat start

查看 MyCat 安装包目录下的 logs/wrapper.log日志,如果没有报错,那就是启动成功了。

[root@server4 logs]# cat wrapper.log 
STATUS | wrapper  | 2024/12/23 20:53:50 | --> Wrapper Started as Daemon
STATUS | wrapper  | 2024/12/23 20:53:50 | Launching a JVM...
INFO   | jvm 1    | 2024/12/23 20:53:50 | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0
INFO   | jvm 1    | 2024/12/23 20:53:50 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO   | jvm 1    | 2024/12/23 20:53:50 |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
INFO   | jvm 1    | 2024/12/23 20:53:50 | 
INFO   | jvm 1    | 2024/12/23 20:53:51 | MyCAT Server startup successfully. see logs in logs/mycat.log

mycat详解

Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件:

文件 说明
server.xml Mycat的配置文件,设置账号、参数等
schema.xml Mycat对应的物理数据库和数据库表的配置
rule.xml Mycat分片(分库分表)规则

Mycat的架构其实很好理解,Mycat是代理,Mycat后面就是物理数据库。和Web服务器的Nginx类似。对于使用者来说,访问的都是Mycat,不会接触到后端的数据库。

mycat配置文件详解

server.xml

这个配置文件主要是用来配置mycat用户账号和授权信息

server.xml 主要用于配置 Mycat 与 外部系统 的连接和其他服务相关的设置

核心配置文件

	<user name="root" defaultAccount="true">
		<property name="password">123456</property>
		<property name="schemas">TESTDB</property>
		
		<!-- 表级 DML 权限设置 -->
		<!-- 		
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
		 -->
	</user>

	<user name="user">
		<property name="password">user</property>
		<property name="schemas">TESTDB</property>
		<property name="readOnly">true</property>
	</user>



用户配置

	<user name="root" defaultAccount="true">
		<property name="password">123456</property>
		<property name="schemas">TESTDB</property>
	</user>

	<user name="user">
		<property name="password">user</property>
		<property name="schemas">TESTDB</property>
		<property name="readOnly">true</property>
	</user>

这个配置定义了一个名为 root 的用户,并且将其设置为默认账户(defaultAccount="true")。这意味着如果没有指定用户名,系统会默认使用 root 用户。name="root":设置用户的名称为 root。

defaultAccount="true":设置该用户为默认账户,如果 MyCat 无法从请求中获取用户名,系统将默认使用该账户。

123456:设置用户的密码为 123456。需要注意,实际应用中应该使用更复杂的密码,并且在生产环境中避免硬编码密码。
TESTDB:设置该用户的可访问的数据库模式为 TESTDB。这意味着该用户只能访问 TESTDB 这个数据库。

true:将此用户设置为只读用户。readOnly="true" 意味着该用户无法进行写操作(如 INSERTUPDATEDELETE),只能执行 SELECT 查询。

用户权限配置

<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">  ---这个开启后下面的才生效
    <schema name="TESTDB" dml="0110">
        <table name="tb01" dml="0000"></table>
        <table name="tb02" dml="1111"></table>
    </schema>
</privileges>
-->
  • :表示是否启用权限检查。check="false" 意味着此时权限检查被禁用,如果启用权限检查,可以改为 check="true"

  • :这个配置定义了对 TESTDB 数据库模式下的 DML(数据操作语言)权限的设置。DML 权限通常是指 SELECTINSERTUPDATEDELETE 操作。dml="0110" 是一个二进制字符串:

    • 0 表示没有该权限。
    • 1 表示有该权限。

    所以 dml="0110" 表示该用户对 TESTDB 模式下的数据库有 SELECTUPDATE 权限,但没有 INSERTDELETE 权限。

  • :对于表 tb01,该用户没有任何 DML 权限,即不能执行 SELECTINSERTUPDATEDELETE 操作。

  • :对于表 tb02,该用户有所有 DML 权限,可以执行 SELECTINSERTUPDATEDELETE 操作。

schema.xml

schema.xml 是 Mycat 配置的核心文件之一,用于定义数据库分表、分库规则以及与数据库连接相关的各种信息。

XML 文件头部

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

<schema> 标签

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">

name="TESTDB":定义了一个名为 TESTDB 的数据库模式。
checkSQLschema="false":禁用了 SQL 校验功能,通常用于分库分表场景,设置为 false 可以提升性能。
sqlMaxLimit="100":设置 SQL 查询的最大返回记录数(就是行数)为 100,用于限制查询结果的条数。

数据节点配置 <dataNode> 标签

<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />

name="dn1":指定数据节点的名称为 dn1。
dataHost="localhost1":指定数据节点对应的 dataHost,表示与该数据节点关联的数据库主机。
database="db1":指定该数据节点使用的数据库为 db1,同理 dn2 和 dn3 分别对应 db2 和 db3。

数据主机配置 <dataHost> 标签

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM1" url="localhost:3306" user="root" password="123456">
        <readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />
    </writeHost>
    <writeHost host="hostS1" url="localhost:3316" user="root" password="123456" />
</dataHost>

name="localhost1":指定数据主机的名称为 localhost1。
maxCon="1000":最大连接数为 1000。
minCon="10":最小连接数为 10。 ---在系统启动或在连接池初始化时,连接池至少会保持10个连接处于打开或空闲状态。这意味着即使没有请求需要数据库连接,连接池也会保持10个连接始终可用。
balance="0":负载均衡策略,0 表示不启用。
dbType="mysql":数据库类型为 MySQL。
dbDriver="native":数据库驱动类型。
writeHost 和 readHost:定义了写入和读取主机的详细信息,包含主机地址、端口、用户名和密码等。
<heartbeat>select user()</heartbeat> 是 Mycat 配置中的一个元素,用来定义心跳查询的 SQL 语句。它会在指定的时间间隔内定期执行这个 SQL 查询,以确保 Mycat 与后端数据库的连接保持活跃。
select user()是一个非常轻量的查询,因此它常被用作数据库的心跳查询。
balance和 switchType、writeType
- balance指的负载均衡类型,目前的取值有4种:

    balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。

    balance="1",全部的readHost与stand by writeHost(备主)参与select语句的负载均衡。

    balance="2",所有读操作都随机的在writeHost、readhost上分发。

    balance="3",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力
- switchType指的是切换的模式,目前的取值也有4种:

    switchType='-1' 表示不自动切换

    switchType='1' 默认值,表示自动切换

    switchType='2' 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status

    switchType='3'基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like 'wsrep%'
- writeType表示写模式:

    writeType="0",所有的操作发送到配置的第一个writehost

    writeType="1",随机发送到配置的所有writehost

    writeType="2",不执行写操作

datanode和datahost和schema的理解

<dataNode>数据节点

<dataNode> 配置项定义了 Mycat 如何连接到实际的数据库节点。每个数据节点代表一个与数据库系统(如 MySQL、Oracle 等)连接的实例,通常是 一个数据库的物理或虚拟节点。数据节点是 Mycat 内部如何进行分库分表操作的核心配置。

作用:

  • 数据节点 表示 Mycat 能访问到的数据库实例。通常,一个数据节点代表一个数据库或一个分片的数据库。
  • 数据节点 存储和提供数据,Mycat 根据配置的 分片规则 将 SQL 请求路由到对应的 dataNode
  • 每个 dataNode 可能关联多个 数据主机<dataHost>),但 dataNode 代表的是 Mycat 内部用来路由数据的逻辑单元。

<dataHost>数据主机

定义:

<dataHost> 是与 数据库主机 相关的配置项,描述了数据库实例的连接细节,比如数据库主机的地址、端口、数据库类型、连接池设置等。dataHost 是实际的数据库连接配置,而 dataNode 则是逻辑上的数据库节点标识,它将指向一个具体的 dataHost

作用:

  • 数据主机 描述的是 Mycat 如何连接到数据库的具体信息,比如 IP 地址、端口、用户名、密码等。
  • Mycat 通过 dataNode 来逻辑上组织分片或数据库分布,而 dataHost 则指定实际的数据库连接信息。
  • dataHost 可以关联一个或多个数据库主机,通过 读写分离 等方式管理主从数据库。

<schema>数据库模式

<schema> 是 Mycat 配置中的一个顶级元素,它描述了 一个逻辑数据库的结构,包括了该数据库的分片规则、表的配置以及与数据节点(dataNode)的关联。<schema> 用于定义如何将请求路由到不同的 dataNode,并且指定如何根据配置的规则进行分库分表。

作用:

  • 数据库模式 定义了一个完整的逻辑数据库结构。它通常包含多个数据表,并且可以配置这些表的分库分表规则。
  • schema 中定义的 会依据指定的 数据分布规则 被分布到多个 dataNode 上。
  • schema 配置不仅包含 数据表的定义,还包括 数据节点dataNode)的配置,指明这些表如何与具体的数据库节点连接。

mycat实验

1.搭建主从架构

192.168.5.101 server1
192.168.5.102 server2

两台mysql搭建主从架构,见上文

2.配置hosts
[root@server1 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.5.101 server1
192.168.5.102 server2
192.168.5.103 server3
192.168.5.104 server4
[root@server1 ~]# scp /etc/hosts 192.168.5.102:/etc/hosts
The authenticity of host '192.168.5.102 (192.168.5.102)' can't be established.
ECDSA key fingerprint is SHA256:Xfko4o2FQVInv0NZgti6C0QHf00G4FF+nxSM7kPVD1g.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.5.102' (ECDSA) to the list of known hosts.
root@192.168.5.102's password: 
hosts                                                                                                                                100%  246   182.7KB/s   00:00    
[root@server1 ~]# scp /etc/hosts 192.168.5.104:/etc/hosts
The authenticity of host '192.168.5.104 (192.168.5.104)' can't be established.
ECDSA key fingerprint is SHA256:cr54OnzylGnFzYbvKDw1jbq9XZkot5Xld6Ar+n7i9I4.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.5.104' (ECDSA) to the list of known hosts.
root@192.168.5.104's password: 
hosts                                
3.修改mycat节点的schema.xml配置文件
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
                <!-- auto sharding by id (long) -->
                <!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
                        /> -->
        </schema>
        <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
                /> -->
        <dataNode name="dn1" dataHost="localhost1" database="books" />
        <!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />
         <dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
        <dataNode       name="jdbc_dn2" dataHost="jdbchost" database="db2" />
        <dataNode name="jdbc_dn3"       dataHost="jdbchost" database="db3" /> -->
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="server1" url="192.168.5.101:3306" user="root"
                                   password="123456">
                        <!-- can have multi read hosts -->
                        <readHost host="server2" url="192.168.5.102:3306" user="root" password="123456" />
                </writeHost>
                <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
        </dataHost>
4.测试
[root@server4 conf]# mysql -uroot -p123456 -P8066 -h127.0.0.1
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.29-mycat-1.6.6.1-release-20181031195535 MyCat Server (OpenCloudDB)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

Database changed
mysql> show tables;
+-----------------+
| Tables_in_books |
+-----------------+
| books           |
| category        |
+-----------------+
2 rows in set (0.00 sec)

mysql> select * from books where bid=1;
+-----+-----------------------+---------+--------------------------+-------+------------+--------+------------+
| bId | bName                 | bTypeId | publishing               | price | pubDate    | author | ISBN       |
+-----+-----------------------+---------+--------------------------+-------+------------+--------+------------+
|   1 | 网站制作直通车        | 2       | 电脑爱好者杂志社         |    34 | 2004-10-01 | 苗壮   | 7505380796 |
+-----+-----------------------+---------+--------------------------+-------+------------+--------+------------+
1 row in set (0.00 sec)

标签:架构,log,数据库,MySQL,节点,mysql,服务器,日志,主从
From: https://www.cnblogs.com/cloudwangsa/p/18637860

相关文章

  • MySQL集群MHA
    MySQL集群MHAMHA由两部分构成:MHAManager(管理节点)和MHANode(数据节点)。在主从复制的MySQL集群中,MHAManager负责监控主节点的健康状况,当主节点出现故障时,MHAManager会自动选举出一个从节点升级为主节点,并协调其余从节点重新连接至新的主节点,实现无缝的故障转移。监控与故障检测......
  • MySQL集群mgr
    MySQL集群mgrMySQL集群MGR和MHA的区别MySQLManager(mysqlmgr)适用场景:用于需要高可用性、自动化管理和负载均衡的MySQL集群环境。适合部署基于GroupReplication的InnoDB集群。MHA(MySQLHighAvailability)适用场景:适用于传统的基于主从复制的MySQL环境。需......
  • MySQL_network
    MySQLRDBMS术语数据库:数据库是一些关联表的集合数据表:表是数据的矩阵列:一列包含了相同类型的数据行:一行一组相关的数据冗余:存储两倍数据主键:主键是唯一的,可以用主键来查询数据外键:外键用于关联两个表复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引......
  • 基于python+Django+mysql校园二手书籍交易平台系统设计与实现
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩,提供核心代码讲解,答辩指导。项目配有对应开发......
  • MYSQL访问控制,第2阶段:请求验证
    服务器接受连接后,进入权限控制的第二阶段。对于您通过连接发出的每个请求,服务器确定您要执行的操作,然后检查您的权限是否足够。这是授权表中的权限列发挥作用的地方。这些权限来自系统表user、global_grants、db、tables_priv、columns_priv或procs_priv。user表和global_gran......
  • MySql B树 B+树
    什么是叶子节点?想象你有一本书,书中的每一页都是一个节点。在这本书里,有些页面包含的是目录或章节标题(这些可以类比为内部节点),而另一些页面则包含了实际的内容,比如故事、文章或者数据记录(这些是叶子节点)。叶子节点就是存储真实数据的最终位置,在树结构中它们位于最底层,没有子节......
  • MySQL安装配置教程(非常详细),从零基础入门到精通,看完这一篇就够了
    Windows下有两种安装MySQL的方式:图形界面安装(.msi文件)免安装版(.zip压缩文件)MySQL下载官网:http://www.mysql.com也可前往百度网盘提取(两种安装方式文件都有):链接:https://pan.baidu.com/s/1NMRUu_E098h4ErzSXTUKgA提取码:3tfb一、MySQL免安装版配置教程http://c.bianche......
  • MySQL General error: 1364 Field 'XXX' doesn't have a default value
    向数据库中插入数据时报了以上错误,其原因为:MySQL使用了严格验证方式解决办法mysql设置的问题,有my.ini的就找这个文件,没有的就找my.cnf(这个一般都在/ect/my.conf)直接把[mysqld]模块下的sql-mode模式改变下,找到sql-mode,然后把这句删掉,改成:sql_mode=NO_ENGINE_SUBSTITU......
  • Omnissa Horizon Clients 2412 发布 - 虚拟桌面基础架构 (VDI) 和应用软件
    OmnissaHorizonClients2412发布-虚拟桌面基础架构(VDI)和应用软件OmnissaHorizon,之前称为VMwareHorizon,通过高效、安全的虚拟桌面交付增强您的工作空间请访问原文链接:https://sysin.org/blog/omnissa-horizon-8/查看最新版。原创作品,转载请保留出处。作者主页:sys......
  • FreeSWITCH的功能、架构、协议、场景、安装、商业化一览
    FreeSWITCH的功能、架构、协议、场景、安装、商业化一览作者:基于Java与FreeSWITCH的开源呼叫中心系统FreeIPCC,Github地址:https://github.com/FreeIPCC/FreeAICCFreeSWITCH的功能、架构、协议、场景、安装与商业化一、FreeSWITCH的功能FreeSWITCH是一个开源的电话软交换平台......