环境:用3台服务器搭建MySQL MHA
主节点:192.168.157.128 CentOS 7.6
数据库:mysql-5.7.27-linux-glibc2.12-x86_64
从节点:192.168.157.129 CentOS 7.6
数据库:mysql-5.7.27-linux-glibc2.12-x86_64
管理节点:192.168.157.130 CentOS 7.6
数据库:mysql-5.7.27-linux-glibc2.12-x86_64
1、3台服务器都安装操作系统 CentOS 7.6 2、 MySQL 安装以及主从设置
三台机器都要做:
关闭防火墙:
systemctl
stop
firewalld.service
systemctl disable firewalld
.service
systemctl
status
firewalld.service
#关闭selinux
setenforce 0
PS:
临时关闭:
[root@localhost ~]#
getenforce
Enforcing
[root@localhost ~]#
setenforce 0
[root@localhost ~]#
getenforce
Permissive
永久关闭:
[root@localhost ~]# vi /etc/sysconfig/selinux
SELINUX=enforcing 改为 SELINUX=disabled
重启服务reboot
#删除预装mysql
rpm -qa|grep mariadb
rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64
#解压
tar zxvf mysql-5.7.27-linux-glibc2.12-x86_64.tar.gz -C /opt
#改名
mv mysql-5.7.27-linux-glibc2.12-x86_64 mysql
#新建mysql用户
useradd mysql
passwd mysql
#
#初始化
mkdir -p /opt/mysql/data
chown -R mysql:mysql /opt/
chown -R mysql:mysql /opt/
#建立相关文件夹
mkdir -p /opt/mysql/tmp
mkdir -p /opt/mysql/log
#更改文件夹权限
chown -R mysql:mysql /opt/mysql
#创建mysql.err文件
[root@mha02 opt]# cd mysql/log
[root@mha02 log]# ll
total 0
[root@mha02 log]# touch mysql.err
[root@mha02 log]# chown -R mysql:mysql mysql.err
#初始化数据库
mysql/bin/mysqld --initialize --user=mysql --basedir=/opt/mysql/ --datadir=/opt/mysql/data/
#简单配置
ln -s /opt/mysql/bin/mysql /usr/bin
ln -s /opt/mysql/bin/mysqladmin /usr/bin
ln -s /opt/mysql/bin/mysqldump /usr/bin
#mysql配置文件,每个服务器的
server-id要不同
vi /etc/my.cnf
[client]
port=3306
socket=/opt/mysql/tmp/mysql.sock
[mysqld]
user=mysql
datadir=/opt/mysql/data
basedir=/opt/mysql
socket=/opt/mysql/tmp/mysql.sock
log-error=/opt/mysql/log/mysql.err
pid-file=/opt/mysql/tmp/mysqld.pid
# id每台机器要不同
server-id = 186
#做双主时的设置,保证另一个主库操作能写入
log_slave_updates
#从库不会跟着主库重启
skip-slave-start
#开启gtid模式,5.7特有
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates = 1
#半同步复制模式
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000
#指定binlog与relay地址
log-bin = /opt/mysql/log/mysql-bin
relay-log = /opt/mysql/log/mysql-relay-bin
#不要同步哪些库,较好的写法
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
#开启数据库
/opt/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &
#登录数据库,修改root密码
mysql -p
之前初始化的密码
mysql> alter user root@'localhost' identified by '123456';
mysql>flush privileges;
增加root远程登录用户:
mysql> create user root@'%' identified by '123456';
Query OK, 0 rows affected (0.01 sec)
mysql> grant all privileges on *.* to root@'%';
mysql> flush privileges;
关闭MySQL服务:
[root@mha01 bin]# mysqladmin -uroot -p -S /opt/mysql/tmp/mysql.sock shutdown
开启MySQL服务:
/opt/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &
同样在其余两个服务器上安装MySQL服务。
#登录mysql,在三个mysql中都配置账号,注意,不能把mysql库作为binlog复制库,否则新建的slave账号会报错
#创建slave账号
mysql> grant replication slave,replication client on *.* to 'repl'@'%' identified by '123456';
#创建mha管理账号
mysql> grant all on *.* to 'monitor'@'%' identified by '123456';
#在slave节点上执行
mysql> set global read_only=1;
#由于从库随时会提升成主库,不能写在配置文件里
#MHA需要通过relay-log去校验slave是否数据读写一致,不要写进配置文件,所有mysql节点执行
mysql>set global relay_log_purge=0;
#设置主从
1、主库查看master
mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000002 | 932 | | | 58d16735-bdae-11e9-b8d3-000c29f97b79:1-8 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
2、slave库执行
mysql> change master to
master_host='192.168.157.128',
master_user='repl',
master_password='123456',
master_log_file='mysql-bin.000002',
master_log_pos=932;
用GTID启动slave:
mysql>change master to
master_host='192.168.157.128',
master_user='repl',
master_password='123456',
master_auto_position=1;
mysql> start slave;
Query OK, 0 rows affected (0.02 sec)
mysql> show slave status\G;
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
看到两个YES,即代表主从成功。
3、搭建MHA
三台主机ssh互信
注意:三台主机都要做,并且要本机对本机的SSH认证
#因为mha需要manager对自己ssh免密登录
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub
root@192.168.157.128
ssh-copy-id -i ~/.ssh/id_rsa.pub
root@
192.168.157.129
ssh-copy-id -i ~/.ssh/id_rsa.pub
root@
192.168.157.130
MHA安装配置:
三台机器都要做:
在/opt目录下安装:
在所有节点安装MHA node所需的perl模块,如下:
#CentOS 6 下载点
rpm -ivh http:
//
dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
#CentOS 7 下载点
rpm -ivh
http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
#安装所需控件
#yum
install
-y
perl-DBD-MySQL
perl-Config-Tiny
perl-Log-Dispatch
perl-Parallel-ForkManager
perl-Time-HiRes
yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-YAML-Tiny perl-PAR-Dist perl-Module-ScanDeps perl-Module-CoreList perl-Module-Build perl-CPAN perl-CPANPLUS perl-File-Remove perl-Module-Install
#下载node和manager软件
# node git 地址:https://github.com/yoshinorim/mha4mysql-node
# manager git 地址:https://github.com/yoshinorim/mha4mysql-manager
# node 所有机器都要安装
# manager 只需要管理节点安装
yum -y install git
git clone https://github.com/yoshinorim/mha4mysql-node.git
#管理节点安装
git clone
https://github.com/yoshinorim/mha4mysql-manager.git
安装MHA
cd /opt/mha4mysql-node
perl Makefile.PL
make && make install
cd /opt/mha4mysql-manager
perl Makefile.PL
make && make install
注意:在perl Makefile.PL时,可能会出现类似Can't locate inc/Module/XXX.pm in @INC的报错
这是由于缺少组件造成的,只需要安装相应附件
例: yum -y install perl-Module-XXX 一般有对应的名字插件,安装就好
#node方面的都已经配好了,然后是manager节点的操作
配置 Manager 节点,以下步骤都是Manager节点操作
#新建MHA配置文件
mkdir /var/log/mha/app1 -p
touch /var/log/mha/app1/manager.log
vi /etc/masterha.cnf
[server default]
#监控用户
user=monitor
password=123456
#ssh 用户
ssh_user=root
#slave 用户
repl_user=repl
repl_password=123456
#ping 三次不通判断失联
ping_interval=3
#使用其他主机去ping,判断是否主机本身故障
secondary_check_script=masterha_secondary_check -s 192.168.157.128 -s 192.168.157.129 -s 192.168.157.130
#相关脚本位置,都要自建,默认是没有的
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script= /usr/local/bin/master_ip_online_change
report_script=/usr/local/bin/send_report
#指定MHA日志目录
manager_workdir=/var/log/mha/app1
manager_log=/var/log/mha/app1/manager.log
#指定bin-log位置
master_binlog_dir=/opt/mysql/log/
remote_workdir=/var/log/mha/mysqltmp
[server1]
hostname=192.168.157.128
port=3306
[server2]
hostname=192.168.157.129
port=3306
#是否无视落后进度让他成为master
candidate_master=1
check_repl_delay=0
[server3]
hostname=192.168.157.130
#永远不会成为master。多用于manager
no_master=1
port=3306
#配置VIP
#为了防止脑裂发生,推荐生产环境采用脚本的方式来管理虚拟 ip,而不是使用 keepalived来完成
vi /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变量
#此处修改VIP地址,预先选择的VIP地址
my $vip = '192.168.157.197/24';
my $key = '1';
#修改ifconfig之后的网卡名,其他地方都不要改动
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
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,
);
