文章内容输出来源:拉勾教育Java高薪训练营7期;
本篇文章是MySQL学习课程中的高可用集群搭建过程。
1.环境软件版本
| 环境&软件 | 版本 |
|---|---|
| Oracle VM VirtualBox | |
| 服务器&CentOS | 7.8 |
| 数据库&Mysql | 5.7.28 |
| 远程连接&Xshell | 6 |
2.环境架构介绍
架构如图所示,4台机器ip和角色如下表:
| 机器名称 | ip | 角色 | 权限 |
|---|---|---|---|
| Mysql_Master | 192.168.124.136 | Master | 读写 |
| Mysql_Slave | 192.168.124.137 | Slave1 | 只读 |
| Mysql_Slave | 192.168.124.138 | Slave2 | 只读 |
| Mysql_MHA | 192.168.124.139 | MHA Manager | 监控 |

3.Mysql主从搭建
3.1 Mysql安装(3台)
下载
wegt https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.28-1.el7.x86_64.rpm-
bundle.tar
解压
tar xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
安装
先移除CentOS自带的mariadb-libs,不然会提示冲突
rpm -qa|grep mariadb
rpm -e | mariadb --nodeps
#安装mysql
rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-5.7.28-1.el7.x86_64.rpm
初始化用户
mysqld --initialize --user=mysql
查看初始密码
cat /var/log/mysqld.log | grep password
启动服务
systemctl start mysqld.service
配置为开机启动
systemctl enable mysqld
修改默认密码
mysql> SET PASSWORD = PASSWORD('123456');
Query OK, 0 rows affected, 1 warning (0.00 sec)
3.2 Mysql主从配置
Master节点
修改master节点的配置文件
[mysqld]
# 指定server id
server-id=1
# innodb_buffer_pool_size = 128M
#
# 开启binlog功能,并指定日志文件名称
log_bin=mysql-bin
# 每次执行写入性操作就与磁盘同步
sync-binlog=1
# 指定哪些库排除掉不进行同步
binlog-ignore-db=performance_schema
binlog-ignore-db=information_schema
binlog-ignore-db=sys
# 日志中记录每一行数据被修改的情况
binlog-format=ROW
relay_log_purge=0
# 指定中继日志
relay_log=mysql-relay-bin
重启服务
systemctl restart mysqld
主库给从库授权
grant replication slave on *.* to root@'%' identified by '123456';
grant all privileges on *.* to root@'%' identified by '123456';
flush privileges;
Slave1节点
修改Slave1节点配置文件
[mysqld]
# 指定server id
server-id=2
read_only=1
# innodb_buffer_pool_size = 128M
#
# 开启binlog功能,并指定日志文件名称
log_bin=mysql-bin
# 每次执行写入性操作就与磁盘同步
sync-binlog=1
# 指定哪些库排除掉不进行同步
binlog-ignore-db=performance_schema
binlog-ignore-db=information_schema
binlog-ignore-db=sys
# 日志中记录每一行数据被修改的情况
binlog-format=ROW
relay_log_purge=0
# 指定中继日志
relay_log=mysql-relay-bin
重启服务
systemctl restart mysqld
从库开启同步
change master to
master_host='192.168.124.136',master_port=3306,master_user='root',master_password
='123456',master_log_file='mysql-bin.000002',master_log_pos=154;
start slave; // 开启同步
Slave2节点
修改Slave2节点配置文件
[mysqld]
# 指定server id
server-id=3
read_only=1
# innodb_buffer_pool_size = 128M
#
# 开启binlog功能,并指定日志文件名称
log_bin=mysql-bin
# 每次执行写入性操作就与磁盘同步
sync-binlog=1
# 指定哪些库排除掉不进行同步
binlog-ignore-db=performance_schema
binlog-ignore-db=information_schema
binlog-ignore-db=sys
# 日志中记录每一行数据被修改的情况
binlog-format=ROW
relay_log_purge=0
# 指定中继日志
relay_log=mysql-relay-bin
3.3 配置半同步复制
Master节点
安装插件
install plugin rpl_semi_sync_master soname 'semisync_master.so';
show variables like '%semi%'
#修改半同步配置
set global rpl_semi_sync_master_enabled=1;
set global rpl_semi_sync_master_timeout=1000;
flush privileges;
重启服务
systemctl restart mysqld
Slave节点
两台Slave节点都执行以下步骤。
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
#修改半同步配置
set global rpl_semi_sync_slave_enabled=1;
stop slave;
start slave;
重启服务
systemctl restart mysqld
测试半同步状态
首先通过MySQL命令行检查参数的方式,查看半同步是否开启。
show variables like '%semi%'
然后通过MySQL日志再次确认。
cat /var/log/mysqld.log
可以看到日志中已经启动半同步:
Start semi-sync binlog_dump to slave (server_id: 2), pos(mysql-bin.000002, 306)
Start semi-sync binlog_dump to slave (server_id: 3), pos(mysql-bin.000002, 306)
4.MHA高可用搭建
四台机器ssh互通
在四台服务器上分别执行下面命令,生成公钥和私钥,换行回车采用默认值
ssh-keygen -t rsa
在三台MySQL服务器分别执行下面命令,将公钥拷到MHA Manager服务器上
ssh-copy-id 192.168.124.139
之后可以在MHA Manager服务器上检查下,看看.ssh/authorized_keys文件是否包含3个公钥
cat /root/.ssh/authorized_keys
从MHA Manager服务器执行命令,向其他三台机器分发公钥。
scp /root/.ssh/authorized_keys 192.168.124.136:/root/.ssh/authorized_keys
scp /root/.ssh/authorized_keys 192.168.124.137:/root/.ssh/authorized_keys
scp /root/.ssh/authorized_keys 192.168.124.138:/root/.ssh/authorized_keys
检查四台机器之间是否ssh互通,各个机器都进行检查,如果不通,则通过ssh-copy-id命令将公钥复制给相应的机器。
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.124.136
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.124.137
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.124.138
ssh互通测试
[root@192 ~]# ssh 192.168.124.139
Last login: Sat Dec 19 21:12:57 2020 from 192.168.124.136
MHA下载安装
- 三台MySQL服务器需要安装node
- MHA Manager服务器需要安装manager和node
MHA node安装
#node安装包
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
#安装依赖
yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
MHA manager安装
在MHA Manager服务器安装mha4mysql-node和mha4mysql-manager。
MHA的manager又依赖了perl-Config-Tiny、perl-Log-Dispatch、perl-Parallel-ForkManager,也分别进行安装。
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm
yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -y
#node安装包
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
#manager安装包
wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
提示:由于perl-Log-Dispatch和perl-Parallel-ForkManager这两个被依赖包在yum仓库找不到,
因此安装epel-release-latest-7.noarch.rpm。在使用时,可能会出现下面异常:Cannot
retrieve metalink for repository: epel/x86_64。可以尝试使
用/etc/yum.repos.d/epel.repo,然后注释掉mirrorlist,取消注释baseurl。
注意:如果出现如上错误,修改完配置后执行如下命令
yum clean all
yum makecache
yum update
yum install -y lsof
MHA配置文件
MHA Manager服务器需要为每个监控的 Master/Slave 集群提供一个专用的配置文件,而所有的Master/Slave 集群也可共享全局配置。
初始化配置目录
mkdir -p /var/log/mha/app1
touch /var/log/mha/app1/manager.log
#目录说明
#/var/log (CentOS目录)
# /mha (MHA监控根目录)
# /app1 (MHA监控实例根目录)
# /manager.log (MHA监控实例日志文件)
配置监控全局配置文件
vi /etc/masterha_default.cnf
[server default]
#用户名
user=root
#密码
password=123456
#ssh登录账号
ssh_user=root
#主从复制账号
repl_user=root
#主从复制密码
repl_password=123456
#设置监控主库,发送ping包的时间间隔
ping_interval=1
#设置发生切换之后发送的报警脚本
#report_script=/usr/local/send_report
#二次检查的主机,实现多路监测master的可用性
secondary_check_script=masterha_secondary_check -s 192.168.124.136 -s 192.168.124.137 -s 192.168.124.138
配置监控实例配置文件
vi /etc/mha/app1.cnf
[server default]
#MHA监控实例根目录
manager_workdir=/var/log/mha/app1
#MHA监控实例日志文件
manager_log=/var/log/mha/app1/manager.log
#[serverx] 服务器编号
#hostname 主机名
#candidate_master 可以做主库
#master_binlog_dir binlog日志文件目录
[server1]
hostname=192.168.124.136
candidate_master=1
master_binlog_dir="/var/lib/mysql"
[server2]
hostname=192.168.124.137
candidate_master=1
master_binlog_dir="/var/lib/mysql"
[server3]
hostname=192.168.124.138
candidate_master=1
master_binlog_dir="/var/lib/mysql"
MHA 配置检测
执行ssh通信检测
在MHA Manager服务器上执行:
masterha_check_ssh --conf=/etc/mha/app1.cnf
检测MySQL主从复制
在MHA Manager服务器上执行:
masterha_check_repl --conf=/etc/mha/app1.cnf
出现“MySQL Replication Health is OK.”证明MySQL复制集群没有问题。
MHA Manager启动
在MHA Manager服务器上执行:
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover /var/log/mha/app1/manager.log 2>&1 &
查看监控状态命令如下:
[root@192 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:21544) is running(0:PING_OK), master:192.168.124.136
查看监控日志命令如下:
tail -f /var/log/mha/app1/manager.log
测试MHA故障转移
模拟主节点崩溃
在MHA Manager服务器执行打开日志命令:
tail -200f /var/log/masterha/app1/app1.log
关闭Master MySQL服务器服务,模拟主节点崩溃
systemctl stop mysqld
查看MHA日志,可以看到哪台slave切换成了master
show master status;
将原主启动切换回主
启动MySQL服务
systemctl start mysqld
挂到新主做从库
change master to
master_host='192.168.124.137',master_port=3306,master_user='root',master_password
='123456',master_log_file='mysql-bin.000002',master_log_pos=154;
start slave; // 开启同步
使用MHA在线切换命令将原主切换回来
masterha_master_switch --conf=/etc/mha/app1.cnf --master_state=alive --new_master_host=192.168.124.136 --new_master_port=3306 --orig_master_is_new_slave
--running_updates_limit=10000
测试SQL脚本
create database test;
use test;
create TABLE position (
id int(20),
name varchar(50),
salary varchar(20),
city varchar(50)
) ENGINE=innodb charset=utf8;
insert into position values(1, 'Java', 13000, 'shanghai');
insert into position values(2, 'DBA', 20000, 'beijing');
create TABLE position_detail (
id int(20),
pid int(20),
description text
) ENGINE=innodb charset=utf8;
insert into position_detail values(1, 1, 'Java Developer');
insert into position_detail values(2, 2, 'Database Administrator');
写在最后
报名了拉勾训练营的课程跟着学习也有一段时间了,感觉收获颇多,以前遇到问题就想着怎么逃避,现在遇到问题就只想着怎么解决。不光技术上得到了提升,跳槽也涨薪了。班班美女和导师也很负责任,每天督促着你学习。
看到这篇博文的同学,如果也想系统深入的学习一下 Java 高阶课程,那么拉勾训练营是个非常不错的选择,而且学费相比其他机构便宜不少,只要你学得够好,毕业还有内推大厂的机会。
本文是MySQL学习课程中的高可用集群搭建过程,涵盖环境软件版本、架构介绍,详细阐述了Mysql主从搭建(包括安装、主从配置、半同步复制配置)以及MHA高可用搭建(如ssh互通、下载安装、配置文件设置、故障转移测试等)内容。
688

被折叠的 条评论
为什么被折叠?



