掌握MySQL就差这一个——超详细讲解Mysql集群技术(包含主从复制,半同步模式,组复制,MHA)

news2024/9/21 12:43:22

Mysql 在服务器中的部署方法

在企业中 90% 的服务器操作系统均为 Linux
在企业中对于 Mysql 的安装通常用源码编译的方式来进行
官网: http://www.mysql.com

1.1 Linux下部署mysql

1 安装依赖性:
[root@mysql_node1 ~]#  yum install cmake gcc-c++ openssl-devel ncurses-devel.x86_64 -y
[root@mysql_node1 ~]# yum install libtirpc-devel-0.2.4-0.16.el7.x86_64.rpm -y  #这个包可以取网站找

2 下载并解压源码包
[root@mysql_node1 ~]# tar zxf mysql-boost-5.7.44.tar.gz
[root@mysql-node10 ~]# cd /root/mysql-5.7.44

3 源码编译安装mysql
[root@mysql_node1 mysql-5.7.44]# cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \      #指定安装路径
-DMYSQL_DATADIR=/data/mysql \                  #指定数据目录
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \     #指定套接字文件
-DWITH_INNOBASE_STORAGE_ENGINE=1 \             #指定启用INNODB存储引擎,默认用myisam
-DWITH_EXTRA_CHARSETS=all \                    #扩展字符集
-DDEFAULT_CHARSET=utf8mb4 \                    #指定默认字符集
-DDEFAULT_COLLATION=utf8mb4_unicode_ci \       #指定默认校验字符集
-DWITH_BOOST=/root/mysql-5.7.44/boost/boost_1_59_0/         #指定c++库依赖

[root@mysql_node1 mysql-5.7.44]# make -j2     #-j2 表示有几个核心就跑几个进程
[root@mysql_node1 mysql-5.7.44# make install

#当cmake出错后如果想重新检测,删除 mysql-5.7.44 中 CMakeCache.txt即可

4 部署mysql
#生成启动脚本
[root@mysql_node1 ~]# dnf install initscripts-10.11.6-1.el9.x86_64 -y
[root@mysql_node1 ~]# cd /usr/local/mysql/support-files/
[root@node1_node1 support-files]# cp mysql.server /etc/init.d/mysqld

#修改环境变量
[root@node1_node1 ~]# vim ~/.bash_profile
export PATH=$PATH:/usr/local/mysql/bin
[root@node1_node1 ~]# source ~/.bash_profile

#生成数据目录
[root@mysql_node1 ~]# useradd -s /sbin/nologin -M mysql
[root@mysql_node1 ~]# mkdir -p /data/mysql
[root@mysql_node1 ~]# chown mysql:mysql /data/mysql/

#修改配置文件
[root@mysql_node1 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql                   #指定数据目录
socket=/data/mysql/mysql.sock         #指定套接字
symbolic-links=0                      #数据只能存放到数据目录中,禁止链接到数据目录

#数据库初始化建立mysql基本数据
[root@mysql_node1 ~]# mysqld --initialize --user=mysql      #记住密码,后面登录用
[root@mysql_node1 ~]# /etc/init.d/mysqld start
[root@mysql_node1 ~]# chkconfig mysqld on

#数据库安全初始化
[root@node1_node1 ~]# mysql_secure_installation    #前两个选no,后面全部选yes

[root@mysql_node1 ~]# mysql -uroot -p123      
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
#如果出现这种情况,可以在/etc/my.cnf再添加两行
[root@mysql_node1 ~]# vim /etc/my.cnf
[client]        #如果你在/etc/my.cnf中更改了socket路径,记得在mysql客户端命令中也使用正确的socket路径
socket=/data/mysql/mysql.sock  
[root@mysql_node1 ~]# /etc/init.d/mysqld restart

[root@mysql_node1 ~]# mysql -uroot -p123
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.44-log Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MySQL [(none)]> 


#需要三个机子,所以另外两个node2和node3也要安装mysql作为salve端,node1作为master端
[root@mysql_node2 ~]# useradd -s /sbin/nologin -M mysql
[root@mysql_node2 ~]# mkdir -p /data/mysql
[root@mysql_node2 ~]# chown mysql:mysql /data/mysql/

[root@mysql_node1 ~]# rsync -al -r /usr/local/mysql root@172.25.254.
20:/usr/local/

[root@mysql_node2 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0a

[client]
socket=/data/mysql/mysql.sock

[root@node1_node2 ~]# vim ~/.bash_profile
export PATH=$PATH:/usr/local/mysql/bin
[root@node1_node2 ~]# source ~/.bash_profile
[root@mysql_node2 ~]# cp /usr/local/mysql/support-files/mysql.server  /etc/init.d/mysqld
[root@mysql_node2 ~]# mysqld --initialize --user=mysql
[root@mysql_node2 ~]# /etc/init.d/mysqld start
[root@mysql_node2 ~]# mysql_secure_installation
[root@mysql_node2 ~]# mysql -uroot -p123
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.44 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MySQL [(none)]>

#node3和node2一样做就ok了

mysql的组从复制

2.1 配置mastesr

[root@mysql_node1 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
log-bin=mysql-bin
server-id=1

[client]
socket=/data/mysql/mysql.sock

[root@mysql_node1 ~]# /etc/init.d/mysqld restart

#进入数据库配置用户权限
[root@mysql_node1 ~]# mysql -p123
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.44 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MySQL [(none)]> create user 'repl'@'%' identified by 'liu';     #生成专门用来做复制的用户,此用户是用于slave端做认证用
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> grant replication slave on *.* to repl@'%';      #对这个用户进行授权
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> show master status;       #查看master的状态
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

[root@mysql_node1 ~]# cd /data/mysql/
[root@mysql_node1 mysql]# mysqlbinlog mysql-bin.000001    #查看二进制日志

2.2 配置salve

[root@mysql_node2 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=2

[client]
socket=/data/mysql/mysql.sock

[root@mysql_node2 ~]# /etc/init.d/mysqld restart 
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 

[root@mysql_node2 ~]# mysql -p123
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.44 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MySQL [(none)]> CHANGE MASTER TO MASTER_HOST='172.25.254.10',MASTER_USER='repl',MASTER_PASSWORD='liu',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

MySQL [(none)]>  start slave;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.25.254.10
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: mysql_node2-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 154
              Relay_Log_Space: 533
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: 739a505f-6479-11ef-9553-000c299a8c10
             Master_Info_File: /data/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

ERROR: No query specified

测试:

#master端
[root@mysql_node1 ~]# mysql -p123
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.44-log Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MySQL [(none)]> CREATE DATABASE liu;
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> CREATE TABLE liu.userlist (
    -> username varchar(20) not null,
    -> password varchar(50) not null
    -> );
Query OK, 0 rows affected (0.02 sec)

MySQL [(none)]> INSERT INTO liu.userlist VALUE ('user1','123');
Query OK, 1 row affected (0.02 sec)

MySQL [(none)]> SELECT * FROM liu.userlist;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 123      |
+----------+----------+
1 row in set (0.00 sec)

#slave端中查看数据是否有同步过来

[root@mysql_node2 ~]# mysql -p123
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.44 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MySQL [(none)]> SELECT * FROM liu.userlist;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 123      |
+----------+----------+
1 row in set (0.00 sec)

MySQL [(none)]> 

2.3 当有数据时添加slave2

#完成基础配置
[root@mysql_node3 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=3

[client]
socket=/data/mysql/mysql.sock

[root@mysql_node3 ~]# /etc/init.d/mysqld restart

#从master节点备份数据
[root@mysql_node1 ~]# mysqldump -uroot -p123 liu > liu.sql
[root@mysql_node1 ~]# scp liu.sql root@172.25.254.30:/mnt/
root@172.25.254.30's password: 
liu.sql                                 100% 1953   828.2KB/s   00:00 


#利用master节点中备份出来的lee.sql在slave2中拉平数据
[root@mysql_node3 ~]# ls /mnt/
liu.sql
[root@mysql_node3 ~]# mysql -uroot -p123 -e "create database liu;"
[root@mysql_node3 ~]# mysql -p123  liu < /mnt/liu.sql
[root@mysql_node3 ~]# mysql -p123 -e "select * from liu.userlist;"
+----------+----------+
| username | password |
+----------+----------+
| user1    | 123      |
+----------+----------+

#配置slave2的slave功能

#在master中查询日志pos
[root@mysql_node1 ~]# mysql -p123 -e "show master status;"
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      799 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

[root@mysql_node3 ~]# mysql -p123
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.44 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MySQL [(none)]> CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='repl',MASTER_PASSWORD='liu', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=799;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

MySQL [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> show slave status;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.25.254.10
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 799
               Relay_Log_File: mysql_node3-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 799
              Relay_Log_Space: 533
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: 739a505f-6479-11ef-9553-000c299a8c10
             Master_Info_File: /data/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

ERROR: No query specified

继续测试:

[root@mysql_node1 ~]# mysql -p123

MySQL [(none)]> INSERT INTO liu.userlist VALUES('user2','123');
Query OK, 1 row affected (0.01 sec)

MySQL [(none)]> select * from liu.userlist;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 123      |
| user2    | 123      |
+----------+----------+
2 rows in set (0.00 sec)


[root@mysql_node3 ~]# mysql -p123

MySQL [(none)]> select * from liu.userlist;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 123      |
| user2    | 123      |
+----------+----------+
2 rows in set (0.00 sec)

2.4 延迟复制

延迟复制时用来控制 sql 线程的,和 i/o 线程无关
这个延迟复制不是 i/o 线程过段时间来复制, i/o 是正常工作的
是日志已经保存在 slave 端了,那个 sql 要等多久进行回放
master 端误操作,可以在 slave 端进行数据备份
#在slave端
[root@mysql_node2 ~]# mysql -p123

MySQL [(none)]> STOP SLAVE SQL_THREAD;
Query OK, 0 rows affected (0.01 sec)

MySQL [(none)]> CHANGE MASTER TO MASTER_DELAY=30;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> START SLAVE SQL_THREAD;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> SHOW SLAVE STATUS\G;

master 中写入数据后过了延迟时间30秒后才能被查询到

2.5 慢查询日志

  • 慢查询,顾名思义,执行很慢的查询
  • 当执行SQL超过long_query_time参数设定的时间阈值(默认10s)时,就被认为是慢查询,这个 SQL语句就是需要优化的
  • 慢查询被记录在慢查询日志里
  • 慢查询日志默认是不开启的
  • 如果需要优化SQL语句,就可以开启这个功能,它可以让你很容易地知道哪些语句是需要优化的。
[root@mysql_node1 ~]# mysql -p123

MySQL [(none)]> SHOW variables like "slow%";
+---------------------+----------------------------------+
| Variable_name       | Value                            |
+---------------------+----------------------------------+
| slow_launch_time    | 2                                |
| slow_query_log      | OFF                              |
| slow_query_log_file | /data/mysql/mysql_node1-slow.log |
+---------------------+----------------------------------+
3 rows in set (0.01 sec)

MySQL [(none)]> SET GLOBAL slow_query_log=ON;   #开启慢查询日志
Query OK, 0 rows affected (0.01 sec)

MySQL [(none)]> SET long_query_time=4;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]>  SHOW VARIABLES like "long%";
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 4.000000 |
+-----------------+----------+
1 row in set (0.00 sec)

MySQL [(none)]> SHOW VARIABLES like "slow%";
+---------------------+----------------------------------+
| Variable_name       | Value                            |
+---------------------+----------------------------------+
| slow_launch_time    | 2                                |
| slow_query_log      | ON                               |   #慢查询日志开启
| slow_query_log_file | /data/mysql/mysql_node1-slow.log |
+---------------------+----------------------------------+
3 rows in set (0.00 sec)

MySQL [(none)]> select sleep (10);
   
[root@mysql_node1 ~]# cat /data/mysql/mysql_node1-slow.log    #慢查询日志
/usr/local/mysql/bin/mysqld, Version: 5.7.44-log (Source distribution). started with:
Tcp port: 3306  Unix socket: /data/mysql/mysql.sock
Time                 Id Command    Argument
# Time: 2024-08-29T12:45:30.792699Z
# User@Host: root[root] @ localhost []  Id:    10
# Query_time: 10.000788  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
SET timestamp=1724935530;
select sleep (10);
# Time: 2024-08-29T12:46:31.747220Z
# User@Host: root[root] @ localhost []  Id:    11
# Query_time: 10.001382  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
SET timestamp=1724935591;
select sleep (10);

2.6 mysql的并行复制

默认情况下 slave 中使用的是 sql 单线程回放
master 中时多用户读写,如果使用 sql 单线程回放那么会造成组从延迟严重
开启 MySQL 的多线程回放可以解决上述问题
在slaves中设定
[root@mysql_node2 ~]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=2
gtid_mode=ON
enforce-gtid-consistency=ON   
slave-parallel-type=LOGICAL_CLOCK     #基于组提交
slave-parallel-workers=16             #开启线程数量
master_info_repository=TABLE          #master信息在表中记录,默认记录在/data/mysql//master.info           
relay_log_info_repository=TABLE       #回放日志信息在表中记录,默认记录在/data/mysql/relay-log.info
relay_log_recovery=ON                #日志回放恢复功能开启


[client]
socket=/data/mysql/mysql.sock

[root@mysql_node2 ~]# /etc/init.d/mysqld restart

[root@mysql_node2 ~]# mysql -p123 -e "show processlist;"
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
| Id | User        | Host      | db   | Command | Time | State                                                  | Info             |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
|  2 | system user |           | NULL | Connect |   28 | Slave has read all relay log; waiting for more updates | NULL             |
|  3 | system user |           | NULL | Connect |   29 | Waiting for an event from Coordinator                  | NULL             |
|  4 | system user |           | NULL | Connect |   29 | Waiting for an event from Coordinator                  | NULL             |
|  5 | system user |           | NULL | Connect |   29 | Waiting for an event from Coordinator                  | NULL             |
|  6 | system user |           | NULL | Connect |   29 | Waiting for an event from Coordinator                  | NULL             |
|  7 | system user |           | NULL | Connect |   29 | Waiting for an event from Coordinator                  | NULL             |
|  8 | system user |           | NULL | Connect |   29 | Waiting for an event from Coordinator                  | NULL             |
|  9 | system user |           | NULL | Connect |   29 | Waiting for an event from Coordinator                  | NULL             |
| 10 | system user |           | NULL | Connect |   29 | Waiting for an event from Coordinator                  | NULL             |
| 11 | system user |           | NULL | Connect |   29 | Waiting for an event from Coordinator                  | NULL             |
| 12 | system user |           | NULL | Connect |   29 | Waiting for an event from Coordinator                  | NULL             |
| 13 | system user |           | NULL | Connect |   29 | Waiting for an event from Coordinator                  | NULL             |
| 15 | system user |           | NULL | Connect |   29 | Waiting for an event from Coordinator                  | NULL             |
| 16 | system user |           | NULL | Connect |   29 | Waiting for an event from Coordinator                  | NULL             |
| 17 | system user |           | NULL | Connect |   29 | Waiting for an event from Coordinator                  | NULL             |
| 18 | system user |           | NULL | Connect |   28 | Waiting for an event from Coordinator                  | NULL             |
| 19 | system user |           | NULL | Connect |   28 | Waiting for an event from Coordinator                  | NULL             |
| 20 | root        | localhost | NULL | Query   |    0 | starting                                               | show processlist |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+

此时sql线程转化为协调线程,16worker负责处理sql协调线程发送过来的处理请求

MySQL 组提交( Group commit )是一个性能优化特性,它允许在一个事务日志同步操作中将多个 事务的日志记录一起写入。这样做可以减少磁盘I/O 的次数,从而提高数据库的整体性能。

2.7 原理解析和架构缺陷

三个线程
实际上主从同步的原理就是基于 binlog 进行数据同步的。在主从复制过程中,会基于 3 个线程来操作,一个主库线程,两个从库线程。
  • 二进制日志转储线程(Binlog dump thread)是一个主库线程。当从库线程连接的时候, 主库可以 将二进制日志发送给从库,当主库读取事件(Event)的时候,会在 Binlog 上加锁,读取完成之 后,再将锁释放掉。
  • 从库 I/O 线程会连接到主库,向主库发送请求更新 Binlog。这时从库的 I/O 线程就可以读取到主库 的二进制日志转储线程发送的 Binlog 更新部分,并且拷贝到本地的中继日志 (Relay log)。
  • 从库 SQL 线程会读取从库中的中继日志,并且执行日志中的事件,将从库中的数据与主库保持同 步。
复制三步骤
步骤 1 Master 将写操作记录到二进制日志( binlog )。
步骤 2 Slave Master binary log events 拷贝到它的中继日志( relay log );
步骤 3 Slave 重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL 复制是异步的且串行化的,而且重启后从接入点开始复制。

具体操作
1.slaves 端中设置了 master 端的 ip ,用户,日志,和日志的 Position ,通过这些信息取得 master 的认证及信息
2.master 端在设定好 binlog 启动后会开启 binlog dump 的线程
3.master 端的 binlog dump 把二进制的更新发送到 slave 端的
4.slave 端开启两个线程,一个是 I/O 线程,一个是 sql 线程,
  • i/o线程用于接收master端的二进制日志,此线程会在本地打开relaylog中继日志,并且保存到本地 磁盘
  • sql线程读取本地relog中继日志进行回放
5. 什么时候我们需要多个 slave
当读取的而操作远远高与写操作时。我们采用一主多从架构
数据库外层接入负载均衡层并搭配高可用机制
架构缺陷
主从架构采用的是异步机制
master 更新完成后直接发送二进制日志到 slave ,但是 slaves 是否真正保存了数据 master 端不会检测
master 端直接保存二进制日志到磁盘
master 端到 slave 端的网络出现问题时或者 master 端直接挂掉,二进制日志可能根本没有到达 slave
master 出现问题 slave 端接管 master ,这个过程中数据就丢失了
这样的问题出现就无法达到数据的强一致性,零数据丢失

三 半同步模式

3.1半同步模式原理

1. 用户线程写入完成后 master 中的 dump 会把日志推送到 slave
2.slave 中的 io 线程接收后保存到 relaylog 中继日志
3. 保存完成后 slave master 端返回 ack
4. 在未接受到 slave ack master 端时不做提交的,一直处于等待当收到 ack 后提交到存储引擎
5. 5.6 版本中用到的时 after_commit 模式, after_commit 模式时先提交在等待 ack 返回后输出 ok

3.2 gtid模式

当为启用 gtid 时我们要考虑的问题
master 端的写入时多用户读写,在 slave 端的复制时单线程日志回放,所以 slave 端一定会延迟与
master
这种延迟在 slave 端的延迟可能会不一致,当 master 挂掉后 slave 接管,一般会挑选一个和 master 延迟日志最接近的充当新的master
那么为接管 master 的主机继续充当 slave 角色并会指向到新的 master 上,作为其 slave
这时候按照之前的配置我们需要知道新的 master 上的 pos id ,但是我们无法确定新的 master slave 之间差多少
当激活 GITD 之后
master 出现问题后, slave2 master 的数据最接近,会被作为新的 master
slave1 指向新的 master ,但是他不会去检测新的 master pos id ,只需要继续读取自己 gtid_next 即可
设置 gtid
#在master端和slave端开启gtid模式
[root@mysql_node1 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
log-bin=mysql-bin
server-id=1
gtid_mode=ON
enforce-gtid-consistency=ON

[client]
socket=/data/mysql/mysql.sock
[root@mysql_node1 ~]# /etc/init.d/mysqld restart

[root@mysql_node2 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=2
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=ON

[client]
socket=/data/mysql/mysql.sock
[root@mysql_node2 ~]# /etc/init.d/mysqld restart

[root@mysql_node3 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=3
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=ON

[client]
socket=/data/mysql/mysql.sock
[root@mysql_node3 ~]# /etc/init.d/mysqld restart


#停止slave端
[root@mysql_node2 ~]# mysql -p123

MySQL [(none)]> stop slave;
Query OK, 0 rows affected (0.00 sec)

[root@mysql_node3 ~]# mysql -p123

MySQL [(none)]> stop slave;
Query OK, 0 rows affected (0.00 sec)


#开启slave端的gtid      #slave1和slave2都要开
MySQL [(none)]> CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='repl',MASTER_PASSWORD='liu', MASTER_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

MySQL [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.25.254.10
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 154
               Relay_Log_File: mysql_node2-relay-bin.000002
                Relay_Log_Pos: 367
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 154
              Relay_Log_Space: 580
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: 739a505f-6479-11ef-9553-000c299a8c10
             Master_Info_File: /data/mysql/master.info
                    SQL_Delay: 30
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 1       #功能开启
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

ERROR: No query specified

3.3.启用半同步模式

master 端配置启用半同步模式
[root@mysql_node1 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
log-bin=mysql-bin
server-id=1
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_master_enabled=1

[client]
socket=/data/mysql/mysql.sock
#先不重启mysql,会报错

[root@mysql_node1 ~]# mysql -p123

MySQL [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';   #安装半同步插件
Query OK, 0 rows affected (0.01 sec)

MySQL [(none)]> SELECT PLUGIN_NAME, PLUGIN_STATUS     
    -> FROM INFORMATION_SCHEMA.PLUGINS
    -> WHERE PLUGIN_NAME LIKE '%semi%';      #查看插件情况
+----------------------+---------------+
| PLUGIN_NAME          | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE        |
+----------------------+---------------+
1 row in set (0.00 sec)
 
MySQL [(none)]> SET GLOBAL rpl_semi_sync_master_enabled = 1;    #打开半同步功能
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> SHOW VARIABLES LIKE 'rpl_semi_sync%';      #查看半同步功能状态
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 10000      |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.01 sec)

MySQL [(none)]>  SHOW STATUS LIKE 'Rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 0     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)

MySQL [(none)]> show plugins;
slave 端开启半同步功能
[root@mysql_node2 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=2
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_slave_enabled=1    #开启半同步功能

[client]
socket=/data/mysql/mysql.sock

[root@mysql_node2 ~]# mysql -p123

MySQL [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled =1;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> STOP SLAVE IO_THREAD;    #重启io线程,半同步才能生效
Query OK, 0 rows affected (0.01 sec)

MySQL [(none)]> START SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> SHOW VARIABLES LIKE 'rpl_semi_sync%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.01 sec)

MySQL [(none)]> SHOW STATUS LIKE 'Rpl_semi_sync%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row in set (0.00 sec)


[root@mysql_node3 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=3
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_slave_enabled=1

[client]
socket=/data/mysql/mysql.sock

[root@mysql_node3 ~]# mysql -p123

MySQL [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.01 sec)

MySQL [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled =1;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> START SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> SHOW VARIABLES LIKE 'rpl_semi_sync%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.01 sec)

3.4.测试

master 端写入数据
[root@mysql_node1 ~]# mysql -p123

MySQL [(none)]> insert into liu.userlist values ('user3','123');
Query OK, 1 row affected (0.05 sec)

MySQL [(none)]> SHOW STATUS LIKE 'Rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 2     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 2     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 1363  |
| Rpl_semi_sync_master_tx_wait_time          | 1363  |
| Rpl_semi_sync_master_tx_waits              | 1     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 1     |
+--------------------------------------------+-------+
14 rows in set (0.01 sec)
模拟故障:
#在slave端
[root@mysql_node2 ~]# mysql -p123

MySQL [(none)]> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)

[root@mysql_node3 ~]# mysql -p123

MySQL [(none)]> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)


#在master端插入数据
MySQL [(none)]> insert into liu.userlist values ('user4','123');
Query OK, 1 row affected (10.00 sec)               #10秒超时

MySQL [(none)]> SHOW STATUS LIKE 'Rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 3     |
| Rpl_semi_sync_master_no_times              | 1     |
| Rpl_semi_sync_master_no_tx                 | 1     | #一笔数据为同步
| Rpl_semi_sync_master_status                | OFF   | #自动转为异步模式,当slave恢复
| Rpl_semi_sync_master_timefunc_failures     | 0     | #会自动恢复
| Rpl_semi_sync_master_tx_avg_wait_time      | 1363  |
| Rpl_semi_sync_master_tx_wait_time          | 1363  |
| Rpl_semi_sync_master_tx_waits              | 1     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 1     |
+--------------------------------------------+-------+
14 rows in set (0.01 sec)

mysql高可用之组复制 (MGR)

MySQL Group Replication( 简称 MGR ) MySQL 官方于 2016 12 月推出的一个全新的高可用与高扩展的解决方案
组复制是 MySQL 5.7.17 版本出现的新特性,它提供了高可用、高扩展、高可靠的 MySQL 集群服务
MySQL 组复制分单主模式和多主模式,传统的 mysql 复制技术仅解决了数据同步的问题,
MGR 对属于同一组的服务器自动进行协调。对于要提交的事务,组成员必须就全局事务序列中给定事务的顺序达成一致
提交或回滚事务由每个服务器单独完成,但所有服务器都必须做出相同的决定
如果存在网络分区,导致成员无法达成事先定义的分割策略,则在解决此问题之前系统不会继续进行,这是一种内置的自动裂脑保护机制
MGR 由组通信系统 ( Group Communication System GCS ) 协议支持
该系统提供故障检测机制、组成员服务以及安全且有序的消息传递

4.1 组复制流程

首先我们将多个节点共同组成一个复制组,在执行读写( RW )事务的时候,需要通过一致性协议层(Consensus 层)的同意,也就是读写事务想要进行提交,必须要经过组里 大多数人 (对应 Node 节点)的同意,大多数指的是同意的节点数量需要大于 (N/2+1 ),这样才可以进行提交,而不是原发起方一个说了算。而针对只读(RO )事务则不需要经过组内同意,直接 提交 即可

注意:节点数量不能超过9

4.2 组复制单主和多主模式

single-primary mode( 单写或单主模式 )
单写模式 group 内只有一台节点可写可读,其他节点只可以读。当主服务器失败时,会自动选择新的主服务器

multi-primary mode( 多写或多主模式 )
组内的所有机器都是 primary 节点,同时可以进行读写操作,并且数据是最终一致的。

4.3.实现mysql组复制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2086589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

django(二):第一个项目

接上文&#xff0c;django&#xff08;一&#xff09;&#xff1a;项目搭建开始开发第一个项目。 1. 新建app 创建一个app应用&#xff0c;取名为company。 python manage.py startapp company注册app到settings.py文件中。 2.实现Model层 settings.py文件中配置数据库&am…

软件测试学习笔记丨静态测试与代码审计 SonarQube

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32049 一&#xff0c;SonarQube 平台搭建 1.1&#xff0c; 介绍 Sonar 是一个用于代码质量管理的开放平台。通过插件机制&#xff0c;Sonar 可以集成不同的测试工具、代码分析工具&#xff…

FATE Board 执行流程探索

背景介绍 FATE Board 是 FATE 提供的一个工程&#xff0c;用于给 FATE 提供可视化能力&#xff0c;方便在联邦学习训练中实时查看执行状态&#xff0c;更好地定位执行中遇到的问题。 查看 FATE 架构可以看到 FATE Board 是建立在 MySQL 和 FATE Flow Server 的基础上的&#…

Unity(2022.3.41LTS) - 着色器

目录 一、着色器的基本概念 二、表面着色器 一、着色器的基本概念 定义与作用&#xff1a; 着色器是一种在图形硬件上运行的程序&#xff0c;用于控制物体的颜色、纹理、光照、透明度等视觉属性。它通过对输入的几何数据&#xff08;如顶点位置、法线、纹理坐标等&#xff09…

某地级市攻防演练突破边界实战

0x1前言 今年某地级市的攻防中&#xff0c;前期通过fofa、google语法、天眼查等待信息收集获取到了某集团的单位后台后台是这样的&#xff0c;当看到这个后台系统时候脸上 不直接也就微笑了起来。最近风声紧&#xff0c;所有厚码希望大家多多理解&#xff08;我也怕死啊呜呜呜…

【MRI基础】k空间基本属性

K 空间本质上是一个矩阵&#xff0c;用于存储从 MRI 扫描仪获得的原始数据。这些数据是在扫描过程中收集的&#xff0c;K 空间中的每个点代表被扫描身体发出的 MRI 信号的不同频率和相位。存储在 K 空间中的数据不是图像形式&#xff0c;而是包含重建图像所需的所有空间频率信息…

灵办 AI:免费智能利器,开启高效办公与智能创作学习新时代

目录 引言一、初识灵办AI—开启智能办公二、灵办 AI 的强大功能解析1. 多语言翻译2. AI 对话功能3. AI 阅读功能4. AI 代码助手功能 三、灵办 AI 的其他优点四、结语 引言 在当今快节奏的时代&#xff0c;技术人员们都在努力寻觅能够提高工作效率、助力学习创作的工具。我同样…

YOLO | YOLO目标检测算法(YOLO-V1)

github&#xff1a;https://github.com/MichaelBeechan CSDN&#xff1a;https://blog.csdn.net/u011344545 YOLO目标检测算法 YOLO V1概述&#xff08;2016&#xff09; YOLO V1概述&#xff08;2016&#xff09; 经典的One-stage方法 YOLO&#xff1a;You Only Look Once 把…

4.sklearn-K近邻算法、模型选择与调优

文章目录 环境配置&#xff08;必看&#xff09;头文件引用1.sklearn转换器和估计器1.1 转换器 - 特征工程的父类1.2 估计器(sklearn机器学习算法的实现) 2.K-近邻算法2.1 简介&#xff1a;2.2 K-近邻算法API2.3 K-近邻算法代码2.4 运行结果2.5 K-近邻算法优缺点 3.模型选择与调…

uni-app插槽(默认插槽,命名插槽,作用域插槽)

目录 什么是插槽? 基本概念 默认插槽 命名插槽 作用域插槽 场景一:子插槽向父组件传递一个字符串 场景二:子插槽向父组件传递对象 什么是插槽? 在 UniApp 中&#xff0c;插槽&#xff08;Slot&#xff09;是一种允许父组件向子组件特定位置插入HTML内容的方式。这种方式使得组…

ROS 2 Jazzy和QT组合开发教程

ROS2 Jazzy和QT组合开发教程 ROS2 和 Qt 组合开发是一个强大且灵活的组合&#xff0c;可以用来构建具有 GUI 的机器人应用程序。这个组合让你能够将 Qt 的图形界面与 ROS 2 的分布式通信功能结合在一起&#xff0c;实现数据的展示、机器人控制、调试等功能。 环境如下&#x…

掌握人事管理,这张报表帮你轻松搞定

在人事管理中&#xff0c;数据分析的重要性不言而喻。无论是了解员工的整体情况&#xff0c;还是洞察人才流失的原因&#xff0c;数据都能为我们提供有力的支持。但是&#xff0c;面对海量的数据&#xff0c;很多HR都会感到不知所措。那么&#xff0c;如何通过一张报表解决所有…

数字化转型升级探索(三)

在数字化转型升级的探索过程中&#xff0c;我们将通过深入应用人工智能、物联网、大数据和云计算等技术&#xff0c;全面重塑业务流程和运营模式&#xff0c;推动信息流、业务流和价值流的高度融合&#xff0c;实现从传统手工操作到智能自动化的全方位升级&#xff0c;提升业务…

【Python报错已解决】`SyntaxError`:`invalid syntax`

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 在Python编程中&#xff0c;SyntaxError是最常见的错误类型之一&#xff0c;它表示代码中存在语法错误。本文将探讨一个具…

★ 算法OJ题 ★ 力扣202 - 快乐数

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将和大家一起做一道双指针算法题--快乐数~ 目录 一 题目 二 算法解析 三 编写算法 一 题目 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 二 算法解析 题⽬告诉我们&#xff0c;当我们不断重复操作…

数字化转型升级探索(四)

在数字化转型升级的探索中&#xff0c;我们将致力于通过整合先进的技术手段&#xff0c;如人工智能、区块链、大数据和云计算&#xff0c;全面改造传统业务模式&#xff0c;实现智能化运营和数据驱动决策&#xff0c;从而提高企业的效率与灵活性&#xff1b;通过实施全新的数字…

【微处理器系统原理与设计应用入门】典型的微处理器及系统

一. 基于微处理器的系统结构 首先明确什么是处理器&#xff1f; 我们在设计一个系统完成一个功能时&#xff0c;必不可少的一个环节就是信息处理&#xff0c;我们人脑处理信息是依靠神经系统传递神经冲动&#xff0c;而对于机器而言需要指令来完成信息处理&#xff0c;所以一…

Golang 小项目(3)

Golang 小项目(3) 前言 本项目适合 Golang 初学者,通过简单的项目实践来加深对 Golang 的基本语法和 Web 开发的理解。 前往 torna.top 免费查阅 项目结构 D:. ├─ go.mod ├─ go.sum │ ├─cmd │ └─main │ main.go │ └─pkg├─config│ app.go│…

CSDN的技术人员真牛,3分钟定位到问题所在

加密社 昨天晚上&#xff0c;我为了方便写文后一键同步至我的其他账号&#xff0c;安装了个浏览器插件 然后今天一来&#xff0c;我发现csdn的内容管理-创作者平台打不开了 我试了各种办法&#xff0c; 包括清缓存&#xff0c;换浏览器重试&#xff0c;换网络&#xff0c;重…

14%电抗器可以过滤几次谐波

14%电抗器&#xff08;也称为14%阻抗电抗器&#xff09;是一种用于限制电流谐波的设备&#xff0c;主要通过增加系统的阻抗来减少谐波电流的幅度。它的“14%”表示电抗器的阻抗相对于电力变压器的额定阻抗的比例&#xff0c;即电抗器的阻抗是变压器阻抗的14%。 一、谐波过滤能力…