目录
一、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地址 | 说明 |
master1 | 192.168.170.200 | 安装 mysql5.7、mysql-mmm |
master2 | 192.168.170.100 | 安装 mysql5.7、mysql-mmm |
slave1 | 192.168.170.101 | 安装 mysql5.7、mysql-mmm |
slave2 | 192.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;