MHA、MMM高可用方案及故障切换

目录

一、MHA高可用方案

1、MHA的组成

2、MHA的工作原理

3、部署MHA架构

第一部分:一主两从数据库架构部署

1、全部更改主机名、初始化操作、开启mysql服务、设置主机名管理、时间同步

2、MySQL服务器做主从复制

3、测试主从效果

第二部分:MHA架构部署

1、安装依赖包

2、安装node组件

3、安装manager组件

4、在所有服务器上配置无密码认证

5、manager节点配置MHA

6、创建MHA软件目录并拷贝配置文件.

8、检查mha运行状态

9、在manager节点上启动MHA

第三部分:模拟故障

 二、MMM高可用方案

第一部分:部署主主复制和主从复制

 1、全部更改主机名、初始化操作、开启mysql服务、设置主机名管理、时间同步

2、修改master01配置文件并同步给其他数据库

3、配置主主复制,两台主服务器相互复制

4、配置主从复制,在两台从服务器上做

​5、测试主主、主从 同步情况

第二部分:部署MMM

1、所有服务器上安装 MySQL-MMM

2、 master01 上对 MySQL-MMM 进行配置

3、修改所有数据库代理配置文件

​4、在 monitor 监控服务器上修改监控配置文件 mmm_mon.conf

5、所有数据库为代理进程和监控进程授权,启动代理进程

6、monitor 服务器上启动数据库监控进程

第三部分:monitor 服务器上模拟故障 测试群集


        传统的mysql主从架构可能会出现单点故障的问题,所以我们需要学习一些高可用方案。

        常见的MySQL高可用方案有 keepalived主备、MHA、MMM、MySQL Ccluster(此方法需要至少6台主机,少有人用)、PXC。如果使用keepalived实现主从复制架构中的主库的高可用,还需要另外考虑到从库对接到备用主库的步骤。今天主要介绍MHA和MMM的高可用方案。

一、MHA高可用方案

        MHA是采用perl语言编写的脚本管理工具,目前主要支持一主多从架构,要搭建MHA要求一个复制群集至少有3台数据库服务器,一主二从。

1、MHA的组成

mha_manage节点:可以单独部署在任何从库上。

mha_node节点,要求部署在每个MySQL节点。给manage提供健康反馈,实际做切换的组件。

2、MHA的工作原理

        mha_manage节点服务器会定期通过心跳消息对主库做健康检查判断其有没有故障,如果故障则mha_manage会自动找到具有最新数据的从库节点,升级该从库为新的主库,同时VIP地址也会自动漂移到新的主库,其他从库也会自动对接新的主库做主从复制。

3、部署MHA架构

我的服务器IP说明
master数据库192.168.170.200安装mysql5.7、MHA node 组件
slave1数据库192.168.170.101安装mysql5.7、MHA node 组件
slave2数据库192.168.170.120安装mysql5.7、MHA node 组件
manager节点192.168.170.20安装MHA node 和 manager 组件,并作为数据库服务器的本地始终源

部署步骤

1)在所有MySQL服务器都做主从复制授权,还要给 MHA manager 访问数据库的授权
2)做时间同步和主从复制配置,并设置从服务器为只读模式
3)所有MySQL服务器和 manager 服务器都安装 mha node 组件,manager 服务器还要安装 mha manager 组件
4)所有MySQL服务器都要相互设置SSH免交互登录
5)在 manager 服务器准备好 VIP故障切换脚本 和 MHA 配置文件
6)在 master主库 服务器上创建 VIP
7)在 manager 服务器用 masterha_check_ssh 和 masterha_check_repl 做 MHA 启动前检测,再使用 masterha_manager 启动 MHA 进程
8)做master故障转移测试(VIP会漂移到新master节点上,其它的从库会自动指向新的主库做主从复制,故障转移完成后MHA进程也会自动退出,MHA配置文件会自动删除原master的配置信息)

第一部分:一主两从数据库架构部署

1、全部更改主机名、初始化操作、开启mysql服务、设置主机名管理、时间同步

所有服务器

更改主机名、刷新生效
hostname master/slave
bash初始化设置 
setenforce 0
systemctl disable --now firewalld

manager服务器

chrony同步阿里云时间
安装开启chrony程序
yum install -y chrony
systemctl start chronyd
修改chrony配置文件
vim /etc/chrony.conf
====================================================================================3 #server 0.centos.pool.ntp.org iburst4 #server 1.centos.pool.ntp.org iburst5 #server 2.centos.pool.ntp.org iburst6 #server 3.centos.pool.ntp.org iburst7 server ntp.aliyun.com iburst
====================================================================================
重启检查是否同步成功,210 Number of sources = 1表示同步成功
systemctl restart chronyd
chronyc sources

所有数据库服务器

mysql安装部分
yum remove -y mariadb-libs.x86_64 
到opt目录中并解压,解压后的包重命名并移动到/usr/local目录中
cd /opt/
rm -rf *
rz -E
tar xf mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz 
mv mysql-5.7.39-linux-glibc2.12-x86_64 /usr/local/mysql创建程序用户管理并修改mysql目录和配置文件的权限
useradd -s /sbin/nologin mysql
chown -R mysql:mysql /usr/local/mysql
修改配置文件
vim /etc/my.cnf
======================================================================================
[client]
port = 3306
socket=/usr/local/mysql/mysql.sock[mysqld]
user = mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character-set-server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket=/usr/local/mysql/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
max_connections=2048
default-storage-engine=INNODB
max_allowed_packet=16M
server-id = 1
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
======================================================================================
chown mysql:mysql /etc/my.cnf
设置环境变量,申明/宣告mysql命令便于系统识别并初始化数据库
echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile
cd /usr/local/mysql/bin
./mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data设置系统识别,进行操作:
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
systemctl daemon-reload
systemctl restart mysqld
初始化数据库密码:
mysqladmin -u root -p password "123456"登录数据库
mysql -u root -p123456
创建用户并设置密码:
CREATE USER 'root'@'%' IDENTIFIED BY '123456';
赋予远程连接的权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
刷新生效
flush privileges;
修改加密方式,可以进行远程连接
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
chrony同步manager节点时间
systemctl start chronyd
修改chrony配置文件
vim /etc/chrony.conf
====================================================================================3 #server 0.centos.pool.ntp.org iburst4 #server 1.centos.pool.ntp.org iburst5 #server 2.centos.pool.ntp.org iburst6 #server 3.centos.pool.ntp.org iburst7 server 192.168.170.20 iburst
====================================================================================
systemctl restart chronyd
chronyc sources
检查是否同步
timedatectl

在hosts配置文件里添加四个主机名和IP
vim /etc/hosts
192.168.170.200 master
192.168.170.101 slave1
192.168.170.120 slave2
192.168.170.20 manager

如果mysql的root密码忘了不要慌

停止mysql服务,修改配置文件/etc/my.cnf中的[mysqld]中添加skip-grant-tables,重启mysql直接使用mysql登录数据库,然后使用update更新密码,重启mysql。最后不要忘记把配置还原哦

update mysql.user set authentication_string=password('123456') where user='root';'root' and host='localhost';
flush privileges;

2、MySQL服务器做主从复制

所有数据库服务器

修改配置文件,id不能相同
vim /etc/my.cnf
[mysqld]
server-id = 1                  #id唯一,注意区别开
log_bin = mysql-bin            #开启二进制日志
binlog_format = mixed          #二进制日志格式
log-slave-updates = 1          #主从复制数据也写到二进制日志里
relay-log = relay-log-bin      #开启中继日志
relay-log-index = slave-relay-bin.index  重启mysqld服务
systemctl restart mysqld创建两个软链接
ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/4、配置 mysql 一主两从
(1)登录数据库
mysql -uroot -p密码
(2)所有数据库节点进行 mysql 授权
create user 'myslave'@'192.168.170.%' identified by 'myslave123';
grant replication slave on *.* to 'myslave'@'192.168.170.%' identified by 'myslave123';
(3)所有节点创建manager节点用户并授权
create user 'manager'@'192.168.170.%' identified by 'manager123';
grant all on *.* to 'manager'@'192.168.170.%' identified by 'manager123';
(4)刷新
flush privileges;

 

主库master配置

在 Master 节点查看二进制文件和同步点
show master status;

从库slave配置

从库配置同步主库,注意 master_log_file 和 master_log_pos 的值要与主库上查询的一致
change master to master_host='192.168.170.200',master_port=3306,master_user='myslave',master_password='myslave123',master_log_file='mysql-bin.000003',master_log_pos=1419;
开启同步
start slave;
show slave status\G
两个从库设置成只读模式
set global read_only=1;

3、测试主从效果

第二部分:MHA架构部署

1、安装依赖包

manager服务器

vim /etc/yum.conf
----
cachedir=/opt/yumcache
keepcache=1
----
cd /opt
mkdir /opt/yumcache
cd /etc/yum.repos.d
mv repo.bak/* ./
mv local.repo repo.bak
cd /opt/yumcache
yum install -y epel-release

----安装依赖包
yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN
----打包依赖包发送给其他服务器
mkdir mha
find ./ -name "*.rpm" -exec mv {} ./mha/ \;    #将依赖包挪入该目录
scp -r mha/ 192.168.170.200:/opt    #将包复制到主服务器
scp -r mha/ 192.168.170.101:/opt    #将包复制到从服务器
scp -r mha/ 192.168.170.120:/opt    #将包复制到从服务器

所有数据库服务器

cd /opt
createrepo mha/   #自动生成yum数据库依赖关系
cd mha
----修改目录
vim /etc/yum.repos.d/local.repo
baseurl=file:///opt/mha
-----
----本地源安装依赖包
yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN
----

补充,这里我按上面操作主库成功安装依赖包,两个从库无法安装,又把local.repo配置改回去了之后才安装上依赖包。重做的时候可以验证一下

2、安装node组件

所有服务器

cd /opt
rz -E
#mha4mysql-node-0.57.tar.gz
tar xf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57/
perl Makefile.PL
make && make install

3、安装manager组件

manager服务器

cd /opt
rz -E
#mha4mysql-manager-0.57.tar.gz
tar xf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl Makefile.PL
make && make install

4、在所有服务器上配置无密码认证

manager服务器

在 manager 节点上配置到所有数据库节点的无密码认证
ssh-keygen -t rsa 				#一路按回车键
ssh-copy-id 192.168.170.200
ssh-copy-id 192.168.170.101
ssh-copy-id 192.168.170.120

主库master配置

在 master 上配置到数据库节点 slave1 和 slave2 的无密码认证
ssh-keygen -t rsa   #一路回车
ssh-copy-id 192.168.170.101
ssh-copy-id 192.168.170.120

 

从库slave配置

在 slave1 上配置到数据库节点 master 和 slave2 的无密码认证
ssh-keygen -t rsa   #一路回车
ssh-copy-id 192.168.170.200
ssh-copy-id 192.168.170.120在 slave2 上配置到数据库节点 master 和 slave1 的无密码认证
ssh-keygen -t rsa   #一路回车
ssh-copy-id 192.168.170.200
ssh-copy-id 192.168.170.101

5、manager节点配置MHA

manager服务器

cd /opt/mha4mysql-manager-0.57/samples
cp -a scripts/ /usr/local/bin
cd /usr/local/bin
cp scripts/master_ip_failover /usr/local/bin
echo '' > master_ip_failover
vim master_ip_failover

 

注意:Windows的脚本不能直接用到Linux里,脚本内容要通过复制创建新的脚本。

清空原先master_ip_failover的内容添加以下配置:#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';use Getopt::Long;my ($command, $orig_master_host, $orig_master_ip,$ssh_user,$orig_master_port, $new_master_host, $new_master_ip,$new_master_port,$orig_master_ssh_port,$new_master_ssh_port,$new_master_user,$new_master_password
);# 这里定义的虚拟IP配置要注意,这个ip必须要与你自己的集群在同一个网段,否则无效
my $vip = '192.168.170.111/24';
my $key = '1';
# 这里的网卡名称 “ens33” 需要根据你机器的网卡名称进行修改
# 如果多台机器直接的网卡名称不统一,有两种方式,一个是改脚本,二是把网卡名称修改成统一
# 我这边实际情况是修改成统一的网卡名称
my $ssh_start_vip = "sudo /sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "sudo /sbin/ifconfig ens33:$key down";
my $ssh_Bcast_arp= "sudo /sbin/arping -I ens33 -c 3 -A $vip";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,'orig_master_ssh_port=i' => \$orig_master_ssh_port,'new_master_host=s'  => \$new_master_host,'new_master_ip=s'    => \$new_master_ip,'new_master_port=i'  => \$new_master_port,'new_master_ssh_port' => \$new_master_ssh_port,'new_master_user' => \$new_master_user,'new_master_password' => \$new_master_password);exit &main();sub main {$ssh_user = defined $ssh_user ? $ssh_user : 'root';print "\n\nIN SCRIPT TEST====$ssh_user|$ssh_stop_vip==$ssh_user|$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();&start_arp();$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 \"`;
}
sub stop_vip() {`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}sub start_arp() {`ssh $ssh_user\@$new_master_host \" $ssh_Bcast_arp \"`;
}
sub usage {print"Usage: master_ip_failover --command=start|stop|stopssh|status --ssh_user=user --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";
}

6、创建MHA软件目录并拷贝配置文件.

manager节点添加故障切换脚本以及VIP故障切换脚本

manager服务器

cd /usr/local/bin/scripts
cp master_ip_online_change power_manager /usr/local/bin/
cd /usr/local/bin/
chmod +x master_ip_failovercd /opt
mkdir /opt/mysql-mha
cd mysql-mha
mkdir mha-manager
mkdir mha-node

vim /opt/mysql-mha/mysql_mha.cnf
[server default]
manager_log=/opt/mysql-mha/manager.log
manager_workdir=/opt/mysql-mha/mha-manager
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=manager
password=manager123
port=3306
ping_interval=1
remote_workdir=/opt/mysql-mha/mha-node
repl_user=myslave
repl_password=myslave123
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.170.101 -s 192.168.170.120
shutdown_script=""
ssh_user=root[server1]
hostname=192.168.170.200
port=3306[server2]
hostname=192.168.170.101
port=3306[server3]
hostname=192.168.170.120
port=3306

主库master配置

第一次配置需要在 Master 节点上手动开启虚拟IP

ifconfig ens33:1 192.168.170.111/24

8、检查mha运行状态

manager服务器

masterha_check_ssh -conf=/opt/mysql-mha/mysql_mha.cnf
masterha_check_repl -conf=/opt/mysql-mha/mysql_mha.cnf   #测试mysql主从连接情况

9、在manager节点上启动MHA
启动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 &查看mha运行状态
masterha_check_status -conf=/opt/mysql-mha/mysql_mha.cnf

remove_dead_master_conf:该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。
--ignore_last_failover:在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间隔不足 8 小时的话,则不会进行 Failover, 之所以这样限制是为了避免 ping-pong 效应。该参数代表忽略上次 MHA 触发切换产生的文件,默认情况下,MHA 发生切换后会在 app1.failover.complete 日志文件中记录,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换, 除非在第一次切换后删除该文件,为了方便,这里设置为--ignore_last_failover。
●使用&后台运行程序:结果会输出到终端;使用Ctrl+C发送SIGINT信号,程序免疫;关闭session发送SIGHUP信号,程序关闭。
●使用nohup运行程序:结果默认会输出到nohup.out;使用Ctrl+C发送SIGINT信号,程序关闭;关闭session发送SIGHUP信号,程序免疫。
●使用nohup和&配合来启动程序nohup ./test &:同时免疫SIGINT和SIGHUP信号。

第三部分:模拟故障

主库宕机了,追踪manager节点服务器mha目录中的日志能够看到主库由了原来的从库接替,且VIP也漂移到了新的主库上。

 从库也实现自动对接到新的主库上

mha在故障切换后会自动退出进程,且配置文件中原本的server1的配置也被自动删除了

当原主库服务器恢复后,怎么让其再次成为主库接着对外提供服务呢?

systemctl restart mysqlmysql -u root -p123456
change master to master_host='192.168.170.101',master_port=3306,master_user='myslave',master_password='myslave123',master_log_file='mysql-bin.000001',master_log_pos=2065;
start slave;
show slave status\G

manager服务器

修改mha配置文件
vim 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

 二、MMM高可用方案

        MMM是双主,只有一个主对外提供工作。主主复制时两个主之间互相做主从复制实现主主复制,从节点也会对接主的master。monitor节点会检测master的状态,当发现主挂了就会vip切换到备的msater上,从库节点会重现找新的master做对接。

我的服务器IP地址说明
master1192.168.170.200安装 mysql5.7、mysql-mmm
master2192.168.170.100安装 mysql5.7、mysql-mmm
slave1192.168.170.101安装 mysql5.7、mysql-mmm
slave2192.168.170.120安装 mysql5.7、mysql-mmm
monitor节点服务器192.168.170.20安装 mysql-mmm

第一部分:部署主主复制和主从复制

 1、全部更改主机名、初始化操作、开启mysql服务、设置主机名管理、时间同步

所有服务器

更改主机名、刷新生效
hostname 主机名
bash初始化设置 
setenforce 0
systemctl disable --now firewalld
vim /etc/seliux/cnf

manager服务器

chrony同步阿里云时间
安装开启chrony程序
yum install -y chrony
systemctl start chronyd
修改chrony配置文件
vim /etc/chrony.conf
====================================================================================3 #server 0.centos.pool.ntp.org iburst4 #server 1.centos.pool.ntp.org iburst5 #server 2.centos.pool.ntp.org iburst6 #server 3.centos.pool.ntp.org iburst7 server ntp.aliyun.com iburst
====================================================================================
重启检查是否同步成功,210 Number of sources = 1表示同步成功
systemctl restart chronyd
chronyc sources

2、修改master01配置文件并同步给其他数据库

vim /etc/my.cnf
......
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
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 台数据库服务器上并启动服务器,注意:配置文件中的 server_id 要修改
scp /etc/my.cnf root@192.168.170.100:/etc/
scp /etc/my.cnf root@192.168.170.101:/etc/
scp /etc/my.cnf root@192.168.170.120:/etc/

其他数据库需要修改id,重启服务
vim /etc/my.cnf
systemctl restart mysqld

3、配置主主复制两台主服务器相互复制

master1和master2

登录数据库
mysql -u root -p123456
#在两台主服务器上都执行授予从的权限,从服务器上不需要执行
grant replication slave on *.* to 'replication'@'192.168.170.%' identified by '123456';
#在两台主服务器上查看,记录日志文件名称和同步点
show master status;

  master1 上配置同步

change master to master_host='192.168.170.100',master_user='replication',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=461;start slave;
show slave status\G

 master2 上配置同步(根据实际情况填写,我这里文件名和位置都是一样的)

change master to master_host='192.168.170.100',master_user='replication',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=461;start slave;
show slave status\G


 

4、配置主从复制,在两台从服务器上做

mysql -uroot -p123456
create user 'myslave'@'192.168.170.%' identified by 'myslave123';
grant replication slave on *.* to 'myslave'@'192.168.170.%' identified by 'myslave123';
flush privileges;
change master to master_host='192.168.170.200',master_user='replication',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=461;
start slave;
show slave status\G


5、测试主主、主从 同步情况

第二部分:部署MMM

1、所有服务器上安装 MySQL-MMM

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum -y install epel-release
yum -y install mysql-mmm*

2、 master01 上对 MySQL-MMM 进行配置

cd /etc/mysql-mmm/
vim mmm_common.conf
---------------------------------------------------------------------
……
<host default>cluster_interface       ens33……replication_user        replicationreplication_password    123456agent_user              mmm_agentagent_password          123456<host db1>ip      192.168.170.200mode    masterpeer    db2
</host><host db2>ip      192.168.170.100mode    masterpeer    db1
</host><host db3>ip      192.168.170.101mode    slave
</host><host db4>ip      192.168.170.102mode    slave
</host><role writer>hosts   db1, db2ips     192.168.80.188mode    exclusive           #只有一个 host 可以进行写操作模式
</role><role reader>hosts   db3, db4ips     192.168.80.198, 192.168.80.199mode    balanced            #多个 slave 主机可以进行读操作模式
</role>
---------------------------------------------------------------------
把配置文件复制到其它 4 台主机,所有主机该配置文件内容都是一样的
scp mmm_common.conf root@192.168.170.100:/etc/mysql-mmm/
scp mmm_common.conf root@192.168.170.101:/etc/mysql-mmm/
scp mmm_common.conf root@192.168.170.120:/etc/mysql-mmm/
scp mmm_common.conf root@192.168.170.20:/etc/mysql-mmm/

3、修改所有数据库代理配置文件

vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db1                #根据不同的主机分别修改为 db1,db2,db3,db4


4、在 monitor 监控服务器上修改监控配置文件 mmm_mon.conf

vim /etc/mysql-mmm/mmm_mon.conf
include mmm_common.conf
<monitor>
.....ping_ips            192.168.170.200,192.168.170.100,192.168.170.101,192.168.170.120    #指定所有数据库服务器的 IPauto_set_online        10           #指定自动上线时间
</monitor><host default>monitor_user        mmm_monitor     #指定 mmm_monitor 的用户名monitor_password    123456          #指定 mmm_monitor 的密码
</host>


5、所有数据库为代理进程和监控进程授权,启动代理进程

在所有数据库上为 mmm_agent(代理进程)授权
grant super, replication client, process on *.* to 'mmm_agent'@'192.168.170.%' identified by '123456';
//在所有数据库上为 mmm_moniter(监控进程)授权
grant replication client on *.* to 'mmm_monitor'@'192.168.170.%' identified by '123456';flush privileges;

在所有数据库服务器上启动代理进程
systemctl start mysql-mmm-agent.service
systemctl enable mysql-mmm-agent.service

6、monitor 服务器上启动数据库监控进程

systemctl start mysql-mmm-monitor.service   

第三部分:monitor 服务器上模拟故障 测试群集

#查看各节点的情况
mmm_control showdb1(192.168.80.20) master/ONLINE. Roles: writer(192.168.170.188)db2(192.168.80.30) master/ONLINE. Roles: db3(192.168.80.13) slave/ONLINE. Roles: reader(192.168.170.198)db4(192.168.80.14) slave/ONLINE. Roles: reader(192.168.170.199)#检测监控功能是否都完善,需要各种OK
mmm_control checks all#指定绑定 VIP 的主机
mmm_control move_role writer db2 #故障测试前还原绑定 VIP 的主机
mmm_control move_role writer db1

故障测试

#停止master1后,在monitor服务器上确认VIP是否移动到master2上。注意:master1 主服务器恢复服务后,不会抢占。
mmm_control show

#从服务器随便停一台后,在monitor服务器上查看,另一台将接管两个虚拟IP,以保证业务不停止
mmm_control show

#在 master01 服务器上为 monitor 服务器地址授权登录(同网段主机授权后都可以使用 vip登录)
grant all on *.* to 'testdba'@'192.168.170.20' identified by '123456';
flush privileges;

#在 monitor 服务器上使用 VIP 登录
yum install -y mariadb-server mariadb
systemctl start mariadb.service
mysql -utestdba -p -h 192.168.170.200#创建数据,测试同步情况
create database testdba;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/861676.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python25 Numpy基础

1.什么是Numpy NumPy&#xff08;Numerical Python 的简称&#xff09;是 Python 语言的一个扩展程序库&#xff0c;支持大量的维度数组与矩阵运算&#xff0c;此外也针对数组运算提供大量的数学函数库。NumPy 的前身是 Numeric&#xff0c;这是一个由 Jim Hugunin 等人开发的…

SAP ALV 负号提前

FUNCTION CONVERSION_EXIT_ZSIGN_OUTPUT. *"---------------------------------------------------------------------- *"*"本地接口&#xff1a; *" IMPORTING *" REFERENCE(INPUT) *" EXPORTING *" REFERENCE(OUTPUT) *"…

PNAS|这样也可以?拿别人数据发自己Paper?速围观!

还在为数据量小&#xff0c;说服力不足发愁&#xff1f; 想研究脱颖而出、眼前一亮&#xff1f; 想从更高层次的探索微生物的奥秘&#xff0c;发出一篇好文章&#xff1f; 近期&#xff0c;有一篇发表在PNAS(IF11.1)的文章“Deforestation impacts soil biodiversity and ecos…

量子计算与AI融合:IBM引领未来计算新纪元

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

docker-本地部署-后端

前置条件 后端文件 这边是一个简单项目的后端文件目录 docker服务 镜像文件打包 #命令行 docker build -t author/chatgpt-ai-app:1.0 -f ./Dockerfile .红框是docker所在文件夹 author&#xff1a;docker用户名chatgpt-ai-app&#xff1a;打包的镜像文件名字:1.0 &#…

YOLOv10改进 | 卷积模块 | 将Conv替换为轻量化的GSConv【轻量又涨点】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a;《YOLOv8改进有效…

技术流 | 运维平台大型“生产事故”录播和实战重现

【本文作者&#xff1a;擎创科技 资深专家禹鼎侯】 本文写于2021年&#xff0c;最近重读觉得特别有现场感。这也是运维人面对生产环境时遇到的各种惊心动魄的事件之一。惊险&#xff0c;但又顺利解决。是最好的结果。 事情是酱紫的。 那天上午&#xff0c;轻轻松松完成了一个新…

昇思MindSpore基本介绍

昇思MindSpore是一个全场景深度学习框架&#xff0c;旨在实现易开发、高效执行、全场景统一部署三大目标。 其中&#xff0c;易开发表现为API友好、调试难度低&#xff1b;高效执行包括计算效率、数据预处理效率和分布式训练效率&#xff1b;全场景则指框架同时支持云、边缘以…

C语言之进程学习

进程打开的文件列表&#xff1a;就是0 1 2 stdin stdout stderro等 类似于任务管理器是动态分ps是静态的 Zombie状态&#xff1a; 在Linux进程的状态中&#xff0c;僵尸进程是非常特殊的一种&#xff0c;它是已经结束了的进程&#xff0c;但是没有从进程表中删除。太多了会导…

轻量级仿 SpringBoot 程序

但凡 Java 程序&#xff0c;想必就是 Spring 程序&#xff1b;但凡 Spring 程序&#xff0c;想必就是 SpringBoot 程序——且慢&#xff0c;当今尚有不是 SpringBoot 即 SpringMVC 的程序不&#xff1f;有——老旧的遗留系统不就是嘛~——不&#xff0c;其实只要稍加“调教”&a…

TikTok网页版使用指南:如何登录TikTok网页版?

海外版抖音TikTok&#xff0c;已成为连接全球观众的重要平台。据统计&#xff0c;在美国&#xff0c;TikTok的用户数量已达到近1.3亿&#xff0c;并且在国外的95后用户群体中很受欢迎。 TikTok网页版也提供了一个广阔的平台&#xff0c;让品牌和创作者在电脑端与全球观众互动&…

智能语音抽油烟机:置入WTK6900L离线语音识别芯片 掌控厨房新风尚

一、抽油烟机语音识别芯片开发背景 在繁忙的现代生活中&#xff0c;人们对于家居生活的便捷性和舒适性要求越来越高。传统的抽油烟机操作方式往往需要用户手动调节风速、开关等功能&#xff0c;不仅操作繁琐&#xff0c;而且在烹饪过程中容易分散注意力&#xff0c;增加安全隐…

大数据处理引擎选型之 Hadoop vs Spark vs Flink

随着大数据时代的到来&#xff0c;处理海量数据成为了各个领域的关键挑战之一。为了应对这一挑战&#xff0c;多个大数据处理框架被开发出来&#xff0c;其中最知名的包括Hadoop、Spark和Flink。本文将对这三个大数据处理框架进行比较&#xff0c;以及在不同场景下的选择考虑。…

ubuntu篇---添加环境变量并且在pycharm中使用

ubuntu篇—添加环境变量并且在pycharm中使用 一. 添加环境变量 vim ~/.bashrc 在文件末尾加上 保存退出 source ~/.bashrc二. 在pycharm中添加环境变量 1.打开pycharm&#xff0c;并打开你的项目 2.点击菜单栏中的“Run”&#xff0c; 选择“Edit Configurations” 3.在弹…

pytorch为自己的extension backend添加profiler功能

pytorch为自己的extension backend添加profiler功能 1.参考文档2.your-extension-for-pytorch需要增加的代码3.pytorch demo及如何调整chrome trace json文件4.[可视化](https://ui.perfetto.dev/) 本文演示了pytorch如何为自己的extension backend添加profiler功能 背景介绍 …

Taro +vue3 中的微信小程序中的分享

微信小程序 右上角分享 的触发 以及配 useShareAppMessage(() > {return {title: "电影属全国通兑券",page: /pages/home/index,imageUrl: "http:///chuanshuo.jpg",};}); 置 就是Taro框架中提供的一个分享Api 封装好的

项目经理必读:三步走实现项目高效管理

一个项目的成功往往取决于项目管理能力的高低。若管理不当&#xff0c;易导致团队成员间的推诿和抱怨&#xff0c;且项目团队还可能面临成员对目标不明确、信息不透明、进度难以跟踪等问题。作为项目经理&#xff0c;掌握有效的项目管理策略至关重要。 一、精细化的目标拆解 …

数据库逻辑结构设计-实体和实体间联系的转换、关系模式的优化

一、引言 如何将数据库概念结构设计的结果&#xff0c;即用E-R模型表示的概念模型转化为关系数据库模式。 E-R模型由实体、属性以及实体间的联系三个要素组成 将E-R模型转换为关系数据库模式&#xff0c;实际上就是要将实体及实体联系转换为相应的关系模式&#xff0c;转换…

【EtherCAT】TwinCAT3通过PLC修改SDO数据

目录 1、打开twincat3, 左边PLC右键->添加新项&#xff0c;建立PLC工程 2、->References右键添加库 3、找到Tc2_EtherCAT库&#xff0c;点确定。 4、PLC程序ST语言就可以调用下面的功能块函数 5、PLC编程界面右键->输入助手 1、打开twincat3, 左边PLC右键->添…

数据恢复篇:如何恢复丢失的Android短信?

许多用户发现自己处于重要短信意外从Android手机中删除的情况。幸运的是&#xff0c;有一些行之有效的方法可以在没有root的情况下恢复已删除的短信Android&#xff0c;这可以成为救命稻草。这些技术不需要深厚的技术知识&#xff0c;也不需要损害设备的安全性。为了帮助您摆脱…