前言
复习mysql,搭建MHA架构,并且对MHA架构进行一定测试,标注出一些关键问题
|NODE|IP|ROLE|
|-|-|-|
|T1|192.168.179.191|master,MHA-node|
|T2|192.168.179.192|slave,MHA-manager|
|T3|192.168.179.193|slave,MHA-node|
可以将MHA-manager移至一个比较安全的节点,但是slave本身也可以(会配置no_master禁止T2成为master)
实践
1.配置域名解析
cat >> /etc/hosts <<EOF
192.168.179.191 T1
192.168.179.192 T2
192.168.179.193 T3
EOF2.安装3台mysql
请参考mysql一键启动脚本
3.设置每个节点间的免密登录(每个节点都需要)
ssh-keygen
for i in 191 192 193;do ssh-copy-id root@192.168.179.$i;done4.配置用户(推荐所有节点,只有主节点也行)
所有节点都需要授权是因为主从可能切换,此时原来的从节点就成为主节点,那么同时也需要复制账户
但是实际上只需要主节点就行了,因为并没有配置忽略mysql这个database(user表在其中),所以从节点复制时也会复制授权语句
#监控用户monmha,监控数据库变化
grant all privileges on *.* to 'monmha'@'T1' identified by '!@#$%^&[]{O2p';
grant all privileges on *.* to 'monmha'@'T2' identified by '!@#$%^&[]{O2p';
grant all privileges on *.* to 'monmha'@'T3' identified by '!@#$%^&[]{O2p';
grant all privileges on *.* to 'monmha'@'192.168.179.*' identified by '!@#$%^&[]{O2p';
#复制用户mha,用于复制数据库
grant REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'mha'@'192.168.179.*' identified by '1U@1UK6$1UK6%5n5*}\9M1UK69M5n5n';
grant REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'mha'@'T1' identified by '1U@1UK6$1UK6%5n5*}\9M1UK69M5n5n';
grant REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'mha'@'T2' identified by '1U@1UK6$1UK6%5n5*}\9M1UK69M5n5n';
grant REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'mha'@'T3' identified by '1U@1UK6$1UK6%5n5*}\9M1UK69M5n5n';
flush privileges;
#192.168.179.*与192.168.179.%基本相同
#在mysql8.0中,创建用户与授权需要分开来,也就是需要两步
#mysql需要对指定NDS进行解析,即使5.修改配置文件
vim /etc/my.cnf
[mysqld]
# ===== 基础配置 =====
# 唯一ID(主从必须不同,如主=1,从=2)
server-id = 1
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
log-error = /var/log/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid
# ===== 二进制日志配置 =====
# 所有节点均需配置(MHA要求)
log-bin = /var/lib/mysql/mysql-bin
binlog_format = ROW
expire_logs_days = 7
max_binlog_size = 100M
# 主库建议1,从库可设0
sync_binlog = 1
# ===== 中继日志配置 =====
# 所有节点均需配置(MHA要求)
relay_log = /var/lib/mysql/relay-bin
# 控制sql线程定时清理中继日志
relay_log_purge = ON
# 从库是否将其接收到的来自主库的更新操作记录到自己的二进制日志,必须启用(从库提升为主时需记录binlog)
log_slave_updates = ON
# ===== GTID 配置(可选)=====
# 一旦开启GTID,无法再回退,但是便于MHA定位日志断点(无需指定断点)
gtid_mode = ON
enforce_gtid_consistency = ON
# ===== 数据持久化配置 =====
#innodb_flush_log_at_trx_commit 0:每秒刷到磁盘,1:事务提交时刷到文件系统,再刷到磁盘(性能好);2:事务提交时刷到磁盘
# 主库建议1,从库可设2
innodb_flush_log_at_trx_commit = 1
# 根据内存调整(通常占50-70%)
innodb_buffer_pool_size = 4G
# ===== 主从角色相关配置 =====
#read_only禁止普通用户写,但是SUPER用户仍能正常写
#super_read_only禁止任何用户写,只有复制线程能绕过该限制的
# 主库=OFF,从库=ON
read_only = OFF
# MHA切换主从时可以修改read_only,但是无法修改super_read_only导致一旦打开,主从切换后的master无法写入
#super_read_only = OFF
# ===== 网络与连接 =====
# 允许远程访问
bind-address = 0.0.0.0
port = 3306
# 禁用DNS解析(提升性能)
#注意,MHA使用DNS解析的主机名登录,一定不能开启
#skip_name_resolve = ON
# 连接数量调优
max_connections = 1000
# ===== 其他MHA要求配置 =====
# 将中继日志信息存储到表中(提高可靠性)
#relay_log_info_repository = TABLE
#master_info_repository = TABLE
# MHA用于节点识别(指定master的IP,可用于主机名解析存在问题时仍能识别)
#report_host = 192.168.179.111 systemctl restart mysqld- 每个节点需要修改
server-id,保证每个节点不同 - 主从节点需要修改
read_only,主库可写,从库只读(MHA切换时自动修改read_only) innodb_flush_log_at_trx_commit建议修改- 经测试,从节点不能开启super_read_only,MHA在主从切换时不会修改这个参数
6.实现一主二从
两个从节点执行
mysql -uroot -p'MyStr0ngP@ssw0rd!'
CHANGE MASTER TO
MASTER_HOST='T1',
MASTER_USER='mha',
MASTER_PASSWORD='1U@1UK6$1UK6%5n5*}\9M1UK69M5n5n',
MASTER_AUTO_POSITION = 1;
STOP SLAVE;
START SLAVE;
SHOW SLAVE STATUS\G; 保证IO与SQL线程都启动了,一般IO线程出问题是master节点的问题,SQL线程出问题都是slave节点的问题
7.测试主从
master节点
mysql -uroot -p'MyStr0ngP@ssw0rd!'
create database test;
show databases;slave节点
show databases;#删除测试数据库
drop database test;8.下载MHA-node节点并安装(mysql的所有节点)
#依赖(每个节点都需要安装)
yum install -y perl-DBD-MySQL
#下载(rpm版)
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
#本地安装(rpm)
yum localinstall -y mha4mysql-node-0.58-0.el7.centos.noarch.rpm9.链接(mysql的所有节点)
#将mysql链接到/usr/bin内,mysqlbinlog链接到/usr/local/bin,否则mha报错(但是这个我并没有验证)
#由于是rpm安装的,所以mysql已经链接了
ln -s /usr/bin/mysqlbinlog /usr/local/bin/mysqlbinlog10.安装MHA-manage(非master的任意一个节点,此处为T2节点)
#安装依赖
yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
#下载(rpm)
wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
#提示,安装MHA的manage的前提是该节点已经安装MHA的客户端(node)
yum localinstall -y mha4mysql-manager-0.58-0.el7.centos.noarch.rpmmha-master节点上也要安装mha-node
11.配置MHA-master
mkdir -p /app/tools/masterha/manager
#该文件需要自己创建,mha启动需要
vim /etc/masterha_default.cnf
manager_workdir=/app/tools/masterha/manager
remote_workdir=/tmp
#manager_workdir为mha工作目录
#remote_workdir放置保留的binlog或relaylog
mkdir -p /app/tools/masterha/app1vim /app/tools/masterha/app1.cnf
[server default]
manager_log= /app/tools/masterha/app1/app.log
#mysql监控用户和密码(用于)
user=monmha
password='!@#$%^&[]{O2p'
#mysql复制账户和密码
repl_user=mha
repl_password='1U@1UK6$1UK6%5n5*}\9M1UK69M5n5n'
#可创建专门的用户用于连接,需要配置登录从节点密钥,这里直接使用root
ssh_user=root
#主库binlog日志位置(master节点上)
master_binlog_dir=/var/lib/mysql
#工作目录
manager_workdir=/app/tools/masterha/app1
remote_workdir=/tmp/mha
ping_interval=3
#故障切换脚本(最后再添加)
#master_ip_failover_script= /app/tools/masterha/app1/master_ip_failover
#master_ip_online_change_script= /app/tools/masterha/app1/master_ip_online_change
#server1为当前master
[server1]
hostname=192.168.56.191
port=3306
[server2]
hostname=192.168.56.192
port=3306
[server3]
hostname=192.168.56.193
port=3306
#candidate_master=1 意味着强制指定为备选master如果是源码安装mysql需要指定master_binlog_dir为安装目录下的binlog目录
12.检查测试mha
#测试ssh连接,不通过就是没有配置免密登录
masterha_check_ssh --conf=/app/tools/masterha/app1.cnf
#测试主从复制
masterha_check_repl --conf=/app/tools/masterha/app1.cnf13.启动
nohup masterha_manager --conf=/app/tools/masterha/app1.cnf &>/app/tools/masterha/app1/manager.log &14.检查
cat /app/tools/masterha/app1/manager.log15.测试
#停止master
systemctl stop mysqldT2节点切换T3节点为master,T3节点成为master节点
错误
1.MySQL拒绝连接
报错
masterha_check_repl --conf=/app/tools/masterha/app1.cnf- 原因
经多次测试,发现MHA使用的是主机名连接,必须配置使用主机名连接而不是直接使用IP连接 解决
- 配置指定主机授权mysql用户(参考步骤4)
- 配置本地解析(参考步骤1)
- 一定要关闭配置中的
skip_name_resolve,如果开启,即使配置了指定主机授权MHA也无法登录mysql
2.master的GTID模式未开启
报错
show slave status\G;- 原因
master上的GTID模式的注释没有解除 解决
修改master节点配置文件,然后重启
vim /etc/my.cnf GTID_MODE=ON systemctl restart mysqld临时修改master节点的GTID
SET GLOBAL GTID_MODE=ON;如果重启出现错误(请先排查配置文件问题),那可能需要
删库
危险操作,只能在刚开始配的时候使用#删除日志与数据,如果配置文件中被修改,删除的位置也需要修改 rm -rf /var/lib/mysql/* rm -f /var/log/mysqld.log




