文章目录
- 一、mysql路由器配置
- 二、MHA高可用部署
- 1.先把server1、server2、server3上的mysql都停掉(为了做新的配置)
- 2.删除三个节点上的/usr/local/mysql/data中的文件、更改/etc/my.cnf文件,重新初始化、安装
- 3.在server1上作slave授权、其它两个节点作change master设置,构建一个一主两从的设置
- 4.在sever4上安装需要安装的资源,并将node节点上所需要安装的资源复制到各个node上安装
- 5.将MHA全局部署文件与另外一个单独文件整合到一起并编辑
- 6.作server4与其它三个节点的免密,并使用脚本进行检查
- 7.在server1中进入mysql对远程管理员登陆数据库作授权
- 8.在server4中用脚本进行检查
- 三、MHA的故障切换过程
一、mysql路由器配置
通过配置Mysql路由器来实现读写分离的效果,编写配置文件,能够实现读写调度到Mysql组复制集群中的不同后端
1.开启一个新的节点配置mysql路由器
[root@server4 ~]# rpm -ivh mysql-router-community-8.0.21-1.el7.x86_64.rpm %安装相关rpm安装包
[root@server4 ~]# cd /etc/mysqlrouter/
[root@server4 mysqlrouter]# ls
mysqlrouter.conf
[root@server4 mysqlrouter]# vim mysqlrouter.conf %添加下面的内容
[routing:ro] %只读路由
bind_address = 0.0.0.0
bind_port = 7001
destinations = 172.25.1.1:3306,172.25.1.2:3306,172.25.1.3:3306
routing_strategy = round-robin %调度算法
[routing:rw] %读写路由
bind_address = 0.0.0.0
bind_port = 7002
destinations = 172.25.1.1:3306,172.25.1.2:3306,172.25.1.3:3306
routing_strategy = first-available
[root@server4 mysqlrouter]# systemctl start mysqlrouter.service %重启服务
[root@server4 mysqlrouter]# yum install -y net-tools
[root@server4 mysqlrouter]# netstat -antulp %查看相关端口是否开启
tcp 0 0 0.0.0.0:7001 0.0.0.0:* LISTEN 4011/mysqlrouter
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 3237/master
tcp 0 0 0.0.0.0:7002 0.0.0.0:* LISTEN 4011/mysqlrouter
2.在server1上创建mysql远程登陆用户,并作相应授权
[root@server1 data]# mysql -pwestos
mysql> grant select on *.* to user1@'%' identified by 'westos'; %创建user1并且授予select(查询)权限
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> grant all on test.* to user2@'%' identified by 'westos'; %创建user2并且授予对test库具备all(完全)权限
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
3.路由器配置好之后在宿主机上以指定用户远程连接mysql指定路由端口,7001或7002
[root@foundation1 ~]# mysql -h 172.25.1.4 -P 7001 -u user1 -pwestos %连接7001端口为只读
[root@foundation1 ~]# mysql -h 172.25.1.4 -P 7002 -u user2 -pwestos %连接7002端口为可读写
4.使用lsof在mysql其它节点上测试连接情况
当某个节点mysql退出之后(不是关闭mysql服务),远程主机可通过路由端口连接到其他mysql主机上继续进行相关操作,因为配置文件中只读策略中定义的算法为round-robin(l轮询调度,一个一个轮着调度)
[root@server1 data]# yum install -y lsof
[root@server1 data]# lsof -i :3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 3666 mysql 31u IPv6 27108 0t0 TCP *:mysql (LISTEN)
mysqld 3666 mysql 83u IPv6 32262 0t0 TCP server1:mysql->server4:45442 (ESTABLISHED)
mysql路由具有后端健康检查功能 ,配置文件中设置
rw端口连接调度算法为first-available
,即一旦有节点挂掉就会调度到其它节点上;远程主机在登录数据库时实际上连接的是server4 mysql路由器,之后server4通过proxy来对后端server2、server3进行调度
此时远端再次登入数据库发现已经调度到server2上:
二、MHA高可用部署
整体结构图:
1.先把server1、server2、server3上的mysql都停掉(为了做新的配置)
[root@server1 data]# /etc/init.d/mysqld stop
Shutting down MySQL........... SUCCESS!
2.删除三个节点上的/usr/local/mysql/data中的文件、更改/etc/my.cnf文件,重新初始化、安装
[root@server1 data]# rm -rf *
[root@server1 data]# vim /etc/my.cnf
[root@server1 ~]# cat /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/data/mysql.sock
symbolic-links=0
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
[root@server1 data]# mysqld --initialize --user=mysql
[root@server1 data]# /etc/init.d/mysqld start
[root@server1 data]# mysql_secure_installation
3.在server1上作slave授权、其它两个节点作change master设置,构建一个一主两从的设置
[root@server1 data]# mysql -pwestos
mysql> grant replication slave on *.* to repl@'%' identified by 'westos';
Query OK, 0 rows affected, 1 warning (0.01 sec)
[root@server2 data]# mysql -pwestos
mysql> change master to MASTER_HOST = '172.25.1.1', MASTER_USER = 'repl', MASTER_PASSWORD = 'westos', MASTER_AUTO_POSITION = 1;
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
4.在sever4上安装需要安装的资源,并将node节点上所需要安装的资源复制到各个node上安装
[root@server4 ~]# ls
MHA-7 mysql-router-community-8.0.21-1.el7.x86_64.rpm
[root@server4 ~]# cd MHA-7/
[root@server4 MHA-7]# ls
mha4mysql-manager-0.58-0.el7.centos.noarch.rpm perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
mha4mysql-manager-0.58.tar.gz perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
mha4mysql-node-0.58-0.el7.centos.noarch.rpm perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm perl-Net-Telnet-3.03-19.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
[root@server4 MHA-7]# yum install *.rpm -y
[root@server4 MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server1:
[root@server4 MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server2:
[root@server4 MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server3:
在三个节点上(server1、2、3):
yum install -y mha4mysql-node-0.58-0.el7.centos.noarch.rpm
5.将MHA全局部署文件与另外一个单独文件整合到一起并编辑
[root@server4 ~]# cd MHA-7/
[root@server4 MHA-7]# ls
mha4mysql-manager-0.58-0.el7.centos.noarch.rpm perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
mha4mysql-manager-0.58.tar.gz perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
mha4mysql-node-0.58-0.el7.centos.noarch.rpm perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm perl-Net-Telnet-3.03-19.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
[root@server4 MHA-7]# tar zxf mha4mysql-manager-0.58.tar.gz
[root@server4 MHA-7]# cd mha4mysql-manager-0.58/
[root@server4 mha4mysql-manager-0.58]# ls
AUTHORS bin COPYING debian lib Makefile.PL MANIFEST MANIFEST.SKIP README rpm samples t tests
[root@server4 mha4mysql-manager-0.58]# cd samples/
[root@server4 samples]# ls
conf scripts
[root@server4 samples]# cd conf/
[root@server4 conf]# ls
app1.cnf masterha_default.cnf
[root@server4 conf]# cat masterha_default.cnf app1.cnf > /etc/masterha/app.cnf
[root@server4 masterha]# vim app.cnf
[server default]
user=root %mysql主从节点的管理员用户密码,确保可以从远程登陆
password=westos
ssh_user=root
repl_user=repl %主从复制用户密码
repl_password=westos
master_binlog_dir= /usr/local/mysql/data %mysql主服务器的binlog目录
remote_workdir=/tmp
secondary_check_script= masterha_secondary_check -s 172.25.1.1 -s 172.25.1.2 %修改1
ping_interval=3
# master_ip_failover_script= /script/masterha/master_ip_failover
# shutdown_script= /script/masterha/power_manager
# report_script= /script/masterha/send_report
# master_ip_online_change_script= /script/masterha/master_ip_online_change
manager_workdir=/etc/masterha/app1 %manager工作目录
manager_log=/etc/masterha/app1/manager.log %manager日志文件
[server1]
hostname=172.25.1.1 %修改2
[server2]
hostname=172.25.1.2 %修改3
candidate_master=1 %指定failover时此slave会接管master,即使数据不是最新的
[server3]
hostname=172.25.1.3 %修改4
no_master=1 %始终是slave
6.作server4与其它三个节点的免密,并使用脚本进行检查
[root@server4 masterha]# ssh-keygen
[root@server4 ~]# ssh-copy-id server1 %只做这一步使用脚本检测时会提示失败
[root@server4 ~]# ssh-copy-id server2
[root@server4 ~]# ssh-copy-id server3
[root@server4 ~]# scp -r .ssh/ server1: %复制私钥和公钥到三个节点上
[root@server4 ~]# scp -r .ssh/ server2:
[root@server4 ~]# scp -r .ssh/ server3:
[root@server4 ~]# masterha_check_ssh --conf=/etc/masterha/app.cnf %当脚本检测返回内容如下所示时说明免密做成功
Sun Apr 11 11:50:23 2021 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sun Apr 11 11:50:23 2021 - [info] Reading application default configuration from /etc/masterha/app.cnf..
Sun Apr 11 11:50:23 2021 - [info] Reading server configuration from /etc/masterha/app.cnf..
Sun Apr 11 11:50:23 2021 - [info] Starting SSH connection tests..
Sun Apr 11 11:50:24 2021 - [debug]
Sun Apr 11 11:50:23 2021 - [debug] Connecting via SSH from root@172.25.1.1(172.25.1.1:22) to root@172.25.1.2(172.25.1.2:22)..
Sun Apr 11 11:50:23 2021 - [debug] ok.
Sun Apr 11 11:50:23 2021 - [debug] Connecting via SSH from root@172.25.1.1(172.25.1.1:22) to root@172.25.1.3(172.25.1.3:22)..
Sun Apr 11 11:50:24 2021 - [debug] ok.
Sun Apr 11 11:50:25 2021 - [debug]
Sun Apr 11 11:50:24 2021 - [debug] Connecting via SSH from root@172.25.1.2(172.25.1.2:22) to root@172.25.1.1(172.25.1.1:22)..
Sun Apr 11 11:50:24 2021 - [debug] ok.
Sun Apr 11 11:50:24 2021 - [debug] Connecting via SSH from root@172.25.1.2(172.25.1.2:22) to root@172.25.1.3(172.25.1.3:22)..
Sun Apr 11 11:50:24 2021 - [debug] ok.
Sun Apr 11 11:50:26 2021 - [debug]
Sun Apr 11 11:50:24 2021 - [debug] Connecting via SSH from root@172.25.1.3(172.25.1.3:22) to root@172.25.1.1(172.25.1.1:22)..
Sun Apr 11 11:50:24 2021 - [debug] ok.
Sun Apr 11 11:50:24 2021 - [debug] Connecting via SSH from root@172.25.1.3(172.25.1.3:22) to root@172.25.1.2(172.25.1.2:22)..
Sun Apr 11 11:50:25 2021 - [debug] ok.
Sun Apr 11 11:50:26 2021 - [info] All SSH connection tests passed successfully.
7.在server1中进入mysql对远程管理员登陆数据库作授权
[root@server1 ~]# mysql -pwestos
mysql> grant all on *.* to root@'%' identified by 'westos';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
8.在server4中用脚本进行检查
[root@server4 ~]# masterha_check_repl --conf=/etc/masterha/app.cnf %检查MySQL复制状况
Sun Apr 11 11:52:29 2021 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sun Apr 11 11:52:29 2021 - [info] Reading application default configuration from /etc/masterha/app.cnf..
Sun Apr 11 11:52:29 2021 - [info] Reading server configuration from /etc/masterha/app.cnf..
Sun Apr 11 11:52:29 2021 - [info] MHA::MasterMonitor version 0.58.
Sun Apr 11 11:52:30 2021 - [info] GTID failover mode = 1
Sun Apr 11 11:52:30 2021 - [info] Dead Servers:
Sun Apr 11 11:52:30 2021 - [info] Alive Servers:
Sun Apr 11 11:52:30 2021 - [info] 172.25.1.1(172.25.1.1:3306)
Sun Apr 11 11:52:30 2021 - [info] 172.25.1.2(172.25.1.2:3306)
Sun Apr 11 11:52:30 2021 - [info] 172.25.1.3(172.25.1.3:3306)
Sun Apr 11 11:52:30 2021 - [info] Alive Slaves:
Sun Apr 11 11:52:30 2021 - [info] 172.25.1.2(172.25.1.2:3306) Version=5.7.31-log (oldest major version between slaves) log-bin:enabled
Sun Apr 11 11:52:30 2021 - [info] GTID ON
Sun Apr 11 11:52:30 2021 - [info] Replicating from 172.25.1.1(172.25.1.1:3306)
Sun Apr 11 11:52:30 2021 - [info] Primary candidate for the new Master (candidate_master is set)
Sun Apr 11 11:52:30 2021 - [info] 172.25.1.3(172.25.1.3:3306) Version=5.7.31-log (oldest major version between slaves) log-bin:enabled
Sun Apr 11 11:52:30 2021 - [info] GTID ON
Sun Apr 11 11:52:30 2021 - [info] Replicating from 172.25.1.1(172.25.1.1:3306)
Sun Apr 11 11:52:30 2021 - [info] Not candidate for the new Master (no_master is set)
Sun Apr 11 11:52:30 2021 - [info] Current Alive Master: 172.25.1.1(172.25.1.1:3306)
Sun Apr 11 11:52:30 2021 - [info] Checking slave configurations..
Sun Apr 11 11:52:30 2021 - [info] read_only=1 is not set on slave 172.25.1.2(172.25.1.2:3306).
Sun Apr 11 11:52:30 2021 - [info] read_only=1 is not set on slave 172.25.1.3(172.25.1.3:3306).
Sun Apr 11 11:52:30 2021 - [info] Checking replication filtering settings..
Sun Apr 11 11:52:30 2021 - [info] binlog_do_db= , binlog_ignore_db=
Sun Apr 11 11:52:30 2021 - [info] Replication filtering check ok.
Sun Apr 11 11:52:30 2021 - [info] GTID (with auto-pos) is supported. Skipping all SSH and Node package checking.
Sun Apr 11 11:52:30 2021 - [info] Checking SSH publickey authentication settings on the current master..
Sun Apr 11 11:52:30 2021 - [info] HealthCheck: SSH to 172.25.1.1 is reachable.
Sun Apr 11 11:52:30 2021 - [info]
172.25.1.1(172.25.1.1:3306) (current master)
+--172.25.1.2(172.25.1.2:3306)
+--172.25.1.3(172.25.1.3:3306)
Sun Apr 11 11:52:30 2021 - [info] Checking replication health on 172.25.1.2..
Sun Apr 11 11:52:30 2021 - [info] ok.
Sun Apr 11 11:52:30 2021 - [info] Checking replication health on 172.25.1.3..
Sun Apr 11 11:52:30 2021 - [info] ok.
Sun Apr 11 11:52:30 2021 - [warning] master_ip_failover_script is not defined.
Sun Apr 11 11:52:30 2021 - [warning] shutdown_script is not defined.
Sun Apr 11 11:52:30 2021 - [info] Got exit code 0 (Not master dead).
MySQL Replication Health is OK.
三、MHA的故障切换过程
1.手动切换
server1和server2均为存活状态:
masterha_master_switch --conf=/etc/masterha/app.cnf --master_state=alive --new_master_host=172.25.1.2 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000 %切换master为server2
server2上停掉mysql,令其为dead状态(注意,此时下述操作承接上一步,即现在master是server2):
server4上执行:
masterha_master_switch --master_state=dead --conf=/etc/masterha/app.cnf --dead_master_host=172.25.1.2 --dead_master_port=3306 --new_master_host=172.25.1.1 --new_master_port=3306 --ignore_last_failover %忽略last_failover,如果不忽略则切换时会出错
之后再把server2 mysql开启,登陆数据库,change master操作指定master为server1,再start slave,此时show slave status\G;则能看到master为server1
关于--ignore_last_failover选项:
在执行完上述切换后会在server4上/etc/masterha/目录下生成app目录,里面会产生app.failover.complete文件(锁定文件,禁止自动切换)
此时我们执行一个脚本来测试这个文件的作用:
先删除这个目录中的这个文件然后:
masterha_manager --conf=/etc/masterha/app.cnf & %启动MHA并打入后台(属于自动切换)
server1上再关闭数据库,此时server4上发现脚本已执行完成,master已自动切换,可以查看/etc/masterha/app目录中的日志manager.log有具体的提示信息
如果在执行脚本前没有删除那个文件,则脚本会执行失败,master切换失败
2.脚本自动切换
server4上:
复制脚本到/usr/local/bin/目录下,为这两个脚本均添加可执行权限(脚本中定义的vip要根据具体情况作更改)
vim /etc/masterha/app.cnf:
[root@server4 masterha]# cat app.cnf
[server default]
user=root
password=westos
ssh_user=root
repl_user=repl
repl_password=westos
master_binlog_dir= /usr/local/mysql/data
remote_workdir=/tmp
secondary_check_script= masterha_secondary_check -s 172.25.1.1 -s 172.25.1.2
ping_interval=3
master_ip_failover_script= /usr/local/bin/master_ip_failover %解开这行注释并修改前半部分路径为/usr/local/bin(failover自动切换脚本)
# shutdown_script= /script/masterha/power_manager
# report_script= /script/masterha/send_report
master_ip_online_change_script= /usr/local/bin/master_ip_online_change %解开这行注释并修改前半部分路径为/usr/local/bin(手动切换脚本)
manager_workdir=/etc/masterha/app1
manager_log=/etc/masterha/app1/manager.log
[server1]
hostname=172.25.1.1
[server2]
hostname=172.25.1.2
candidate_master=1
[server3]
hostname=172.25.1.3
no_master=1
使用测试脚本进行repl测试:
[root@server4 masterha]# masterha_check_repl --conf=/etc/masterha/app.cnf
之后server2上添加指定vip 172.25.1.100,发现在远程主机上可以登陆这个vip的mysql
[root@foundation1 ~]# mysql -h 172.25.1.100 -u root -pwestos
之后再次手动切换master为server1,则vip会转到server1上:
masterha_master_switch --conf=/etc/masterha/app.cnf --master_state=alive --new_master_host=172.25.1.1 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
之后在server4上测试,并把server1上的mysql停止,:
masterha_manager --conf=/etc/masterha/app.cnf & %自动切换
发现vip又切换到了server2上,然后master为server2,想要将server1加入集群则change master为server2并start slave即可