mysql集群

MySQL集群、Redis集群、RabbitMQ集群 MySQL-MMM 是 Master-Master Replication Manager for MySQL(mysql 主主复制管理器)的简称。脚本)。MMM 基于 MySQL Replication 做的扩展架构,主要用来监控 mysql 主主复制并做失败转移。其原理是将真实数据库节点的 IP(RIP)映射为虚拟 IP(VIP)集。 阅读详情

一、Mysql集群技术

两个linux7主机,mysql1、2

172.25.254.10、20

[root@mysql1 ~]# vmset.sh eth0 172.25.254.10 mysql1.timinglee.org

[root@mysql1 ~]# yum install lrzsz.x86_64 -y

将包上传进linux中。解压

mysql1、2

[root@mysql1 ~]# tar zxf mysql-boost-5.7.44.tar.gz

[root@mysql1 ~]# cd mysql-5.7.44/

[root@mysql1 mysql-5.7.44]# yum install cmake.x86_64 -y

[root@mysql1 mysql-5.7.44]# yum install cmake gcc-c++ openssl-devel ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el9_4.x86_64.rpm rpcgen.x86_64

编译

[root@mysql1 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 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_BOOST=/root/mysql-5.7.44/boost/boost_1_59_0/

[root@mysql1 mysql-5.7.44]# make

[root@mysql1 mysql-5.7.44]# make install

1.1 安装启动配置—所有mysql都一致

[root@mysql1 mysql-5.7.44]# cd /usr/local/mysql/support-files/

[root@mysql1 support-files]# cp mysql.server /etc/init.d/mysqld

[root@mysql1 support-files]# vim ~/.bash_profile

# User specific environment and startup programs

PATH=$PATH:$HOME/bin:/usr/local/mysql/bin

export PATH

[root@mysql1 support-files]# source ~/.bash_profile

[root@mysql1 support-files]# useradd -s /sbin/nologin -M mysql

[root@mysql1 support-files]# mkdir -p /data/mysql

[root@mysql1 support-files]# chown mysql.mysql /data/mysql/

[root@mysql1 support-files]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0

[root@mysql1 support-files]# mysqld --initialize --user=mysql

2024-08-24T07:06:08.117366Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2024-08-24T07:06:08.335322Z 0 [Warning] InnoDB: New log files created, LSN=45790
2024-08-24T07:06:08.366421Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2024-08-24T07:06:08.374487Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 5639d40a-61e7-11ef-9e3d-000c29fd8b36.
2024-08-24T07:06:08.375245Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2024-08-24T07:06:08.492622Z 0 [Warning] A deprecated TLS version TLSv1 is enabled. Please use TLSv1.2 or higher.
2024-08-24T07:06:08.492637Z 0 [Warning] A deprecated TLS version TLSv1.1 is enabled. Please use TLSv1.2 or higher.
2024-08-24T07:06:08.495995Z 0 [Warning] CA certificate ca.pem is self signed.
2024-08-24T07:06:08.544314Z 1 [Note] A temporary password is generated for root@localhost: tv6(vU=7vwXg  #此处为主默认密码,30N+>JEKnTtg为从默认密码

[root@mysql1 support-files]# /etc/init.d/mysqld start

Starting MySQL.Logging to '/data/mysql/mysql1.org.err'.
 SUCCESS! 

[root@mysql1 support-files]# chkconfig mysqld on

注:此处报错是因为mysql的服务没关

配置mysql的权限表

[root@mysql1 ~]# mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root:tv6(vU=7vwXg     #输入当前密码,开始时输入默认密码,密文

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

New password:123456         #输入新密码

Re-enter new password:123456            # 重复密码

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: no     #是否启用密码插件
Using existing password for root.

#是否要重置密码
Change the password for root ? ((Press y|Y for Yes, any other key for No) : 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.


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

#是否禁止root用户远程登录
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

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.

 - 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@mysql1 ~]# mysql -uroot -p123456

mysql> SHOW DATABASES;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> exit

Bye

1.2 mysql主从复制

  • 概念:当主的配置修改时,从mysql也会出现相应的配置,而从mysql修改配置时,主mysql则不会出现从mysql新添加的配置

1.2.1 对于主mysql的配置

[root@mysql1 ~]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
log-bin=mysql-bin
server-id=1

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

Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 

[root@mysql1 ~]# mysql -p123456

mysql> CREATE USER ‘repl’@‘%’ IDENTIFIED BY ‘lee’;
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT REPLICATION SLAVE ON . TO 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 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)

[root@mysql1 ~]# cd /data/mysql/

[root@mysql1 mysql]# mysqlbinlog mysql-bin.000001 -vv

1.2.2 对于从mysql的配置

[root@mysql2 support-files]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=2

[root@mysql2 support-files]# /etc/init.d/mysqld restart

Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 

mysql> CHANGE MASTER TO MASTER_HOST=‘172.25.254.10’,MASTER_USER=‘repl’,MASTER_PASSWORD=‘lee’,MASTER_LOG_FILE=‘mysql-bin.000001’,MASTER_LOG_POS=595;

注意:MASTER_LOG__FILE=‘mysql-bin.000001’,MASTER_LOG_POS=595;要与主服务器的mysql> SHOW MASTER STATUS;这条命令的查询结果一致。

mysql> start slave;

mysql> 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: 595
               Relay_Log_File: mysql2-relay-bin.000004
                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: 595
              Relay_Log_Space: 694
              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: 5639d40a-61e7-11ef-9e3d-000c29fd8b36
             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)

测试

进入mysql进行配置

[root@mysql1 ~]# mysql -uroot -p123456

查看是否有lee数据库

mysql> show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| lee                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

使用lee数据库

mysql> use lee;
Database changed

在lee库中建表,建立id,username,password字段

mysql> create table userlist (
    -> id INT AUTO_INCREMENT PRIMARY KEY,
    -> username varchar(255) NOT NULL,
    -> password varchar(255) NOT NULL);
Query OK, 0 rows affected (0.01 sec)

在主mysql中的lee中的userlist表中插入值

[root@mysql1 ~]# mysql -uroot -p123456 -e “INSERT INTO lee.userlist VALUES(‘1’,‘user3’,‘123’);”

[root@mysql1 ~]# mysql -uroot -p123456 -e ‘select * from lee.userlist;’

mysql: [Warning] Using a password on the command line interface can be insecure.
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | user3    | 123      |
+----+----------+----------+

在从mysql中检查看是否出现该配置

[root@mysql2 support-files]# mysql -uroot -p123456 -e ‘select * from lee.userlist;’

mysql: [Warning] Using a password on the command line interface can be insecure.
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | user3    | 123      |
+----+----------+----------+

在slave阶段中默认情况下是开启了写功能的,但是建议关闭slave节点的写功能来保证数据一致性

[root@mysql2 support-files]# vim /etc/mysql.cnf

[mysqld]
super_read_only=on

1.2.3 添加一台新的从mysql

[root@mysql3 ~]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=3

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

Shutting down MySQL. SUCCESS! 
Starting MySQL. SUCCESS! 

在三台mysql机中都配置互相免密,此处只展示mysql3的免密

[root@mysql3 ~]# ssh-keygen

[root@mysql3 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.10

[root@mysql3 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.20

建立一个lee数据库,并从master节点备份数据

[root@mysql3 ~]# mysql -uroot -p123456

mysql> CREATE DATABASE lee;

mysql> exit

[root@mysql3 ~]# mysqldump -uroot -p123456(此处为自己的密码) lee > lee.sql(自己得有lee数据库)

在lee库中建立userlist表

[root@mysql3 ~]# mysql -uroot -p123456

mysql> use lee

mysql> create table userlist (
-> id INT AUTO_INCREMENT PRIMARY KEY,
-> username varchar(255) NOT NULL,
-> password varchar(255) NOT NULL);

mysql> exit

利用master节点中备份出来的lee.sql在slave2中拉平数据

[root@mysql3 ~]# mysql -uroot -p123456 lee <lee.sql

[root@mysql3 ~]# mysql -uroot -p123456 -e “select * from lee.userlist;”

mysql: [Warning] Using a password on the command line interface can be insecure.
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | user3    | 123      |
+----+----------+----------+

在主mysql中查询日志

[root@mysql1 ~]# mysql -uroot -p123456 -e “SHOW MASTER STATUS;”

mysql: [Warning] Using a password on the command line interface can be insecure.
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

[root@mysql3 ~]# mysql -uroot -p123456

mysql> CHANGE MASTER TO MASTER_HOST=‘172.25.254.10’,MASTER_USER=‘repl’,MASTER_PASSWORD=‘lee’,MASTER_LOG_FILE=‘mysql-bin.000002’,MASTER_LOG_POS=154;

mysql> start slave;

mysql> 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: mysql3-relay-bin.000002
                Relay_Log_Pos: 320
        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: 528
              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: 5639d40a-61e7-11ef-9e3d-000c29fd8b36
             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)

测试

在主mysql中添加数据

[root@mysql1 ~]# mysql -uroot -p123456 -e ‘select * from lee.userlist;’

在新添加的mysql3中查看

[root@mysql3 ~]# mysql -uroot -p123456 -e ‘select * from lee.userlist;’

+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | user3    | 123      |
|  2 | user6    | 1234     |
+----+----------+----------+

1.3 延迟复制

  • 概念:当主mysql修改数据后,从mysql会等待一段时间才复制数据
  • 作用:当主mysql误操作,可以在从mysql进行数据备份

配置

[root@mysql3 ~]# mysql -uroot -p123456

mysql> STOP SLAVE SQL_THREAD;

mysql> CHANGE MASTER TO MASTER_DELAY=60; #配置延迟60s

mysql> START SLAVE SQL_THREAD;

mysql> SHOW SLAVE STATUS\G;

Master_UUID: 5639d40a-61e7-11ef-9e3d-000c29fd8b36
             Master_Info_File: /data/mysql/master.info
                    SQL_Delay: 60    #此处表示配置成功,延迟60s复制
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400

在这里插入图片描述

1.4 慢查询查询

  • 作用:当执行SQL超过long_query_time参数设定的时间阈值(默认10s)时,就被认为是慢查询,这个 SQL语句就是需要优化的,开启这个功能,它可以让你很容易地知道哪些语句是需要优化的。

配置

查看

[root@mysql1 ~]# mysql -uroot -p123456

mysql> SHOW variables like “slow%”;

+---------------------+-----------------------------+
| Variable_name       | Value                       |
+---------------------+-----------------------------+
| slow_launch_time    | 2                           |
| slow_query_log      | OFF                         |
| slow_query_log_file | /data/mysql/mysql1-slow.log |
+---------------------+-----------------------------+
3 rows in set (0.01 sec)

开启慢查询日志

mysql> SET GLOBAL slow_query_log=ON;

mysql> SET long_query_time=4;

mysql> SHOW VARIABLES like “long%”;

+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 4.000000 |
+-----------------+----------+
1 row in set (0.01 sec)

mysql> SHOW VARIABLES like “slow%”;

+---------------------+-----------------------------+
| Variable_name       | Value                       |
+---------------------+-----------------------------+
| slow_launch_time    | 2                           |
| slow_query_log      | ON                          |
| slow_query_log_file | /data/mysql/mysql1-slow.log |
+---------------------+-----------------------------+
3 rows in set (0.00 sec)

mysql> exit

查看慢查询日志文件

[root@mysql1 ~]# cat /data/mysql/mysql1-slow.log

测试

mysql> select sleep (10);

+------------+
| sleep (10) |
+------------+
|          0 |
+------------+
1 row in set (10.00 sec)

mysql> exit

[root@mysql1 ~]# cat /data/mysql/mysql1-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-25T06:24:42.689095Z
# User@Host: root[root] @ localhost []  Id:    11
# Query_time: 10.001840  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
SET timestamp=1724567082;
select sleep (10);
# Time: 2024-08-25T06:24:56.818017Z
# User@Host: root[root] @ localhost []  Id:    11
# Query_time: 10.000315  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
SET timestamp=1724567096;
select sleep (10);

1.5 mysql的并行复制—从mysql中配置

[root@mysql2 ~]# 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
relay_log_info_repository=TABLE
relay_log_recovery=ON

[root@mysql2 ~]# /etc/init.d/mysqld start

​ Starting MySQL SUCCESS!

二、半同步模式

在这里插入图片描述

配置gtid

主mysql

[root@mysql1 ~]# 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
symbolic-links=0

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

Shutting down MySQL........... SUCCESS! 
Starting MySQL. SUCCESS! 

所有从mysql

[root@mysql2 ~]# 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
symbolic-links=0

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

Shutting down MySQL. SUCCESS! 
Starting MySQL. SUCCESS! 

2.1 从mysql开启与停止gtid

关闭

[root@mysql3 ~]# mysql -p123456

mysql> stop slave;

开启

mysql> CHANGE MASTER TO MASTER_HOST=‘172.25.254.10’, MASTER_USER=‘repl’,MASTER_PASSWORD=‘lee’, MASTER_AUTO_POSITION=1;

mysql> start slave;

*************************** 1. row ***************************
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 1   #表示开启gtid
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

2.2 启用半同步模式

主mysql

[root@mysql1 ~]# 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
symbolic-links=0

安装半同步插件

[root@mysql1 ~]# mysql -p123456

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;

查看插件安装情况

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; #开启

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          |
| 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               | 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> show plugins;

从mysql

[root@mysql2 ~]# 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_master_enabled=1   #开启半同步
symbolic-links=0

下载半同步插件,并重启io线程

[root@mysql2 ~]# mysql -p123456

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;

mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;

mysql> STOP SLAVE IO_THREAD;

mysql> START SLAVE IO_THREAD;

检查配置

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.01 sec)

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

测试

主mysql

mysql> insert into lee.userlist values (‘3’,‘user4’,‘123’);
Query OK, 1 row affected (0.03 sec)

mysql> 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             | 1     |
| Rpl_semi_sync_master_no_times              | 0     |

#未同步数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      | 676   |
| Rpl_semi_sync_master_tx_wait_time          | 676   |
| Rpl_semi_sync_master_tx_waits              | 1     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |

#已同步数1
| Rpl_semi_sync_master_yes_tx                | 1     |
+--------------------------------------------+-------+

模拟故障

所有从mysql

mysql> STOP SLAVE IO_THREAD;

主mysql

mysql> insert into lee.userlist values (‘6’,‘user5’,‘555’);

Query OK, 1 row affected (10.01 sec) #10s超时,同步失败

mysql> SHOW STATUS LIKE ‘Rpl_semi%’;

+--------------------------------------------+-------+
| 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             | 1     |
| Rpl_semi_sync_master_no_times              | 1     |
| Rpl_semi_sync_master_no_tx                 | 1     | #一笔数据为同步
#自动转为异步模式,当slave恢复后会自动恢复
| Rpl_semi_sync_master_status                | OFF   | 
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 676   |
| Rpl_semi_sync_master_tx_wait_time          | 676   |
| 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.00 sec)

三、mysql高可用之组复制(MGR)

组复制流程

在这里插入图片描述

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

3.1 实现mysql组复制

mysql1

[root@mysql1 ~]# rm -fr /data/mysql/ #清空配置,还原环境

[root@mysql1 ~]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=1

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON

log_bin=binlog
binlog_format=ROW
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"

group_replication_start_on_boot=off
group_replication_local_address="172.25.254.10:33061"
group_replication_group_seeds="172.25.254.10:33061,172.25.254.20:33061,172.25.254.30:33061"
group_replication_ip_whitelist="172.25.254.0/24,127.0.0.1/8"
group_replication_bootstrap_group=off
group_replication_single_primary_mode=OFF
group_replication_enforce_update_everywhere_checks=ON
group_replication_allow_local_disjoint_gtids_join=1

[root@mysql1 ~]# mysqld --user=mysql --initialize

2024-08-25T07:24:10.521301Z 1 [Note] A temporary password is generated for root@localhost: IbZqfA6_p-yo     ptQk#Et)o7=>

[root@mysql1 ~]# /etc/init.d/mysqld start

Starting MySQL.Logging to '/data/mysql/mysql1.org.err'.
.. ERROR! The server quit without updating PID file (/data/mysql/mysql1.org.pid).
#发现启动失败

查看日志查找错误在哪

[root@mysql1 ~]# cat /data/mysql/mysql1.org.err

2024-08-25T07:24:21.077842Z 0 [ERROR] Can't start server: Bind on TCP/IP port: Address already in use
2024-08-25T07:24:21.077844Z 0 [ERROR] Do you already have another mysqld server running on port: 3306 ?
2024-08-25T07:24:21.077849Z 0 [ERROR] Aborting

#表示3306端口被占用

[root@mysql1 ~]# ps aux | grep mysqld

root       2285  0.0  0.0 113412  1592 pts/0    S    Aug24   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/mysql1.org.pid
mysql      2474  0.0  7.2 2155404 203988 pts/0  Sl   Aug24   0:01 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=mysql1.org.err --pid-file=/data/mysql/mysql1.org.pid --socket=/data/mysql/mysql.sock
root       3084  0.0  0.0 112808   964 pts/0    S+   00:44   0:00 grep --color=auto mysqld

#发现3306端口确实正在使用

[root@mysql1 ~]# kill 2285

[root@mysql1 ~]# kill 2474

[root@mysql1 ~]# /etc/init.d/mysqld start

[root@mysql1 ~]# mysql_secure_installation

​ #配置新密码为123456

[root@mysql1 ~]# mysql -uroot -p123456 -e “alter user root@localhost identified by ‘lee’;”

​ #将密码修改为lee

[root@mysql1 ~]# mysql -plee

mysql> SET SQL_LOG_BIN=0;

mysql> CREATE USER rpl_user@‘%’ IDENTIFIED BY ‘lee’;

mysql> GRANT REPLICATION SLAVE ON . TO rpl_user@‘%’;

mysql> FLUSH PRIVILEGES;

mysql> SET SQL_LOG_BIN=1;

mysql> CHANGE MASTER TO MASTER_USER=‘rpl_user’, MASTER_PASSWORD=‘lee’ FOR CHANNEL ‘group_replication_recovery’;

mysql> SET GLOBAL group_replication_bootstrap_group=ON;

mysql> START GROUP_REPLICATION;

mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

mysql> SELECT * FROM performance_schema.replication_group_members;

+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 058e9840-62b3-11ef-b7fe-000c29fd8b36 | mysql1.org  |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+

在复制配置文件到myql-node20和mysql-node30

[root@mysql1 ~]# scp /etc/my.cnf root@172.25.254.20:/etc/my.cnf

[root@mysql1 ~]# scp /etc/my.cnf root@172.25.254.30:/etc/my.cnf

mysql2、3

[root@mysql2 ~]# rm -fr /data/mysql/

[root@mysql2 ~]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=2                           #唯一标识,修改为2,mysql3修改为3

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON

log_bin=binlog
binlog_format=ROW
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"

group_replication_start_on_boot=off

group_replication_local_address="172.25.254.20:33061"    #修改为本地主机地址
group_replication_group_seeds="172.25.254.10:33061,172.25.254.20:33061,172.25.254.30:33061"
group_replication_ip_whitelist="172.25.254.0/24,127.0.0.1/8"
group_replication_bootstrap_group=off
group_replication_single_primary_mode=OFF
group_replication_enforce_update_everywhere_checks=ON
group_replication_allow_local_disjoint_gtids_join=1

[root@mysql2 ~]# mysqld --user=mysql --initialize

2024-08-25T08:13:17.665281Z 0 [Warning] CA certificate ca.pem is self signed.
2024-08-25T08:13:17.707142Z 1 [Note] A temporary password is generated for root@localhost: ptQk#Et)o7=>

[root@mysql2 ~]# ps aux | grep mysqld

root       2454  0.0  0.0 113412  1596 pts/0    S    Aug24   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/mysql2.org.pid
mysql      2643  0.0  7.2 1933252 204272 pts/0  Sl   Aug24   0:01 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=mysql2.org.err --pid-file=/data/mysql/mysql2.org.pid --socket=/data/mysql/mysql.sock
root       3275  0.0  0.0 112808   964 pts/0    R+   01:14   0:00 grep --color=auto mysqld

[root@mysql2 ~]# kill 2454

[root@mysql2 ~]# kill 2643

[root@mysql2 ~]# /etc/init.d/mysqld start

[root@mysql2 ~]# mysql_secure_installation

​ #配置新密码为123456

[root@mysql2 ~]# mysql -uroot -p123456 -e “alter user root@localhost identified by ‘lee’;”

[root@mysql2 ~]# mysql -plee

mysql> SET SQL_LOG_BIN=0;

mysql> CREATE USER rpl_user@‘%’ IDENTIFIED BY ‘lee’;

mysql> GRANT REPLICATION SLAVE ON . TO rpl_user@‘%’;

mysql> FLUSH PRIVILEGES;

mysql> SET SQL_LOG_BIN=1;

mysql> CHANGE MASTER TO MASTER_USER=‘rpl_user’, MASTER_PASSWORD=‘lee’ FOR CHANNEL ‘group_replication_recovery’;

mysql> START GROUP_REPLICATION;

mysql> SELECT * FROM performance_schema.replication_group_members;

+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 058e9840-62b3-11ef-b7fe-000c29fd8b36 | mysql1.org  |        3306 | ONLINE       |
| group_replication_applier | e227d3cc-62b9-11ef-8094-000c29ba23e8 | mysql2.org  |        3306 | RECOVERING   |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
2 rows in set (0.00 sec)

测试

mysql1

[root@mysql1 ~]# mysql -plee

mysql> CREATE DATABASE lee;

建userlist表

mysql> CREATE TABLE lee.userlist(
    -> username VARCHAR(10) PRIMARY KEY NOT NULL,
    -> password VARCHAR(50) NOT NULL);

mysql> INSERT INTO lee.userlist VALUES (‘user1’,‘111’);

mysql> SELECT * FROM lee.userlist;

+----------+----------+
| username | password |
+----------+----------+
| user1    | 111      |
+----------+----------+
1 row in set (0.00 sec)

3.2 mysql路由

在这里插入图片描述

mysql Router

是一个对应用程序透明的InnoDB Cluster连接路由服务,提供负载均衡、应用连接故障转移和客户端路 由。 利用路由器的连接路由特性,用户可以编写应用程序来连接到路由器,并令路由器使用相应的路由策略 来处理连接,使其连接到正确的MySQL数据库服务器

3.2.1 mysql路由配置

再开一台主机mysql-router

在这里插入图片描述

将该包导入linux系统中,并解压

[root@mysql_router ~]# rpm -ivh mysql-router-community-8.4.0-1.el7.x86_64.rpm

配置mysql路由

[root@mysql_router ~]# vim /etc/mysqlrouter/mysqlrouter.conf

[keepalive]
interval = 60

[routing:ro]
bind_address = 0.0.0.0
bind_port = 7001
destinations = 172.25.254.10:3306,172.25.254.20:3306,172.25.254.30:3306
routing_strategy = round-robin

[routing:rw]
bind_address = 0.0.0.0
bind_port = 7002
destinations = 172.25.254.30:3306,172.25.254.20:3306,172.25.254.10:3306
routing_strategy = first-available

[root@mysql_router ~]# systemctl start mysqlrouter.service

测试

建立测试用户

mysql> CREATE USER lee@‘%’ IDENTIFIED BY ‘lee’;

mysql> GRANT ALL ON lee.* TO lee@‘%’;

查看调度效果,其他从mysql类同

[root@mysql-node10 ~]# watch -1 lsof -i :3306

COMMAND  PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
mysqld   9879  mysql  22u  IPv6  56697  0t0     TCP *:mysql (LISTEN)

[root@mysql_router ~]# mysql -ulee -plee -h 172.25.254.40 -P 7001

四、mysql高可用之MHA

在这里插入图片描述

MHA的作用:故障切换和主从复制的软件

MHA工作原理

  • 目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群必须最少有3台数据库服务器, 一主二从,即一台充当Master,台充当备用Master,另一台充当从库。
  • MHA Node 运行在每台 MySQL 服务器上
  • MHAManager 会定时探测集群中的master 节点
  • 当master 出现故障时,它可以自动将最新数据的slave 提升为新的master
  • 然后将所有其他的slave 重新指向新的master,VIP自动漂移到新的master。
  • 整个故障转移过程对应用程序完全透明。

4.1 搭建主两从架构

主mysql

先暂停服务,并还原环境

[root@mysql1 ~]# /etc/init.d/mysqld stop

[root@mysql1 ~]# rm -fr /data/mysql/*

[root@mysql1 ~]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=1
log_bin=mysql-bin
gtid_mode=ON
log_slave_updates=ON
enforce-gtid-consistency=ON

[root@mysql1 ~]# mysqld --user mysql --initialize

2024-08-27T02:28:17.084996Z 1 [Note] A temporary password is generated for root@localhost: 9/wX=Y0r%_c<

[root@mysql1 ~]# /etc/init.d/mysqld start

Starting MySQL.Logging to '/data/mysql/mysql1.org.err'.
 SUCCESS!

[root@mysql1 ~]# mysql_secure_installation

​ #新密码为123456

[root@mysql1 ~]# mysql -p123456

mysql> CREATE USER ‘repl’@‘%’ IDENTIFIED BY ‘lee’;

mysql> GRANT REPLICATION SLAVE ON . TO repl@‘%’;

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;

mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;

所有从mysql

[root@mysql2 ~]# /etc/init.d/mysqld stop
Shutting down MySQL… SUCCESS!

[root@mysql2 ~]# rm -fr /data/mysql/*

[root@mysql2 ~]# vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=2

gtid_mode=ON
log_slave_updates=ON
enforce-gtid-consistency=ON
log_bin=mysql-bin

[root@mysql2 ~]# mysqld --user mysql --initialize

2024-08-27T02:35:45.687903Z 1 [Note] A temporary password is generated for root@localhost: guK1Tyy%!p9F

[root@mysql2 ~]# /etc/init.d/mysqld start

[root@mysql2 ~]# mysql_secure_installation

​ 新密码123456

[root@mysql2 ~]# mysql -p123456

mysql> CHANGE MASTER TO MASTER_HOST=‘172.25.254.10’, MASTER_USER=‘repl’,MASTER_PASSWORD=‘lee’, MASTER_AUTO_POSITION=1;

mysql> start slave;

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;

mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;

mysql> STOP SLAVE IO_THREAD;

mysql> START SLAVE IO_THREAD;

mysql> SHOW STATUS LIKE ‘Rpl_semi_sync%’;

+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row in set (0.01 sec)

4.2 MHA配置

MHA

新开一台主机MHA:172.25.254.40

在这里插入图片描述

[root@mysql_mha ~]# unzip MHA-7.zip

[root@mysql_mha ~]# cd MHA-7/

在这里插入图片描述

[root@mysql_mha MHA-7]# yum install *.rpm -y

[root@mysql_mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.10:/mnt

The authenticity of host '172.25.254.10 (172.25.254.10)' can't be established.
ECDSA key fingerprint is SHA256:E3qE8JvU9z/9Q6iQNWX4FB2C7Of1r+MKoHRNklKH9ow.
ECDSA key fingerprint is MD5:26:47:a1:e9:a2:08:3a:f9:fa:eb:2d:a8:99:11:bf:6b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.25.254.10' (ECDSA) to the list of known hosts.
root@172.25.254.10's password: 123456
mha4mysql-node-0.58-0.el7.centos.noarch.rpm                          100%   35KB  18.2MB/s   00:00    

[root@mysql_mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.20:/mnt

[root@mysql_mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.30:/mnt

其他MySQL10、20、30

[root@mysql1 ~]# yum install /mnt/mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y

4.3 配置MHA的管理环境

MHA

查看配置目录和配置文件

[root@mysql_mha ~]# masterha_manager --help

因为当前只有一套主从,所以只需要写一个配置文件即可

生成配置文件

[root@mysql_mha ~]# mkdir /etc/masterha

[root@mysql_mha ~]# cd MHA-7/

[root@mysql_mha MHA-7]# tar zxf mha4mysql-manager-0.58.tar.gz

[root@mysql_mha MHA-7]# cd mha4mysql-manager-0.58/samples/conf/

[root@mysql_mha conf]# cat masterha_default.cnf app1.cnf > /etc/masterha/app1.cnf

编写配置文件

需要将各个主机之间配置免密

[root@mysql_mha conf]# vim /etc/masterha/app1.cnf

[server default]
user=root
password=lee
ssh_user=root
repl_user=repl
repl_password=lee
master_binlog_dir= /data/mysql
remote_workdir=/tmp
secondary_check_script= masterha_secondary_check -s 172.25.254.10 -s 172.25.254.11
ping_interval=3

# master_ip_failover_script= /script/masterha/master_ip_failover
# shutdown_script= /script/masterha/power_manager
# report_script= /script/masterha/send_report
# master_ip_online_change_script= /script/masterha/master_ip_online_change
[server default]
manager_workdir=/etc/masterha
manager_log=/var/etc/masterha/manager.log

[server1]
hostname=172.25.254.10
candidate_master=1
check_repl_delay=0

[server2]
hostname=172.25.254.20
candidate_master=1
check_repl_delay=0

[server3]
hostname=172.25.254.30
no_master=1

#详情键Mysql集群技术.pdf文件

检测网络及ssh免密

[root@mysql_mha conf]# masterha_check_ssh --conf=/etc/masterha/app1.cnf

mysql1

[root@mysql_mha conf]# mysql -p123456

mysql> GRANT ALL ON . TO root@‘%’ identified by ‘123456’;

mha

执行检测

[root@mysql_mha conf]# masterha_check_repl --conf=/etc/masterha/app1.cnf

4.4 MHA的故障切换—重看,重做

4.4.1 未发生故障手动切换

MHA

前提:主mysql还在正常运行

[root@mysql_mha ~]# masterha_master_switch \
> --conf=/etc/masterha/app1.cnf \
> --master_state=alive \
> --new_master_host=172.25.254.20 \
> --new_master_port=3306 \
> --orig_master_is_new_slave \
> --running_updates_limit=10000

[root@mysql_mha ~]# masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=172.25.254.20 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000

[root@mysql_mha ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf

测试

模拟故障

[root@mysql_mha ~]# /etc/init.d/mysqld stop

在mha和主MySQL做故障切换

[root@mysql_mha ~]# masterha_master_switch --master_state=dead --conf=/etc/masterha/app1.cnf --dead_master_host=192.168.56.12 --dead_master_port=3306 --new_master_host=192.168.56.11 --new_master_port=3306 --ignore_last_failover

恢复故障mysql节点

[root@mysql_mha ~]# /etc/init.d/mysqld start

[root@mysql_mha ~]# mysql -p123456

mysql> CHANGE MASTER TO MASTER_HOST=‘172.25.254.10’, MASTER_USER=‘repl’,MASTER_PASSWORD=‘123456’,MASTER__AUTO_POSITION=1;

mysql> show slave\G

测试主两从是否正常

[root@mysql_mha ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf

4.4.2 自动切换

MHA

[root@mysql_mha ~]# rm -fr app1.failover.complete

[root@mysql_mha ~]# masterha_manager --conf=/etc/masterha/app1.cnf

[root@mysql_mha ~]# cat /etc/masterha/manager.log

mysql2

恢复故障节点

[root@mysql2 mysql-5.7.44]# /etc/init.d/mysqld start

[root@mysql2 mysql-5.7.44]# mysql -p123456

mysql> CHANGE MASTER TO MASTER_HOST=‘172.25.254.10’, MASTER_USER=‘repl’,MASTER_PASSWORD=‘123456’, MASTER_AUTO_POSITION=1;

[root@mysql_mha ~]# rm -rf app1.failover.complete manager.log

4.5 为MHA添加VIP功能

mha

在这里插入图片描述

[root@mysql_mha ~]# ls

anaconda-ks.cfg     master_ip_online_change  MHA-7.zip     mysql-boost-5.7.44.tar.gz
master_ip_failover  MHA-7                    mysql-5.7.44  original-ks.cfg

[root@mysql_mha ~]# cp master_ip_failover master_ip_online_change /usr/local/bin/

[root@mysql_mha ~]# chmod +x /usr/local/bin/master_ip_*

[root@mysql_mha ~]# vim /usr/local/bin/master_ip_failover

my $vip = '172.25.254.100/24';
my $ssh_start_vip = "/sbin/ip addr add $vip dev eth0";
my $ssh_stop_vip = "/sbin/ip addr del $vip dev eth0";

[root@mysql_mha ~]# vim /usr/local/bin/master_ip_online_change

my $vip = '172.25.254.100/24';
my $ssh_start_vip = "/sbin/ip addr add $vip dev eth0";
my $ssh_stop_vip = "/sbin/ip addr del $vip dev eth0";
my $exit_code = 0;

[root@mysql_mha masterha]# masterha_manager --conf=/etc/masterha/app1.cnf & 启动监控程序

musql1

[root@mysql1 ~]# ip a a 172.25.254.100/24 dev eth0

测试-模拟故障

[root@mysql1 ~]# /etc/init.d/mysqld stop

[root@mysql_mha masterha]# cat manager.log

[root@mysql2 mysql]# /etc/init.d/mysqld start

mysql> CHANGE MASTER TO MASTER_HOST=‘172.25.254.10’, MASTER_USER=‘repl’,MASTER_PASSWORD=‘123456’, MASTER_AUTO_POSITION=1

[root@mysql_mha masterha]# rm -rf app1.failover.complete manager.log

[root@mysql_mha masterha]# masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=172.25.254.10 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000

[root@mysql1 ~]# ip a

MySQL 集群 上一篇文章我们提到MySQL 读写分离,这篇文章我们讲解MySQL集群。我们提到的集群…… 阅读详情

相关推荐

Windows下搭建MySQL集群

本文将讨论在Windows下搭建MySQL集群的步骤和搭建过程中应当注意的问题。 由于机器数量和性能有限,搭建环境为一台宿主机(IP:10.200.178.191),一台虚拟机(IP:10.200.178.192)。 管理节点、数据存储节点和SQL节点的分配情况如下: 管理节点:10.200.178.191 数据存储节点:10.200.178.192 SQL节点:10.200.178.1

hero_hegang的专栏 2969

mysql学习之mysql集群

本片博文是笔者学习《高性能mysql》一书的第一篇学习笔记,对应书籍章节为第10章。主要介绍了mysql集群部署方案主从集群部署。集群方案、主从同步原理、复制类型、docker安装mysql集群示例。

liushangzaibeijing的博客 3万+

协方差矩阵

对两个类内协方差矩阵进行对角化,可以将它们变换为对角矩阵。这个过程可以通过对每个协方差矩阵进行特征值分解来实现,从而得到它们的特征向量和特征值,进而得到它们的对角矩阵形式。这个过程的意义在于,它可以帮助我们找到一个新的坐标系,使得在这个坐标系下,每个特征之间都是独立的,从而简化了计算。具体来说,当我们使用对角协方差矩阵作为特征向量的坐标系时,它意味着每个特征之间都是相互独立的,从而方便了进一步的分析和处理。在实际应用中,对角化协方差矩阵可以用于降维、特征选择和分类等任务。

m0_55196097的博客 1万+

MySQL高可用集群

1 什么是MySQL高可用集群MySQL高可用集群MySQLInnoDBClusterInnoDBCluster是MySQL官方实现高可用读写分离的架构方案包含以下组件MySQLGroupReplication简称MGR是MySQL的主从同步高可用方案包括数据同步和角色选举MySQLShell是InnoDBCluster的管理工具用来创建和管理集群MySQLRouter是业务。

GzlAndy的博客 2396

Ubuntu下Ollama局域网共享大模型服务:5分钟搞定配置与防火墙设置

本文提供了一份在Ubuntu系统上快速配置Ollama实现局域网共享大模型服务的实战指南。通过修改服务配置使其监听所有网络接口,并设置UFW防火墙规则,用户可在5分钟内让同一Wi-Fi下的其他设备(如笔记本、手机)便捷调用主机上的AI模型能力,实现团队或多设备间的AI资源共享。

ik6789012的博客 824

避坑指南:Qt5.14.2 ARM交叉编译中那些你可能遇到的‘坑’及解决方案

本文深度解析了Qt 5.14.2在ARM架构上进行交叉编译的完整流程与常见难题。重点阐述了如何精准匹配交叉编译器与目标板环境、正确配置sysroot以及使用configure参数的艺术,并针对编译过程中的头文件缺失、链接错误等典型“坑”提供了经过验证的解决方案,旨在帮助开发者成功构建适用于嵌入式设备的Qt运行时库。

weixin_29279101的博客 352

MySQL集群搭建

MySQL集群搭建1、主从复制原理1.1 原理剖析1.2 三个步骤1.3复制原则和问题2、搭建普通集群版(一主一从)2.1修改主机配置文件binlog格式设置:2.2从机配置文件2.3主机:建立账户并授权从机:配置需要复制的主机3、docker搭建MySQL集群3.1新建新的MySQL容器3.2配置主机3.3配置从机 1、主从复制原理 从机会从主机 读取binlog 来进行数据同步。 1.1 原理剖析 实际上主从同步的原理就是基于 binlog 进行数据同步的。在主从复制过程中,会基于 3 个线程来操作,一

qq_41296669的博客 1万+

PCB数据集

整理了一部分PCB数据集

m0_57996537的博客 3867

mysql集群_MySQL集群

如有文章侵权请联系删除,欢迎对内容有误处提出意见!如何解决从节点读数据延迟的问题也是研究的重点,将在下一篇文章中介绍。一、MySQL集群的优缺点优点:某一从节点失效后可快速自动切换。是一种分布式体系结构,没有单点故障。吞吐量高、延迟短。可扩展性强,支持在线扩容。缺点:不支持外键。占用磁盘空间大、内存占用率高。部署配置很复杂。二、MySQL集群的解决方案读写分离、主从复制应用程序对于数据库而言都是写...

weixin_39760368的博客 109

三、参考比较法之城市建成区提取——提取

在正式开始提取之前,还是要继续啰嗦一下,其实基于夜间灯光数据建成区提取,可以分为好几个层次,基于县一级、市一级、省一级,很多论文的做法都是以市一级为准,也就是统计好市一级城市的每一年的统计年鉴中的建成区面积作为备用。有人可能会问为什么不以县一级,由于县一级的统计数据一般存在缺失,很难形成一个长时间序列的数据,所以一般采取的是市一级。前文也进行建议,如果确实要基于县一级进行提取可以参考前面理论介绍那篇文章中的相关建议。那么当我们确定阈值后如何将城市建成区提取出来?

端木宛白的博客家园 5401

光学传播仿真软件:ASAP_(1).ASAP软件介绍与安装

ASAP(Advanced System for Analysis and Propagation)是一款强大的光学传播仿真软件,广泛应用于光学系统的设计、分析和优化。它提供了丰富的建模工具和仿真功能,可以帮助用户从简单的光学元件到复杂的光学系统进行仿真。:支持光学、机械、热学等多物理场的联合仿真。:采用高精度的算法,确保仿真结果的准确性。:内置了大量的光学元件,如透镜、反射镜、棱镜、光栅等。:提供直观的用户界面,支持多种建模和仿真方式。:支持使用脚本语言进行二次开发,增强软件的定制能力。

kkchenjj的博客 1592

mysql 集群_MySQL集群

如有文章侵权请联系删除,欢迎对内容有误处提出意见!如何解决从节点读数据延迟的问题也是研究的重点,将在下一篇文章中介绍。一、MySQL集群的优缺点优点:某一从节点失效后可快速自动切换。是一种分布式体系结构,没有单点故障。吞吐量高、延迟短。可扩展性强,支持在线扩容。缺点:不支持外键。占用磁盘空间大、内存占用率高。部署配置很复杂。二、MySQL集群的解决方案读写分离、主从复制应用程序对于数据库而言都是写...

weixin_36070745的博客 270

如何给K8S配置一个具有永久有效的kubeconfig

在 Amazon EKS 环境中,Kubernetes 的认证机制与 AWS IAM 深度集成,通过aws-iam-authenticator动态生成临时凭证。这种设计虽然增强了安全性,但给需要持久化凭证的工具链(如 CI/CD 系统中的 KubeVela)带来了挑战。具体表现为:临时凭证失效​​:默认 Token 有效期为 15 分钟至 1 小时;​​IAM 角色限制​​:直接使用aws eks get-token生成的凭证无法持久化

小杨同学的博客 660

MYSQL集群

当你要进行M-S-M,多主一从同步复制的时候,为了避免在从库中后执行的主库同步信息,将先执行的主库同步信息覆盖的这种情况,所以就要使用 for channel 参数,将这两个同步信息放到不同的管道中在从库中进行配置,‘xxxx’参数是你起的管道名称,两个不能一样,要不就成一条管道了,还是覆盖。主库将变更写binlog日志,然后从库连接主库后,从库有个IO线程,将主库的binlog日志拷贝到本地,写入一个中继日志,接着从库中有一个sql线程会从中继日志中读取binlog,然后执行binlog日志中的内容。

weixin_46091713的博客 1288

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

部署MySQL集群

MySQL集群可以通过多种方式实现,包括MySQL Cluster(NDB Cluster)、MySQL Group Replication(MGR)、以及使用第三方中间件如ProxySQL、MaxScale等结合多个MySQL实例进行集群管理。本文将以MySQL Group Replication为例进行说明。MySQL Group Replication(MGR)是MySQL 5.7.17及以上版本引入的一个高可用性和数据一致性解决方案。

m0_61431263的博客 1083

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

MySQL8分片集群搭建

架构图 参考文档 https://severalnines.com/database-blog/mysql-innodb-cluster-80-complete-deployment-walk-through-part-one https://severalnines.com/database-blog/mysql-innodb-cluster-80-complete-operation-walk-through-part-two MySQL InnoDB Cluster包含三个组件 MySQL Gro

神棍之路 2580

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

MySQL 集群方案讲解

MySQL 集群方案讲解

闲余知道 1664

windows下搭建mysql集群_Windows下搭建MySQL集群

本文将讨论在Windows下搭建MySQL集群的步骤和搭建过程中应当注意的问题。由于机器数量和性能有限,搭建环境为一台宿主机(IP:10.200.178.191),一台虚拟机(IP:10.200.178.192)。管理节点、数据存储节点和SQL节点的分配情况如下:管理节点:10.200.178.191数据存储节点:10.200.178.192SQL节点:10.200.178.191和10.200....

weixin_31491381的博客 1021

mysql 100台 集群_mysql集群

MySQL集群分为三类节点:管理节点、 SQL节点、存储节点。管理节点的功能是管理其他节点,负责调度不同的SQL节点和存储节点。SQL节点作用是用户和该节点进行交互,用户发送SQL语句 到该节点,进行读写请求。存储节点负责到磁盘中读数据和写数据。MySQL集群中采用一种特殊存储引擎,名叫NDB。NDB负责对数据进行读写,并保证节 点之间的数据一致性,存储节点没有必要使用共享存储,因为第一存储节点本...

weixin_36488250的博客 420

mysql 做集群_Mysql 集群

Mysqld分三层,一个MGM用于管理配置,多个mysqld给应用程序提供访问,多个ndbd提供集群存储。mysqld的作用和一般的mysqld相同,不过加入的对NDB 数据存储的支持。数据是分散存储在每组ndb节点的,每组中ndb节点的数据相同,每组至少有一个ndbd保持运行状态才能访问数据。(组的分配参看NoOfReplicas参数)。ndb节点间保证数据的同步。下面简单介绍下各个节点功能:管...

weixin_42445886的博客 1190

【MySQL】mysql集群

主库提供对外的增删改查服务写入二进制日志(Binary log),从库通过特定的线程,将Binary log 日志中的内容同步到从库中。两个日志(binlog二进制日志&relay log日志)和三个线程(master[主库]的一个线程和slave[从库]的二个线程)主库的更新操作写入binlog二进制日志中。master服务器创建一个binlog转储线程,将二进制日志内容发送到从服务器。

m0_74823388的博客 962
上一篇: nginx
Dream_of_falling
博客等级 码龄5年 82粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值