MySQL集群技能

打印 上一主题 下一主题

主题 562|帖子 562|积分 1686

目次
一、MySQL安装部署
1、MySQL源码安装
2、MySQL部署
二、MySQL组从复制
1、组从复制集群配置
2、mysql主从集群slave添加及延迟回放
1、slave添加
2、延迟复制
3、慢查询日志
4、MySQL并行复制
5、组从复制原理
 6、MySQL的GTid模式
三、MySQL半同步模式
四、MySQL高可用之组复制
五、MySQL路由
六、mysql高可用集群MHA
1、MHA部署
2、MHA故障切换
1、无故障情况手动切换
2、出现故障手动切换
3、出现故障主动切换
3、MySQL高可用集群VIP管理


随着数据量的不停增长和业务对数据库高可用性、高扩展性及高性能的需求日益剧烈,MySQL 集群技能应运而生。它解决了传统单节点 MySQL 数据库面对的单点故障问题,通过多节点部署实现高可用性,当某个节点出现故障时,其他节点可以继续提供服务;同时解决了数据存储容量和处理本事的瓶颈问题,实现了可扩展性,能够随着业务的发展动态增长节点;还提升了数据库的性能,通过负载平衡等技能将请求分发到差别节点举行处理,进步了响应速度和吞吐量。
一、MySQL安装部署

1、MySQL源码安装

情况准备:
基于RHEL7情况的mysql源码安装
1、安装源码安装必要的软件
  1. [root@mysql-node1 ~]# yum  install cmake gcc-c++ openssl-devel -y
  2. [root@mysql-node1 ~]# yum install ncurses-devel.x86_64 -y
  3. [root@mysql-node1 ~]# yum install libtirpc-devel-0.2.4-0.16.el7.x86_64.rpm -y
  4. [root@mysql-node1 ~]# tar zxf mysql-boost-5.7.44.tar.gz
  5. [root@mysql-node1 ~]# cd mysql-5.7.44/
复制代码
2、源码编译及安装
  1. [root@mysql-node1 ~]# 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/
  2. [root@mysql-node1 ~]# make -j4  && make install
复制代码
2、MySQL部署

  1. [root@mysql-node2 ~]# cd /usr/local/mysql/
  2. [root@mysql-node2 ~]# useradd -s /sbin/nologin -M mysql
  3. [root@mysql-node2 mysql]# mkdir /data/mysql -p
  4. [root@mysql-node2 ~]# chown mysql.mysql -R /data/mysql
  5. [root@mysql-node2 support-files]# cp mysql.server /etc/init.d/mysqld
复制代码
  1. [root@mysql-node2 ~]# vim /etc/my.cnf
  2. [root@mysql-node2 ~]# cat  /etc/my.cnf
  3. [mysqld]
  4. datadir=/data/mysql
  5. socket=/data/mysql/mysql.sock
  6. symbolic-links=0
复制代码
  1. [root@mysql-node2 ~]# vim ~/.bash_profile
  2. [root@mysql-node2 ~]# source ~/.bash_profile
复制代码

数据库初始化建立mysql基本数据
  1. [root@mysql-node2 ~]# mysqld --user mysql --initialize
  2. [root@mysql-node2 ~]# /etc/init.d/mysqld start
  3. [root@mysql-node2 ~]# chkconfig mysqld on
复制代码
安全初始化
  1. [root@mysql-node2 ~]# mysql_secure_installation
复制代码
二、MySQL组从复制

1、组从复制集群配置

master配置
  1. [root@mysql-node1 ~]# vim /etc/my.cnf
  2. [root@mysql-node1 ~]# cat  /etc/my.cnf
  3. [mysqld]
  4. datadir=/data/mysql
  5. socket=/data/mysql/mysql.sock
  6. symbolic-links=0
  7. server-id=10
  8. log-bin=mysql-bin
  9. [root@mysql-node1 ~]# /etc/init.d/mysqld restart
  10. Shutting down MySQL.. SUCCESS!
  11. Starting MySQL. SUCCESS!
复制代码

进入数据库配置用户权限

salve配置
  1. [root@mysql-node2 ~]# vim /etc/my.cnf
  2. [root@mysql-node2 ~]# cat  /etc/my.cnf
  3. [mysqld]
  4. datadir=/data/mysql
  5. socket=/data/mysql/mysql.sock
  6. symbolic-links=0server-id=2[root@mysql-node2 ~]# /etc/init.d/mysqld restart
复制代码



2、mysql主从集群slave添加及延迟回放

1、slave添加

添加第二个slave安装部署mysql
生产情况中备份时必要锁表,包管备份前后的数据一致 mysql> FLUSH TABLES WITH READ LOCK;
备份后再解锁 mysql> UNLOCK TABLES; mysqldump命令备份的数据文件,在还原时先DROP TABLE,必要合并数据时必要删除此语句
master节点备份数据
  1. [root@mysql-node1 ~]# mysqldump -uroot -p mlh > mlh.sql
  2. [root@mysql-node1 ~]# scp mlh.sql root@172.25.254.30:/mnt/
  3. [root@mysql-node3 mnt]# mysql -uroot -p123 -e "CREATE DATABASE mlh;"
  4. [root@mysql-node3 mnt]# mysql -uroot -p123 mlh < mlh.sql
复制代码

  1. CHANGE MASTER TO  MASTER_HOST='172.25.254.10',MASTER_USER='repl',MASTER_PASSWORD='123',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=154;
复制代码

测试:
master
  1. mysql> INSERT INTO mlh.userlist values('user2','123');
  2. Query OK, 1 row affected (0.00 sec)
复制代码
slave2

2、延迟复制

延迟复制指的是从服务器在复制主服务器的二进制日志时,故意设置肯定的时间延迟,而不是实时同步数据。例如,主服务器上的数据发生变化后,从服务器不会立刻举行同步,而是等候一段时间(如几分钟、几小时等)后再开始复制这些变化。
  1. mysql> STOP SLAVE SQL_THREAD;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> CHANGE MASTER TO MASTER_DELAY=60;
  4. Query OK, 0 rows affected (0.00 sec)
  5. mysql> START SLAVE SQL_THREAD;
  6. Query OK, 0 rows affected (0.00 sec)
  7. mysql> SHOW SLAVE STATUS\G;
复制代码
3、慢查询日志

慢查询日志可以记载实行时间凌驾特定阈值的 SQL 语句,资助你找出性能瓶颈,以便举行优化。在主从集群情况下,它对于分析整个系统的性能问题尤其重要。

  • 性能优化:通过分析慢查询日志中的语句,可以针对性地举行索引优化、查询重写等操作,进步数据库的响应速度。
  • 故障排查:如果主从同步出现延迟,慢查询日志可以资助确定是否是由于某些耗时的查询导致从库无法实时跟上主库的写入速度。

  1. mysql> SET GLOBAL slow_query_log=ON;
  2. Query OK, 0 rows affected (0.00 sec)
  3. #开启慢查询功能
复制代码
测试:
  1. mysql> SELECT SLEEP (10);
  2. [root@mysql-node1 ~]# cat /data/mysql/mysql-node1-slow.log
  3. #慢查询日志
复制代码
4、MySQL并行复制

传统的 MySQL 主从复制是单线程的,即从库只有一个 SQL 线程来次序地应用主库传过来的二进制日志(binlog)。而并行复制则允很多个线程同时处理差别的事件,从而加速从库的复制速度,减少主从之间的延迟。
  1. [root@mysql-node2 ~]# vim /etc/my.cnf
  2. [mysqld]
  3. datadir=/data/mysql
  4. socket=/data/mysql/mysql.sock
  5. server-id=2
  6. gtid_mode=ON
  7. enforce-gtid-consistency=ON
  8. slave-parallel-type=LOGICAL_CLOCK #基于组提交,
  9. slave-parallel-workers=10 #开启线程数量
  10. master_info_repository=TABLE #master信息在表中记录,默认记录
  11. 在/data/mysql//master.info
  12. relay_log_info_repository=TABLE #回放日志信息在表中记录,默认记录
  13. 在/data/mysql/relay-log.info
  14. relay_log_recovery=ON #日志回放恢复功能开启
  15. [root@mysql-node2 ~]# /etc/init.d/mysql start
复制代码

5、组从复制原理


三个线程 实际上主从同步的原理就是基于 binlog 举行数据同步的。在主从复制过程中,会基于3 个线程来操作, 一个主库线程,两个从库线程。


  • 二进制日志转储线程(Binlog dump thread)是一个主库线程。当从库线程毗连的时间, 主库可以 将二进制日志发送给从库,当主库读取变乱(Event)的时间,会在 Binlog 上加锁,读取完成之 后,再将锁开释掉。
  • 从库 I/O 线程会毗连到主库,向主库发送请求更新 Binlog。这时从库的 I/O 线程就可以读取到主库 的二进制日志转储线程发送的 Binlog 更新部分,并且拷贝到本地的中继日志 (Relay log)。
  • 从库 SQL 线程会读取从库中的中继日志,并且实行日志中的变乱,将从库中的数据与主库保持同 步。
复制三步调
步调1:Master将写操作记载到二进制日志(binlog)。
步调2:Slave将Master的binary log events拷贝到它的中继日志(relay log);
步调3:Slave重做中继日志中的变乱,将改变应用到自己的数据库中。 MySQL复制是异步的且串行化 的,而且重启后从接入点开始复制。
架构缺陷
主从架构采用的是异步机制,master更新完成后直接发送二进制日志到slave,但是slaves是否真正保存了数据master端不会检测,master端直接保存二进制日志到磁盘 ,当master端到slave端的网络出现问题时大概master端直接挂掉,二进制日志大概根本没有到达slave,master出现问题slave端接受master,这个过程中数据就丢失了 ,这样的问题出现就无法到达数据的强一致性,零数据丢失。
 6、MySQL的GTid模式

当master出现问题后,slave2和master的数据最接近,会被作为新的master slave1指向新的master,但是他不会去检测新的master的pos id,只必要继续读取自己gtid_next即可。
  1. #MASTER
  2. [root@mysql-node1 ~]# cat /etc/my.cnf
  3. [mysqld]
  4. datadir=/data/mysql
  5. socket=/data/mysql/mysql.sock
  6. symbolic-links=0
  7. log-bin=mysql-bin
  8. server-id=10
  9. slow_query_log=on
  10. gtid_mode=ON
  11. enforce-gtid-consistency=ON
  12. [root@mysql-node1 ~]# /etc/init.d/mysqld restart
  13. #Slave2
  14. [root@mysql-node3 ~]# cat /etc/my.cnf
  15. [mysqld]
  16. datadir=/data/mysql
  17. socket=/data/mysql/mysql.sock
  18. symbolic-links=0
  19. server-id=30
  20. gtid_mode=ON
  21. enforce-gtid-consistency=ON
  22. [root@mysql-node3 ~]# /etc/init.d/mysqld restart
复制代码

  1. #停止slave端
  2. [root@mysql-node2 ~]# mysql -p
  3. mysql> stop slave;
  4. Query OK, 0 rows affected (0.00 sec)
  5. [root@mysql-node3 ~]# mysql -p
  6. mysql> stop slave;
  7. Query OK, 0 rows affected (0.01 sec)
  8. #开启slave端的gtid
  9. mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='repl', MASTER_PASSWORD='123', MASTER_AUTO_POSITION=1;
  10. mysql> start slave;
  11. mysql> show slave status\G;
复制代码

三、MySQL半同步模式

MySQL 半同步复制工作模式是一种在主从复制架构下进步数据一致性和可用性的机制。在该模式下,主库在实行完事件提交后,会等候至少一个从库吸收到并写入中继日志后返回确认信息,才认为事件提交乐成。这样确保了主库的数据在至少一个从库中有备份,避免了主库在事件提交后但从库还未同步数据时主库发生故障导致的数据丢失问题,进步了数据的安全性和系统的可靠性。
1、事件提交过程: 当客户端向主库发送一个写请求时,主库实行事件并将事件记载到二进制日志中。 主库将事件写入二进制日志后,会等候至少一个从库吸收到事件并返回确认信息。这个等候过程是异步的,不会阻塞主库的其他操作。 当主库吸收到至少一个从库的确认信息后,认为事件提交乐成,并向客户端返回乐成响应。
2、从库复制过程: 从库通过 I/O 线程从主库读取二进制日志,并将其写入到本地的中继日志(Relay Log)中。 从库的 SQL 线程读取中继日志中的事件,并在从库上依次实行这些事件,以保持与主库的数据同步。
3、故障处理: 如果主库在等候从库确认信息的过程中超时,主库会切换回异步复制模式,继续处理客户端的请求。此时,大概会出现主从数据不一致的情况。 当从库出现故障时,主库会继续处理客户端的请求,但不会等候从库的确认信息。当从库规复后,会主动从主库同步数据,以保持与主库的数据一致。


MASTER配置
  1. [root@mysql-node1 ~]# vim /etc/my.cnf
  2. rpl_semi_sync_master_enabled=1
  3. #先不要重启否则会报错,在mysql执行打开半同步功能命令后才能重启
复制代码
安装半同步插件
  1. mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
复制代码
检察插件情况

  1. mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
  2.   -> FROM INFORMATION_SCHEMA.PLUGINS
  3.   -> WHERE PLUGIN_NAME LIKE '%semi%';
  4. #打开半同步功能
  5. mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
  6. #查看半同步功能状态
  7. mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
  8. mysql> SHOW STATUS LIKE 'rpl_semi_sync%';
复制代码


在slave端开启半同步功能
  1. slave1
  2. [root@mysql-node2 & 3 ~]# cat  /etc/my.cnf
  3. [mysqld]
  4. datadir=/data/mysql
  5. socket=/data/mysql/mysql.sock
  6. symbolic-links=0
  7. server-id=20
  8. gtid_mode=ON
  9. enforce-gtid-consistency=ON
  10. rpl_semi_sync_master_enabled=1
  11. #安装半同步插件
  12. mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
  13. #打开半同步功能
  14. mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
  15. #重启I/O线程半同步才会生效
复制代码
测试:
在 MySQL 中,如果主库在等候从库确认信息过程中超时,会切换回异步复制模式继续处理客户端请求,此时大概出现主从数据不一致情况。当从库出现故障时,主库也会继续处理请求且不等候从库确认信息,从库规复后会主动从主库同步数据以保持一致。如果所有从设备都关闭了半同步功能,主设备会继续正常写入数据且不会宕机,备份设备重新启动后会读取从主设备复制的数据包罗之前未读取部分,因为主设备会继续记载所有事件且从设备从主设备二进制日志中复制。当从设备都关闭半同步功能时,主设备不会一直处于等候状态直到收到 ACK 后才继续读取写入数据,在 MySQL 的半同步复制模式下,主库在事件提交时会等候至少一个从库的 ACK 消息后才认为事件提交乐成,但如果所有从库都关闭半同步功能,主库会主动切换回异步复制模式,在异步复制模式下,主库在事件提交后不会等候从库确认,而是立刻返回给客户端事件提交乐成的响应,然后继续处理后续读写请求,所以从设备都关闭半同步功能后,主设备会按照异步复制的方式工作。



四、MySQL高可用之组复制

MySQL 组复制是一种高可用、高可靠的数据库复制技能。其工作原理是多个 MySQL 服务器组成一个复制组,组内成员通过分布式的事件机制和通信协议实现数据的同步和一致性。事件在组内被广播,各成员根据一致性协议举行验证和实行,确保数据在组内的一致性。当有成员发生故障时,组内其他成员可以主动检测并举行故障规复,包管数据库服务的持续可用。同时,新成员可以动态参加组,实现灵活的扩展和高可用性部署。
配置:
  1. [root@mysql-node1 ~]# vim /etc/hosts
  2. 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
  3. ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
  4. 172.25.254.10   mysql-node1.mlh.org
  5. 172.25.254.20   mysql-node2.mlh.org
  6. 172.25.254.30   mysql-node3.mlh.org
  7. #在一主两从主机做解析
  8. [root@mysql-node1 ~]# /etc/init.d/mysqld stop
  9. #清除mysql旧数据
  10. [root@mysql-node1 ~]# rm -rf /data/mysql/*
  11. #编辑主配置文件
  12. [root@mysql-node1 ~]# vim /etc/my.cnf
  13. [mysqld]
  14. datadir=/data/mysql
  15. socket=/data/mysql/mysql.sock
  16. symbolic-links=0
  17. server-id=10
  18. disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
  19. gtid_mode=ON
  20. enforce_gtid_consistency=ON
  21. master_info_repository=TABLE
  22. relay_log_info_repository=TABLE
  23. binlog_checksum=NONE
  24. log_slave_updates=ON
  25. log_bin=binlog
  26. binlog_format=ROW
  27. plugin_load_add='group_replication.so'
  28. transaction_write_set_extraction=XXHASH64
  29. group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
  30. group_replication_start_on_boot=off
  31. group_replication_local_address="172.25.254.10:33061"
  32. group_replication_group_seeds="172.25.254.10:33061,172.25.254.20:33061,172.25.254.30:33061"
  33. group_replication_ip_whitelist="172.25.254.0/24,127.0.0.1/8"
  34. group_replication_bootstrap_group=off
  35. group_replication_single_primary_mode=OFF
  36. group_replication_enforce_update_everywhere_checks=ON
  37. group_replication_allow_local_disjoint_gtids_join=1
  38. [root@mysql-node1 ~]# mysqld --user=mysql --initialize #初始化mysql
  39. [root@mysql-node1 ~]# /etc/init.d/mysqld start        #启动mysql
  40. [root@mysql-node1 ~]# mysql -uroot -p'eOoBC0Jkie)x'        #登录mysql,密码为初始化生成的密码
  41. mysql> alter user root@localhost identified by '123';        #登录后修改密码
  42. slave主机配置同理
复制代码
master-sql配置
  1. mysql> SET SQL_LOG_BIN=0;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'lee';
  4. Query OK, 0 rows affected (0.00 sec)
  5. mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
  6. Query OK, 0 rows affected (0.00 sec)
  7. mysql> FLUSH PRIVILEGES;
  8. Query OK, 0 rows affected (0.00 sec)
  9. mysql> SET SQL_LOG_BIN=1;
  10. Query OK, 0 rows affected (0.00 sec)
  11. mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='lee' FOR CHANNEL
  12. 'group_replication_recovery';
  13. Query OK, 0 rows affected, 2 warnings (0.00 sec)
  14. mysql> SET GLOBAL group_replication_bootstrap_group=ON; #用以指定初始成员,值在第
  15. 一台主机中执行
  16. Query OK, 0 rows affected (0.00 sec)
  17. mysql> START GROUP_REPLICATION;
  18. Query OK, 0 rows affected, 1 warning (2.19 sec)
  19. mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
  20. Query OK, 0 rows affected (0.00 sec)
  21. mysql> SELECT * FROM performance_schema.replication_group_members;
复制代码

slave-sql配置
  1. mysql> SET SQL_LOG_BIN=0;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'lee';
  4. Query OK, 0 rows affected (0.00 sec)
  5. mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
  6. Query OK, 0 rows affected (0.00 sec)
  7. mysql>  FLUSH PRIVILEGES;
  8. Query OK, 0 rows affected (0.00 sec)
  9. mysql> SET SQL_LOG_BIN=1;
  10. Query OK, 0 rows affected (0.00 sec)
  11. mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='lee' FOR CHANNEL
  12.     -> 'group_replication_recovery';
  13. Query OK, 0 rows affected, 2 warnings (0.02 sec)
  14. mysql> START GROUP_REPLICATION;
  15. Query OK, 0 rows affected, 1 warning (5.71 sec)
  16. mysql> SELECT * FROM performance_schema.replication_group_members;
复制代码
当三台主机都配置好后,可以发现在每台主机都有对方的信息

测试:
在主设备创建库表并插入数据,在两个slave主机能看到;
  1. mysql> CREATE DATABASE mlh;
  2. Query OK, 1 row affected (0.00 sec)
  3. mysql> CREATE TABLE mlh.userlist(
  4.     -> username VARCHAR(10) PRIMARY KEY NOT NULL,
  5.     -> password VARCHAR(50) NOT NULL
  6.     -> );
  7. Query OK, 0 rows affected (0.01 sec)
  8. mysql> INSERT INTO mlh.userlist VALUES('user1','111');
  9. Query OK, 1 row affected (0.01 sec)
复制代码
效果:

在两台slave插入数据,主设备也能看到
  1. slave1:INSERT INTO mlh.userlist VALUES('user2','222');
  2. slave2:INSERT INTO mlh.userlist VALUES('user3','333');
复制代码

五、MySQL路由

  1. 安装mysql-router
  2. [root@mysql-node1 ~]#  rpm -ivh mysql-router-community-8.4.0-1.el7.x86_64.rpm
  3. 配置Mysql-router文件
  4. [root@mysql-node1 ~]# vim /etc/mysqlrouter/mysqlrouter.conf
  5. [routing:ro]
  6. bind_address = 0.0.0.0
  7. bind_port = 7001
  8. destinations = 172.25.254.20:3306,172.25.254.30:3306
  9. routing_strategy = round-robin
  10. [root@mysql-node1 ~]# systemctl start mysqlrouter.service
复制代码

建立远程访问用户
  1. mysql> CREATE USER mlh@'%' identified by '123';
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> grant all ON *.* to mlh@'%';
  4. Query OK, 0 rows affected (0.00 sec)
复制代码
测试:
  1. [root@mysql-node1 ~]#  mysql -uroot -p123 -h 172.25.254.10 -P  7001
复制代码

mysql router 并不能限制数据库的读写,访问分流
六、MySQL高可用集群MHA

MySQL 高可用集群 MHA(Master High Availability)主要是通过监控和管理 MySQL 主从复制架构来实现高可用性。其工作原理是持续监控 MySQL 主服务器状态,当检测到主服务器故障时,主动选择一个最优的从服务器提升为新主服务器,并将其他从服务器指向新主服务器举行数据同步。MHA 的功能包罗快速故障转移,最大限度地减少数据丢失;支持在线主从切换,对应用程序影响小;可主动修复从服务器数据不一致问题,确保数据的完备性和一致性,为 MySQL 数据库提供了可靠的高可用解决方案,保障业务系统的持续稳固运行。
为什么要用MHA? Master的单点故障问题
什么是 MHA? MHA(Master High Availability)是一套良好的MySQL高可用情况下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中,MHA能做到0-30秒内主动完成故障切换操作。 MHA能在故障切换的过程中最大水平上包管数据的一致性,以到达真正意义上的高可用。
MHA 的组成 MHA由两部分组成:MHAManager (管理节点) MHA Node (数据库节点), MHA Manager 可以单独部署在一台独立的呆板上管理多个master-slave集群,也可以部署在一台 slave 节点上。 MHA Manager 会定时探测集群中的 master 节点。 当 master 出现故障时,它可以主动将最新数据的 slave 提升为新的 master, 然后将所有其他的 slave 重新指向新的 master。
MHA 的特点 主动故障切换过程中,MHA从宕机的主服务器上保存二进制日志,最大水平的包管数据不丢失 使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日 志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以包管所有节点的数 据一致性 现在MHA支持一主多从架构,最少三台服务,即一主两从
故障切换备选主库的算法 1.一样平常判断从库的是从(position/GTID)判断优劣,数据有差异,最接近于master的slave,成为备选 主。 2.数据一致的情况下,按照配置文件次序,选择备选主库。 3.设定有权重(candidate_master=1),按照权重欺压指定备选主。 (1)默认情况下如果一个slave落后master 100M的relay logs的话,即使有权重,也会失效。 (2)如果check_repl_delay=0的话,即使落后很多日志,也欺压选择其为备选主。
MHA工作原理 现在MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群必须最少有3台数据库服务器, 一主二从,即一台充当Master,台充当备用Master,另一台充当从库。 MHA Node 运行在每台 MySQL 服务器上 MHAManager 会定时探测集群中的master 节点 当master 出现故障时,它可以主动将最新数据的slave 提升为新的master 然后将所有其他的slave 重新指向新的master,VIP主动漂移到新的master。 整个故障转移过程对应用程序完全透明。
1、MHA部署

创建一个新主机172.25.254.50
  1. [root@mysql-mha ~]# unzip MHA-7.zip
  2. [root@mysql-mha ~]# cd MHA-7/
复制代码
剖析
  1. [root@mysql-mha ~]# vim /etc/hosts
  2. 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
  3. ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
  4. 172.25.254.50   mysql-MHA.mlh.org
  5. 172.25.254.10   mysql-node1.mlh.org
  6. 172.25.254.20   mysql-node2.mlh.org
  7. 172.25.254.30   mysql-node3.mlh.org
  8. [root@mysql-mha ~]# scp /etc/hosts root@172.25.254.10:/etc/hosts
  9. [root@mysql-mha ~]# scp /etc/hosts root@172.25.254.20:/etc/hosts
  10. [root@mysql-mha ~]# scp /etc/hosts root@172.25.254.30:/etc/hosts
复制代码
免密认证
  1. [root@mysql-mha ~]# ssh-keygen
  2. [root@mysql-mha ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.10
  3. [root@mysql-mha ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.20
  4. [root@mysql-mha ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.30
  5. [root@mysql-mha .ssh]# scp id_rsa root@172.25.254.10:/root/.ssh/
  6. id_rsa                                            100% 1675     2.6MB/s   00:00
  7. [root@mysql-mha .ssh]# scp id_rsa root@172.25.254.20:/root/.ssh/
  8. id_rsa                                            100% 1675     1.3MB/s   00:00
  9. [root@mysql-mha .ssh]# scp id_rsa root@172.25.254.30:/root/.ssh/
  10. id_rsa                                            100% 1675     2.6MB/s   00:00
复制代码
初始化10、20、30三台主机
登录MySQL配置
  1. #搭建主设备
  2. mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'lee';
  3. Query OK, 0 rows affected (0.00 sec)
  4. mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%';
  5. Query OK, 0 rows affected (0.00 sec)
  6. mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
  7. Query OK, 0 rows affected (0.02 sec)
  8. mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
  9. Query OK, 0 rows affected (0.00 sec)
  10. mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
  11. mysql> SHOW STATUS LIKE 'rpl_semi_sync%';
复制代码

从设备配置
  1. #配置前打开主设备log-bin=mysql-bin功能
  2. mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='repl',
  3. MASTER_PASSWORD='lee', MASTER_AUTO_POSITION=1;
  4. Query OK, 0 rows affected, 2 warnings (0.00 sec)
  5. mysql> start slave;
  6. Query OK, 0 rows affected (0.00 sec)
  7. mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
  8. Query OK, 0 rows affected (0.01 sec)
  9. mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;
  10. Query OK, 0 rows affected (0.00 sec)
  11. mysql> STOP SLAVE IO_THREAD;
  12. Query OK, 0 rows affected (0.00 sec)
  13. mysql> START SLAVE IO_THREAD;
  14. Query OK, 0 rows affected (0.00 sec)
  15. mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
复制代码

安装MHA软件
  1. [root@mysql-mha MHA-7]# yum install *.rpm -y
  2. [root@mysql-mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.10:/root
  3. [root@mysql-mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.20:/root
  4. [root@mysql-mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.30:/root
  5. [root@mysql-node1&2&3 ~]# yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y
复制代码


  1. [root@mysql-mha ~]# masterha_manager --help
  2. Usage:
  3.   masterha_manager --global_conf=/etc/masterha_default.cnf #全局配置文件,记录
  4. 公共设定
  5.   --conf=/usr/local/masterha/conf/app1.cnf #不同管理配置文件,记录各自配
  6.   See online reference
  7.   (http://code.google.com/p/mysql-master-ha/wiki/masterha_manager) for
  8.   details.
复制代码
因为我们当前只有一套主从,所以我们只必要写一个配置文件即可,rpm包中没有为我们准备配置文件的模板,可以解压源码包后在samples中找到配置文件的模板文件。
  1. #生成配置文件
  2. [root@mysql-mha ~]# mkdir /etc/masterha
  3. [root@mysql-mha MHA-7]# tar zxf mha4mysql-manager-0.58.tar.gz
  4. [root@mysql-mha MHA-7]# cd mha4mysql-manager-0.58/samples/conf/
  5. [root@mysql-mha conf]# cat masterha_default.cnf app1.cnf >
  6. /etc/masterha/app1.cnf
复制代码
允许超等用户远程登登录
  1. mysql> CREATE USER root@'%' identified by '123';
  2. mysql> grant ALL ON *.* to root@'%';
复制代码
  1. #编辑配置文件
  2. [root@mysql-mha ~]# vim /etc/masterha/app1.cnf
  3. [server default]
  4. manager_workdir=/etc/masterha
  5. manager_log=/etc/masterha/manager.log
  6. [server1]
  7. hostname=172.25.254.10
  8. candidate_master=1
  9. check_repl_delay=0
  10. [server2]
  11. hostname=172.25.254.20
  12. candidate_master=1
  13. check_repl_delay=0
  14. [server3]
  15. hostname=172.25.254.30
  16. candidate_master=0
  17. no_master=1
  18. [server default]
  19. user=root
  20. password=mlh
  21. ssh_user=root
  22. master_binlog_dir= /data/mysql
  23. remote_workdir=/data/tmp
  24. secondary_check_script= masterha_secondary_check -s 172.25.254.10 -s 172.25.254.11
  25. ping_interval=3
  26. # master_ip_failover_script= /script/masterha/master_ip_failover
  27. # shutdown_script= /script/masterha/power_manager
  28. # report_script= /script/masterha/send_report
  29. # master_ip_online_change_script= /script/masterha/master_ip_online_change
复制代码
测试:
网络及免密认证检测
  1. [root@mysql-mha ]# masterha_check_ssh --conf=/etc/masterha/app1.cnf
复制代码

检测数据主从复制情况
  1. masterha_check_repl --conf=/etc/masterha/app1.cnf
复制代码

2、MHA故障切换

修改主配置文件
  1. [root@mysql-mha ~]# vim /etc/masterha/app1.cnf
  2. [server default]
  3. user=root
  4. password=mlh
  5. ssh_user=root
  6. repl_user=repl        #mysql主从复制中负责认证的用户
  7. repl_password=mlh  #mysql主从复制中负责认证的用户密码
  8. master_binlog_dir= /data/mysql
  9. remote_workdir=/data/tmp
  10. secondary_check_script= masterha_secondary_check -s 172.25.254.10 -s 172.25.254.11
  11. ping_interval=3
复制代码
情况检测
  1. [root@mysql-mha ]# masterha_check_ssh --conf=/etc/masterha/app1.cnf
  2. masterha_check_repl --conf=/etc/masterha/app1.cnf
复制代码
1、无故障情况手动切换

  1. [root@mysql-mha ~]# masterha_master_switch \
  2. > --conf=/etc/masterha/app1.cnf \
  3. > --master_state=alive \
  4. > --new_master_host=172.25.254.20 \
  5. > --new_master_port=3306 \
  6. > --orig_master_is_new_slave \
  7. > --running_updates_limit=10000
复制代码






切换乐成后在从设备10、30检察效果

2、出现故障手动切换

模仿故障,关闭master主机10
  1. [root@mysql-node1 ~]# /etc/init.d/mysqld stop
  2. Shutting down MySQL............ SUCCESS!
  3. [root@mysql-mha ~]# masterha_master_switch --master_state=dead --conf=/etc/masterha/app1.cnf --dead_master_host=172.25.254.10 --dead_master_port=3306 --new_master_host=172.25.254.20 --new_master_port=3306 --ignore_last_failover
复制代码
规复故障MASTER节点
  1. [root@mysql-node1 ~]# /etc/init.d/mysqld start
  2. mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.20', MASTER_USER='repl',
  3.     -> MASTER_PASSWORD='mlh', MASTER_AUTO_POSITION=1;
  4. Query OK, 0 rows affected, 2 warnings (0.01 sec)
  5. #指定新master主机
  6. mysql> start slave;
复制代码


3、出现故障主动切换

删除锁文件是为了防止启动冲突和确保新的主服务器能够顺利接受服务
  1. [root@mysql-mha ~]# cd /etc/masterha/
  2. [root@mysql-mha masterha]# rm -rf app1.failover.complete
  3. [root@mysql-mha masterha]# masterha_manager --conf=/etc/masterha/app1.cnf
  4. #监控程序通过指定配置文件监控master状态,当master出问题后自动切换并退出避免重复做故障切换
复制代码
关闭当前master主机172.25.254.20
  1. [root@mysql-node2 ~]# /etc/init.d/mysqld stop
复制代码
观察日志
  1. [root@mysql-mha masterha]# tail -f  manager.log
复制代码

规复故障节点
  1. mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='repl',
  2.     -> MASTER_PASSWORD='mlh', MASTER_AUTO_POSITION=1;
  3. Query OK, 0 rows affected, 2 warnings (0.00 sec)
  4. mysql> start slave;
复制代码

再次启动主动切换功能必须删除锁文件
  1. [root@mysql-mha masterha]# rm -rf app1.failover.complete  manager.log
复制代码
3、MySQL高可用集群VIP管理

VIP 功能的关键作用是确保在主服务器发生故障时,可以快速而无缝地将假造 IP 地址切换到新的主服务器上,从而包管应用程序可以持续访问数据库,而无需手动更新毗连配置。

  1. [root@mysql-mha ~]# cp master_ip_* /usr/local/bin/
  2. [root@mysql-mha ~]# chmod +x /usr/local/bin/master_ip_*
复制代码
master_ip_failover: 主要用于故障切换时将假造 IP 从故障的主服务器转移到新的主服务器。 master_ip_online_change: 主要用于处理主服务器的在线更改或维护,确保假造 IP 能在不发生故障的情况下迁移到新的主服务器。
  1. [root@mysql-mha ~]# vim /usr/local/bin/master_ip_failover
  2. [root@mysql-mha ~]# vim /usr/local/bin/master_ip_online_change
  3. #配置内容,修改VIP为'172.25.254.100/24;'即可
  4. my $vip = '172.25.254.100/24';
  5. my $ssh_start_vip = "/sbin/ip addr add $vip dev eth0";
  6. my $ssh_stop_vip = "/sbin/ip addr del $vip dev eth0";
  7. [root@mysql-mha ~]# vim /etc/masterha/app1.cnf
复制代码

在master主机手动添加vip
  1. [root@mysql-node1 ~]# ip a a 172.25.254.100/24 dev eth0
复制代码
测试切换master后VIP是否迁移
  1. #清除日志和锁文件
  2. [root@mysql-mha masterha]# rm -rf manager.log
  3. [root@mysql-mha masterha]# rm -rf app1.failover.complete
  4. #在MHA主机监控
  5. [root@mysql-mha ~]# masterha_manager --conf=/etc/masterha/app1.cnf
  6. #关闭master主机172.25.254.10
  7. [root@mysql-node1 ~]# /etc/init.d/mysqld stop
  8. Shutting down MySQL............ SUCCESS
复制代码

切换乐成后,VIP随master切换迁移到新的主机172.25.254.20

规复故障主机slave172.25.254.10
  1. mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.20', MASTER_USER='repl',
  2.     -> MASTER_PASSWORD='mlh', MASTER_AUTO_POSITION=1;
  3. Query OK, 0 rows affected, 2 warnings (0.01 sec)
  4. mysql> start slave;
  5. Query OK, 0 rows affected (0.00 sec)
  6. mysql> show slave status\G;
  7. *************************** 1. row ***************************
  8.                Slave_IO_State: Waiting for master to send event
  9.                   Master_Host: 172.25.254.20
复制代码
手动切换主服务器VIP的变化
  1. [root@mysql-mha ~]# 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
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

吴旭华

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表