Mysql——高可用集群部署

news2024/9/21 6:28:07

目录

一、源码编译mysql

二、mysql的主从复制

2.1、主从复制

2.2、延迟复制

2.3、慢查询日志

2.4、MySQL的并行复制

三、MySQL半同步模式

四、mysql高可用组复制

五、mysql-router

六、mysql高可用MHA

七、为MHA添加VIP功能


一、源码编译mysql

1、安装依赖

[root@mysql1 ~]# 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

2、解压源码包

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

3、源码编译安装MySQL

[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 -j2
[root@mysql1 mysql-5.7.44]# make install

生成mysql数据目录:

[root@mysql1 ~]# cd /usr/local/mysql/
[root@mysql1 mysql]# useradd -s /sbin/nologin -M mysql
[root@mysql1 mysql]# mkdir /data/mysql -p
[root@mysql1 mysql]# chown mysql.mysql -R /data/mysql

生成启动文件: 

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

 编辑配置文件:

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

编辑环境变量: 

[root@mysql1 mysql]# vim ~/.bash_profile 
[root@mysql1 mysql]# source ~/.bash_profile 

初始化: 

[root@mysql1 mysql]# mysqld --user mysql --initialize
2024-08-22T02:43:33.182882Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2024-08-22T02:43:33.876344Z 0 [Warning] InnoDB: New log files created, LSN=45790
2024-08-22T02:43:33.939173Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2024-08-22T02:43:33.996930Z 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: 530f15cf-6030-11ef-80da-000c29f9980d.
2024-08-22T02:43:33.998428Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2024-08-22T02:43:34.355930Z 0 [Warning] A deprecated TLS version TLSv1 is enabled. Please use TLSv1.2 or higher.
2024-08-22T02:43:34.355957Z 0 [Warning] A deprecated TLS version TLSv1.1 is enabled. Please use TLSv1.2 or higher.
2024-08-22T02:43:34.357064Z 0 [Warning] CA certificate ca.pem is self signed.
2024-08-22T02:43:34.381234Z 1 [Note] A temporary password is generated for root@localhost: CCwv;7jj9nQC

[root@mysql1 mysql]# vim passwd
[root@mysql1 mysql]# cat passwd 
CCwv;7jj9nQC

启动mysql: 


[root@mysql1 mysql]# chkconfig mysqld on
[root@mysql1 mysql]# mysql_secure_installation
[root@mysql1 mysql]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/data/mysql/mysql1.err'.
 SUCCESS! 
[root@mysql1 mysql]# mysql -uroot -p

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

二、mysql的主从复制

2.1、主从复制

1、 配置master

[root@mysql1 ~]# vim /etc/my.cnf
[root@mysql1 ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS!

mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
Query OK, 0 rows affected (0.00 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.00 sec)

2、配置salve1

[root@mysql2 ~]# vim /etc/my.cnf
[root@mysql2 ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 

mysql> CHANGE MASTER TO
    -> MASTER_HOST='172.25.254.11',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=350;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

 

 测试:

mysql>  CREATE DATABASE gyj;
Query OK, 1 row affected (0.01 sec)

mysql> CREATE TABLE gyj.userlist(
    -> username varchar(20) not null,
    -> password varchar(50) not null);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into gyj.userlist value('user1','111');
Query OK, 1 row affected (0.00 sec)

mysql> select * from gyj.userlist;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 111      |
+----------+----------+
1 row in set (0.00 sec)

2.2、延迟复制

延迟复制时用来控制 sql 线程的,和 i/o 线程无关,这个延迟复制不是i/o 线程过段时间来复制, i/o 是正常工作的,是日志已经保存在slave 端了,那个 sql 要等多久进行回放。
需要重新创建虚拟机作为延迟复制的slave,确保master的数据丢失后,该slave不会马上丢失。

1、添加slave2

新建虚拟机,从master拷贝mysql文件给新虚拟机,作为slave2。

[root@mysql1 ~]# cd /usr/local/
[root@mysql1 local]# ls
bin  etc  games  include  lib  lib64  libexec  mysql  sbin  share  src
[root@mysql1 local]# rsync -al -r mysql root@172.25.254.13:/usr/local/

slave2的基础配置:

[root@mysql3 local]# cd mysql/
[root@mysql3 mysql]# ls
bin  docs  include  lib  LICENSE  man  mysql-test  README  README-test  share  support-files

[root@mysql3 mysql]# useradd -s /sbin/nologin -M mysql
[root@mysql3 mysql]#  mkdir /data/mysql -p
[root@mysql3 mysql]# chown mysql.mysql -R /data/mysql

#生成启动文件
[root@mysql3 mysql]# cd support-files/
[root@mysql3 support-files]# cp mysql.server /etc/init.d/mysqld

 编辑配置文件:

#编辑配置文件
[root@mysql3 mysql]# vim /etc/my.cnf

 编辑环境变量:

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

 mysql初始化并启动:

[root@mysql3 support-files]# mysqld --user mysql --initialize
[root@mysql3 support-files]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/data/mysql/mysql3.err'.
. SUCCESS! 

#修改密码
[root@mysql3 support-files]# mysql_secure_installation

2、从master节点备份数据给slave2:

查看master的数据库表中数据:

 进行拷贝:

#拷贝数据库
[root@mysql1 mysql]# mysqldump -uroot -pmysql gyj > gaoyingjie.sql

#查看拷贝的数据库
[root@mysql1 mysql]# ls
bin   gaoyingjie.sql  lib      man         README       share
docs  include         LICENSE  mysql-test  README-test  support-files

#将拷贝出的文件远程传输给slave2
[root@mysql1 mysql]# scp -r gaoyingjie.sql root@172.25.254.13:/usr/local/mysql

在slave2中:

#新建一个名为gyj的database
[root@mysql3 support-files]# mysql -uroot -pmysql -e "create database gyj;"

#查看可拷贝过来的文件
[root@mysql3 mysql]# ls
bin   gaoyingjie.sql  lib      man         README       share
docs  include         LICENSE  mysql-test  README-test  support-files

#将拷贝文件传给新建的database
[root@mysql3 mysql]# mysql -uroot -p gyj <gaoyingjie.sql
Enter password:

#查询该数据库的gyj.userlist表 ,与master的表中数据一致
[root@mysql3 mysql]#  mysql -uroot -pmysql -e "select * from gyj.userlist;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------+----------+
| username | password |
+----------+----------+
| user1    | 111      |
+----------+----------+

3、配置slave2的slave功能:

在master中查看日志pos

在slave2:

mysql>  CHANGE MASTER TO MASTER_HOST='172.25.254.11', MASTER_USER='repl',MASTER_PASSWORD='repl', MASTEER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1238;

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

mysql> SHOW SLAVE STATUS\G;

查看是否同步数据:

#在master插入一条数据
mysql> insert into gyj.userlist values('user2','222');
Query OK, 1 row affected (0.06 sec)


#在slave查看是否有数据
mysql> select * from gyj.userlist;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 111      |
| user2    | 222      |
+----------+----------+
2 rows in set (0.00 sec)

 4、在slave2端添加延迟复制语句

mysql>  STOP SLAVE SQL_THREAD;
Query OK, 0 rows affected (0.01 sec)

mysql> CHANGE MASTER TO MASTER_DELAY=60;
Query OK, 0 rows affected (0.00 sec)

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

mysql> SHOW SLAVE STATUS\G;

 5、测试

当master删除数据时,slave2会延迟60s再删除数据。

master:删除user2

slave2:查询到的仍然是原始数据

2.3、慢查询日志

慢查询,顾名思义,执行很慢的查询 ,当执行SQL 超过 long_query_time 参数设定的时间阈值(默认 10s )时,就被认为是慢查询,这个 SQL语句就是需要优化的;
慢查询被记录在慢查询日志里 ,慢查询日志默认是不开启的 ,如果需要优化SQL语句,就可以开启这个功能,它可以让你很容易地知道哪些语句是需要优化的。
#默认不开启
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.00 sec)

1、开启慢查询日志

mysql> SET GLOBAL slow_query_log=ON;
Query OK, 0 rows affected (0.01 sec)

mysql> SET long_query_time=4;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW VARIABLES like "long%";
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 4.000000 |
+-----------------+----------+
1 row in set (0.00 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)

 2、查看慢查询日志

[root@mysql1 mysql]# 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

3、测试慢查询

2.4、MySQL的并行复制

默认情况下 slave 中使用的是 sql 单线程回放
master 中时多用户读写,如果使用 sql 单线程回放那么会造成组从延迟严重
开启 MySQL 的多线程回放可以解决上述问题

1、在slave1编辑配置文件

[root@mysql2 mysql]# vim /etc/my.cnf
[root@mysql2 mysql]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL... SUCCESS! 

查看slave1的线程有16个:

三、MySQL半同步模式

1、配置gtid

[root@mysql1 mysql]# vim /etc/my.cnf
[root@mysql1 mysql]# /etc/init.d/mysqld restart
Shutting down MySQL............ SUCCESS! 
Starting MySQL. SUCCESS! 

master:

slave1:

slave2:

2、停止slave

两台slave都要停:

[root@mysql2 mysql]# mysql -uroot -pmysql

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

3、开启slave的gtid

mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.11', MASTER_USER='repl',MASTER_PASSWORD='repl', MASTERR_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.06 sec)

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

mysql> SHOW SLAVE STATUS\G;

4、启动半同步模式

(1)、master端开启半同步

安装半同步插件:

[root@mysql1 mysql]# mysql -uroot -pmysql
#安装插件
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.07 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.05 sec)

打开半同步功能:

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

 查看半同步状态:

 编辑master配置文件

[root@mysql1 mysql]# vim /etc/my.cnf
[root@mysql1 mysql]# /etc/init.d/mysqld restart
Shutting down MySQL........... SUCCESS! 
Starting MySQL. SUCCESS! 

 (2)、slave端开启半同步

#安装插件
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.05 sec)

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

#重启io线程,半同步才能生效
mysql> STOP SLAVE IO_THREAD;
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_master_enabled              | OFF        |
| 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 |
| rpl_semi_sync_slave_enabled               | ON         |
| rpl_semi_sync_slave_trace_level           | 32         |
+-------------------------------------------+------------+
8 rows in set (0.05 sec)

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';

编辑配置文件:(必须在mysql加载模块后才能添加此配置)

slave1与slave2相同

[root@mysql2 mysql]# vim /etc/my.cnf
[root@mysql2 mysql]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 

 5、测试

  • 在master中写入数据:
mysql> insert into gyj.userlist values('user3','333');
Query OK, 1 row affected (0.03 sec)

mysql> select * from gyj.userlist;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 111      |
| user2    | 222      |
| user3    | 333      |
+----------+----------+
3 rows in set (0.00 sec)
#查看
mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';

 连接到2台slave,已同步1笔数据:

  • 模拟故障: 

将slave1和slave2的IO进程停掉

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

在master端插入数据,会有延迟:

 自动转入异步模式OFF,并且未同步数据有2笔:

四、mysql高可用组复制

全部主机停掉mysql:

/etc/init.d/mysqld stop

全部主机删除mysql的数据目录:

rm -rf /data/mysql/*

编辑所有主机musql的配置文件:

配置全部主机的本地解析:

vim /etc/hosts

 初始化mysql:

 mysqld --user=mysql --initialize

启动mysql:

/etc/init.d/mysqld start

 登录mysql并修改密码:

mysql -uroot -p初始化后生成的密码
alter user root@localhost identified by 'gyj';"

配置mysql

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'gyj';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

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

mysql>  CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='gyj' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.02 sec)


#只在第一台主机中开启,后面的主机直接执行START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=ON; #用以指定初始成员,只在第
一台主机中执行
Query OK, 0 rows affected (0.00 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (2.19 sec)

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

#查看组成员信息
mysql> SELECT * FROM performance_schema.replication_group_members;

测试:

  • 在任意一台主机写入数据

可以在其他主机看到该数据:

  • 当其中一台主机挂掉后

 查询组成员可以看出没有mysql2,因为组成员还是大于n/2,所以还是可以写入数据的:

 没有挂掉的mysql3也可以看到数据:

当mysql2重启后:

 在mysql1上查看组成员信息发现没有mysql2,,是因为组成员重启后不自动启动组复制:

 需要对mysql2手动开启组复制:

五、mysql-router

上传并安装mysql-router

 rpm -ivh mysql-router-community-8.4.0-1.el7.x86_64.rpm

 编辑配置文件:

[root@mysql1 ~]# vim /etc/mysqlrouter/mysqlrouter.conf 
[root@mysql1 ~]# systemctl start mysqlrouter.service

 建立测试用户测试:

mysql> create user gyj@'%' identified by 'gyj';
Query OK, 0 rows affected (10.04 sec)

mysql> GRANT ALL ON  gyj.* to gyj@'%';
Query OK, 0 rows affected (0.00 sec)

[root@mysql-router ~]# mysql -ulee -plee -h 172.25.254.11 -P 7001

六、mysql高可用MHA

1、安装MHA所需软件

新建mha主机:mysql-mha(ip172.25.254.50)

mysql-mha主机上传并解压MHA:

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

全部主机取消dns解析:

[root@mysql1 ~]# vim /etc/ssh/sshd_config 
[root@mysql1 ~]# systemctl restart sshd

实现四台主机的免密认证:


[root@mysql1 ~]# ssh-keygen -t rsa
[root@mysql1 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.12
[root@mysql1 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.13
[root@mysql1 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.50

[root@mysql2 ~]# ssh-keygen
[root@mysql2 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.11
[root@mysql2 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.13
[root@mysql2 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.50

[root@mysql-mha ~]# ssh-keygen
[root@mysql-mha ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.11
[root@mysql-mha ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.12
[root@mysql-mha ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.13

在mysql-mha主机上下载所需要软件:

[root@mysql-mha ~]# cd MHA-7/
[root@mysql-mha MHA-7]# ls
mha4mysql-manager-0.58-0.el7.centos.noarch.rpm  perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
mha4mysql-manager-0.58.tar.gz                   perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
mha4mysql-node-0.58-0.el7.centos.noarch.rpm     perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm          perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm  perl-Net-Telnet-3.03-19.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm       perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
[root@mysql-mha MHA-7]# yum install *.rpm -y

将其中的mha4mysql-node-0.58-0.el7.centos.noarch.rpm拷贝给其余三台主机:

[root@mysql-mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.11:/root

[root@mysql-mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.12:/root
   
[root@mysql-mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.13:/root
 

在三台主机中下载安装mha4mysql-node-0.58-0.el7.centos.noarch.rpm

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

2、搭建主从架构

master节点:

/etc/init.d/mysqld stop
rm -rf /data/mysql/*
vim /etc/my.cnf

初始化并登录mysql: 

[root@mysql1 ~]# mysqld --user mysql --initialize
[root@mysql1 ~]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/data/mysql/mysql1.err'.
 SUCCESS! 
[root@mysql1 ~]# mysql -uroot -p'Vo%khweBl5jZ'


#修改密码
mysql> alter user root@localhost identified by 'mysql';
Query OK, 0 rows affected (0.00 sec)

配置mysql:


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

mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.00 sec)

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

在两台slave中:

/etc/init.d/mysqld stop
rm -rf /data/mysql/*
vim /etc/my.cnf

 两台slave初始化并登录mysql:

mysqld --user mysql --initialize
mysql -uroot -p'iUP4cDQW:hT)'

mysql> alter user root@localhost identified by 'gyj';
Query OK, 0 rows affected (0.00 sec)

配置mysql并开启主从模式:

mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.11', MASTER_USER='repl',
    -> MASTER_PASSWORD='gyj', MASTER_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)


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

mysql> start slave;
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;
Query OK, 0 rows affected (0.04 sec)

mysql> START SLAVE IO_THREAD;
Query OK, 0 rows affected (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)

3、配置MHA的管理环境

新建配置文件目录,从模板拷贝:

[root@mysql-mha ~]# mkdir /etc/masterha

[root@mysql-mha ~]# cd MHA-7/
[root@mysql-mha MHA-7]# ls
mha4mysql-manager-0.58-0.el7.centos.noarch.rpm  perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
mha4mysql-manager-0.58.tar.gz                   perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
mha4mysql-node-0.58-0.el7.centos.noarch.rpm     perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm          perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm  perl-Net-Telnet-3.03-19.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm       perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
[root@mysql-mha MHA-7]# tar zxf mha4mysql-manager-0.58.tar.gz

[root@mysql-mha ~]# cd MHA-7/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 

添加172.25.254.20作为配置文件内检测是否能连接的备用ip,当mha检查如果连接不到master172.25.254.11时,会尝试链接172.25.254.20来判断是哪一方的链接出现问题。

[root@mysql1 ~]# ip a a 172.25.254.20 dev eth0

4、检验配置

检测网络及 ssh 免密:
[root@mysql-mha ~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf

 检测数据主从复制情况 :

#在master节点
mysql> GRANT ALL ON *.* TO root@'%' identified by 'mysql';
#在mysql-mha
[root@mysql-mha ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf

5、故障切换

确保以上检测通过后才能进行切换。

无故障手动切换:

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

可以看到手动切换到172.25.254.12上,变成新的master: 

 master故障手动切换:

[root@mysql1 ~]# /etc/init.d/mysqld stop
Shutting down MySQL............ SUCCESS! 
[root@mysql-mha ~]# masterha_master_switch --master_state=dead --conf=/etc/masterha/app1.cnf --dead_master_host=172.25.254.11 --dead_master_port=3306 --new_master_host=172.25.254.12 --new_master_port=3306 --ignore_last_failover

 在172.25.254.13中查看master已经变成172.25.254.12

当172.25.254.11恢复时:需要手动添加到组从关系内成为新的slave

[root@mysql1 ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS! 
[root@mysql1 ~]# mysql -uroot -pmysql

#添加到主从关系内,成为salve
mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.12', MASTER_USER='repl',
    -> MASTER_PASSWORD='gyj', MASTER_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

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

master(172.25.254.12)出现故障后,自动切换:

#监测
[root@mysql-mha ~]# masterha_manager --conf=/etc/masterha/app1.cnf

[root@mysql-mha ~]# cat /etc/masterha/manager.log
[root@mysql2 ~]# /etc/init.d/mysqld stop
Shutting down MySQL............ SUCCESS! 

在172.25.254.13中看到master变成了172.25.254.11:

当172.25.254.12恢复时:需要手动添加到主从关系中成为新的slave

mysql>  CHANGE MASTER TO MASTER_HOST='172.25.254.11', MASTER_USER='repl',
    -> MASTER_PASSWORD='gyj', MASTER_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.04 sec)

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

mysql> SHOW SLAVE STATUS\G;

七、为MHA添加VIP功能

清除锁文件

[root@mysql-mha ~]# rm -rf /etc/masterha/app1.failover.complete 

上传vip脚本文件:

[root@mysql-mha ~]# ls
anaconda-ks.cfg  master_ip_failover  master_ip_online_change  MHA-7  MHA-7.zip
[root@mysql-mha ~]# cp master_ip_failover master_ip_online_change /usr/local/bin/
[root@mysql-mha ~]# chmod +x /usr/local/bin/master_ip_*
 

编辑vip脚本:改为自己的vip

[root@mysql-mha ~]# vim /usr/local/bin/master_ip_failover 
[root@mysql-mha ~]# vim /usr/local/bin/master_ip_online_change 

在master上添加vip:

启动监控:

[root@mysql-mha ~]#  masterha_manager --conf=/etc/masterha/app1.cnf
[root@mysql-mha ~]# cat /etc/masterha/manager.log

 将master:172.25.254.11停掉:172.25.254.12会变成新的master,并且vip会转移到172.25.254.12

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

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

相关文章

HX711—称重模块

1、简介 HX711 采用了海芯科技集成电路专利技术&#xff0c; 是一款专为高精度电子秤而设计的 24 位 A/D 转 换器芯片。 2、原理图 PCB参考设计原理图 3、模块驱动代码&#xff08;固件库&#xff09; 数据读取代码分析 HX711信号读取时序 初始化&#xff1a; 将 PD_SCK&…

C练手题--A snail enters a bar! 【7 kyu】

一、原题 链接&#xff1a;Training on A snail enters a bar! | Codewars Problem Description: A snail is crawling along a rubber band that has an initial length of x units. The snail moves at a constant speed of y units per minute. As the snail crawls from t…

upload-labs靶场通关(附靶场环境)

链接: https://pan.baidu.com/s/1GQP5zthh598A4Mp-WQM4vA 提取码: zovn 环境搭建 步骤一&#xff1a;将环境附件下载到phpstudy_pro\WWW下面修改名字为upload 步骤二&#xff1a;询问绑定地址 第一关 less-1 步骤一&#xff1a;上传一句话木马 步骤二&#xff1a;更改文件名…

昇腾 编程范式 - 矢量编程流水任务设计

昇腾 编程范式 - 矢量编程流水任务设计 flyfish 编程范式简单来说就是不同编程风格或方式的“套路”。按着套路走就可以。 矢量算子编程范式把算子的实现流程分为3个基本任务:CopyOut&#xff0c;Compute&#xff0c;copyout CopyIn负责数据搬入操作&#xff0c; Compute负责…

spring入门(一)spring简介

一、spring简介 Spring技术是JavaEE开发必备技能&#xff0c;企业开发技术选型命中率>90% spring能够简化开发&#xff0c;降低企业级开发的复杂性。框架整合&#xff0c;高效整合其他技术&#xff0c;提高企业级应用开发与运行效率。 主要学习&…

Leetcode3244. 新增道路查询后的最短距离 II

Every day a Leetcode 题目来源&#xff1a;3244. 新增道路查询后的最短距离 II 解法1&#xff1a;贪心 由于题目保证添加的边&#xff08;捷径&#xff09;不会交叉&#xff0c;从贪心的角度看&#xff0c;遇到捷径就走捷径是最优的。所有被跳过的城市都不可能再出现在最短…

从人机环境系统的角度看,自下而上和自上而下两种认知方式如何有机地结合使用?...

从具体的“态”到抽象的“势”&#xff0c;从感觉到认知是自下而上的&#xff0c;例如 GPT&#xff1b;反之&#xff0c;则是自上而下的&#xff0c;比如有经验的人。理性偏自下而上&#xff0c;神性&#xff08;感觉&#xff09;则自上而下。其中&#xff0c;“态”和“势”是…

[000-01-008].Seata案例应用

业务说明&#xff1a;这里我们创建三个服务&#xff0c;一个订单服务&#xff0c;一个库存服务&#xff0c;一个账户服务。当用户下单时&#xff0c;会在订单服务中创建一个订单&#xff0c;然后通过远程调用库存服务来扣减下单商品的库存&#xff1b;再通过远程调用账户服务来…

如何用命令行工作流做定制化 AI 文献回顾?

&#xff08;注&#xff1a;本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 千万不要把 AI 生成的结果&#xff0c;直接端出去给你的导师&#xff0c;甚至是投稿到出版社。 需求 我最近在 B 站发布了一个视频&#xff0c;叫做《AI…

Redis:Redis性能影响因素

这里写自定义目录标题 一、CPU对Redis的影响二、磁盘对Redis的影响三、网络对Redis的影响四、Swap对Redis的影响 一、CPU对Redis的影响 二、磁盘对Redis的影响 性能建议&#xff1a; 如果是热点场景&#xff0c;建议大家关闭rdb和aof。在SATA和SAS普通盘上&#xff0c;append…

【微服务】springboot 自定义注解+反射+aop实现动态修改请求参数

目录 一、前言 二、动态修改接口请求参数的场景 2.1 动态修改请求参场景汇总 2.1.1 数据格式标准化 2.1.2 安全需要 2.1.3 参数校验与默认值设定 2.1.4 数据隐私保护 2.1.5 适配不同客户端 2.1.6 统计与监控 2.1.7 高级功能特性 三、springboot 使用过滤器和拦截器动…

Mysql8 主从复制主从切换(超详细)

文章目录 1 主从复制1.1 实施前提1.2 主节点配置(在192.168.25.91操作)1.3 从节点配置(在192.168.25.92操作)1.4 创建用于主从同步的用户1.5 开启主从同步1.5 主从同步验证 2 主从切换2.1 实施前提2.2 主节点设置只读(在192.168.25.91操作)2.3 检查主从数据是否同步完毕(在192.…

Vue的冷门内置指令:优化与性能提升的利器

在Vue.js的广阔生态中&#xff0c;开发者们常常聚焦于那些耳熟能详的内置指令&#xff0c;如v-for用于循环渲染列表&#xff0c;v-if和v-else-if用于条件渲染等。然而&#xff0c;Vue还提供了一系列较为冷门但功能强大的内置指令&#xff0c;它们在某些特定场景下能够显著提升应…

ER模型介绍

7.1.概述&#xff1a; 1.ER模型也叫做实体关系模型&#xff0c;是用来描述现实生活中客观存在的事物、事物的属性&#xff0c;以及事物之间关系的一种数据模型。2.在开发基于数据库的信息系统的设计阶段&#xff0c;通常使用ER模型来描述信息需要和信息特性&#xff0c;帮助我…

云平台之Zabbix 监控网站

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

NMPC非线性模型预测控制经验分享与代码实例

NMPC非线性模型预测控制经验分享与代码实例 原本做完本科毕设之后就应该动笔写这一部分&#xff0c;但是做的过程中慢慢意识到自己懂的只是一点点。最近重新接触一些优化相关的问题&#xff0c;希望能够做出我认知之下比较好的解答。本人知识有限&#xff0c;难免写的有问题&am…

ClickHousez中如何定时清理过期数据库?

一、脚本清理 要在ClickHouse中自动删除过期的数据库&#xff0c;你可以使用ClickHouse的SQL命令结合外部脚本&#xff08;如Shell脚本&#xff09;和计划任务&#xff08;如cron&#xff09;来实现。下面是一个示例&#xff0c;展示如何创建一个Shell脚本来检查数据库的创建时…

1、.Net UI框架:Avalonia UI - .Net宣传系列文章

Avalonia UI是一个开源的跨平台UI框架&#xff0c;它允许开发者使用C#和XAML来创建应用程序&#xff0c;这些应用程序可以在多个平台上运行&#xff0c;包括Windows、macOS、Linux、Android和iOS。Avalonia UI的设计目标是提供一个现代化、可移植的UI框架&#xff0c;它具有类似…

C++之搜索二叉树(上)

目录 搜索二叉树的概念 搜索二叉树的操作 递归版本 二叉树的插入 二叉树的查找 二叉树的删除 非递归版本 二叉树的递归插入 二叉树的递归查找 二叉树的递归删除 在之前我们已经学习过了二叉树这一数据结构&#xff0c;本期我们将学习一种新的数据结构------搜索二…

Ubuntu服务器时间和本地时间不一致怎么解决——Linux的Local Time和RTC time

最近一直在搞大模型的相关工作&#xff0c;所以一直在用Linux服务器&#xff0c;前面的文章里也提到了&#xff0c;我用的是一台Dell PowerEdge R730xd。 但在使用中发现&#xff0c;IDRAC中的日志时间和本地时间存在时差&#xff0c;大概相关8小时。 对于技术人员&#xff0c…