当前位置: 首页 > news >正文

6种MySQL高可用方案对比分析

大家好,我是 V 哥,关于 MySQL 高可用方案,在面试中频频出现,有同学在字节面试就遇到过,主要考察你在高可用项目中是如何应用的,V 哥整理了6种方案,供你参考。

MySQL的高可用方案有多种,常见的包括以下几种:

1. 主从复制(Master-Slave Replication)

  • 原理:主库进行写操作,数据通过异步或半同步复制到从库。可以通过从库进行读操作,实现读写分离。
  • 优点:实现简单,适用于读多写少的场景。
  • 缺点:主库故障时,手动提升从库为主库,切换较慢。可以借助管理工具,如MHA(Master High Availability)来自动切换主从。

**主从复制(Master-Slave Replication)**是一种常见的MySQL高可用方案,主要用于数据读写分离、备份、故障恢复等场景。以下是适合的业务场景和实现步骤的详细介绍。

一、主从复制适合的业务场景

  1. 读多写少的业务

    • 在一些业务场景中,数据库的读操作远多于写操作。通过将读操作分发到从库,减轻主库的压力。
    • 例如:电商平台中的商品展示页面,读操作远多于写操作。
  2. 数据备份

    • 主从复制可以为数据提供实时备份,从库上的数据几乎实时同步主库。即便主库故障或出现问题,也可以通过提升从库为主库来确保业务的持续运行。
  3. 故障恢复

    • 主库故障时,可以快速切换到从库,提供一定程度上的高可用性。
  4. 数据分析

    • 数据分析或报表生成往往对实时性要求不高,可以从从库中读取数据进行分析,避免影响主库的性能。

二、主从复制的实现步骤

1. 准备工作
  • 环境要求:假设有两台服务器,分别作为主库(Master)和从库(Slave)。IP地址假设为:
    • 主库IP:192.168.1.100
    • 从库IP:192.168.1.101
  • 安装MySQL:确保主库和从库都已经安装了MySQL,并进行基础配置。
2. 主库(Master)配置
  1. 修改主库的MySQL配置文件
    • 编辑主库的MySQL配置文件my.cnfmy.ini(路径根据系统不同有所差异,一般在/etc/my.cnf/etc/mysql/my.cnf)。
     [mysqld]# 开启二进制日志 (Master必须开启)log-bin=mysql-bin# 设置server-id,确保在集群中唯一server-id=1# 设置binlog格式,推荐ROWbinlog_format=ROW# 可选:限制binlog大小max_binlog_size=100M# 可选:保留二进制日志的天数expire_logs_days=7
  1. 重启MySQL服务

    在修改配置文件后,需要重启MySQL服务以使配置生效:

   sudo systemctl restart mysqld
  1. 创建用于复制的用户

    在主库上为从库创建一个专门用于复制的用户,并授予复制权限:

   CREATE USER 'replica'@'192.168.1.101' IDENTIFIED BY 'replica_password';GRANT REPLICATION SLAVE ON *.* TO 'replica'@'192.168.1.101';FLUSH PRIVILEGES;
  1. 锁定数据库并获取二进制日志文件和位置

    由于复制需要基于二进制日志来同步数据,所以需要锁定表来确保数据的一致性:

   FLUSH TABLES WITH READ LOCK;SHOW MASTER STATUS;

运行SHOW MASTER STATUS;命令后,MySQL会返回类似如下信息:

   +------------------+----------+--------------+------------------+| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |+------------------+----------+--------------+------------------+| mysql-bin.000001 |      120 |              |                  |+------------------+----------+--------------+------------------+

记录下FilePosition的值,例如:mysql-bin.000001120。它们将在配置从库时使用。

  1. 备份主库数据

    使用mysqldump进行全量备份,将数据导出并导入从库:

   mysqldump -u root -p --all-databases --master-data > master_backup.sql
  1. 解锁表

    完成备份后,解除数据库锁定:

   UNLOCK TABLES;
3. 从库(Slave)配置
  1. 修改从库的MySQL配置文件
    • 编辑从库的MySQL配置文件my.cnfmy.ini
     [mysqld]# 设置server-id,确保在集群中唯一server-id=2# 从库不需要开启二进制日志,除非需要级联复制log-bin=mysql-slave-bin# 其他可选配置relay-log=relay-bin
  1. 重启从库MySQL服务

    使配置生效:

   sudo systemctl restart mysqld
  1. 导入主库数据

    将在主库导出的备份文件导入到从库:

   mysql -u root -p < master_backup.sql
  1. 配置复制

    使用主库的二进制日志文件名和位置,配置从库的复制:

   CHANGE MASTER TOMASTER_HOST='192.168.1.100',MASTER_USER='replica',MASTER_PASSWORD='replica_password',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=120;
  1. 启动复制

    配置完成后,启动从库的复制进程:

   START SLAVE;
  1. 检查复制状态

    通过以下命令查看从库的复制状态:

   SHOW SLAVE STATUS\G;

需要确认以下两个字段为Yes,表明复制正常运行:

   Slave_IO_Running: YesSlave_SQL_Running: Yes
4. 读写分离配置(可选)
  1. 应用层处理读写分离

    • 应用程序可以通过代码配置,将写操作定向到主库,将读操作定向到从库。
    • 例如:在Java Spring中,使用AbstractRoutingDataSource来根据操作类型选择不同的数据库连接。
  2. 使用中间件(例如Mycat、ProxySQL)

    • 可以使用数据库中间件,将读写分离的逻辑下沉到中间件层,实现更灵活的负载均衡。

三、维护和监控

  1. 监控主从同步延迟

    • 通过Seconds_Behind_Master字段监控从库的延迟,确保数据同步及时。
  2. 定期备份从库

    • 虽然从库的数据是实时同步的,但仍需定期备份从库,防止意外数据丢失。
  3. 故障切换

    • 当主库故障时,可以手动提升从库为主库:
     STOP SLAVE;RESET SLAVE ALL;

主从复制可以为读多写少的业务场景提供一个简单而有效的解决方案,既提升了读操作的性能,也增强了数据库的可靠性。

2. 半同步复制(Semi-Synchronous Replication)

  • 原理:在主库提交事务之前,至少一个从库确认收到数据,才算提交成功。相比于异步复制,有一定的延迟但更安全。
  • 优点:保证数据一致性较强,适用于对数据一致性要求高的业务。
  • 缺点:相比异步复制延迟较大,尤其在网络状况不佳时。

**半同步复制(Semi-Synchronous Replication)**是介于异步复制和全同步复制之间的一种高可用方案。它在写操作时不仅要求主库将数据写入二进制日志文件,还要求至少一个从库确认收到数据后,主库才认为提交成功。相比异步复制,它提供了更好的数据一致性保障,但又不像全同步复制那样带来较大的性能开销。以下将详细介绍它的适用业务场景和具体实现步骤。

一、半同步复制适合的业务场景

  1. 对数据一致性要求较高的业务

    • 半同步复制适用于那些对数据一致性要求较高的业务场景。例如,金融系统、银行交易系统或电子商务平台,这些业务对数据的一致性要求非常严格,需要确保主库上的数据已经被至少一个从库接收到。
  2. 高并发写操作下保证数据的安全

    • 如果某个业务场景具有大量的写操作,同时不能容忍数据丢失,半同步复制可以确保主库在提交事务时至少有一个从库已经收到数据,从而保证在主库崩溃时,数据依然是安全的。
  3. 低容忍度的故障恢复

    • 在需要快速故障恢复的场景下,半同步复制可以确保数据在主库发生故障时不会丢失,这样可以快速地将从库提升为主库,以确保业务的连续性。
  4. 跨地域分布的数据库

    • 当主库和从库位于不同数据中心时,半同步复制可以确保至少一个从库位于不同地理位置,保证在单个数据中心故障时,数据仍然可用。

二、半同步复制的实现步骤

1. 准备工作
  • 假设我们有两台服务器,一台作为主库(Master),另一台作为从库(Slave)。我们将配置半同步复制,确保在事务提交时,至少一个从库已经收到数据。
  • 假设主库的IP为192.168.1.100,从库的IP为192.168.1.101
2. 主库(Master)配置
  1. 修改主库的MySQL配置文件
    • 编辑主库的MySQL配置文件my.cnfmy.ini
     [mysqld]# 启用二进制日志(必须开启)log-bin=mysql-bin# 设置server-id,必须在主从库中唯一server-id=1# 设置binlog格式,推荐ROW格式binlog_format=ROW# 启用半同步复制的插件plugin-load=rpl_semi_sync_master=semisync_master.so# 启用半同步复制,并设置半同步超时时间rpl_semi_sync_master_enabled=1rpl_semi_sync_master_timeout=10000 # 以毫秒为单位,超时时间为10秒
  1. 重启MySQL服务
    • 使配置生效:
     sudo systemctl restart mysqld
  1. 启用半同步复制插件
    • 如果没有在配置文件中加载插件,也可以通过以下命令动态加载:
     INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';SET GLOBAL rpl_semi_sync_master_enabled = 1;
  1. 创建复制用户
    • 在主库上创建一个专门用于复制的用户,并授予REPLICATION SLAVE权限:
     CREATE USER 'replica'@'192.168.1.101' IDENTIFIED BY 'replica_password';GRANT REPLICATION SLAVE ON *.* TO 'replica'@'192.168.1.101';FLUSH PRIVILEGES;
  1. 查看主库状态
    • 确认主库的半同步插件是否已启用:
     SHOW VARIABLES LIKE 'rpl_semi_sync%';

确认rpl_semi_sync_master_enabledON

3. 从库(Slave)配置
  1. 修改从库的MySQL配置文件
    • 编辑从库的MySQL配置文件my.cnfmy.ini
     [mysqld]# 设置server-id,确保唯一server-id=2# 启用半同步复制的插件plugin-load=rpl_semi_sync_slave=semisync_slave.so# 启用半同步复制rpl_semi_sync_slave_enabled=1
  1. 重启MySQL服务
    • 使配置生效:
     sudo systemctl restart mysqld
  1. 启用半同步复制插件
    • 如果没有在配置文件中加载插件,也可以动态加载:
     INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';SET GLOBAL rpl_semi_sync_slave_enabled = 1;
  1. 配置复制
    • 配置从库的复制,首先确保从库与主库同步。在从库上执行以下命令:
     CHANGE MASTER TOMASTER_HOST='192.168.1.100',MASTER_USER='replica',MASTER_PASSWORD='replica_password',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=120;

这里的MASTER_LOG_FILEMASTER_LOG_POS的值可以从主库上通过SHOW MASTER STATUS获得。

  1. 启动复制
    • 在从库上启动复制进程:
     START SLAVE;
  1. 检查复制状态
    • 通过以下命令查看复制状态,确保Slave_IO_RunningSlave_SQL_RunningYes
     SHOW SLAVE STATUS\G;
4. 验证半同步复制状态
  1. 检查主库的复制状态
    • 使用以下命令查看主库上的半同步复制状态:
     SHOW STATUS LIKE 'Rpl_semi_sync_master%';

关键字段:

  • Rpl_semi_sync_master_status: ON 表示主库启用了半同步复制。
  • Rpl_semi_sync_master_clients: 表示当前确认半同步复制的从库数量。
  1. 检查从库的复制状态
    • 在从库上执行以下命令,查看半同步复制是否正常:
     SHOW STATUS LIKE 'Rpl_semi_sync_slave%';

关键字段:

  • Rpl_semi_sync_slave_status: ON 表示从库启用了半同步复制。

三、半同步复制中的细节配置

  1. 超时时间配置

    • rpl_semi_sync_master_timeout 控制主库等待从库确认的超时时间。默认值是10秒,如果从库在该时间内未响应,主库将退回到异步模式,继续执行写操作。
    • 根据业务需求,可以调整该时间来平衡性能和一致性。
  2. 读写分离

    • 半同步复制一般配合读写分离的架构。主库负责写操作,而从库负责读操作。这种模式可以有效减轻主库的压力,并且在半同步模式下从库能保持与主库的数据高度一致。
  3. 多从库配置

    • 在实际部署中,可能会有多个从库。半同步复制要求至少一个从库确认写入日志后,主库才能认为事务成功。因此,即使有多个从库,只要一个从库响应,写操作就可以继续执行。

四、半同步复制的优势与注意事项

优势
  1. 数据安全性提高:半同步复制在主库提交事务之前,至少有一个从库已经收到数据,确保数据不会丢失。
  2. 故障切换更快速:因为从库已经接收到了主库的最新数据,当主库发生故障时,从库可以立即切换为主库,而不会有数据不一致的问题。
  3. 适合跨数据中心架构:当主库和从库位于不同数据中心时,可以减少因单个数据中心故障导致的数据丢失风险。
要注意的事
  1. 性能损耗:因为主库必须等待从库的确认响应,写操作的性能会有所下降,特别是在网络延迟较大的情况下。
  2. 超时机制:如果从库无法在规定的超时时间内响应,主库会退回到异步复制,这可能会导致短时间内的数据不一致性。

通过配置半同步复制,业务可以在数据安全性与性能之间找到一个较好的平衡。它适用于对数据一致性要求高,但又不想完全牺牲性能的场景,是金融、银行等关键业务系统中的常见选择

3. Galera Cluster

  • 原理:是一种多主集群架构,支持多点读写。每个节点同步数据并维持一致性。
  • 优点:数据实时同步、没有单点故障,适合高可用和高一致性要求的场景。
  • 缺点:复杂度较高,对网络质量要求较高,适用于小范围分布式架构。

Galera Cluster是一种基于多主(Multi-master)复制的高可用数据库集群方案,提供了高并发、高可用性、强一致性和容错能力。它允许多个节点同时进行读写操作,并确保所有节点的数据一致性。下面详细介绍它适合的业务场景以及实现步骤。

一、Galera Cluster适合的业务场景

  1. 高并发读写的业务场景

    • Galera Cluster允许多个节点同时进行读写操作,适合具有高并发读写需求的业务场景。例如,社交平台、在线支付系统等高并发场景,多个节点可以同时处理请求,大大提升系统的并发处理能力。
  2. 需要高可用性和容灾的业务

    • Galera Cluster通过多主节点架构提供高可用性。当任意一个节点发生故障时,集群中的其他节点可以继续处理请求,保证业务不间断运行。这对那些对高可用性要求较高的业务至关重要,如金融系统、电子商务平台等。
  3. 地理分布的数据库集群

    • Galera Cluster可以支持多个数据中心的数据库同步,适合跨地理区域部署,确保数据在不同地区保持一致。例如,跨区域的业务系统,如全球范围内的物流管理系统,能够在不同地区保持数据实时一致。
  4. 对强一致性要求较高的业务

    • Galera Cluster使用同步复制技术,保证了集群中所有节点的数据强一致性。适合数据一致性要求较高的业务场景,如银行系统、交易平台等,这些场景中的数据一致性至关重要。

二、Galera Cluster的实现步骤

1. 准备工作
  • 假设我们要搭建一个包含3个节点的Galera Cluster,节点IP如下:
    • 节点1:192.168.1.101
    • 节点2:192.168.1.102
    • 节点3:192.168.1.103
  • 系统要求:确保每个节点上已经安装了MySQL(或Percona、MariaDB等兼容Galera的数据库版本),并且它们可以相互通信(通常通过开放3306端口)。
  • 时间同步:确保所有节点的系统时间同步,可以使用ntpchrony服务来保持各节点时间的一致性。
2. 安装Galera插件和数据库
  1. 安装数据库
    • 在每个节点上安装MySQL或MariaDB,推荐使用MariaDBPercona XtraDB,因为它们对Galera的支持较好。
    • 以MariaDB为例,安装命令如下:
     sudo apt-get updatesudo apt-get install mariadb-server
  1. 安装Galera插件
    • MariaDB和Percona通常会自带Galera插件。如果没有,手动安装Galera插件:
     sudo apt-get install galera-4
3. 配置MySQL节点
  1. 修改MySQL配置文件

    • 在每个节点上编辑MySQL配置文件my.cnf(路径可能是/etc/mysql/my.cnf/etc/my.cnf,根据系统的不同有所差异)。

    • [mysqld]部分添加以下配置:

     [mysqld]# 服务器唯一IDserver-id=1# 开启二进制日志(但Galera不使用它,兼容性需求)log-bin# 在所有节点启用同步复制功能binlog_format=ROW# 必须启用的选项default_storage_engine=InnoDBinnodb_autoinc_lock_mode=2innodb_flush_log_at_trx_commit=0# 启用Galera同步协议wsrep_on=ON# 连接到集群的URLwsrep_cluster_address="gcomm://192.168.1.101,192.168.1.102,192.168.1.103"# 指定Galera库wsrep_provider=/usr/lib/galera/libgalera_smm.so# 集群名称,所有节点应保持一致wsrep_cluster_name="my_galera_cluster"# 节点名称,确保在集群中唯一wsrep_node_name="node1"# 节点的IP地址wsrep_node_address="192.168.1.101"# 数据库用户名和密码,供节点间认证使用wsrep_sst_auth="sst_user:sst_password"# SST(State Snapshot Transfer)时使用的方式wsrep_sst_method=rsync  # 可选择rsync或xtrabackup
  • 在其他节点上重复此操作,注意修改server-idwsrep_node_namewsrep_node_address,以保证每个节点的配置唯一。
  1. 创建SST传输用户

    • SST用于在节点间传输数据。在主节点上为SST传输创建一个用户:
     CREATE USER 'sst_user'@'%' IDENTIFIED BY 'sst_password';GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sst_user'@'%';FLUSH PRIVILEGES;
  1. 防火墙设置

    • 确保集群节点间的通信端口是开放的,主要端口包括:
      • 4567:节点间的数据复制通信端口。
      • 4568:增量状态转移(IST)时使用的端口。
      • 4444:状态快照传输(SST)时使用的端口。

    可以使用以下命令开放这些端口:

   sudo ufw allow 3306/tcpsudo ufw allow 4567/tcpsudo ufw allow 4568/tcpsudo ufw allow 4444/tcp
4. 启动Galera Cluster
  1. 启动第一个节点

    • 第一个节点的启动稍有不同,因为它需要引导整个集群。使用以下命令在第一个节点上启动MySQL:
     sudo galera_new_cluster
  • 这将会引导整个集群,后续的节点将会连接到这个节点。
  1. 启动其他节点

    • 在其他节点上,正常启动MySQL服务,它们会自动连接到第一个节点并同步数据:
     sudo systemctl start mysql
  1. 验证集群状态

    • 在每个节点上运行以下命令,确认节点是否成功加入集群:
     SHOW STATUS LIKE 'wsrep_cluster_size';

如果一切顺利,wsrep_cluster_size的值应该为3,表示集群中有3个节点。

5. 读写操作的配置
  1. 负载均衡

    • 在多节点的Galera Cluster中,可以通过数据库中间件(例如ProxySQL)实现读写分离或负载均衡,确保不同的读写操作能够均匀地分布在不同的节点上,进一步提高性能。
  2. 多主读写

    • Galera支持多主读写,所有节点都可以同时处理读写请求。在应用程序层面,可以通过负载均衡策略将读写操作分发到不同节点。
6. 监控和维护
  1. 监控集群健康状态

    • 通过监控wsrep_status的几个重要字段来确保集群健康:
      • wsrep_cluster_size: 当前集群的节点数。
      • wsrep_cluster_status: 应为Primary,表示集群处于正常状态。
      • wsrep_ready: 应为ON,表示节点可以处理请求。
  2. 节点故障恢复

    • 如果某个节点发生故障,可以简单地重新启动该节点,它将自动加入集群并恢复数据。如果节点数据过多,可以使用xtrabackup替代rsync进行SST传输以减少影响。

三、Galera Cluster的优势与注意事项

优势
  1. 强一致性:Galera Cluster通过同步复制提供了数据的强一致性,保证集群中所有节点数据的准确同步。
  2. 多主架构:多个节点可以同时处理读写请求,极大地提高了并发性能。
  3. 高可用性:即使某个节点宕机,其他节点也能继续工作,保证系统的高可用性和容错能力。
  4. 自动故障恢复:节点崩溃后可以自动加入集群并恢复数据,不需要人工干预。
注意事项
  1. 性能损耗:由于Galera使用同步复制技术,所有节点都需要在事务提交时进行数据同步,因此延迟较大,可能会影响。这在地理上分散的节点部署时尤为明显。

  2. 网络要求:Galera Cluster对网络延迟较为敏感,要求节点间的网络连接稳定且带宽充足。如果集群节点分布在不同的数据中心或地理位置上,确保低延迟的网络连接非常重要。

  3. 写扩展性有限:虽然Galera Cluster允许多主写操作,但因为所有写操作需要同步到其他节点,写操作的扩展性有限。在高写入负载的场景下,Galera的性能可能不如其他基于异步复制的方案。

  4. SST和IST操作:当新节点加入集群或发生节点故障时,Galera使用SST(State Snapshot Transfer)或IST(Incremental State Transfer)来同步数据。SST会导致性能损耗,因为它需要进行全量数据传输。为了避免大规模的SST操作,可以使用xtrabackup等更高效的工具,并确保节点尽量避免长时间离线。

  5. 事务冲突处理:由于多主复制,可能会发生事务冲突。Galera采用乐观并发控制(OCC),当两个节点同时尝试修改相同的数据时,后提交的事务会回滚。因此,虽然多主写操作提供了更高的并发性,但在高写入冲突的场景下可能导致回滚次数增多,影响整体性能。

四、小结一下

Galera Cluster 是一种适用于高可用、高一致性、高并发读写业务场景的数据库集群解决方案。通过多主节点和同步复制机制,Galera能够确保数据的一致性和集群的高可用性,特别适合那些对数据一致性要求高且需要处理大量读写请求的业务。

噢了,现在你可以成功部署一个稳定、高效的Galera Cluster,满足大规模、跨地域、高一致性业务场景的需求。

4. MySQL Group Replication

  • 原理:MySQL自带的多主复制技术,基于Paxos算法的集群一致性协议。
  • 优点:提供数据强一致性,自动故障恢复,多主模式。
  • 缺点:性能和扩展性较受限于集群规模,适合对一致性要求极高的场景。

MySQL Group Replication是MySQL 5.7及以上版本提供的一种原生高可用性解决方案。它采用多主复制的架构,支持强一致性和高可用性。以下是MySQL Group Replication适合的业务场景,以及具体的实现步骤。

一、MySQL Group Replication适合的业务场景

  1. 高可用性需求的业务

    • 对于金融、电子商务等对可用性要求极高的系统,MySQL Group Replication可以确保在节点故障的情况下,其他节点能够继续提供服务。
  2. 高并发的读写操作

    • 在需要高并发读写操作的业务场景中(如社交平台、在线游戏等),Group Replication允许多个节点同时处理请求,提高了系统的并发性能。
  3. 跨地域的数据库应用

    • MySQL Group Replication可以支持跨地理位置的数据库复制,适用于国际化的业务系统。这对于需要在不同地区保持数据一致性的企业至关重要。
  4. 数据一致性要求高的应用

    • 对数据一致性要求严格的应用,如在线支付、库存管理等,MySQL Group Replication通过保证所有节点的强一致性,满足这些场景的需求。
  5. 自动故障恢复

    • MySQL Group Replication具有自动故障恢复能力,适合对系统可用性和自动化管理要求高的业务。

二、MySQL Group Replication的实现步骤

1. 准备工作
  • 假设我们要搭建一个包含3个节点的MySQL Group Replication集群,节点IP如下:

    • 节点1:192.168.1.101
    • 节点2:192.168.1.102
    • 节点3:192.168.1.103
  • 系统要求:确保每个节点上已经安装了MySQL(5.7或以上版本)。

  • 时间同步:使用ntpchrony确保所有节点的系统时间一致。

2. 安装MySQL
  • 在每个节点上安装MySQL(5.7或以上版本)。以Ubuntu为例,安装命令如下:
  sudo apt-get updatesudo apt-get install mysql-server
  • 确认MySQL版本:
  mysql --version
3. 配置MySQL节点
  1. 修改MySQL配置文件

    • 在每个节点上编辑MySQL配置文件my.cnf(路径通常是/etc/mysql/my.cnf/etc/my.cnf)。

    • [mysqld]部分添加以下配置:

     [mysqld]server-id=1  # 每个节点的唯一ID,依次为1, 2, 3log_bin=binlog  # 启用二进制日志binlog_format=ROW  # 设置二进制日志格式为ROWgtid_mode=ON  # 启用GTIDenforce-gtid-consistency=true  # 强制GTID一致性transaction_write_set_extraction=FULL  # 设置事务写集提取为FULL# 启用Group Replicationplugin-load=group_replication.so  # 加载Group Replication插件group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"  # 设置组的UUIDgroup_replication_start_on_boot=on  # 启动时自动启动Group Replicationgroup_replication_ssl_mode=DISABLED  # 禁用SSL(如需使用SSL,可更改配置)group_replication_group_seeds="192.168.1.101:33061,192.168.1.102:33061,192.168.1.103:33061"  # 所有节点的地址group_replication_local_address="192.168.1.101:33061"  # 当前节点的地址(根据实际节点修改)
  • 在其他节点上重复此操作,确保server-id唯一,并修改group_replication_local_address
  1. 创建复制用户

    • 在每个节点上创建用于Group Replication的复制用户:
     CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_password';GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';FLUSH PRIVILEGES;
  1. 防火墙设置

    • 确保集群节点间的通信端口是开放的,主要端口包括:
      • 3306:MySQL默认端口。
      • 33061:Group Replication协议的端口。

    可以使用以下命令开放这些端口:

   sudo ufw allow 3306/tcpsudo ufw allow 33061/tcp
4. 启动MySQL服务
  • 在每个节点上启动MySQL服务:
  sudo systemctl start mysql
5. 配置Group Replication
  1. 启动Group Replication

    • 在每个节点上执行以下命令启动Group Replication:
     START GROUP REPLICATION;
  1. 验证集群状态

    • 在任意一个节点上,运行以下命令确认Group Replication是否正常运行:
     SELECT * FROM performance_schema.replication_group_members;
  • 此命令将返回当前Group Replication的成员列表,包括每个节点的状态。
  1. 监控Group Replication状态

    • 监控Group Replication状态的关键字段:
     SHOW STATUS LIKE 'group_replication%';
  • 重要字段说明:
    • group_replication_members: 集群中节点的数量。
    • group_replication_state: 集群状态,正常情况下应为ONLINE
    • group_replication_primary_member: 当前主节点的ID。
6. 读写操作配置
  • 通过负载均衡策略(如使用ProxySQL)实现读写分离,以提高性能和响应速度。所有节点都可以同时进行读写操作。
7. 监控和维护
  1. 监控集群健康状态

    • 通过监控各节点的健康状态和性能指标,确保系统正常运行。
  2. 节点故障处理

    • 如果某个节点发生故障,Group Replication会自动检测并调整状态,其他节点会继续提供服务。
  3. 节点恢复

    • 当故障节点恢复后,可以通过以下命令重新加入集群:
     STOP GROUP REPLICATION;START GROUP REPLICATION;

三、MySQL Group Replication的优势与注意事项

优势
  1. 强一致性:Group Replication确保所有节点的强一致性,适合需要确保数据准确性的业务。
  2. 高可用性:集群中的节点可以自动故障转移,确保系统持续可用。
  3. 支持多主写:所有节点都可以进行读写操作,极大提高了并发处理能力。
  4. 原生集成:MySQL Group Replication是MySQL的原生功能,易于安装和配置。
注意事项
  1. 网络延迟敏感:Group Replication对网络延迟较为敏感,网络质量直接影响到写操作的延迟和性能。
  2. 性能考量:虽然Group Replication支持高并发,但在高写入负载情况下,可能会因数据同步而出现性能瓶颈。
  3. 事务冲突处理:多个节点同时写入时,可能会发生事务冲突。MySQL Group Replication使用乐观并发控制(OCC)来处理冲突。
  4. 节点离线处理:长时间离线的节点需要注意处理,可能会在重新加入时需要全量数据同步。

四、小结一下

MySQL Group Replication是一种非常灵活且强大的高可用性解决方案,适合高可用性、高一致性和高并发的业务场景。通过简单的配置和管理,企业可以快速部署一个高效且可靠的数据库集群,确保业务连续性和数据安全。

5. MySQL InnoDB Cluster

  • 原理:由MySQL Group Replication、MySQL Shell 和MySQL Router组成的高可用集群解决方案。
  • 优点:官方支持,集成度高,自动化程度高,方便维护。
  • 缺点:运维管理上需要一定的技术门槛,适用于中大型企业环境。

MySQL InnoDB Cluster是MySQL 5.7及以上版本提供的一个集成高可用性解决方案。它结合了MySQL Group Replication、MySQL Shell和MySQL Router,为用户提供了一个简化的部署和管理高可用集群的方式。以下是MySQL InnoDB Cluster适合的业务场景,以及具体的实现步骤。

一、MySQL InnoDB Cluster适合的业务场景

  1. 高可用性需求的应用

    • 对于对可用性要求极高的应用,例如在线支付、金融服务等,InnoDB Cluster能够在节点故障时快速切换,确保服务持续可用。
  2. 需要读写分离的高并发系统

    • 在社交网络、电商平台等高并发场景中,InnoDB Cluster能够通过MySQL Router实现智能的读写分离,提高系统的处理能力。
  3. 跨地域部署的应用

    • InnoDB Cluster支持地理分布式的节点部署,适用于跨多个数据中心的业务需求,能够在不同地区保持数据一致性。
  4. 自动故障恢复

    • InnoDB Cluster能够自动检测并处理节点故障,适合对自动化管理要求高的系统。
  5. 需要简单管理和运维的环境

    • 对于缺乏运维经验的小型团队或企业,InnoDB Cluster提供了简化的管理界面和工具,适合快速上手和维护。

二、MySQL InnoDB Cluster的实现步骤

1. 准备工作
  • 假设我们要搭建一个包含3个节点的MySQL InnoDB Cluster,节点IP如下:

    • 节点1:192.168.1.101
    • 节点2:192.168.1.102
    • 节点3:192.168.1.103
  • 系统要求:确保每个节点上已经安装了MySQL(5.7或以上版本)。

  • 时间同步:使用ntpchrony确保所有节点的系统时间一致。

2. 安装MySQL和相关工具
  1. 安装MySQL

    在每个节点上安装MySQL(5.7或以上版本)。以Ubuntu为例,安装命令如下:

   sudo apt-get updatesudo apt-get install mysql-server
  1. 安装MySQL Shell

    MySQL Shell是InnoDB Cluster的管理工具,安装命令如下:

   sudo apt-get install mysql-shell
  1. 安装MySQL Router

    MySQL Router是用于应用程序和InnoDB Cluster之间的连接中介,安装命令如下:

   sudo apt-get install mysql-router
3. 配置MySQL节点
  1. 修改MySQL配置文件

    在每个节点上编辑MySQL配置文件my.cnf(路径通常是/etc/mysql/my.cnf/etc/my.cnf)。

    [mysqld]部分添加以下配置:

   [mysqld]server-id=1  # 每个节点的唯一ID,依次为1, 2, 3log_bin=binlog  # 启用二进制日志binlog_format=ROW  # 设置二进制日志格式为ROWgtid_mode=ON  # 启用GTIDenforce-gtid-consistency=true  # 强制GTID一致性transaction_write_set_extraction=FULL  # 设置事务写集提取为FULL# InnoDB Cluster配置plugin-load=group_replication.so  # 加载Group Replication插件group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"  # 设置组的UUIDgroup_replication_start_on_boot=on  # 启动时自动启动Group Replicationgroup_replication_ssl_mode=DISABLED  # 禁用SSL(如需使用SSL,可更改配置)group_replication_group_seeds="192.168.1.101:33061,192.168.1.102:33061,192.168.1.103:33061"  # 所有节点的地址group_replication_local_address="192.168.1.101:33061"  # 当前节点的地址(根据实际节点修改)
  • 在其他节点上重复此操作,确保server-id唯一,并修改group_replication_local_address
  1. 创建复制用户

    在每个节点上创建用于InnoDB Cluster的复制用户:

   CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_password';GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';FLUSH PRIVILEGES;
  1. 防火墙设置

    确保集群节点间的通信端口是开放的,主要端口包括:

    • 3306:MySQL默认端口。
    • 33061:Group Replication协议的端口。

    可以使用以下命令开放这些端口:

   sudo ufw allow 3306/tcpsudo ufw allow 33061/tcp
4. 启动MySQL服务

在每个节点上启动MySQL服务:

sudo systemctl start mysql
5. 配置InnoDB Cluster
  1. 使用MySQL Shell创建集群

    • 登录MySQL Shell(使用root用户):
   mysqlsh --uri root@192.168.1.101
  • 进入SQL模式:
   \sql
  • 创建InnoDB Cluster:
   var cluster = dba.createCluster('myCluster');
  • 向集群添加节点:
   cluster.addInstance('repl_user@192.168.1.102:3306');cluster.addInstance('repl_user@192.168.1.103:3306');
  • 完成后,查看集群状态:
   cluster.status();
  1. 配置MySQL Router

    • 使用MySQL Router连接到InnoDB Cluster:
   mysqlrouter --bootstrap repl_user@192.168.1.101:3306 --user=mysqlrouter
  • 配置文件通常位于/etc/mysqlrouter/mysqlrouter.conf,可以根据需要进行修改。
6. 读写操作配置
  • 通过MySQL Router实现读写分离。应用程序通过MySQL Router连接到集群,Router会根据配置智能地将读写请求分发到相应的节点。
7. 监控和维护
  1. 监控集群健康状态

    • 通过MySQL Shell,使用以下命令监控集群状态:
   cluster.status();
  1. 节点故障处理

    • 如果某个节点发生故障,InnoDB Cluster会自动检测并调整状态,其他节点会继续提供服务。
  2. 节点恢复

    • 当故障节点恢复后,可以通过以下命令重新加入集群:
   cluster.addInstance('repl_user@192.168.1.102:3306');

三、MySQL InnoDB Cluster的优势与注意事项

优势
  1. 强一致性:InnoDB Cluster确保所有节点的强一致性,适合需要确保数据准确性的业务。
  2. 高可用性:集群中的节点可以自动故障转移,确保系统持续可用。
  3. 支持多主写:所有节点都可以进行读写操作,极大提高了并发处理能力。
  4. 简化管理:通过MySQL Shell和MySQL Router,简化了集群的管理和监控。
注意事项
  1. 网络延迟敏感:InnoDB Cluster对网络延迟较为敏感,网络质量直接影响到写操作的延迟和性能。
  2. 性能考量:虽然InnoDB Cluster支持高并发,但在高写入负载情况下,可能会因数据同步而出现性能瓶颈。
  3. 事务冲突处理:多个节点同时写入时,可能会发生事务冲突。InnoDB Cluster使用乐观并发控制(OCC)来处理冲突。
  4. 节点离线处理:长时间离线的节点需要注意处理,可能会在重新加入时需要全量数据同步。

四、总结

MySQL InnoDB Cluster是一个强大且灵活的高可用性解决方案,适合高可用性、高一致性和高并发的业务场景。通过简单的配置和管理,企业可以快速部署一个高效且可靠的数据库集群,确保业务连续性和数据安全。

6. Percona XtraDB Cluster (PXC)

  • 原理:基于Galera的多主集群解决方案,提供高可用性和高一致性。
  • 优点:数据强一致性、自动故障恢复,兼容MySQL和Percona Server。
  • 缺点:与Galera类似,网络延迟会影响性能。

**Percona XtraDB Cluster (PXC)**是一个基于MySQL和Galera库的高可用性解决方案,提供多主集群的特性。它支持强一致性、自动故障转移和扩展性。以下是Percona XtraDB Cluster适合的业务场景,以及具体的实现步骤。

一、Percona XtraDB Cluster适合的业务场景

  1. 高可用性和高可靠性需求

    • 对于金融、电子商务和在线服务等对可用性和可靠性要求极高的系统,PXC能够确保在节点故障的情况下,其他节点能够继续提供服务。
  2. 需要强一致性的应用

    • 适用于需要保证数据强一致性的应用,例如库存管理和在线支付,这些系统在数据更新时需要确保所有节点的数据一致。
  3. 大规模并发处理

    • 在高并发的应用场景下,如社交媒体、在线游戏和大数据分析,PXC能够通过多个主节点处理写请求,支持高并发的读写操作。
  4. 跨地理位置的集群

    • PXC支持地理分布式的节点部署,适合需要在不同地区保持数据一致性的业务需求。
  5. 自动故障恢复

    • PXC能够自动检测节点故障并进行恢复,适合对系统可用性和自动化管理要求高的业务。

二、Percona XtraDB Cluster的实现步骤

1. 准备工作

假设我们要搭建一个包含3个节点的Percona XtraDB Cluster,节点IP如下:

  • 节点1:192.168.1.101

  • 节点2:192.168.1.102

  • 节点3:192.168.1.103

  • 系统要求:确保每个节点上已经安装了Percona Server和Galera库。

  • 时间同步:使用ntpchrony确保所有节点的系统时间一致。

2. 安装Percona Server和相关工具
  1. 安装Percona Server

    在每个节点上安装Percona Server。以Ubuntu为例,安装命令如下:

   sudo apt-get updatesudo apt-get install percona-server-server-5.7
  1. 安装Galera库

    在每个节点上安装Galera库:

   sudo apt-get install percona-xtradb-cluster-galera
3. 配置Percona XtraDB Cluster节点
  1. 修改MySQL配置文件

    在每个节点上编辑MySQL配置文件my.cnf(路径通常是/etc/mysql/my.cnf/etc/my.cnf)。

    [mysqld]部分添加以下配置:

   [mysqld]server-id=1  # 每个节点的唯一ID,依次为1, 2, 3log_bin=binlog  # 启用二进制日志binlog_format=ROW  # 设置二进制日志格式为ROWdefault-storage-engine=InnoDB  # 设置默认存储引擎为InnoDBinnodb_flush_log_at_trx_commit=1  # 每次事务提交后将日志刷新到磁盘innodb_file_per_table=ON  # 为每个表使用单独的表空间innodb_buffer_pool_size=1G  # 根据实际情况调整缓冲池大小# Galera配置wsrep_provider=/usr/lib/galera/libgalera_smm.so  # Galera库路径wsrep_cluster_name="my_cluster"  # 设置集群名称wsrep_cluster_address="gcomm://192.168.1.101,192.168.1.102,192.168.1.103"  # 所有节点的地址wsrep_node_address="192.168.1.101"  # 当前节点的地址(根据实际节点修改)wsrep_node_name="node1"  # 当前节点的名称wsrep_sst_method=rsync  # 设置状态快照传输方法
  • 在其他节点上重复此操作,确保server-id唯一,并修改wsrep_node_addresswsrep_node_name
  1. 创建复制用户

    在每个节点上创建用于集群的复制用户:

   CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_password';GRANT ALL PRIVILEGES ON *.* TO 'repl_user'@'%';FLUSH PRIVILEGES;
  1. 防火墙设置

    确保集群节点间的通信端口是开放的,主要端口包括:

    • 3306:MySQL默认端口。
    • 4567:Galera集群节点间通信端口。
    • 9200:状态快照传输端口。

    可以使用以下命令开放这些端口:

   sudo ufw allow 3306/tcpsudo ufw allow 4567/tcpsudo ufw allow 9200/tcp
4. 启动集群节点
  1. 启动第一个节点

    在第一个节点上启动MySQL服务:

   sudo systemctl start mysql

由于这是第一个节点,因此它将自动初始化集群。

  1. 启动其他节点

    在第二个节点和第三个节点上,首先以gcomm://开头启动服务以加入集群:

   sudo systemctl stop mysql  # 停止MySQL服务sudo galera_new_cluster  # 初始化Galera集群

然后启动第二个节点和第三个节点:

   sudo systemctl start mysql
5. 验证集群状态
  1. 检查节点状态

    在任意一个节点上,运行以下命令以检查集群状态:

   SHOW STATUS LIKE 'wsrep_cluster_size';

此命令将返回集群中节点的数量,确保所有节点都已成功加入集群。

  1. 检查集群成员
   SHOW STATUS LIKE 'wsrep_connected';

返回值应为ON,表示节点已连接。

6. 读写操作配置
  • 可以直接通过任意一个节点进行读写操作。对于高并发的应用场景,可以使用负载均衡器(如HAProxy)在节点之间进行负载均衡。
7. 监控和维护
  1. 监控集群健康状态

    • 使用以下命令监控集群的健康状态:
   SHOW STATUS LIKE 'wsrep%';

关键字段包括:

  • wsrep_cluster_size:集群中节点的数量。
  • wsrep_ready:表示节点是否准备好进行写操作。
  • wsrep_connected:表示节点是否连接到集群。
  1. 节点故障处理

    • 如果某个节点发生故障,PXC会自动检测并调整状态,其他节点会继续提供服务。
  2. 节点恢复

    • 当故障节点恢复后,可以通过以下命令重新加入集群:
   sudo systemctl stop mysql  # 停止MySQL服务sudo galera_new_cluster  # 初始化Galera集群sudo systemctl start mysql  # 启动MySQL服务

三、Percona XtraDB Cluster的优势与注意事项

优势
  1. 强一致性:PXC确保所有节点的强一致性,适合需要确保数据准确性的业务。
  2. 高可用性:集群中的节点可以自动故障转移,确保系统持续可用。
  3. 支持多主写:所有节点都可以进行读写操作,极大提高了并发处理能力。
  4. 负载均衡:可以通过HAProxy等负载均衡器实现请求分发,提高系统性能。
注意事项
  1. 网络延迟敏感:PXC对网络延迟较为敏感,网络质量直接影响到写操作的延迟和性能。
  2. 性能考量:在高写入负载情况下,可能会因数据同步而出现性能瓶颈。
  3. 事务冲突处理:多个节点同时写入时,可能会发生事务冲突。PXC使用乐观并发控制(OCC)来处理冲突。
  4. 节点离线处理:长时间离线的节点需要注意处理,可能会在重新加入时需要全量数据同步。

四、总结

Percona XtraDB Cluster是一个强大且灵活的高可用性解决方案,适合高可用性、高一致性和高并发的业务场景。通过简单的配置和管理,企业可以快速部署一个高效且可靠的数据库集群,确保业务连续性和数据安全。

最后

以上6种高可用方案详解,希望可以帮助小伙伴们,欢迎关注威哥爱编程,插播一下,服票大涨,会意味着大环境将走出低迷吗?

相关文章:

6种MySQL高可用方案对比分析

大家好&#xff0c;我是 V 哥&#xff0c;关于 MySQL 高可用方案&#xff0c;在面试中频频出现&#xff0c;有同学在字节面试就遇到过&#xff0c;主要考察你在高可用项目中是如何应用的&#xff0c;V 哥整理了6种方案&#xff0c;供你参考。 MySQL的高可用方案有多种&#xf…...

FastAPI: websocket的用法及举例

1. Websocket 1.1 Websocket介绍 WebSocket 是一种在单个TCP连接上进行全双工通信的协议&#xff0c;允许客户端和服务器之间相互发送数据&#xff0c;而不需要像传统的HTTP请求-响应模型那样频繁建立和断开连接。 全双工通信(Full-Duplex Communication)是一种通信模式&#…...

JavaSE——面向对象2:方法的调用机制、传参机制、方法递归、方法重载、可变参数、作用域

目录 一、成员方法 (一)方法的快速入门 (二)方法的调用机制(重要) (三)方法的定义 (四)注意事项和使用细节 1.访问修饰符(作用是控制方法的使用范围) 2.返回的数据类型 3.方法名 4.形参列表 5.方法体 6.方法调用细节说明 (五)传参机制 1.基本数据类型的传参机制 …...

Vue+Flask

App.vue 首先要安装 npm install axios<template><div><h1>{{ message }}</h1><input v-model"name" placeholder"Enter your name" /><input v-model"age" placeholder"Enter your age" /><…...

深入剖析 Android Lifecycle:构建高效稳定的应用

在 Android 开发中&#xff0c;管理应用组件的生命周期是至关重要的。正确处理生命周期事件可以确保应用的性能、稳定性和用户体验。Android Framework 提供了一系列的机制来管理应用组件的生命周期&#xff0c;而android.arch.lifecycle库则为我们提供了更简洁、更灵活的方式来…...

ElasticSearch分词器、相关性详解与聚合查询实战

目录 1. ES分词器详解 1.1 基本概念 1.2 分词发生时期 1.3 分词器的组成 切词器&#xff1a;Tokenizer 词项过滤器&#xff1a;Token Filter 字符过滤器&#xff1a;Character Filter 1.4 倒排索引的数据结构 2. 相关性详解 2.1 什么是相关性&#xff08;Relevance&am…...

删除二叉树中以x为根节点的子树(包括根结点)

已知二叉树以二叉链表存储&#xff0c;编写算法完成&#xff1a;对于树中每个元素值为x的结点&#xff0c;删除以它为根的子树&#xff0c;并释放相应的空间。 思想&#xff1a; 删除二叉树采用后序遍历。先删除左子树&#xff0c;然后右子树&#xff0c;最后根。 利用层次遍…...

Netty 与 WebSocket之间的关系

WebSocketProtocolHandler 和 Netty 在处理 WebSocket 连接时扮演不同的角色&#xff0c;但它们通常是一起使用的&#xff0c;尤其是在基于 Netty 的项目中。为了更好地理解它们之间的区别&#xff0c;我们首先需要了解 WebSocket 和 Netty 的基本概念。 WebSocket WebSocket…...

通信工程学习:什么是CSMA/CA载波监听多路访问/冲突避免

CSMA/CA&#xff1a;载波监听多路访问/冲突避免 CSMA/CA&#xff08;Carrier Sense Multiple Access/Collision Avoidance&#xff09;&#xff0c;即载波监听多路访问/冲突避免&#xff0c;是一种用于数据传输时避免各站点之间冲突的算法&#xff0c;尤其适用于无线局域网&…...

JAVA并发编程系列(13)Future、FutureTask异步小王子

美团本地生活面试&#xff1a;模拟外卖订单处理&#xff0c;客户支付提交订单后&#xff0c;查询订单详情&#xff0c;后台需要查询店铺备餐进度、以及外卖员目前位置信息后再返回。 时间好快&#xff0c;一转眼不到一个月时间&#xff0c;已经完成分享synchronized、volatile、…...

【python爬虫可以获取到谷歌影像吗?】如何有效下载谷歌影像?

【python爬虫可以获取到谷歌影像吗&#xff1f;】如何有效下载谷歌影像&#xff1f; 【python爬虫可以获取到谷歌影像吗&#xff1f;】如何有效下载谷歌影像&#xff1f; 文章目录 【python爬虫可以获取到谷歌影像吗&#xff1f;】如何有效下载谷歌影像&#xff1f;前言1. 使用…...

Windows 上安装 PostgreSQL

Windows 上安装 PostgreSQL PostgreSQL 是一款功能强大的开源关系数据库管理系统,广泛用于各种应用场景。在 Windows 系统上安装 PostgreSQL 相对简单,但需要遵循一系列步骤。本文将详细介绍在 Windows 上安装 PostgreSQL 的过程,并提供一些关键的配置和优化建议。 一、下…...

Vue 技术进阶 day2 数据监视的原理、其他内置指令、自定义指令、生命周期、组件化、VueComponent构造函数

目录 1.Vue监测数据的原理 1.1 原理 1.1.1 数据劫持 1.1.2 观察者模式(Vue内部的实现) 1.1.3 更新组件 1.1.4 计算属性和侦听器 1.2 后添加属性做响应式&#xff08;Vue.set / vm.$set&#xff09; 1.3 对象和数组的响应式 1.4 数据监视案例 2.指令 2.1 内置指令 2.…...

vue.js 原生js app端实现图片旋转、放大、缩小、拖拽

效果图&#xff1a; 旋转 放大&#xff1a;手机上可以双指放大缩小 拖拽 代码实现&#xff1a; html <div id"home" class"" v-cloak><!-- 上面三个按钮 图片自己解决 --><div class"headImage" v-if"showBtn">&l…...

MyBatis的注入问题

对之前文章的补充&#xff1a;MyBatis中的#{}与${}注入问题----原文链接 前言&#xff1a; MyBatis是一个流行的Java持久层框架&#xff0c;用于将对象与数据库中的数据进行映射。然而&#xff0c;如果不当使用&#xff0c;MyBatis也可能受到诸如SQL注入这类的安全问题的影响。…...

基于springboot的评分评教管理系统

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的评分评教管理系统1拥有三种角色 管理员&#xff1a;评价管理、学生管理、评分指标管理、课程管理、教师管理、管理员管理等教师&#xff1a;课程管理、学生管理、个人信…...

C嘎嘎入门篇:类和对象(2)

前言&#xff1a; 上一篇小编讲了类和对象&#xff08;1&#xff09;&#xff0c;当然&#xff0c;在看这篇文章之前&#xff0c;读者朋友们一定要掌握好前面的基础内容&#xff0c;因为这篇和前面息息相关&#xff0c;废话不多说&#xff0c;下面小编就加快步伐&#xff0c;开…...

数据库 - Mongo数据库

目录 前言 一、MongoDB的特点 二、Mongo的核心概念 三、MongoDB的优劣势 四、使用场景 五、MongoDB与其他数据库的对比 六、如何安装MongoDB 七、数据库指令操作 &#xff08;一&#xff09;基本数据库操作 &#xff08;1&#xff09;连接 MongoDB &#xff08;2&am…...

工业控制过等保三级需要的网络安全设备及详细讲解

在工业控制系统&#xff08;ICS&#xff09;的安全性日益受到重视的背景下&#xff0c;网络安全等级保护&#xff08;过等保&#xff09;三级作为一种重要的安全标准&#xff0c;对保障工业控制系统的安全运行有着重要的意义。过等保三级主要针对那些对安全性要求较高的系统&am…...

Android开发高级篇:MVVM框架与数据双向绑定

在Android开发中&#xff0c;MVVM&#xff08;Model-View-ViewModel&#xff09;架构模式以其高效、简洁的特点&#xff0c;成为越来越多开发者的首选。MVVM不仅实现了界面&#xff08;UI&#xff09;与业务逻辑的分离&#xff0c;还通过数据双向绑定技术&#xff0c;极大地简化…...

智能招聘系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;企业管理&#xff0c;招聘信息管理&#xff0c;应聘信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;招聘信息&#xff0c;我的 开发系统&…...

Wireshark抓包GRPC协议查看Protobuf编码内容

1.说明 对通过GRPC协议进行通信的流量进行抓包后&#xff0c; 需要先转换为HTTP2协议&#xff0c; 因为默认解析的HTTP协议和TCP协议无法进行后续的查看操作&#xff0c; 然后再通过加载protobuf文件&#xff0c; 对GRPC内的DATA字段进行解码。 2.抓包 本文为了测试方便&…...

selenium 强制、隐式、显示等待(11种预置条件)

注&#xff1a;显示等待和隐式等待不可混用 强制等待 让当前正在执行的代码线程暂停运行。 示例&#xff1a;在电商网站的商品搜索页面&#xff0c;等待 5 秒之后&#xff0c;点击搜索按钮&#xff0c;如果页面加载速度很快&#xff0c;在 2 秒内生成&#xff0c;那么还需要…...

ffmpeg拉取rtsp网络视频流报错解析

在使用ffmpeg调用api方式对一个rtsp网络视频流拉流播放时&#xff0c;应用程序出现了一些错误提示&#xff0c;并且拉流播放的画面也出现了一些马赛克的现象。所以这里便对应用程序所产生的错误提示进行了详细的研究和分析。这里将分析结果贴在下面&#xff0c;若其他朋友遇到类…...

c# iTextSharp 读取PDF

安装 iTextSharp&#xff1a; 可以通过 NuGet 包管理器安装 iTextSharp&#xff1a; Install-Package itext7创建 PDF 文件&#xff1a; using System; using System.IO; using iText.Kernel.Pdf; using iText.Layout; using iText.Layout.Element;class Program {static voi…...

<<迷雾>> 第5章 从逻辑学到逻辑电路(3)--与门 示例电路

与门及其符号&#xff08;2输入端&#xff09; info::操作说明 鼠标单击开关切换开合状态 系统中使用 半方形半圆形 表示与门 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/cyjsjdmw-examples/assets/circuit/cyjsjdmw-ch05-11…...

Java应用的数据库连接池连接超时处理

Java应用的数据库连接池连接超时处理 大家好&#xff0c;我是微赚淘客返利系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java应用中&#xff0c;数据库连接池是管理数据库连接的重要组件。然而&#xff0c;当数据库负载过高或网…...

机器学习:opencv--摄像头OCR

目录 前言 一、三个函数 1.显示图像 2.点排序 3.透视变换 二、代码实例 1.打开摄像头 2.图像预处理 3.检测特定轮廓 4.对轮廓进行处理 5.释放资源 前言 摄像头OCR指的是利用摄像头捕捉图像中的文字信息&#xff0c;并通过光学字符识别&#xff08;OCR&#xff09;技…...

基于二分查找的动态规划 leetcode 300.最长递增子序列

如题&#xff1a; https://leetcode.cn/problems/longest-increasing-subsequence/description/ 其实常规动态规划的解法就没什么好说的了&#xff0c;有意思的是官方放出了一个二分查找的动态规化解法&#xff0c;时间复杂度能降到O(nlog(n))&#xff0c;但是为什么这样能解&…...

Java8 IntStream流sum的Bug

做. - 力扣&#xff08;LeetCode&#xff09;的时候发现 IntStream流中的sum在相加的过程中会加到突破Int上限导致数据不对&#xff0c;需要装成LongStream流才能有正确的输出。 long sum Arrays.stream(milestones).asLongStream().sum(); 要这样子写&#xff0c;只把sum改…...

西宁电子商务网站建设/免费seo培训

这是松哥之前一个零散的笔记&#xff0c;整理出来分享给大伙&#xff01; MySQL 读写分离在互联网项目中应该算是一个非常常见的需求了。受困于 Linux 和 MySQL 版本问题&#xff0c;很多人经常会搭建失败&#xff0c;今天松哥就给大伙举一个成功的例子&#xff0c;后面有时间再…...

东莞做网站网络公司/品牌宣传推广策划方案

CodeForces - 579E 可以发现结果关于x的函数是一个单谷函数&#xff0c;所以三分。 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAXN 200000 int a[MAXN10],n; double l[MAXN10]; void Read(int &x){char c…...

棋牌网站怎么做优化/云搜索app官网

安装&#xff1a; apt-get install lrzsz rz 上传 sz 下载转载于:https://www.cnblogs.com/hellowego/p/6650031.html...

wordpress主题 tob/推广app的软文案例

每天读一篇一线开发者原创好文问题引入&#xff1a;项目发展&#xff0c;自动化测试需要使用python模拟客户端发送http2.0请求。选型&#xff1a;目前网上盛行的python模拟客户端发送http2.0的库主要为hyper&#xff0c;毫无疑问&#xff0c;大胆一试。选型参考&#xff1a;htt…...

网站制作专业吗/常州网站推广

知识点&#xff1a;string删除最后一个元素也可以用pop_back&#xff08;&#xff09;来实现 还有就是这一段得写在if内&#xff0c;当时sb了思考了一下才明白233 class Solution { public:vector<string>res;void gene(int n,int lc,int rc,string s){if(lcrc&&…...

哈尔滨电子网站建设/快速优化seo

http://blog.csdn.net/yerenyuan_pku/article/details/72620101 SVN是何物 SVN是Subversion的简称&#xff0c;是一款集中式的开源版本控制系统&#xff0c;因为有着明确的权限管理机制&#xff0c;所以为目前国内绝大多数的公司所使用。 何谓集中式&#xff1a;集中式核心在于…...