阅读 420

MySQL主从复制与MHA高可用架构搭建

MySQL主从复制与MHA高可用架构搭建

环境架构介绍

架构如图所示,4台机器的IP和角色如下表:

机器名称IP角色权限
Mysql_Master192.168.31.199数据库Master可读写、主库
Mysql_Slave1192.168.31.165数据库Slave只读、从库
Mysql_Slave2192.168.31.142数据库Slave只读、从库
Mysql_MHA192.168.31.126MHA Manager高可用监控
image-20210603192606566

MySQL主从搭建

MySQL安装(3台)

  1. 因为CentOS7默认安装mariadb数据库,存中文时可能会有意想不到的问题,先把它删掉就好了,使用命令:

    yum remove mariadb-libs.x86_64
    复制代码
  2. 下载MySql安装包

    wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
    复制代码
  3. 安装软件包

    rpm -ivh mysql-community-release-el7-5.noarch.rpm
    复制代码
  4. 安装MySQL服务程序

    yum install mysql-community-server
    复制代码
  5. 完成后重启MySQL服务

    service mysqld restart
    复制代码

    此时,MySQL就已经成功安装在服务器上。

  6. 修改密码

    输入mysql -uroot -p 后这次我们直接不用密码就进去了,没有密码肯定是不安全的,现在就只要修改密码就好了。

    SET PASSWORD = PASSWORD('root123456');
    复制代码
  7. 设置开机自启动,可以在/etc/rc.local文件中加上如下MySQL的启动命令,例如:

    /etc/init.d/mysql start
    复制代码

关闭防火墙

不同的MySQL直接要互相访问,需要关闭Linux的防火墙,否则就要在配置/etc/sysconfifig/iptables中增加规则。配置防火墙不是本篇文章的重点,所以四台服务器均关闭防火墙。

systemctl stop firewalld
复制代码

MySQL主从配置

Master节点
使用vi /etc/my.cnf命令修改Master配置文件
#bin_log配置 
log_bin=mysql-bin 
server-id=1 
sync-binlog=1 
binlog-ignore-db=information_schema 
binlog-ignore-db=mysql 
binlog-ignore-db=performance_schema 
binlog-ignore-db=sys 
#relay_log配置 
relay_log=mysql-relay-bin 
log_slave_updates=1 
relay_log_purge=0
复制代码
重启服务
systemctl restart mysqld
复制代码
主库给从库授权

登录MySQL,在MySQL命令行执行如下命令:

mysql> grant replication slave on *.* to root@'%' identified by '密码'; 
mysql> grant all privileges on *.* to root@'%' identified by '密码'; 
mysql> flush privileges; 
//查看主库状态信息,例如master_log_file='mysql-bin.000007',master_log_pos=154 
mysql> show master status;
复制代码

Slave节点

修改Slave的MySQL配置文件my.cnf,两台Slave的server-id分别设置为2和3

#bin_log配置 
log_bin=mysql-bin 
#服务器ID,从库1是2,从库2是3 
server-id=2 
sync-binlog=1 
binlog-ignore-db=information_schema 
binlog-ignore-db=mysql 
binlog-ignore-db=performance_schema 
binlog-ignore-db=sys 
#relay_log配置 
relay_log=mysql-relay-bin 
log_slave_updates=1 
relay_log_purge=0 
read_only=1
复制代码
重启服务
systemctl restart mysqld
复制代码
开启同步

登录MySQL,在Slave节点的MySQL命令行执行同步操作,例如下面命令(注意参数与上面show master status操作显示的参数一致):

change master to master_host='192.168.31.199',master_port=3306,master_user='root',master_password ='123456',master_log_file='mysql-bin.000007',master_log_pos=154;

start slave; // 开启同步
复制代码

配置半同步复制

Master节点

登录MySQL,在MySQL命令行执行下面命令安装插件

install plugin rpl_semi_sync_master soname 'semisync_master.so';
show variables like '%semi%';
复制代码

使用vi /etc/my.cnf,修改MySQL配置文件

# 自动开启半同步复制 
rpl_semi_sync_master_enabled=ON 
rpl_semi_sync_master_timeout=1000
复制代码

重启MySQL服务

systemctl restart mysqld
复制代码

Slave节点

两台Slave节点都执行以下步骤。

登录MySQL,在MySQL命令行执行下面命令安装插件

install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
复制代码

使用vi /etc/my.cnf,修改MySQL配置文件

# 自动开启半同步复制 
rpl_semi_sync_slave_enabled=ON
复制代码

重启服务

systemctl restart mysqld
复制代码

测试半同步状态

首先通过MySQL命令行检查参数的方式,查看半同步是否开启。

show variables like '%semi%';
复制代码

然后通过MySQL日志再次确认。

cat /var/log/mysqld.log
复制代码

可以看到日志中已经启动半同步信息,例如:

Start semi-sync binlog_dump to slave (server_id: 2), pos(mysql-bin.000005, 154)
复制代码

MHA高可用搭建

四台机器ssh互通

在四台服务器上分别执行下面命令,生成公钥和私钥(注意:连续按换行回车采用默认值)

ssh-keygen -t rsa
复制代码

在三台MySQL服务器分别执行下面命令,密码输入系统密码,将公钥拷到MHA Manager服务器上

ssh-copy-id 192.168.31.126
复制代码

之后可以在MHA Manager服务器上检查下,看看.ssh/authorized_keys文件是否包含3个公钥

cat /root/.ssh/authorized_keys
复制代码

执行下面命令,将MHA Manager的公钥添加到authorized_keys文件中(此时应该包含4个公钥)

cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys 
复制代码

从MHA Manager服务器执行下面命令,向其他三台MySQL服务器分发公钥信息。

scp /root/.ssh/authorized_keys root@192.168.31.199:/root/.ssh/authorized_keys scp /root/.ssh/authorized_keys root@192.168.31.165:/root/.ssh/authorized_keys scp /root/.ssh/authorized_keys root@192.168.31.142:/root/.ssh/authorized_keys
复制代码

可以MHA Manager执行下面命令,检测下与三台MySQL是否实现ssh互通。

ssh 192.168.31.199 
exit 
ssh 192.168.31.165 
exit
ssh 192.168.31.142 
exit
复制代码

MHA下载安装

  • 三台MySQL服务器需要安装node

  • MHA Manager服务器需要安装manager和node

MHA node安装

在四台服务器上安装mha4mysql-node。

MHA的Node依赖于perl-DBD-MySQL,所以要先安装perl-DBD-MySQL。

yum install perl-DBD-MySQL -y 
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm 
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
复制代码
MHA manager安装

在MHA Manager服务器安装mha4mysql-node和mha4mysql-manager。

MHA的manager又依赖了perl-Confifig-Tiny、perl-Log-Dispatch、perl-Parallel-ForkManager,也分别进行安装。

wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 
rpm -ivh epel-release-latest-7.noarch.rpm 

yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -y 
wget https://github.com/yoshinorim/mha4mysql- node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm 
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm 

wget https://github.com/yoshinorim/mha4mysql- manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm 
rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
复制代码

MHA配置文件

MHA Manager服务器需要为每个监控的 Master/Slave 集群提供一个专用的配置文件,而所有的Master/Slave 集群也可共享全局配置。

初始化配置目录
#目录说明 
# /var/log    				(CentOS目录) 
# 	/mha      				(MHA监控根目录) 
# 		/app1   				(MHA监控实例根目录) 
# 			/manager.log  (MHA监控实例日志文件) 

mkdir -p /var/log/mha/app1 
touch /var/log/mha/app1/manager.log 
复制代码
配置监控全局配置文件

vim /etc/masterha_default.cnf

[server default] 
#主库用户名,在master mysql的主库执行下列命令建一个新用户
#create user 'mha'@'%' identified by '123123';
#grant all on *.* to mha@'%' identified by '123123'; 
#flush privileges; 
user=mha 
password=123123 
port=3306 
#ssh登录账号 
ssh_user=root 
#从库复制账号和密码 
repl_user=root 
repl_password=123456 
port=3306 
#ping次数 
ping_interval=1 
#二次检查的主机 
secondary_check_script=masterha_secondary_check -s 192.168.31.199 -s 192.168.31.165 -s 192.168.31.142
复制代码
配置监控实例配置文件

先使用 mkdir -p /etc/mha 命令创建目录,然后使用 vim /etc/mha/app1.cnf 命令编辑文件

#MHA监控实例根目录 
manager_workdir=/var/log/mha/app1 
#MHA监控实例日志文件 
manager_log=/var/log/mha/app1/manager.log 

#[serverx] 服务器编号 
#hostname 主机名
#candidate_master 可以做主库 
#master_binlog_dir binlog日志文件目录 
[server1] 
hostname=192.168.31.199 
candidate_master=1 
master_binlog_dir="/var/lib/mysql" 

[server2] 
hostname=192.168.31.165 
candidate_master=1 
master_binlog_dir="/var/lib/mysql"

[server3] 
hostname=192.168.31.142 
candidate_master=1 
master_binlog_dir="/var/lib/mysql"
复制代码

MHA 配置检测

执行ssh通信检测

在MHA Manager服务器上执行:

masterha_check_ssh --conf=/etc/mha/app1.cnf
复制代码
检测MySQL主从复制

在MHA Manager服务器上执行:

masterha_check_repl --conf=/etc/mha/app1.cnf
复制代码

出现“MySQL Replication Health is OK.”证明MySQL复制集群没有问题。

MHA Manager启动

在MHA Manager服务器上执行:

nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
复制代码

查看监控状态命令如下:

masterha_check_status --conf=/etc/mha/app1.cnf
复制代码

查看监控日志命令如下:

tail -f /var/log/mha/app1/manager.log
复制代码

测试MHA故障转移

模拟主节点崩溃

在MHA Manager服务器执行打开日志命令:

tail -200f /var/log/mha/app1/manager.log
复制代码

关闭Master MySQL服务器服务,模拟主节点崩溃

systemctl stop mysqld
复制代码

查看MHA日志,可以看到哪台slave切换成了master

show master status;
复制代码
文章分类
后端
文章标签