一、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.73.1:3306,172.25.73.2:3306,172.25.73.3:3306
routing_strategy = round-robin 算法调度
[routing:rw]
bind_address = 0.0.0.0 读写路由
bind_port = 7002
destinations = 172.25.73.1:3306,172.25.73.2:3306,172.25.73.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 3739/mysqlrouter
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 3312/master
tcp 0 0 0.0.0.0:7002 0.0.0.0:* LISTEN 3739/mysqlrouter
2、在server1创建远程登陆用户并授权
[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@westos_student73 ~]# mysql -h 172.25.73.4 -P 7001 -u user1 -pwestos 连接7001端口为只读
[root@westos_student73 ~]# mysql -h 172.25.73.4 -P 7002 -u user2 -pwestos 连接7002端口为可读写
yum -y install mariadb
测试user2是否可以写入数据
4、使用lsof在mysql其它节点上测试连接情况
当某个节点mysql退出之后(不是关闭mysql服务),远程主机可通过路由端口连接到其他mysql主机上继续进行相关操作,因为配置文件中只读策略中定义的算法为round-robin
(轮询调度,一个一个轮着调度)
[root@server1 data]# yum install -y lsof
[root@server1 ~]# lsof -i :3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 4172 mysql 30u IPv6 32018 0t0 TCP *:mysql (LISTEN)
mysqld 4172 mysql 57u IPv6 31449 0t0 TCP server1:mysql->server4:56634 (ESTABLISHED)
mysql路由具有后端健康检查功能 ,配置文件中设置rw端口连接调度算法为first-available,一但有节点挂掉就会调度到其它节点上;远程主机在登录数据库时实际上连接的是server4 mysql路由器,之后server4通过proxy来对后端server2、server3进行调度
远程主机再次登入数据库发现已经调度到server2上
二、MHA高可用
MHA是一款开源的MySQL的高可用程序,他为MySQL主从复制架构提供了automating master failover功能。MHA在监控到master节点故障时,会提升其中拥有最新数据的slave节点成为新的master节点。在此期间,MHA会通过其他从节点获取额外信息来避免一致性方面的额问题。MHA还提供了master节点切换功能,即按需切master/slave节点
1、server1、server2、server3上的mysql,server4的mysqlrouter,都停掉准备做新的配置
[root@server1 ~]# /etc/init.d/mysqld stop
[root@server2 ~]# /etc/init.d/mysqld stop
[root@server3 ~]# /etc/init.d/mysqld stop
[root@server4 mysqlrouter]# systemctl stop mysqlrouter.service
2、删除三个节点上的/usr/local/mysql/data中的文件、更改/etc/my.cnf文件,重新初始化数据库
[root@server1 data]# rm -rf *
[root@server1 data]# vim /etc/my.cnf
[mysqld]
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-insecure --user=mysql
[root@server1 data]# /etc/init.d/mysqld start
3、在server1上作slave授权、其它两个节点作change master设置,构建一个一主两从的设置
[root@server1 data]# mysql
mysql> grant replication slave on *.* to repl@'%' identified by 'westos';
[root@server2 data]# mysql
mysql> change master to MASTER_HOST = '172.25.73.1', MASTER_USER = 'repl', MASTER_PASSWORD = 'westos', MASTER_AUTO_POSITION = 1;
mysql> start slave;
[root@server3 data]# mysql
mysql> change master to MASTER_HOST = '172.25.73.1', MASTER_USER = 'repl', MASTER_PASSWORD = 'westos', MASTER_AUTO_POSITION = 1;
mysql> start slave;
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.73.1 -s 172.25.73.2 修改
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.73.1 修改
[server2]
hostname=172.25.73.2 修改
candidate_master=1 指定failover时此slave会接管master,即使数据不是最新的
[server3]
hostname=172.25.73.3 修改
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
当脚本检测返回内容如下所示时说明免密做成功
Tue Sep 14 20:15:43 2021 - [debug] Connecting via SSH from root@172.25.73.1(172.25.73.1:22) to root@172.25.73.2(172.25.73.2:22)..
Tue Sep 14 20:15:44 2021 - [debug] ok.
Tue Sep 14 20:15:44 2021 - [debug] Connecting via SSH from root@172.25.73.1(172.25.73.1:22) to root@172.25.73.3(172.25.73.3:22)..
Tue Sep 14 20:15:44 2021 - [debug] ok.
Tue Sep 14 20:15:44 2021 - [debug]
Tue Sep 14 20:15:44 2021 - [debug] Connecting via SSH from root@172.25.73.2(172.25.73.2:22) to root@172.25.73.1(172.25.73.1:22)..
Tue Sep 14 20:15:44 2021 - [debug] ok.
Tue Sep 14 20:15:44 2021 - [debug] Connecting via SSH from root@172.25.73.2(172.25.73.2:22) to root@172.25.73.3(172.25.73.3:22)..
Tue Sep 14 20:15:44 2021 - [debug] ok.
Tue Sep 14 20:15:45 2021 - [debug]
Tue Sep 14 20:15:44 2021 - [debug] Connecting via SSH from root@172.25.73.3(172.25.73.3:22) to root@172.25.73.1(172.25.73.1:22)..
Tue Sep 14 20:15:45 2021 - [debug] ok.
Tue Sep 14 20:15:45 2021 - [debug] Connecting via SSH from root@172.25.73.3(172.25.73.3:22) to root@172.25.73.2(172.25.73.2:22)..
Tue Sep 14 20:15:45 2021 - [debug] ok.
7、在server1的mysql对远程管理员登陆数据库授权
[root@server1 ~]# mysql
mysql> grant all on *.* to root@'%' identified by 'westos';
mysql> flush privileges;
8、在server4中用脚本进行检查
[root@server4 ~]# masterha_check_repl --conf=/etc/masterha/app.cnf 检查MySQL复制状况
显示ok即可!到此MHA的部署已经完成
三、MHA的故障切换过程
1、手动切换
server1和server2均为存活状态
[root@server4 ~]#
masterha_master_switch --conf=/etc/masterha/app.cnf --master_state=alive --new_master_host=172.25.73.2 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000 切换master为server2
在server1、server3查看,master切换为server2
mysql> show slave status\G;