mysql源码编译安装、mysql的主从复制、IOSQL线程优化

news2024/12/26 14:02:50

文章目录

  • 前言
  • 一、mysql源码编译安装
  • 二、主从复制
    • 1.主从复制的作用、原理
    • 2.实验过程
  • 三、gtid模式
  • 四、半同步模式:优化IO线程
  • 五、并行复制/多线程复制:优化SQL线程
  • 六、延迟复制


前言

mysql是现在普遍使用的数据库,但是如果宕机了必然会造成数据丢失。为了保证mysql数据库的可靠性。就要会一些提高可靠性的技术。
为什么要主从复制、读写分离
主从复制、读写分离一般是一起使用的。目的很简单,就是为了提高数据库的并发性能。你想,假设是单机,读写都在一台MySQL上面完成,性能肯定不高。如果有三台MySQL,一台mater只负责写操作,两台salve只负责读操作,性能不就能大大提高了吗?
所以主从复制、读写分离就是为了数据库能支持更大的并发。
随着业务量的扩展、如果是单机部署的MySQL,会导致I/O频率过高。采用主从复制、读写分离可以提高数据库的可用性。


一、mysql源码编译安装

官网: www.mysql.com
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
下载之后,解压编译安装
[root@server1 ~]# tar xf mysql-boost-5.7.40.tar.gz
[root@server1 ~]# cd mysql-5.7.40/
需要使用cmake进行mysql的编译安装,所以我们先下载好cmake、gcc-c++
然后用cmake、make、make install来编译安装,在这个过程中我们可以看到进度百分比,这是比之前方便的地方
[root@server1 mysql-5.7.40]# yum install -y cmake gcc-c++ bsion
[root@server1 mysql-5.7.40]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_BOOST=/root/mysql-5.7.40/boost/boost_1_59_0
[root@server1 mysql-5.7.40]# make
也可以用make -j2编译,意思为起两个进程一起编译
[root@server1 mysql-5.7.40]# make install
拷贝启动脚本
[root@server1 mysql-5.7.40]# cd /usr/local/mysql/
[root@server1 mysql]# cd support-files/
[root@server1 support-files]# cp mysql.server /etc/init.d/mysqld
修改mysql配置文件
在这里插入图片描述
初始化数据库
[root@server1 ~]# mkdir /data/mysql -p
创建仅用于启动mysql的用户;-M默认不创建用户主目录,-s给不给交互式权限
[root@server1 ~]# useradd -M -d /data/mysql/ -s /sbin/nologin mysql
用mysql的用户的身份写数据
[root@server1 ~]# chown mysql.mysql /data/mysql/
方便调用命令
在这里插入图片描述
[root@server1 ~]# source .bash_profile
mysqld是后台参数,数据库启动前必须做初始化
[root@server1 ~]# mysqld --initialize --user=mysql
在这里插入图片描述
启动服务
[root@server1 ~]# /etc/init.d/mysqld start
Starting MySQL.Logging to ‘/data/mysql/server1.err’.
SUCCESS!
[root@server1 ~]# netstat -antlp|grep :3306
tcp6 0 0 :::3306 ::😗 LISTEN 13856/mysqld

安全初始化
[root@server1 ~]# mysql_secure_installation
Securing the MySQL server deployment.

Enter password for user root:                    #输入上面生成的临时密码

The existing password for the user account root has expired. Please set a new password.

New password:	                                 #输入两遍新密码

Re-enter new password:

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No:	     #是否激活密码插件,直接回车
Using existing password for root.
Change the password for root ? ((Press y|Y for Yes, any other key for No) :
                                                 #是否再次修改管理员密码,直接回车
 ... skipping.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.
                                                 #是否删除匿名用户,输入 y

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.
                                                 #是否禁用root远程登录,输入 y
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.
                                                  #是否删除test数据库,输入 y
 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.
                                                  #刷新授权表
All done!
登录数据库
[root@server1 ~]# mysql -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.40 Source distribution

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.

mysql> show databases;             ##显示库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

二、主从复制

1.主从复制的作用、原理

作用:

做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的评率,提高单个机器的I/O性能。
读写分离,使数据库能支持更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。
1–在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;(主库写,从库读,降压)
2–在从主服务器进行备份,避免备份期间影响主服务器服务;(确保数据安全)
3–当主服务器出现问题时,可以切换到从服务器。(提升性能)

原理:

当Master节点进行insert、update、delete操作时,会按顺序写入到binlog中。
salve从库连接master主库,Master有多少个slave就会创建多少个binlog dump线程。
当Master节点的binlog发生变化时,binlog dump 线程会通知所有的salve节点,并将相应的binlog内容推送给slave节点。
I/O线程接收到 binlog 内容后,将内容写入到本地的 relay-log,即中继日志,持久化到磁盘。
SQL线程读取I/O线程写入的relay-log,并且根据 relay-log 的内容对从数据库做对应的操作,即回放。
在这里插入图片描述在这里插入图片描述

2.实验过程

server2直接建立为slave,server3先演示数据库的备份,在做成slave;
master配置

参数从官方网站复制而来;以下为生成二进制文件在这里插入图片描述
重启服务
[root@server1 ~]# /etc/init.d/mysqld restart
创建复制用户
[root@server1 ~]# mysql -pwestos
mysql> CREATE USER ‘repl’@‘%’ IDENTIFIED BY ‘westos’; ##创建专门用于复制的用户repl,允许从除了localhost之外的所有主机,密码为westos
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT REPLICATION SLAVE ON . TO ‘repl’@‘%’; ##repl用户可以从任何主机登录,具备所有库所有表的复制权限
Query OK, 0 rows affected (0.00 sec)
mysql> show master status;
±-----------------±---------±-------------±-----------------±------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±-----------------±---------±-------------±-----------------±------------------+
| mysql-bin.000001 | 595 | | | | ##mysql-bin.000001生成的二进制日志
±-----------------±---------±-------------±-----------------±------------------+
1 row in set (0.00 sec)

slave配置
新建数据库实例server2

[root@server1 ~]# scp -r /usr/local/mysql/ server2:/usr/local/
[root@server2 ~]# vim .bash_profile(和server1步骤一致)
在这里插入图片描述
[root@server2 ~]# source .bash_profile
[root@server2 ~]# cd /usr/local/mysql
[root@server2 mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@server2 mysql]# useradd -M -d /data/mysql/ -s /sbin/nologin mysql
[root@server2 mysql]# mkdir -p /data/mysql
[root@server2 mysql]# chown mysql.mysql /data/mysql/
[root@server2 ~]# vim /etc/my.cnf【数据从master,不需要激活二进制】
在这里插入图片描述
初始化数据库
[root@server2 mysql]# mysqld --initialize --user=mysql
开启数据库
[root@server2 mysql]# /etc/init.d/mysqld start
安全初始化
[root@server2 mysql]# mysql_secure_installation
在这里插入图片描述
测试
测试数据同步(仅在server2测试,server3的设置和测试在后面)

master创建测试数据库
[root@server1 ~]# mysql -pwestos
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> create database westos;         ##创建westos库
Query OK, 1 row affected (0.00 sec)

mysql> use westos;

mysql> create table user_tb (              ##创建user_tb表
    -> username varchar(25) not null,
    ->  password varchar(50) not null);
Query OK, 0 rows affected (0.00 sec)

mysql> desc user_tb;                 
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(25) | NO   |     | NULL    |       |
| password | varchar(50) | NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> insert into user_tb values ('user1','123');     ##插入数据
Query OK, 1 row affected (0.00 sec)

mysql> insert into user_tb values ('user2','456');     ##插入数据
Query OK, 1 row affected (0.00 sec)
slave server2查看数据:
[root@server2 mysql]# mysql -pwestos
mysql> show databases;         ##westos库已同步
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| westos             |
+--------------------+
5 rows in set (0.00 sec)
mysql> use westos           ##进入westos库
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;         ##显示表
+------------------+
| Tables_in_westos |
+------------------+
| user_tb          |
+------------------+
1 row in set (0.00 sec)

mysql> select * from user_tb;  ##查看表内数据,已同步
+----------+----------+
| username | password |
+----------+----------+
| user1    | 123      |
| user2    | 456      |
+----------+----------+
2 rows in set (0.01 sec)

再添加一个slave server3

[root@server1 ~]# scp -r /usr/local/mysql/ server3:/usr/local/
[root@server3 ~]# vim .bash_profile
[root@server3 ~]# source .bash_profile
[root@server3 ~]# mkdir -p /data/mysql
[root@server3 ~]# useradd -M -d /data/mysql/ -s /sbin/nologin mysql
[root@server3 ~]# chown mysql.mysql /data/mysql/
[root@server3 ~]# vim /etc/my.cnf
在这里插入图片描述
[root@server3 ~]# mysqld --initialize --user=mysql
[root@server3 ~]# cd /usr/local/mysql/
[root@server3 mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@server3 mysql]# /etc/init.d/mysqld start
[root@server3 mysql]# mysql_secure_installation

master备份数据库

[root@server1 ~]# mysqldump -pwestos westos > dump.sql
[root@server1 ~]# scp dump.sql server3:
注意:
生产环境中备份时master主机需要锁表,保证备份前后的数据一致
在这里插入图片描述
注意:
mysqldump命令备份的数据文件,在还原时先DROP TABLE,需要合并数据时需要删除此语句,要不然会造成数据丢失
在这里插入图片描述
[root@server1 ~]# mysql -pwestos
mysql> show master status;
±-----------------±---------±-------------±-----------------±------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±-----------------±---------±-------------±-----------------±------------------+
| mysql-bin.000001 | 1534 | | | |
±-----------------±---------±-------------±-----------------±------------------+
1 row in set (0.00 sec)

salve server3还原数据库、并设为slave

[root@server3 ~]# mysqladmin -pwestos create westos
[root@server3 ~]# mysql -pwestos westos < dump.sql

[root@server3 ~]# mysql -pwestos
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| westos             |
+--------------------+
5 rows in set (0.00 sec)

mysql> use westos
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from user_tb;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 123      |
| user2    | 456      |
+----------+----------+
2 rows in set (0.00 sec)

mysql> CHANGE MASTER TO MASTER_HOST='192.168.56.11', MASTER_USER='repl', MASTER_PASSWORD='westos', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1534;              ##因为数据已经备份,MASTER_LOG_POS=1534号比较server2有改变,从1534开始复制即可
Query OK, 0 rows affected, 2 warnings (0.01 sec)

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

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.56.11
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1534
               Relay_Log_File: server3-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
...

测试主从同步:
一主两从架构完成,更新master,slave的数据会同步;复制是单向的,只能在master上操作

[root@server1 ~]# mysql -pwestos
mysql> insert into westos.user_tb values (‘user3’,‘666’);
Query OK, 1 row affected (0.00 sec)
[root@server2 mysql]# mysql -pwestos
mysql> select * from westos.user_tb;
±---------±---------+
| username | password |
±---------±---------+
| user1 | 123 |
| user2 | 456 |
| user3 | 666 |
±---------±---------+
3 rows in set (0.00 sec)
[root@server3 mysql]# mysql -pwestos
mysql> select * from westos.user_tb;
±---------±---------+
| username | password |
±---------±---------+
| user1 | 123 |
| user2 | 456 |
| user3 | 666 |
±---------±---------+
3 rows in set (0.00 sec)

三、gtid模式

gtid,让我们在设置主从模式时,降低了复杂度,更加方便,尤其是主从切换时更加方便

GTID概念介绍
GTID即全局事务ID (global transaction identifier), 其保证为每一个在主上提交的事务在复制集群中可以生成一个唯一的ID。GTID最初由google实现,官方MySQL在5.6才加入该功能。mysql主从结构在一主一从情况下对于GTID来说就没有优势了,而对于2台主以上的结构优势异常明显,可以在数据不丢失的情况下切换新主。使用GTID需要注意: 在构建主从复制之前,在一台将成为主的实例上进行一些操作(如数据清理等),通过GTID复制,这些在主从成立之前的操作也会被复制到从服务器上,引起复制失败。也就是说通过GTID复制都是从最先开始的事务日志开始,即使这些操作在复制之前执行。比如在server1上执行一些drop、delete的清理操作,接着在server2上执行change的操作,会使得server2也进行server1的清理操作。
GTID实际上是由UUID+TID (即transactionId)组成的。其中UUID(即server_uuid) 产生于auto.conf文件(cat /data/mysql/data/auto.cnf),是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增,所以GTID能够保证每个MySQL实例事务的执行(不会重复执行同一个事务,并且会补全没有执行的事务)。GTID在一组复制中,全局唯一。
gtid在官网位置
在这里插入图片描述

master配置:

[root@server1 mysql]# vim /etc/my.cnf
...
log-bin=mysql-bin
server-id=1
gtid_mode=ON                  ##gtid模式开启
enforce-gtid-consistency=ON     ##强制使用gtid模式

重启服务
[root@server1 mysql]# /etc/init.d/mysqld restart

slave配置:server2和server3配置一致

[root@server2 ~]# vim /etc/my.cnf
...
server-id=2
gtid_mode=ON
enforce-gtid-consistency=ON

重启服务
[root@server2 ~]# /etc/init.d/mysqld restart

[root@server2 ~]# mysql -pwestos
#首先停止slave
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

#重新配置
mysql> CHANGE MASTER TO MASTER_HOST='192.168.56.11', MASTER_USER='repl', MASTER_PASSWORD='westos', MASTER_AUTO_POSITION = 1; 
                     ##MASTER_AUTO_POSITION = 1:自动
Query OK, 0 rows affected, 2 warnings (0.00 sec)

#再次启动
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.56.11
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 154
               Relay_Log_File: server2-relay-bin.000002
                Relay_Log_Pos: 367
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes      ##出现yes即可
            Slave_SQL_Running: Yes      ##出现yes即可

概念:
异步
一般情况下MySQL默认复制模式为异步,何为异步?简单的说就是主服务器上的I/O threads 将binlog写入二进制日志中就返回给客户端一个结果,无需等待二进制日志是否成功发送到从库和从库上是否成功完成relay log的写入以及SQL threads从relay log中提取二进制日志写入自己binlog的过程,异步模式的缺点就是一旦主库写入binlog日志后发生宕机,此时从库还未完成对主库传送过来binlog的读写存储操作,那么从库就会发生数据丢失的现象。所以这里就出现了另外一种复制模式,即半同步模式。
半同步
在半同步模式下,主库将binlog日志信息写入到日志中,然后等待从库完成后面的接收读取和存储操作,并返回主库一个明确信息,即从库接收完主库传递过来的binlog内容已经写入到自己的relay log中,才会通知主库上的等待线程,该操作已经完成,此时主库接收到从库发过来的信息就会进入下一个同步操作动作,如果在此时等待超时,超过主库中设置的超时时间限制(一般是rpl_semi_sync_master_timeout的值),则关闭半同步,并切换为异步模式,直到至少有一台从库告诉主库已经接收到主库传送过来的binlog信息为止。

四、半同步模式:优化IO线程

半同步模式必须走gtid
在异步复制已设置完成的前提下,继续配置半同步复制。半同步复制是使用插件实现的,所以插件必须安装到服务器才能使用
master发送日志后,等待slave回复ACK
在这里插入图片描述
master配置:

#安装半同步模块
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.01 sec)

mysql> 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> SET GLOBAL rpl_semi_sync_master_enabled = 1;    #激活master半同步模式
Query OK, 0 rows affected (0.00 sec)

mysql> 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          |   ##1个slave数量回应就可以进行引擎提交
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.00 sec)

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';               #查看半同步状态
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 2     |  ##2个slave
| 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)

半同步参数写入配置文件,确保重启后依然生效
[root@server1 mysql]# vim /etc/my.cnf
...
log-bin=mysql-bin
server-id=1
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_master_enabled=1                    ##保证重启后依然生效1=on

slave配置:

安装半同步模块
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.00 sec)

mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;
Query OK, 0 rows affected (0.00 sec)

mysql> STOP SLAVE IO_THREAD;           #需要重启IO线程,slave端的半同步才能生效
Query OK, 0 rows affected (0.00 sec)

mysql> START SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)

mysql> 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.00 sec)

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

#半同步参数写入配置文件
[root@server2 ~]# vim /etc/my.cnf
server-id=2
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_slave_enabled=1     ##确保重启生效

测试

master写入数据:
mysql> insert into westos.user_tb values ('user6','666');
Query OK, 1 row affected (0.01 sec)

mysql> 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      | 2096  |
| Rpl_semi_sync_master_tx_wait_time          | 2096  |
| 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     |		#显示通过半同步复制的数据有1+--------------------------------------------+-------+
14 rows in set (0.00 sec)

停止所有slave节点的IO线程:
mysql> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)

master节点再次写入数据:
mysql> insert into westos.user_tb values ('user7','666');
Query OK, 1 row affected (10.00 sec)
##等待默认超时时间10秒后,mysql自动切换为异步模式;实际生产环境,超时时间为无穷大。

mysql> 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             | 4     |
| Rpl_semi_sync_master_no_times              | 1     |
| Rpl_semi_sync_master_no_tx                 | 1     |	#显示未通过半同步模式复制的数据有1| Rpl_semi_sync_master_status                | OFF   |	#半同步模式关闭
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 2096  |
| Rpl_semi_sync_master_tx_wait_time          | 2096  |
| 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节点再次启动IO线程,mysql会自动切回半同步模式
mysql> START SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)

五、并行复制/多线程复制:优化SQL线程

在slave端设置,只能降低延时,不能消除延时

默认slave节点sql单线程回放,会造成数据同步延时较高
slave节点添加以下参数
[root@server2 ~]# vim /etc/my.cnf

slave-parallel-type=LOGICAL_CLOCK###基于组提交
slave-parallel-workers=16###启用16个work,根据实际需求修改
master_info_repository=TABLE ###记录master信息至表(默认是file)
relay_log_info_repository=TABLE###记录relay信息至表(默认是file)
relay_log_recovery=ON

重启服务
[root@server2 ~]# /etc/init.d/mysqld restart
Shutting down MySQL… SUCCESS!
Starting MySQL. SUCCESS!
[root@server2 ~]# mysql -pwestos
可以看到多开了16个线程
在这里插入图片描述

六、延迟复制

延迟复制可以设置副本服务器故意落后于源至少指定的时间
STOP SLAVE SQL_THREAD;
CHANGE MASTER TO MASTER_DELAY=60; ##延迟60秒
START SLAVE SQL_THREAD;


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

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

相关文章

用PS设置宽480像素*高640像素,分辨率300dpi,24位真彩色 大小限制20K到40K之间的照片

最近需要设置一组照片&#xff0c;是学生录取大学的电子照片&#xff0c;具体要求如下&#xff1a;宽480像素*高640像素&#xff0c;分辨率300dpi&#xff0c;24位真彩色 大小限制20K到40K之间&#xff1b;照片底色为白色或者蓝色&#xff0c;其他颜色均不符合条件。首先&#…

python+pytest接口自动化(3)-接口测试一般流程及方法

首先我们要明确&#xff0c;通常所接口测试其实就属于功能测试&#xff0c;主要校验接口是否实现预定的功能&#xff0c;虽然有些情况下可能还需要对接口进行性能测试、安全性测试。在学习接口自动化测试之前&#xff0c;我们先来了解手工接口测试怎样进行。URL组成为了更好的理…

数学建模介绍

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a; &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大的激励…

【分布式系统】MinIO之Multi-Node Multi-Drive架构分析

文章目录架构分析节点资源硬盘资源服务安装安装步骤创建系统服务新建用户和用户组创建环境变量启动服务负载均衡代码集成注意最近打算使用MinIO替代原来使用的FastDFS&#xff0c;所以一直在学习MinIO的知识。这篇文章是基于MinIO多节点多驱动的部署进行研究。 架构分析 节点资…

迁移系统:换电脑或者硬盘转移磁盘文件的方法!

为什么要将操作系统迁移到新驱动&#xff1f; “将操作系统转移到新驱动您好&#xff0c;我刚刚为我的台式机订购了一个新的2TB希捷Barracuda硬盘&#xff0c;我想知道如何将我的Windows 10操作系统与我下载的其他一些软件一起转移过来。我使用新的/大的硬盘&#xff0c;然…

SpringBoot配置文件(properties yml)

查看官网更多系统配置项&#xff1a;https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties 1.配置⽂件作⽤ 整个项⽬中所有重要的数据都是在配置⽂件中配置的&#xff0c;⽐如&#xff1a;数据库的连接信息&am…

【华为OD机试模拟题】用 C++ 实现 - 能力组队(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明能力组队题目输入输出示例一输入输出说明示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 O…

如何调教ChatGPT成为你的策略助手

量化策略开发&#xff0c;高质量社群&#xff0c;交易思路分享等相关内容 『正文』 ˇ 去年12月的时候我们初次体验ChatGPT,《ChatGPT生成量化交易策略》. 当时还是很惊喜的&#xff0c;可以辅助写代码&#xff0c;写注释&#xff0c;给出一些示例。使用的时间长了发现写一…

java面试题-GC垃圾回收

1.如何判断一个对象是否可以回收&#xff1f;Java虚拟机使用可达性分析算法来判断对象是否可以被回收。可达性分析算法的基本思路是从一组称为“GC Roots”的根对象开始遍历所有对象&#xff0c;只有从GC Roots开始的对象可以被访问到&#xff0c;其他的对象都被判定为无用对象…

13 Sentinel介绍

什么是Sentinel 分布式系统的流量防卫兵&#xff1a;随着微服务的普及&#xff0c;服务调用的稳定性变得越来越重要。Sentinel以“流量”为切入点&#xff0c;在流量控制、断路、负载保护等多个领域开展工作&#xff0c;保障服务可靠性。特点&#xff1a; 2. 丰富的应用场景&a…

Java 锁 高频 面试题回答

之前面了几个开发&#xff0c;问了关于锁的知识都是一问三不知 &#xff0c;也许是业务场景中出现的比较少&#xff0c;所以这些人只能回答出一些基础的线程方面的知识&#xff0c;之前也看了些书&#xff0c;做一些记录 &#xff0c;所以和大家分享一下 说一下乐观锁和悲观锁的…

Binder系统-C程序示例_框架分析

IPC&#xff1a;进程间的通信&#xff0c;远程调用&#xff0c;比如我们的A进程需要打开LED灯&#xff0c;调用led_open/led_ctl方法&#xff0c;但是他是没有权限去操作的&#xff0c;所以进程A通过&#xff1a;1.首先构造一些数据&#xff0c;2.通过IPC发送数据到进程B&#…

LPC4357JET256/LPC4337FET256/LPC4337JET256 32位MCU 204MHz 1MB

【详情】LPC4300系列微控制器(MCU)拥有全世界首款非对称双核数字信号控制器体系结构&#xff0c;配有ARM Cortex-M4和Cortex-M0处理器。这些NXP Cortex-M4 MCU配有Cortex-M0协处理器&#xff0c;优势在于&#xff0c;可在单一体系结构、开发环境中&#xff0c;开发数字信号处理…

画栋雕梁:定制投资体系2——规划开发能力圈

接上一篇&#xff0c;选择了适合自己“买”的方法&#xff0c;接下来就是要规划买的范围。这个范围一般受个人眼界、认知和理解的限制&#xff0c;也即是价值投资中的一个重要概念——能力圈。每个人的能力圈不可能一样&#xff0c;这和个人过往的学习、工作、成长经历相关。若…

PyQGIS开发 -- 基础学习笔记

1、自主学习QGIS开发虽然QGIS本身功能强大&#xff0c;但还是架不住我们要编写新的功能、新的业务流程、新的算法。前文中我们提到&#xff0c;扩展QGIS有2种方法&#xff0c;一是用Python、C来写QGIS的插件&#xff1b;另一种就是基于QGIS的C API开发独立应用程序。然而后者资…

前端食堂技术周刊第 72 期:Signals 是前端框架的未来、Chrome Headless、ts-reset、magic-regexp、Bun 新文档

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;草莓番茄 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 本期摘要 Signals 是前端框架的未来Chrome Headless 进化成完全体Next.js 13.2Deno…

纯x86汇编实现的多线程操作系统实践 - 第二章 BSP的启动

本章主要讲解BSP的初始化过程&#xff0c;对应的代码为mbr.asm。系统加电启动后&#xff0c;BIOS进行必要的初始化&#xff0c;并将硬盘的0扇区512字节的数据搬运到内存地址0x7c00处。之后&#xff0c;BSP的IP被置为0x7c00&#xff0c;开始运行。初始化代码mbr.asm将顺序执行以…

服务网格领域的百花齐放

服务网格是一种技术架构&#xff0c;它用于管理微服务系统中各个服务之间的通信&#xff0c;旨在处理微服务间的流量&#xff08;也称为东西向流量&#xff09;。 ​ 在云原生应用中&#xff0c;一个应用的背后可能存在着成百上千个服务&#xff0c;各个服务可能又有着若干个实…

机器学习——集成学习

引言 集成学习&#xff1a;让机器学习效果更好&#xff0c;单个不行&#xff0c;群殴走起。 分类 1. Bagging:训练多个分类器取平均&#xff08;m代表树的个数&#xff09;。 2.Boosting&#xff08;提升算法&#xff09;:从弱学习器开始加&#xff0c;通过加权来进行训练。…

这样在管理后台里实现 403 页面实在是太优雅了

前言403 页面通常表示无权限访问&#xff0c;与 404 页面代表着不同含义。而大部分管理后台框架仅提供了 404 页面的支持&#xff0c;但却忽略了对 403 页面的处理&#xff0c;有的框架虽然也有对 403 页面的处理&#xff0c;但处理效果却不尽人意。那怎么样的 403 页面才是即好…