MySQL安装MHA高并发全及简单的测试全过程

mysql1 20.0.0.114
mysql2 20.0.0.85
mysql3 20.0.0.87
MHA-manager 20.0.0.89

一、首先准备三台虚拟机 20.0.0.114主服务器;20.0.0.85从服务器; 20.0.0.87从服务器 将电脑设置到基本的配置 即关闭防火墙 关闭核心防护 且能够正常的上网

ping百度能通之后
systemctl stop firewalld
systemctl disable firewalld
vi /etc/selinux/config
SELINUX=disabled
mount /dev/cdrom /mnt      # 若是报错看自己的虚拟机是不是没有打钩
df -Th
vi /etc/fstab
/dev/cdrom /mnt iso9660 defaults 0 0
cd /etc/yum.repos.d/
ll
mkdir backup
mv C* backup/
cp backup/CentOS-Base.repo local.repo       #若是不成功先进backup在cp 或建个文件
vi local.repo                              # 36dd
name=CentOS
baseurl=file:///mnt
gpgcheck=0
enabled=1
yum clean all
yum makecache
init 6

二、为三台服务器安装MySQL 20.0.0.114 和20.0.0.85 和20.0.0.87

1、首先将mysql1 mysql2 和mysql3的所需要的mysql软件包传到/opt目录下并去ll看先有没有传过去 三台都需要编译安装这里仅仅显示一台的安装步骤 其他两台相同

[root@mysql1 opt]# ll
总用量 47748
-rw-r--r--  1 root root    54484 9月  19 14:10 mha4mysql-node-0.57.tar.gz
-rw-r--r--  1 root root 48833145 9月  19 14:10 mysql-boost-5.7.20.tar.gz
drwxr-xr-x. 2 root root        6 10月 31 2018 rh

2、安装环境依赖包 新建一个mysql专用的用户 解压

yum -y install \
ncurses \
ncurses-devel \
bison \
cmake

useradd -s /sbin/nologin  mysql

cd /opt
tar xf mysql-boost-5.7.20.tar.gz
cd /opt/mysql-5.7.20/

3、安装设置配置选项

cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \          #指定将 mysql 数据库程序安装到某目录下,
如目录/usr/local/ mysql
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \                               #指定初始化参数文件目录
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8  \                         #指定默认使用的字符集编码,如 utf8。
-DDEFAULT_COLLATION=utf8_general_ci \             #指定默认使用的字符集校对规则,utf8_general_ci
是适用于 UTF-8 字符集的通用规则。
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1

4、编译 安装 数据库进行权限调整

make && make install
chwon mysql:msyql /usr/local/mysql/

5、建立调整配置文件 以方便以后用systemctl 进行权限调整

vi /etc/my.cnf

[client]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock

[mysql]
port = 3306
default-character-set=utf8
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
server-id = 1

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES

chown mysql:mysql /etc/my.cnf

6、设置环境变量 并进行备份 安装 测试配置文件

echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile
echo 'export PATH' >> /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/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
systemctl enable mysqld
systemctl start mysqld
systemctl status mysqld
netstat -anpt | grep 3306

mysqladmin -u root -p password "abc123" ##刚开始没密码是空的直接回车,然后输入密码abc123,在此确认abc123,这是在root账户下运行的

mysql -u root -p     ##这个命令敲下,提示要输入密码,这个就是刚才设置的密码abc123
exit                 ##退出数据库

7、安装好 mysql后对mysql1 和mysql2 以及mysql3的server-id进行调整方便后面的并添加主从设置方便后面的实验 我们这里以mysql1作为主服务器 MySQL2和3作为从服务器

7、1在主服务器上

vi /etc/my.cnf
server-id=11
log-slave-updates = true     #新增 【该参数就是为了让从库从主库复制数据时可以写入到binlog日志】
systemctl restart mysqld     #新增【记得重启下】

7、2在两个从服务器上

vi /etc/my.cnf

server-id=22                #mysql3的设置为33
relay-log = relay-log-bin   #新增
relay-log-index = slave-relay-bin.index   #新增

systemctl restart mysqld 

三、为mysql2和mysql3设置时间同步

1、在主机Master 搭建时间同步服务器NTP(20.0.0.114)

[root@localhost ~]# yum -y install ntp
[root@localhost ~]# vi /etc/ntp.conf ####最后面添加这二行
server 127.127.1.0
fudge 127.127.1.0 stratum 8 [root@localhost ~]# systemctl restart ntpd
[root@localhost ~]# systemctl enable ntpd

2、在从服务器上配置NTP同步 两个从库都要设置

登录到20.0.0.85
[root@localhost ~]# yum -y install ntpdate
[root@localhost ~]# ntpdate 20.0.0.114

[root@localhost ~]# crontab -e
*/2 * * * * /usr/sbin/ntpdate 20.0.0.114 >>/var/log/ntpdate.log
[root@localhost ~]# systemctl restart crond
[root@localhost ~]# systemctl enable crond
[root@localhost ~]# touch /var/log/ntpdate.log
[root@localhost ~]# tail -f /var/log/ntpdate.log ###动态查看更新日志文件

四、进行授权

所有的数据库节点都要授权

mysql -uroot -p

grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by '123456';
grant all privileges on *.* to 'mha'@'20.0.0.%' identified by 'manager';

#下面三条授权按理论是不用添加的,但是在做案例实验时通过 MHA 检查 MySQL 主从 有报错,报两个从库通过主机名连接不上主库,所以三个数据库都添加下面的授权。
grant all privileges on *.* to 'mha'@'Mysql1' identified by 'manager'; 
grant all privileges on *.* to 'mha'@'Mysql2' identified by 'manager'; 
grant all privileges on *.* to 'mha'@'Mysql3' identified by 'manager';

2、授权后查看二进制文件和同步点 在 Mysql1 主机上查看二进制文件和同步点,

mysql>show master status;
±------------------±---------±-------------±-----------------±------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±------------------±---------±-------------±-----------------±------------------+
| master-bin.000001 | 885 | | | |
±------------------±---------±-------------±-----------------±------------------+
1 row in set (0.00 sec)

3、执行同步操作 在 Mysql2 和 Mysql3 分别执行同步

mysql>change master to master_host=‘20.0.0.114’,master_user=‘myslave’,master_password=‘123456’,master_log_file=‘master-bin.000001’,master_log_pos=885;
mysql>start slave;

4、查看数据同步结果 查看 IO 和 SQL 线程都是 yes 代表同步是否正常。

mysql>show slave status\G;
…省略部分内容…
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
…省略部分内容…
####必须设置两个从库为只读模式,在两个从库上分别执行
mysql> set global read_only=1;

5、插入数据测试数据库同步 在 Mysql1 主库插入条数据,测试是否同步。

mysql>create database test_db;
Query OK, 1 row affected (0.00 sec)

mysql>use test_db;
Database changed

mysql>create table test(id int);
Query OK, 0 rows affected (0.13 sec)

mysql>insert into test(id) values (1);
Query OK, 1 row affected (0.03 sec)

6、在两个从库分别查询,出现如下所示执行结果则说明主从同步正常。

mysql>select * from test_db.test;
±-----+
| id |
±-----+
| 1 |
±-----+
1 row in set (0.00 sec)

五、安装MHA环境包

1、所有服务器上都安装 MHA 依赖的环境,首先安装 epel 源

[root@MHA-manager ~]# yum install -y epel-release --nogpgcheck
[root@MHA-manager ~]# yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN
###############################################################
安装上面的命令要是没有安装包先进行下面的超作
cd /etc/yum.repos.d/
ll
mv local.repo ./backup/
cp backup/* ./
ll
rm -rf local.repo 【这个是让用线网源安装上下的的两个命令】
ll
就可以安装了
###############################################################

2、所有的服务器都必须先安装 node 记得先上传到/opt哦

[root@Mysql1 ~]# tar zxvf mha4mysql-node-0.57.tar.gz
[root@Mysql1 ~]# cd mha4mysql-node-0.57
[root@Mysql1 mha4mysql-node-0.57]# perl Makefile.PL
[root@Mysql1 mha4mysql-node-0.57]# make && make install
[root@Mysql1 mha4mysql-node-0.57]# make install

在 MHA-manager 上安装 manager 组件

1、解压 编译安装

[root@MHA-manager ~]# tar zxvf mha4MHA-manager-0.57.tar.gz
[root@MHA-manager ~]# cd mha4MHA-manager-0.57
[root@MHA-manager mha4MHA-manager-0.57]# perl Makefile.PL
[root@MHA-manager mha4MHA-manager-0.57]# make
[root@MHA-manager mha4MHA-manager-0.57]# make install

2、检查有没有脚本生成

manager 安装后在/usr/local/bin 下面会生成几个工具,主要包括以下几个:
masterha_check_ssh 检查 MHA 的 SSH 配置状况
masterha_check_repl 检查 MySQL 复制状况
masterha_manger 启动 manager的脚本
masterha_check_status 检测当前 MHA 运行状态
masterha_master_monitor 检测 master 是否宕机
masterha_master_switch 控制故障转移(自动或者手动)
masterha_conf_host 添加或删除配置的 server 信息
masterha_stop 关闭manager
###########################################################################
node 安装后也会在/usr/local/bin 下面会生成几个脚本(这些工具通常由 MHA
Manager 的脚本触发,无需人为操作)主要如下:
save_binary_logs 保存和复制 master 的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的 slave
filter_mysqlbinlog 去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)
purge_relay_logs 清除中继日志(不会阻塞 SQL 线程)

六、配置免交互 在所有的(四台)服务器上都要配置 这里仅仅显示一台的

ssh-keygen -t rsa  ###一路按回车键
ssh-copy-id 20.0.0.114
ssh-copy-id 20.0.0.85
ssh-copy-id 20.0.0.87

七. 配置安装 MHA 在20.0.0.89上

ll /opt/mha4mysql-manager-0.57/samples/scripts/ 能看到
脚本具体作用如下所示。 
●master_ip_failover:自动切换时 VIP 管理的脚本
●master_ip_online_change:在线切换时 vip 的管理
●power_manager:故障发生后关闭主机的脚本
●send_report:因故障切换后发送报警的脚本
(2)使用下面内容完整替换master_ip_failover文件的内容,IP 部分更换为自己的IP地址。【最好不要全部复制 而仅仅是将下面##中的内容添加到文件中就行了 其他的不要变】

cp /opt/mha4mysql-manager-0.57/samples/scripts/* /usr/local/bin

vi /usr/local/bin/master_ip_failover

省略
  $new_master_ip,  $new_master_port,  $new_master_user,
  $new_master_password
);
####################################添加新增内容############
my $vip = '20.0.0.200';
my $brdc = '20.0.0.255';
my $ifdev = 'ens33';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
my $exit_code = 0;
#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,
省略

(3)创建 MHA 软件目录并拷贝配置文件 vi编辑器中的内容可直接复制

 mkdir /etc/masterha
 cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/
mkdir -p /var/log/masterha/app1

vi /etc/masterha/app1.cnf

[server default]
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/manager.log
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      ###MySQL 监控用户
password=manager     ###MySQL 监控用户的密码
ping_interval=1      ###ping 包时间间隔
remote_workdir=/tmp
repl_user=myslave     ###主从复制用户
repl_password=123456     ###主从复制用户的密码
secondary_check_script= /usr/local/bin/masterha_secondary_check -s 20.0.0.85 -s 20.0.0.87
shutdown_script=""
ssh_user=root      ###SSH 登录用户名
[server1]
hostname=20.0.0.114
port=3306
[server2]
hostname=20.0.0.85
port=3306
candidate_master=1
check_repl_delay=0
[server3]
hostname=20.0.0.87
port=3306

简单解析上面编辑器中的内容
candidate_master 与 check_repl_delay 的主要作用如下
●candidate_master=1:设置为候选 master,如果设置该参数以后,发生主从切换以后 会将此从库提升为主库,即使这个主库不是集群中最新的 slave。
●check_repl_delay=0:默认情况下如果一个 slave 落后 master 100M 的 relay logs 的话, MHA 将不会选择该 slave 作为一个新的 master。
因为对于这个 slave 的恢复需要花费 很长时间,通过设置 check_repl_delay=0,MHA 触发切换在选择一个新的 master 的时 候将会忽略复制延时,
这个参数对于设置了 candidate_master=1 的主机非常有用,因 为这个候选主在切换的过程中一定是新的 master

(4)下面是非常重要的测试 应该是第二个测试不会成功 不过没关系 继续往下看
(1)测试 ssh 无密码认证,如果正常最后会输出 successfully
[root@mha-manager ~]# masterha_check_ssh -conf=/etc/masterha/app1.cnf
(2)测试 mysq 主从连接情况,最后出现 MySQL Replication Health is OK 字样说明正常
[root@mha-manager ~]# masterha_check_repl -conf=/etc/masterha/app1.cnf

########不成功的修改办法######
问题1:[warning] relay_log_purge=0 is not set on slave 20.0.0.85(20.0.0.85:3)
在从服务器上:
mysql -uroot -p -e ‘set global relay_log_purge=0’
问题2:[warning] log-bin is not set on slave 20.0.0.87(20.0.0.87:3306)
在从服务器上:vi /etc/my.cnf
在[mysqld]参数下增加 log_bin=on
问题3:mysqlbinlog: unknown variable ‘default-character-set=utf8‘
在从服务器上:vi /etc/my.cnf
在[client]参数下注释 #default-character-set=utf8
如果在执行过程中,有如下报错信息:
Can’t exec “mysqlbinlog”: No such file or directory at /usr/lib64/perl5/vendor_perl/MHA/BinlogManager.pm line 99.
采用设置软连接的方式解决,三台 MySQL 上都需要执行
[root@Mysql1 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
[root@Mysql1 ~]# ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
如果有如下报错信息:
Bareword “FIXME_xxx” not allowed while “strict subs” in use at /usr/local/bin/master_ip_failover line 100.
在 manager 机器上面使用如下解决方法。
[root@mha-manager ~]# vim /usr/local/bin/master_ip_failover
##Update master ip on the catalog database, etc
#FIXME_xxx; ###将此行注释101行
(5)首次配置 MHA 的 VIP 地址需要手动进行配置,在 Mysql1 上执行如下命令

[root@Mysql1 ~]# ifconfig ens33:1 20.0.0.200
[root@Mysql1 ~]# ifconfig ens33:1
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 20.0.0.200 netmask 255.255.255.0 broadcast 20.0.0.255
ether 00:0c:29:eb:b2:c5 txqueuelen 1000 (Ethernet)

(6)启动 MHA

nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &

(7)查看 MHA 状态,可以看到当前的 master 是 Mysql1 节点。

[root@MHA-manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf app1
app1 (pid:7763) is running(0:PING_OK), master:20.0.0.114

故障模拟

一、自动切换

1、先在主服务器上 mysql1上把mysql先stop看看有没有切换 再去mha-manger要是出现successfully 说名切换成功
这时切换的主机可能是20.0.0.87

[root@Mysql1 ~]# systemctl stop mysqld

[root@MHA-manager ~]#tail -f /var/log/masterha/app1/manager.log

2、这时候可以将主服务器设置成备用的服务器 将已经切换的主服务器设置成主服务器
(1)启动Mysql1主库
[root@Mysql1 ~]# systemctl start mysqld
mysql>CHANGE MASTER TO MASTER_HOST=‘20.0.0.85’, MASTER_PORT=3306, MASTER_LOG_FILE=‘on.000001’, MASTER_LOG_POS=154, MASTER_USER=‘myslave’, MASTER_PASSWORD=‘123456’;
(2)启动从库同步并设置为只读
mysql>start slave;
mysql>set global read_only=1;
(3)停掉当前主库(Mysql2)的同步进程,不然下次作为从库同步会报错
mysql>stop slave;
mysql>reset slave;
3、看下有没有切换
[root@MHA-manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
若是出现的不是20.0.0.87先去修改下配置文件
将/etc/masterha/app1.cnf 这个配置文件中的所有的87改成85 所有的85改成87
在去执行下面的命令
masterha_check_status --conf=/etc/masterha/app1.cnf
这个时候能看到已经转换成功了

二、手动切换

1、将配置文件添加这个内容就
/etc/masterha/app1.cnf
省略
ssh_user=root

[server1]
hostname=20.0.0.114
port=3306
candidate_master=1
check_repl_delay=0
port=3306

[server2]
省略

2、手动切换的时候 不能将mha开启
停止 MHA
[root@MHA-manager ~]# masterha_stop --conf=/etc/masterha/app1.cnf
3、设置新的 master 为 Mysql1,在输入命令后会有交互需要输入 yes。另外需要注释 手动切换脚本/usr/local/bin/scripts/master_ip_online_change
里面的 152 行,不然会报错。 解决方案如下
[root@MHA-manager ~]# vi /usr/local/bin/scripts/master_ip_online_change
FIXME_xxx_drop_app_user($orig_master_handler); ####此行需要注释掉152行
4、 最后启动 MHA 检查是否正常
[root@MHA-manager ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
5、重新执行设置新的 master 为 alive 命令,出现 completed successfully 字样,表示手动切换成功。
[root@MHA-manager ~]# cp /usr/local/bin/scripts/master_ip_online_change /usr/local/bin/
[root@MHA-manager ~]# masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=20.0.0.114 --orig_master_is_new_slave
。。。。。省略。。。。。
Fri May 25 09:08:25 2018 - [info] 192.168.8.134: Resetting slave info succeeded.
Fri May 25 09:08:25 2018 - [info] Switching master to 192.168.8.134(192.168.8.134:3306)
completed successfully.

猜你喜欢

转载自blog.csdn.net/Laiyunpeng666/article/details/108680329
今日推荐