目录
MySQL高可用方案
1、MHA架构(单主)
MHA的工作原理
MHA 架构的优点
MHA 架构的缺点
2、MHA架构的部署
1)关闭防火墙和selinux
2)分别修改master和slave1,slave2的主机名
3)修改master主库服务器的配置文件
4)修改slave从库服务器的配置(slave1,slave2)
5)在 Master、Slave1、Slave2 节点上都创建两个软链接
6)进入master的mysql,给slave节点和manage授权
7)在master节点查看二进制文件和同步位置点
8)在slave1和slave2上执行同步操作,并查看数据同步状态
9)两个从库必须设置为只读模式
10)在主库中创建库创建表,插入数据,从库测试数据同步
11)在所有服务器上安装MHA的依赖环境
12)在所有服务器上安装MHA的node组件
13)在manage服务器上安装manage组件
14)在manage服务器上配置到其他数据库的ssh免密登录
15)master,slave1和slave2之间,也要互相配置ssh免密登录
16)在manage服务器上配置MHA
17)创建 MHA 软件目录并拷贝配置文件
18)第一次配置需要在 Master 节点上手动开启虚拟IP
19)在 manager 节点上测试 ssh 无密码认证
20)在 manager 节点上测试 mysql 主从连接情况
21)启动MHA
22)查看MHA状态,查看日志
23)模拟故障发生
24)关闭 manager 服务的命令
3、MMM架构(双主)
MMM 的工作原理
MMM架构的优点
MMM架构的缺点
4、MMM架构部署
1)首先关闭防火墙和selinux,并安装依赖环境(所有服务器)
2)修改master01的配置文件
3)讲配置文件复制给其他3台mysql数据库服务器
4)其他三台MySQL服务器修改配置文件中的server-id,然后重启mysql服务
5)配置主主复制
6)在从服务器上配置主从复制
7)在master01上创建库创建表,插入数据,master02,slave01,slave02测试同步情况
8)在master01上对mmm进行配置
9)修改所有数据库服务器的代理配置文件 mmm_agent.conf
10)修改monitor监控服务器上的监控配置文件 mmm_mon.conf
11)在所有数据库上为 mmm_agent(代理进程)和 mmm_moniter(监控进程)授权
12)所有服务器开启mysql-mmm-agent
13)在 monitor 服务器上启动 mysql-mmm-monitor
14)在monitor 服务器上测试群集
15)故障测试
16)客户端测试
17)slave01和slave02上都可以查看验证
MySQL高可用方案
mysql高可用的九方案,MAH架构、MMM架构、MGR架构、Mysql cluster(多主)、Galera Cluster(多主)、PXC架构(多主)、RAID10(数据可靠性方案)、SAN存储网络、DRBD方案。
本篇文章主要讲述MHA架构和MMM架构
1、MHA架构(单主)
MySQL MHA(Master High Availability)是一种用于 MySQL 数据库的高可用性架构。它的设计目标是确保在主数据库发生故障时,能够快速自动地将备库(Slave)提升为新的主库,以保证系统的连续性和可用性。
MHA的工作原理
1. MHA 通过manage监控 MySQL master主节点的状态来实现故障检测和自动故障转移。
2. 当master主节点发生故障时,MHA 会自动将其中一个拥有最新数据的slave从节点提升 为新的master主节点。
3. 使其他的slave从节点与新master节点做主从复制操作,确保数据库的可用性。
MHA 架构的优点
-
自动故障切换:MHA 能够自动检测主库的故障,并快速将备库提升为新的主库,减少了手动干预的需要,提高了系统的可用性。
-
实时监测:MHA 通过与 Master 节点和 Slave 节点建立 SSH 连接,实时监测它们的状态,能够及时发现故障并采取相应的措施。
-
简化配置:MHA 提供了简单易用的配置文件,可以轻松地配置主库和备库的信息,减少了配置的复杂性。
-
高可扩展性:MHA 支持多个备库,可以根据需求灵活地扩展系统的容量和性能。
MHA 架构的缺点
-
配置复杂性:尽管 MHA 提供了简化的配置文件,但对于不熟悉 MHA 的用户来说,配置仍然可能是一项复杂的任务。特别是在涉及多个主库和备库的复杂环境中,配置可能变得更加困难。
-
依赖 SSH 连接:MHA 使用 SSH 连接与主库和备库进行通信和监控。这意味着在配置和使用 MHA 时,必须确保 SSH 连接的可用性和稳定性。如果 SSH 连接出现问题,可能会导致 MHA 无法正常工作。
-
故障切换过程中的数据同步延迟:在故障切换期间,MHA 需要将备库提升为新的主库,并重新配置其他备库作为新的从库。这个过程可能需要一些时间,导致在切换期间存在一定的数据同步延迟。这可能会对某些应用程序的数据一致性产生影响。
-
依赖 MySQL 复制功能:MHA 依赖 MySQL 的复制功能来实现数据的同步和复制。如果 MySQL 的复制功能出现问题,可能会导致 MHA 无法正常工作或数据同步不完整。
-
需要额外的硬件资源:为了实现高可用性,MHA 需要至少一个备库来作为冗余备份。这意味着需要额外的硬件资源来支持备库的运行和数据复制,增加了系统的成本和复杂性。
2、MHA架构的部署
环境:
master:192.168.3.10 #提前导入mha4mysql-node-0.57.tar.gz
slave1:192.168.3.11 #提前导入mha4mysql-node-0.57.tar.gz
slave2:192.168.3.12 #提前导入mha4mysql-node-0.57.tar.gz
manage:192.168.3.106 #提前导入mha4mysql-node-0.57.tar.gz和mha4mysql-manager-0.57.tar.gz
1)关闭防火墙和selinux
systemctl stop firewalld.service
setenforce 0
2)分别修改master和slave1,slave2的主机名
master:#修改master的主机名
hostnamectl set-hostname mysql-1
slave1:#修改slave1的主机名
hostnamectl set-hostname mysql-2salve2:#修改slave2的主机名
hostnamectl set-hostname mysql-3
3)修改master主库服务器的配置文件
vim /etc/my.cnf
[mysqld]
server-id = 1
log_bin = mysql-bin #开启二进制日志
binlog_format = mixed #设置二进制日志类型
log-slave-updates = true #允许slave从master复制数据时可以写入到自己的二进制日志
relay-log = relay-log-bin #开启中继日志
relay-log-index = slave-relay-bin.index #中继日志索引systemctl restart mysqld #重启mysql服务
4)修改slave从库服务器的配置(slave1,slave2)
vim /etc/my.cnf
server-id = 2 #三台服务器的 server-id 不能一样
log_bin = mysql-bin
binlog_format = mixed
log-slave-updates = true
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.indexsystemctl restart mysqld
5)在 Master、Slave1、Slave2 节点上都创建两个软链接
ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
6)进入master的mysql,给slave节点和manage授权
mysql -uroot -p
#给slave节点授权
grant replication slave on *.* to 'myslave'@'192.168.3.%' identified by '123123';#给manage授权
grant all privileges on *.* to 'mha'@'192.168.3.%' identified by 'abc123';
#防止从库通过主机名连接主库(master,salve1,salve2上均设置)grant all privileges on *.* to 'mha'@'mysql1' identified by 'abc123';
grant all privileges on *.* to 'mha'@'mysql2' identified by 'abc123';
grant all privileges on *.* to 'mha'@'mysql3' identified by 'abc123';flush privileges; #使授权立即生效
7)在master节点查看二进制文件和同步位置点
master:
show master status;
8)在slave1和slave2上执行同步操作,并查看数据同步状态
change master to master_host='192.168.3.10',master_user='myslave',master_password='123123',
master_log_file='mysql-bin.000001',master_log_pos=1743;
start slave;
show slave status\G
9)两个从库必须设置为只读模式
set global read_only=1;
10)在主库中创建库创建表,插入数据,从库测试数据同步
master:
show databases;
create database test;
use test;
create table t1(id int, name varchar(10), age int,primary key(id));
desc t1;
insert into t1 values(1,'张三',18),(2,'李四',19),(3,'王五',20);
select * from t1;
slave1,slave2:show databases;
select * from test.t1;
11)在所有服务器上安装MHA的依赖环境
yum install epel-release --nogpgcheck -y #首先安装epel源
yum install -y perl-DBD-MySQL \ #其次安装依赖环境
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN
12)在所有服务器上安装MHA的node组件
cd /opt
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install
13)在manage服务器上安装manage组件
tar zxvf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl Makefile.PL
make && make install
14)在manage服务器上配置到其他数据库的ssh免密登录
ssh-keygen -t rsa #一路按回车键
ssh-copy-id 192.168.3.10
ssh-copy-id 192.168.3.11
ssh-copy-id 192.168.3.12
15)master,slave1和slave2之间,也要互相配置ssh免密登录
master:
ssh-keygen -t rsa
ssh-copy-id 192.168.3.11
ssh-copy-id 192.168.3.12slave1:
ssh-keygen -t rsa
ssh-copy-id 192.168.3.10
ssh-copy-id 192.168.3.12
slave2:
ssh-keygen -t rsa
ssh-copy-id 192.168.3.10
ssh-copy-id 192.168.3.11
16)在manage服务器上配置MHA
#在 manager 节点上复制相关脚本到/usr/local/bin 目录
cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
#复制故障切换脚本
cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
#修改故障切换脚本vim /usr/local/bin/master_ip_failover
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';use Getopt::Long;
my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);
#############################添加内容部分#########################################
#指定vip的地址
my $vip = '192.168.3.254';
#指定vip的广播地址
my $brdc = '192.168.3.255';
#指定vip绑定的网卡
my $ifdev = 'ens33';
#指定vip绑定的虚拟网卡序列号
my $key = '1';
#代表此变量值为ifconfig ens33:1 192.168.3.254
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
#代表此变量值为ifconfig ens33:1 192.168.3.254 down
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
#指定退出状态码为0
my $exit_code = 0;
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
#my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
##################################################################################
GetOptions(
'command=s' => \$command,
'ssh_user=s' => \$ssh_user,
'orig_master_host=s' => \$orig_master_host,
'orig_master_ip=s' => \$orig_master_ip,
'orig_master_port=i' => \$orig_master_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
);exit &main();
sub main {
print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
if ( $command eq "stop" || $command eq "stopssh" ) {
my $exit_code = 1;
eval {
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
exit 0;
}
else {
&usage();
exit 1;
}
}
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
## A simple system call that disable the VIP on the old_master
sub stop_vip() {
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}sub usage {
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}
17)创建 MHA 软件目录并拷贝配置文件
#创建相关目录(master,slave1,salve2,manage)
mkdir -p /opt/mysql-mha/mha-node
#manager节点
mkdir -p /opt/mysql-mha/mha
#编写配置文件
vim /opt/mysql-mha/mysql_mha.cnf
[server default]
manager_log=/opt/mysql-mha/manager.log
manager_workdir=/opt/mysql-mha/mha
master_binlog_dir=/usr/local/mysql/data
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
user=mha
password=manager
port=3306
ping_interval=1
remote_workdir=/opt/mysql-mha/mha-node
repl_user=myslave
repl_password=123123
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.3.11 -s 192.168.3.12
shutdown_script=""
ssh_user=root[server1]
hostname=192.168.3.10
port=3306[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.3.11
port=3306[server3]
hostname=192.168.3.12
port=3306
18)第一次配置需要在 Master 节点上手动开启虚拟IP
master:
/sbin/ifconfig ens33:1 192.168.3.254/24
19)在 manager 节点上测试 ssh 无密码认证
masterha_check_ssh -conf=/opt/mysql-mha/mysql_mha.cnf
20)在 manager 节点上测试 mysql 主从连接情况
masterha_check_repl -conf=/opt/mysql-mha/mysql_mha.cnf
21)启动MHA
nohup masterha_manager \
--conf=/opt/mysql-mha/mysql_mha.cnf \
--remove_dead_master_conf \
--ignore_last_failover < /dev/null > /var/log/mha_manager.log 2>&1 &
22)查看MHA状态,查看日志
masterha_check_status --conf=/opt/mysql-mha/mysql_mha.cnf #查看MHA状态
cat /opt/mysql-mha/manager.log | grep "current master" #查看日志
23)模拟故障发生
MHA上:日志监控
tail -f /opt/mysql-mha/manager.logmaster上停止mysql服务
systemctl stop mysqld
24)关闭 manager 服务的命令
masterha_stop --conf=/opt/mysql-mha/mysql_mha.cnf
或者
直接采用 kill 进程 ID 的方式关闭。
3、MMM架构(双主)
MySQL 高可用方案之 MMM(Multi-Master Replication Manager)是一种常用的解决方案,用于实现 MySQL 数据库的高可用性和负载均衡。
MMM 基于 MySQL 的复制机制,通过在多个 MySQL 服务器之间进行主从复制,实现了数据的同步和备份。它的主要特点是可以实现多主复制,即多个 MySQL 服务器可以同时作为主节点接收写操作,并将这些写操作同步到其他从节点上。
MMM 的工作原理
-
MMM 通过监控 MySQL master的状态来实现故障检测和自动故障转移。当一个master主节点发生故障时,MMM 会自动将VIP转到备master节点上,确保数据库的可用性。
-
MMM 还可以根据负载情况自动进行负载均衡。它可以根据每个节点的负载情况,将读操作分发到不同的节点上,从而提高系统的整体性能。
-
MMM 还提供了一些管理工具,可以方便地进行节点的添加、删除和配置修改等操作。
MMM架构的优点
-
高可用性:MMM 通过自动故障检测和故障转移机制,可以快速将一个从节点提升为新的主节点,从而实现数据库的高可用性,减少系统的停机时间。
-
负载均衡:MMM 可以根据节点的负载情况,将读操作分发到不同的节点上,从而实现负载均衡,提高系统的整体性能。
-
简单易用:MMM 提供了一些管理工具,可以方便地进行节点的添加、删除和配置修改等操作,使得系统的管理和维护变得简单易用。
MMM架构的缺点
-
数据一致性:由于 MMM 采用的是异步复制机制,主节点和从节点之间存在一定的延迟,可能导致数据的不一致。在某些场景下,可能需要额外的措施来确保数据的一致性。
-
配置复杂性:MMM 的配置相对复杂,需要对 MySQL 的复制机制和 MMM 的工作原理有一定的了解。在配置过程中,需要注意各个节点的配置一致性和正确性。
4、MMM架构部署
环境:
master01(db1):192.168.3.10 # 提前导入 mysql5.7、mysql-mmm
master02(db2):192.168.3.11 # 提前导入mysql5.7、mysql-mmm
slave01(db3):192.168.3.12 # 提前导入 mysql5.7、mysql-mmm
slave02(db4):192.168.3.13 # 提前导入 mysql5.7、mysql-mmm
monitor :192.168.80.106 # 提前导入mysql-mmm
1)首先关闭防火墙和selinux,并安装依赖环境(所有服务器)
systemctl stop firewalld.service
setenforce 0
#下载aliyun的repo源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum -y install epel-release #安装epel源
yum -y install mysql-mmm* #安装mmm
2)修改master01的配置文件
vim /etc/my.cnf
......
[mysqld]......
server-id = 1 #每台 Mysql 主机的 server-id 不能相同
log-error=/usr/local/mysql/data/mysql_error.log #错误日志
general_log=ON #通用查询日志
general_log_file=/usr/local/mysql/data/mysql_general.log
slow_query_log=ON #慢查询日志
slow_query_log_file=mysql_slow_query.log
long_query_time=5
binlog-ignore-db=mysql,information_schema #不需要同步的库名
log_bin=mysql_bin #开启二进制日志用于主从数据复制
log_slave_updates=true #允许slave从master复制数据时可以写入到自己的二进制日志
sync_binlog=1 #"双1设置",MySQL 在每写一次二进制日志时都会同步到磁盘中去
innodb_flush_log_at_trx_commit=1 #"双1设置",每次事务提交时MySQL都会把缓存的数据写入日志文件,并且刷到磁盘中去
auto_increment_increment=2 #自增字段一次递增多少
auto_increment_offset=1
3)讲配置文件复制给其他3台mysql数据库服务器
scp /etc/my.cnf root@192.168.3.11:/etc/
scp /etc/my.cnf root@192.168.3.12:/etc/
scp /etc/my.cnf root@192.168.3.13:/etc/
4)其他三台MySQL服务器修改配置文件中的server-id,然后重启mysql服务
master02:
vim /etc/my.cnf
server-id = 2
systemctl restart mysqld.service
slave01:
vim /etc/my.cnf
server-id = 3
systemctl restart mysqld.servicel
slave02:
vim /etc/my.cnf
server-id = 4
systemctl restart mysqld.service
5)配置主主复制
#在master01和master02服务器上为彼此授权
grant replication slave on *.* to 'replication'@'192.168.3.%' identified by '123123';
show master status; #在master01和master02服务器上查看日志文件名称和同步点
master01:change master to master_host='192.168.3.11',master_user='replication',master_password='123123',master_log_file='mysql_bin.000001',master_log_pos=459;
start slave;
show slave status\G
master02:
change master to master_host='192.168.3.10',master_user='replication',master_password='123123',master_log_file='mysql_bin.000001',master_log_pos=459;
start slave;
show slave status\G
6)在从服务器上配置主从复制
change master to master_host='192.168.3.10',master_user='replication',master_password='123123',master_log_file='mysql_bin.000001',master_log_pos=459;
start slave;
show slave status\G
7)在master01上创建库创建表,插入数据,master02,slave01,slave02测试同步情况
master01:
master:
show databases;
create database test;
use test;
create table t1(id int, name varchar(10), age int,primary key(id));
desc t1;
insert into t1 values(1,'张三',18),(2,'李四',19),(3,'王五',20);
select * from t1;
master02,slave01,slave02:show databases;
select * from test.t1;
8)在master01上对mmm进行配置
cd /etc/mysql-mmm/
vim mmm_common.conf
……
<host default>
cluster_interface ens33
……
replication_user replication
replication_password 123123
agent_user mmm_agent
agent_password 123123<host db1>
ip 192.168.3.10
mode master
peer db2
</host><host db2>
ip 192.168.3.11
mode master
peer db1
</host><host db3>
ip 192.168.3.12
mode slave
</host><host db4>
ip 192.168.3.13
mode slave
</host><role writer>
hosts db1, db2
ips 192.168.3.254
mode exclusive #只有一个 host 可以进行写操作模式
</role><role reader>
hosts db3, db4
ips 192.168.3.154, 192.168.3.155
mode balanced #多个 slave 主机可以进行读操作模式
</role>
9)修改所有数据库服务器的代理配置文件 mmm_agent.conf
vim /etc/mysql-mmm/mmm_agent.conf
this db1 #根据不同的主机分别修改为 db1,db2,db3,db4
10)修改monitor监控服务器上的监控配置文件 mmm_mon.conf
vim /etc/mysql-mmm/mmm_mon.conf
include mmm_common.conf
<monitor>
.....
ping_ips 192.168.3.10,192.168.3.11,192.168.3.12,192.168.3.13 #指定所有数据库服务器的 IP
auto_set_online 10 #指定自动上线时间
</monitor><host default>
monitor_user mmm_monitor #指定 mmm_monitor 的用户名
monitor_password 123123 #指定 mmm_monitor 的密码
</host>
11)在所有数据库上为 mmm_agent(代理进程)和 mmm_moniter(监控进程)授权
#为 mmm_agent(代理进程)授权(所有MySQL服务器上)
grant super, replication client, process on *.* to 'mmm_agent'@'192.168.3.%' identified by '123123';
#为 mmm_moniter(监控进程)授权(所有MySQL服务器上)
grant replication client on *.* to 'mmm_monitor'@'192.168.3.%' identified by '123123';
flush privileges; #授权立即生效
12)所有服务器开启mysql-mmm-agent
systemctl start mysql-mmm-agent.service
13)在 monitor 服务器上启动 mysql-mmm-monitor
systemctl start mysql-mmm-monitor.service
14)在monitor 服务器上测试群集
#查看各节点的情况
mmm_control show
#检测监控功能是否都完善,需要各种OK
mmm_control checks all
#指定绑定 VIP 的主机
mmm_control move_role writer db2
15)故障测试
#停止 master02 确认 VIP 是否移动到 master01 上。
注意:master01 主服务器恢复服务后,不会抢占
mater02:
systemctl stop mysqld.service
16)客户端测试
#在 master01 服务器上为 monitor 服务器地址授权登录
grant all on *.* to 'abc'@'192.168.3.106' identified by '123123';
flush privileges;#在 monitor 服务器上使用 VIP 登录
yum install -y mariadb-server mariadb
systemctl start mariadb.servicemysql -uabc -p -h 192.168.3.254
#创建数据,测试同步情况
create database abc;
17)slave01和slave02上都可以查看验证
show databases;
select * from abc.a1;