MYSQL 高可用集群搭建 ---MHA
admin
2024-01-29 14:25:37

文章目录

  • 1. 何为高可用
  • 2. MHA介绍
  • 3. 实验环境介绍
  • 4. MHA 搭建
    • 4.1 前期准备工作
      • 4.1.1 MHA下载
      • 4.1.2 配置三台机器免密通信
    • 4.2 搭建主从环境
      • 4.2.1 部署mysql (三台)
      • 4.2.2 开启bin_log二进制日志及GTID
        • 4.2.2.1 开启bin_log二进制日志
        • 4.2.2.2 开启GTID
      • 4.2.3 配置基于GTID主从复制,开启主从同步
      • 4.2.3.1 主库上复制数据到所有从库,完成在某个时刻GTID的同步
      • 4.2.3.2 在各从库上恢复备份并配置主从复制,开启主从同步
      • 4.2.3.3 查看主库bin_log日志信息,准备链接主库
      • 4.2.3.4 从库链接主库信息(node01\node02)
    • 4.3 其他报错信息解决思路
      • 4.3.1 首先看当时的报错信息,报错代码。比如
      • 4.3.2 其次看mysql 日志文件
      • 4.3.3 推荐报错信息速查链接

参考链接

1. 何为高可用

2. MHA介绍

3. 实验环境介绍

192.168.221.133      master
192.168.221.153      node01
192.168.221.136      node02

4. MHA 搭建

4.1 前期准备工作

4.1.1 MHA下载

mkdir /data && cd /data
wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz

4.1.2 配置三台机器免密通信

  • 1、配置三台机器免密通信
    所有节点都执行生成密钥操作,以主库示例,所有节点都要操作
cd /root/.ssh/
ssh-keygen -t dsa -P '' -f id_dsa
cat id_dsa.pub >> authorized_keys
  • 2、在主库上接收slave上的密钥
scp 192.168.221.153:/root/.ssh/authorized_keys ./authorized_keys.3
scp 192.168.221.136:/root/.ssh/authorized_keys ./authorized_keys.4
  • 3、在主库上执行合并密钥的命令
cat authorized_keys.3 >> authorized_keys
cat authorized_keys.4 >> authorized_keys
  • 4、在主库上将合并后的密钥文件发给其他节点
scp authorized_keys 192.168.221.153:/root/.ssh/
scp authorized_keys 192.168.221.136:/root/.ssh/
    1. 所有节点在/etc/hosts文件中写入本地解析
cat >> /etc/hosts << EOF
192.168.221.133      master
192.168.221.153      node01
192.168.221.136      node02
EOF
  • 6、测试能够互相ssh且不要密码,即成功!

4.2 搭建主从环境

4.2.1 部署mysql (三台)

  • 1、安装部署
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql-community-server --nogpgcheck systemctl start mysqld
systemctl enable mysqld

安装失败则查看之前是否安装myssql,如有安装,则卸载

rpm -ql|grep mysql
rpm -e mysql57-community-release-el7-11.noarch
  • 2、进入数据库,跳过密码【配置】
在 /etc/my.cnf  最后一行添加免密登陆   
在[mysqld]后面任意一行添加“skip-grant-tables”用来跳过密码验证的过程
然后重启服务 systemctl restart mysqld
  • 3、创建主从复制号
create user 'gtid'@'192.168.221.%' identified by 'gtid123';
grant replication slave on *.* to 'gtid'@'192.168.221.%';
flush privileges;
  • 4、创建管理账号
create user 'manage'@'192.168.221.%' identified by 'manage123';
grant all privileges on *.* to 'manage'@'192.168.221.%';
flush privileges;
  • 5、修改mysql root密码
use mysql;
update mysql.user set authentication_string=password('123') where user='root';
flush privileges;
  • 6、设置密码不过期策略,不然会报【1862】错误
        vi /etc/my.cnf[mysqld]skip-grant-tables:wq! #保存退出# mysql -u root -puse mysqlselect * from mysql.user where user='root' \G查看#password_expired 把Y修改为Nupdate user set password_expired='N' where user='root';flush privileges;quit然后把 /etc/my.cnf 的 skip-grant-tables 这行注释掉再次登录服务

4.2.2 开启bin_log二进制日志及GTID

4.2.2.1 开启bin_log二进制日志

  • master 节点
#编辑 /etc/my.cnf文件
#skip-grant-tables
server-id=1
log-bin=master-bin
expire_logs_days=3
  • node01 节点
#编辑 /etc/my.cnf文件
#skip-grant-tables
server-id=2
log-bin=master-bin
expire_logs_days=3
  • node02 节点
#编辑 /etc/my.cnf文件
#skip-grant-tables
server-id=3
log-bin=master-bin
expire_logs_days=3
  • 重启三台服务
systemctl restart mysqld

4.2.2.2 开启GTID

  • GTID 的作用
    GTID复制的作用:主要保证主从复制中的高级特性。GTID在MySQL 5.6版本中引入的新特性,但默认并没有开启。GTID在MySQL 5.7版本中即使不开启,也有匿名的GTID记录。GTID的优势:(1)为主库的dump线程传输可以提供并行的解决方案;(2)为从库的SQL线程可以提供并发"回放";(3)配置主从时方便,无需手动定位主库二进制日志文件名称及位置信息,而是交由MySQL自动去定位;温馨提示:MySQL 5.7.17+的版本以后几乎都是GTID模式了。
  • 开启GTID(三台)
mysql -uroot -p
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;

4.2.3 配置基于GTID主从复制,开启主从同步

4.2.3.1 主库上复制数据到所有从库,完成在某个时刻GTID的同步

mysqldump --single-transaction -uroot -p -A > all.sql
scp all.sql node01:/root/
scp all.sql node02:/root/

4.2.3.2 在各从库上恢复备份并配置主从复制,开启主从同步

  • 从库执行
mysql -uroot -p < all.sql
mysql -uroot -p

4.2.3.3 查看主库bin_log日志信息,准备链接主库

mysql> show master status\G
*************************** 1. row ***************************File: master-bin.000001Position: 154Binlog_Do_DB:Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

4.2.3.4 从库链接主库信息(node01\node02)

  • 1、从库配置主库的链接信息并确认复制起点
CHANGE MASTER TO
MASTER_HOST='192.168.221.133',
MASTER_USER='gtid',
MASTER_PASSWORD='gtid123',
MASTER_PORT=3306,
MASTER_LOG_FILE='master-bin.000001',
MASTER_LOG_POS=4,
MASTER_CONNECT_RETRY=10;
  • 2、从库开启专用的复制线程
> START SLAVE;
  • 3、验证主从复制状态
mysql> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.221.133Master_User: gtidMaster_Port: 3306Connect_Retry: 10Master_Log_File: master-bin.000001Read_Master_Log_Pos: 154Relay_Log_File: node01-relay-bin.000002Relay_Log_Pos: 369Relay_Master_Log_File: master-bin.000001Slave_IO_Running: YesSlave_SQL_Running: Yes
....

重点看这两个线程

    Slave_IO_Running: YesSlave_SQL_Running: Yes
  • 可能会遇到的报错及解决方法
Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
错误原因:链接时输入的bin_log二进制名错了
解决办法:主库 show master status \G ,查看二进制名
stop slave;
CHANGE MASTER TO
MASTER_HOST='192.168.221.133',
MASTER_USER='gtid',
MASTER_PASSWORD='gtid123',
MASTER_PORT=3306,
MASTER_LOG_FILE='master-bin.xxxxx',
MASTER_LOG_POS=4,
MASTER_CONNECT_RETRY=10;
start slave;

4.3 其他报错信息解决思路

4.3.1 首先看当时的报错信息,报错代码。比如

# 1. 数据库root密码不对或者密码过期时间导致
mysqldump: Got error: 1045: Access denied for user 'root'@'localhost' (using password: YES) when trying to connect
解决办法:修改数据库root密码
use mysql;
update mysql.user set authentication_string=password('123') where user='root';
flush privileges;
修改密码过期时间
update user set password_expired='N' where user='root';
# 2. 没有配置mysql 的server id
ERROR 1794 (HY000): Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave. Additional e
解决办法:编辑/etc/my.cnf
修改三台的server id 为不同数值
# 3. 没有打开bin_log日志
Got fatal error 1236 from master when reading data from binary log: 'Binary log is not open'
解决办法:配置文件如上,添加bin_log日志并重启服务
等等错误

4.3.2 其次看mysql 日志文件

日志文件所有的报错信息都很清楚,例如:

#截取部分
cat  /var/log/mysqld.log
# bin_log 日志没有开启
2022-11-17T23:14:39.667951Z 5 [ERROR] Error reading packet from server for channel '': Binary log is not open (server_errno=1236)
2022-11-17T23:14:39.667966Z 5 [ERROR] Slave I/O for channel '': Got fatal error 1236 from master when reading data from binary log: 'Binary log is not open', Error_code: 1236
#
2022-11-17T23:07:11.531128Z 0 [ERROR] InnoDB: Table `mysql`.`innodb_table_stats` not found.
2022-11-17T23:07:11.531162Z 0 [ERROR] InnoDB: Fetch of persistent statistics requested for table `mysql`.`gtid_executed` but the required system tables mysql.innodb_table_stats and mysql.i

4.3.3 推荐报错信息速查链接

Mysql-error code汇总
常见报错收集

相关内容

热门资讯

南京一批涉房“自媒体”被约谈 转自:扬子晚报扬子晚报网12月20日讯(记者 马祚波)12月19日,南京市房产局联合网信、公安、市场...
今天,庆祝澳门回归26周年 二十六载风雨兼程澳门与祖国同心同行今天的澳门欣欣向荣未来值得无限期待祝福澳门,祝福伟大祖国!(央视新...
常年保持8%体脂率,40岁C罗... 转自:扬子晚报据北青体育报道,40岁的葡萄牙球星C罗在社媒晒出“魔鬼身材”照片,展示清晰的肌肉线条。...
浙江90岁老人接到“孙子”紧急... 本文转自【FM93交通之声】;四个“孙子”栽了!杭州一位90岁爷爷接到“孙子”的求助电话毫不犹豫拿出...
多组数据透视11月“使用+吸引... 来源:央视网央视网消息:商务部最新数据显示,11月份,我国实际使用外资金额和新设立外商投资企业数量均...