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 iburst
  4 #server 1.centos.pool.ntp.org iburst
  5 #server 2.centos.pool.ntp.org iburst
  6 #server 3.centos.pool.ntp.org iburst
  7 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 iburst
  4 #server 1.centos.pool.ntp.org iburst
  5 #server 2.centos.pool.ntp.org iburst
  6 #server 3.centos.pool.ntp.org iburst
  7 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_failover

cd /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 mysql

mysql -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 iburst
  4 #server 1.centos.pool.ntp.org iburst
  5 #server 2.centos.pool.ntp.org iburst
  6 #server 3.centos.pool.ntp.org iburst
  7 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        replication
    replication_password    123456
    agent_user              mmm_agent
    agent_password          123456

<host db1>
    ip      192.168.170.200
    mode    master
    peer    db2
</host>

<host db2>
    ip      192.168.170.100
    mode    master
    peer    db1
</host>

<host db3>
    ip      192.168.170.101
    mode    slave
</host>

<host db4>
    ip      192.168.170.102
    mode    slave
</host>

<role writer>
    hosts   db1, db2
    ips     192.168.80.188
    mode    exclusive           #只有一个 host 可以进行写操作模式
</role>

<role reader>
    hosts   db3, db4
    ips     192.168.80.198, 192.168.80.199
    mode    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    #指定所有数据库服务器的 IP
    auto_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 show
  db1(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;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【DC-DC升压电推剪方案】FP6277,FP6296电源升压芯片在电推剪中扮演着一个怎样的角色?带你深入了解电推剪的功能和应用及工作原理

随着人们对个人形象要求的不断提高&#xff0c;理发器作为一个必备的家居用品&#xff0c;也在不断进行技术升级。而其中的核心装备之一&#xff0c;电推剪理发器升压芯片FP6277、FP6296&#xff0c;正在引领着现代理发技术的突破。本文将给大家带来的是电推剪在传统意义上运用…

基于稀疏矩阵方法的剪枝压缩模型方案总结

1.简介 1.1目的 在过去的一段时间里&#xff0c;对基于剪枝的模型压缩的算法进行了一系列的实现和实验&#xff0c;特别有引入的稀疏矩阵的方法实现了对模型大小的压缩&#xff0c;以及在部分环节中实现了模型前向算法的加速效果&#xff0c;但是总体上模型加速效果不理想。所…

基于yolo的物体识别坐标转换

一、模型简介: 1.1、小孔成像模型简图如下:不考虑实际相机中存在的场曲、畸变等问题 相对关系为: 为了表述与研究的方便,我们将像面至于小孔之前,且到小孔的距离仍然是焦距f,这样的模型与原来的小孔模型是等价的 相对关系为: 二、坐标系简介: **世界坐标系(world coo…

Python26 Lambda表达式

1.什么是lambda表达式 lambda 是 Python 中的一个关键字&#xff0c;用于定义简单的匿名函数。与 def 关键字定义的标准函数不同&#xff0c;lambda 函数主要用于需要一个函数对象作为参数的简短操作。lambda 函数的设计哲学是简洁&#xff0c;因此它只能包含一条表达式&#…

【投稿优惠|稳定检索】2024年文化传播、交流与考古学国际会议 (CCEA 2024)

2024年文化传播、交流与考古学国际会议 (CCEA 2024) 2024 International Conference on Cultural Communication, Exchange, and Archaeology 【重要信息】 大会地点&#xff1a;西安 官网地址&#xff1a;http://www.icccea.com 投稿邮箱&#xff1a;iccceasub-conf.com 【注…

Pytest+Allure+Yaml+Jenkins+Gitlab接口自动化中Jenkins配置

一、背景 Jenkins&#xff08;本地宿主机搭建&#xff09; 拉取GitLab(服务器)代码到在Jenkins工作空间本地运行并生成Allure测试报告 二、框架改动点 框架主运行程序需要先注释掉运行代码&#xff08;可不改&#xff0c;如果运行报allure找不到就直接注释掉&#xff09; …

人工神经网络是什么,其应用有哪些?

人工神经网络是什么&#xff0c;其应用有哪些&#xff1f; 当你阅读这篇文章时&#xff0c;你身体的哪个器官正在考虑它&#xff1f;当然是大脑&#xff01;但是你知道大脑是如何工作的吗&#xff1f;嗯&#xff0c;它有神经元或神经细胞&#xff0c;它们是大脑和神经系统的主要…

检测故障电容器

去耦电容与旁路电容 “去耦电容”和“旁路电容”这两个术语经常互换使用&#xff0c;它们的功能重叠&#xff0c;容易造成混淆。实际上&#xff0c;它们的用途相似&#xff0c;但在电路中的应用可能会影响术语。 去耦电容 功能&#xff1a;去耦电容器主要用于通过为交流信号…

全面芯片外贸指南解密IC电子元器件商城网站搭建/制作/开发策略

电子元器件行业在数字化转型的大潮下正经历着前所未有的变革。传统销售渠道的局限性日益凸显&#xff0c;越来越多的企业和商家开始寻求线上突破&#xff0c;搭建自己的IC电子元器件商城网站成为提升市场竞争力的关键一步。本篇文章道合顺芯站点将详细阐述搭建IC电子元器件商城…

浏览器页面打不开(网络连接正常的情况下)

目录 一、代理被打开 二、DNS被篡改 三、网络配置出现问题 四、浏览器配置问题 一、代理被打开 1. 右击Wifi图标 2.点击“打开网络和internet设置” 3. 点击代理&#xff0c;把该窗口所有的东西都关闭&#xff0c;尤其是代理服务器 二、DNS被篡改 如果第一个方法不行&am…

00. 这里整理了最全的爬虫框架(Java + Python)

目录 1、前言 2、什么是网络爬虫 3、常见的爬虫框架 3.1、java框架 3.1.1、WebMagic 3.1.2、Jsoup 3.1.3、HttpClient 3.1.4、Crawler4j 3.1.5、HtmlUnit 3.1.6、Selenium 3.2、Python框架 3.2.1、Scrapy 3.2.2、BeautifulSoup Requests 3.2.3、Selenium 3.2.4…

解决 Pyecharts 在 jupyter Lab 上运行图片空白问题!

文章目录 &#x1f3f3;️‍&#x1f308; 1 提前声明 JUPYTER_LAB&#x1f3f3;️‍&#x1f308; 2 load_javascript(&#xff09;&#x1f3f3;️‍&#x1f308; 3 render_notebook()&#x1f3f3;️‍&#x1f308; 4 图示&#x1f3f3;️‍&#x1f308; 5 可视化项目源码…

十个常用的六西格玛统计工具及应用场景

六西格玛是一种质量改进方法&#xff0c;企业已经使用了几十年 - 因为它取得了成果。六西格玛项目遵循明确定义的一系列步骤&#xff0c;世界各国的每个行业的公司都使用这种方法来解决问题。 但是&#xff0c;六西格玛在很大程度上依赖于统计和数据分析&#xff0c;许多对质量…

气膜体育馆的安装流程—轻空间

随着人们对健康生活和高品质运动环境的追求&#xff0c;气膜体育馆因其独特的优点而逐渐受到青睐。轻空间将详细介绍气膜体育馆的安装流程&#xff0c;从实地勘测到检测&#xff0c;再到最终的清理现场&#xff0c;每一步都至关重要&#xff0c;确保体育馆的安全性和功能性。 一…

深入探究小型语言模型 (SLM)

使用 Microsoft Bing Image Creator 创建 大型语言模型 (LLM) 已经流行了一段时间。最近&#xff0c;小型语言模型 (SLM) 增强了我们处理和使用各种自然语言和编程语言的能力。但是&#xff0c;一些用户查询需要比在通用语言上训练的模型所能提供的更高的准确性和领域知识。此外…

EPLAN批量修改文字大小

在项目设计过程中&#xff0c;往往要批量调整文字的大小&#xff0c;如何批量修改文字大小&#xff1a; 点击需要调整的相同类的文字 右键 “属性”&#xff0c;然后在分配里找到“属性放置&#xff0c;设备标识符”这一栏 看下文字的属性在第几层 在项目数据找到层管理&…

【前端】HTML+CSS复习记录【2】

文章目录 前言一、img&#xff08;图片标签&#xff09;二、a&#xff08;链接标签&#xff09;三、ul&#xff08;无序列表&#xff09;四、ol&#xff08;有序列表&#xff09;系列文章目录 前言 长时间未使用HTML编程&#xff0c;前端知识感觉忘得差不多了。通过梳理知识点…

9 个让 Python 性能更高的小技巧,你掌握了吗?

我们经常听到 “Python 太慢了”&#xff0c;“Python 性能不行”这样的观点。但是&#xff0c;只要掌握一些编程技巧&#xff0c;就能大幅提升 Python 的运行速度。 今天就让我们一起来看下让 Python 性能更高的 9 个小技巧 python学习资料分享&#xff08;无偿&#xff09;…

人力资源成熟度模型的应用

由于各子&#xff08;分&#xff09;公司的业务相同&#xff0c;该电力总公司人力资源部收归了下属单位的人事招聘权、调配权以及考评权&#xff0c;期望通过集权对下属人力资源部实施过程管控&#xff0c;现实结果证明&#xff0c;这种集权并不能达到该电力公司的人力资源管理…

Web浏览器读写NFC Ntag标签

本示例使用的发卡器&#xff1a;RS232串口USB转COM读写器IC卡发卡器WEB浏览器二次开发JS编程SDK-淘宝网 (taobao.com) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&g…