目录
2)分别修改master和slave1,slave2的主机名
4)修改slave从库服务器的配置(slave1,slave2)
5)在 Master、Slave1、Slave2 节点上都创建两个软链接
6)进入master的mysql,给slave节点和manage授权
8)在slave1和slave2上执行同步操作,并查看数据同步状态
14)在manage服务器上配置到其他数据库的ssh免密登录
15)master,slave1和slave2之间,也要互相配置ssh免密登录
18)第一次配置需要在 Master 节点上手动开启虚拟IP
20)在 manager 节点上测试 mysql 主从连接情况
1)首先关闭防火墙和selinux,并安装依赖环境(所有服务器)
4)其他三台MySQL服务器修改配置文件中的server-id,然后重启mysql服务
7)在master01上创建库创建表,插入数据,master02,slave01,slave02测试同步情况
9)修改所有数据库服务器的代理配置文件 mmm_agent.conf
10)修改monitor监控服务器上的监控配置文件 mmm_mon.conf
11)在所有数据库上为 mmm_agent(代理进程)和 mmm_moniter(监控进程)授权
13)在 monitor 服务器上启动 mysql-mmm-monitor
mysql高可用的九方案,MAH架构、MMM架构、MGR架构、Mysql cluster(多主)、Galera Cluster(多主)、PXC架构(多主)、RAID10(数据可靠性方案)、SAN存储网络、DRBD方案。
本篇文章主要讲述MHA架构和MMM架构
MySQL MHA(Master High Availability)是一种用于 MySQL 数据库的高可用性架构。它的设计目标是确保在主数据库发生故障时,能够快速自动地将备库(Slave)提升为新的主库,以保证系统的连续性和可用性。
1. MHA 通过manage监控 MySQL master主节点的状态来实现故障检测和自动故障转移。
2. 当master主节点发生故障时,MHA 会自动将其中一个拥有最新数据的slave从节点提升 为新的master主节点。
3. 使其他的slave从节点与新master节点做主从复制操作,确保数据库的可用性。
自动故障切换:MHA 能够自动检测主库的故障,并快速将备库提升为新的主库,减少了手动干预的需要,提高了系统的可用性。
实时监测:MHA 通过与 Master 节点和 Slave 节点建立 SSH 连接,实时监测它们的状态,能够及时发现故障并采取相应的措施。
简化配置:MHA 提供了简单易用的配置文件,可以轻松地配置主库和备库的信息,减少了配置的复杂性。
高可扩展性:MHA 支持多个备库,可以根据需求灵活地扩展系统的容量和性能。
配置复杂性:尽管 MHA 提供了简化的配置文件,但对于不熟悉 MHA 的用户来说,配置仍然可能是一项复杂的任务。特别是在涉及多个主库和备库的复杂环境中,配置可能变得更加困难。
依赖 SSH 连接:MHA 使用 SSH 连接与主库和备库进行通信和监控。这意味着在配置和使用 MHA 时,必须确保 SSH 连接的可用性和稳定性。如果 SSH 连接出现问题,可能会导致 MHA 无法正常工作。
故障切换过程中的数据同步延迟:在故障切换期间,MHA 需要将备库提升为新的主库,并重新配置其他备库作为新的从库。这个过程可能需要一些时间,导致在切换期间存在一定的数据同步延迟。这可能会对某些应用程序的数据一致性产生影响。
依赖 MySQL 复制功能:MHA 依赖 MySQL 的复制功能来实现数据的同步和复制。如果 MySQL 的复制功能出现问题,可能会导致 MHA 无法正常工作或数据同步不完整。
需要额外的硬件资源:为了实现高可用性,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
systemctl stop firewalld.service
setenforce 0
master:#修改master的主机名
hostnamectl set-hostname mysql-1
slave1:#修改slave1的主机名
hostnamectl set-hostname mysql-2salve2:#修改slave2的主机名
hostnamectl set-hostname mysql-3
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服务
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
ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
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; #使授权立即生效
master:
show master status;
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
set global read_only=1;
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;
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
cd /opt
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install
tar zxvf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl Makefile.PL
make && make install
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
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
#在 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";
}
#创建相关目录(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
master:
/sbin/ifconfig ens33:1 192.168.3.254/24
masterha_check_ssh -conf=/opt/mysql-mha/mysql_mha.cnf
masterha_check_repl -conf=/opt/mysql-mha/mysql_mha.cnf
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 &
masterha_check_status --conf=/opt/mysql-mha/mysql_mha.cnf #查看MHA状态
cat /opt/mysql-mha/manager.log | grep "current master" #查看日志
MHA上:日志监控
tail -f /opt/mysql-mha/manager.logmaster上停止mysql服务
systemctl stop mysqld
masterha_stop --conf=/opt/mysql-mha/mysql_mha.cnf
或者
直接采用 kill 进程 ID 的方式关闭。
MySQL 高可用方案之 MMM(Multi-Master Replication Manager)是一种常用的解决方案,用于实现 MySQL 数据库的高可用性和负载均衡。
MMM 基于 MySQL 的复制机制,通过在多个 MySQL 服务器之间进行主从复制,实现了数据的同步和备份。它的主要特点是可以实现多主复制,即多个 MySQL 服务器可以同时作为主节点接收写操作,并将这些写操作同步到其他从节点上。
MMM 通过监控 MySQL master的状态来实现故障检测和自动故障转移。当一个master主节点发生故障时,MMM 会自动将VIP转到备master节点上,确保数据库的可用性。
MMM 还可以根据负载情况自动进行负载均衡。它可以根据每个节点的负载情况,将读操作分发到不同的节点上,从而提高系统的整体性能。
MMM 还提供了一些管理工具,可以方便地进行节点的添加、删除和配置修改等操作。
高可用性:MMM 通过自动故障检测和故障转移机制,可以快速将一个从节点提升为新的主节点,从而实现数据库的高可用性,减少系统的停机时间。
负载均衡:MMM 可以根据节点的负载情况,将读操作分发到不同的节点上,从而实现负载均衡,提高系统的整体性能。
简单易用:MMM 提供了一些管理工具,可以方便地进行节点的添加、删除和配置修改等操作,使得系统的管理和维护变得简单易用。
数据一致性:由于 MMM 采用的是异步复制机制,主节点和从节点之间存在一定的延迟,可能导致数据的不一致。在某些场景下,可能需要额外的措施来确保数据的一致性。
配置复杂性:MMM 的配置相对复杂,需要对 MySQL 的复制机制和 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
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
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
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/
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
#在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
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
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;
cd /etc/mysql-mmm/
vim mmm_common.conf
……
cluster_interface ens33
……
replication_user replication
replication_password 123123
agent_user mmm_agent
agent_password 123123
ip 192.168.3.10
mode master
peer db2
ip 192.168.3.11
mode master
peer db1
ip 192.168.3.12
mode slave
ip 192.168.3.13
mode slave
hosts db1, db2
ips 192.168.3.254
mode exclusive #只有一个 host 可以进行写操作模式
hosts db3, db4
ips 192.168.3.154, 192.168.3.155
mode balanced #多个 slave 主机可以进行读操作模式
vim /etc/mysql-mmm/mmm_agent.conf
this db1 #根据不同的主机分别修改为 db1,db2,db3,db4
vim /etc/mysql-mmm/mmm_mon.conf
include mmm_common.conf
.....
ping_ips 192.168.3.10,192.168.3.11,192.168.3.12,192.168.3.13 #指定所有数据库服务器的 IP
auto_set_online 10 #指定自动上线时间
monitor_user mmm_monitor #指定 mmm_monitor 的用户名
monitor_password 123123 #指定 mmm_monitor 的密码
#为 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; #授权立即生效
systemctl start mysql-mmm-agent.service
systemctl start mysql-mmm-monitor.service
#查看各节点的情况
mmm_control show
#检测监控功能是否都完善,需要各种OK
mmm_control checks all
#指定绑定 VIP 的主机
mmm_control move_role writer db2
#停止 master02 确认 VIP 是否移动到 master01 上。
注意:master01 主服务器恢复服务后,不会抢占
mater02:
systemctl stop mysqld.service
#在 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;
show databases;
select * from abc.a1;