目录
2 tar: Unexpected EOF in archive
4 log event entry exceeded max_allowed_packet
5 yum install perl-Parallel-ForkManager 出现No package perl-Parallel-ForkManager available.
6 MHA Last failover was done at 2020/08/14 01:14:10. Current time is too early to do failover again
寄首语
在拉勾业务中职位表相当于电商系统的商品表,投递表相当于电商系统的订单表。职位表我们采用垂直拆分方法分为position(职位描述表)和 position_detail(职位详情表),表结构结构如下:
position:id(int)、name(varchar)、salary(varchar)、city(varchar)
position_detail:id(int)、pid(int)、description(text)
-
首先实现一主两从的同步复制功能(采用半同步复制机制)
-
然后采用MHA实现主机出故障,从库能自动切换功能
-
MHA高可用搭建后,在主库新建商品表进行效果测试
环境准备
1 环境说明
根据作业要求我们需要4台主机,乞丐版推荐虚拟机,皇帝版推荐云服务器(注意选择同一局域网内的),也可以使用docker快速搭建。本文采用虚拟机安装方式
2 软件版本说明
linux centos7
mysql 5.7.28
MHA-node 0.58
MHA-manager 0.58
3 集群中各节点的作用
ip 主机名 作用 安装软件
192.168.126.128 master2 mysql主 mysql,mha_node
192.168.126.129 slave1 mysql从 mysql,mha_node
192.168.126.130 slave2 mysql从 mysql,mha_node
192.168.126.131 mha mha manager mha_manager,mha_node
4 安装虚拟机centos7
4.1 新建虚拟机
文件,选择新建虚拟机,选择典型即可,点击下一步
4.2 安装客户机操作系统
我们选择通过磁盘镜像安装,选择硬盘中的centos镜像。点击下一步
4.3 简易安装信息
此步骤我们需要给我们的虚拟机起名字和输入密码(包括root密码),填写完成点击下一步。
4.4 命名虚拟机
此步骤我们需要给我们的虚拟机命名,和更改虚拟机文件的存放位置,默认位置为C盘,大佬随意,我们更改为G盘
4.5 指定磁盘容量
测试环境,我们选择默认大小20G即可,后期不够可扩容。存储方式也选择默认,将虚拟磁盘拆分成多个文件,点击下一步
4.6 自定义硬件
此步骤用于定义虚拟机的硬件,诸如网卡、声卡、打印机等硬件,我们直接选择默认即可。点击完成
4.7 虚拟机安装
此过程取决于电脑硬件配置,大约20-30分钟;
5 安装mysql
5.1 上传相关软件至虚拟机
此步骤可借助xshell ,来实现,过程略
5.2 mysql解压
tar -vxf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
5.3 卸载mariadb
# rpm 查找 mariadb
rpm -qa|grep mariadb
# 卸载maridb
rpm -e mariadb-libs-5.5.41-2.el7_0.x86_64 --nodeps
5.4 安装mysql-common
rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
5.5 安装mysql-libs
rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
5.6 安装mysql-libs-compact
rpm -ivh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
5.7 安装mysql-clients
rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
5.8 安装mysql-server
rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm
5.9 安装mysql-devel
rpm -ivh mysql-community-devel-5.7.28-1.el7.x86_64.rpm
5.11 mysql 初始化
生成mysql的临时密码
mysqld --initialize --user=mysql
临时密码可通过下面命令查看
cat /var/log/mysqld.log
启动mysql服务
systemctl start mysqld.service
登录mysql,更改默认密码
set password =password('root')
5.12 关闭防火墙
#关闭防火墙
systemctl stop firewalld
#取消防火墙开机启动
systemctl disable firewalld
5.13 复制虚拟机3份
经过以上操作,虚拟机中mysql 已经安装完成,下面为了避免重复造轮子,我们将虚拟机复制3份。分别为slave1,slave2,mha
各虚拟机ip如下
master2 192.168.133.128
slave1 192.168.133.129
slave2 192.168.133.130
mha 192.168.133.131
确保各主机之间网络互通
6 mysql 主机配置
6.1 主机配置
配置mysql的配置文件my.cnf
vim /etc/my.cnf
#开启binglog
log_bin=log-bin
server-id=1
sync-binlog=1
binlog-ignore-db=performance_schema
binlog-ignore-db=information_schema
binlog-ignore-db=sys
配置完成后,重启mysql服务
systemctl restart mysqld.service
登录mysql ,授予root远程登录的权限
#开启复制功能
grant replication slave on *.* to 'root'@'%' identified by 'root';
#开启远程登录功能
grant all privileges on *.* to 'root'@'%' identified by 'root';
#刷新权限
flush privileges;
6.2 从库配置
配置mysql的配置文件my.cnf
vim /etc/my.cnf
#log-bin
server-id=2
relay_log=mysql_relay-bin
read_only=1
重启mysql服务
systemctl restart mysqld.service
将从库的master地址 指向 master
change master to master_host='192.168.133.128',master_port=3306,master_user='root',master_password='root',master_log_file='log-bin.000001',master_log_pos=869;
6.3 配置半同步复制
半同步复制功能需要动态加载,查看是否支持动态加载插件
select @@have_dynamic_loading;
查看半同步插件是否已安装,
show plugins;
master 端安装rpl_semi_sync_master
install plugin rpl_semi_sync_master soname 'semisync_master.so';
安装完成后,将semi相关的配置放入my.cnf,然后进行重启
vim /etc/my.cnf
#半同步semi配置
rpl_semi_sync_master_timeout=1000
rpl_semi_sync_master_enabled=1
#重启
systemctl restart mysqld.service
master 端安装rpl_semi_sync_slave
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
vim /etc/my.cnf
#semi配置
rpl_semi_sync_slave_enabled=1
systemctl restart mysqld.service
7 安装MHA
7.1 配置免密登录
我们首先为4台机器分别设置DNS域名解析
192.168.133.128 master2
192.168.133.129 slave1
192.168.133.130 slave2
192.168.133.130 mha
每台虚拟机上生成ssh公钥秘钥,用于免密登录访问
mha上
#生成秘钥
ssh-keygen -t rsa
#此过程会让输入密码,输入即可
ssh-copy-id 192.168.133.128
ssh-copy-id 192.168.133.129
ssh-copy-id 192.168.133.130
master2上
#生成秘钥
ssh-keygen -t rsa
#此过程会让输入密码,输入即可
ssh-copy-id 192.168.133.129
ssh-copy-id 192.168.133.130
ssh-copy-id 192.168.133.131
slave1上
#生成秘钥
ssh-keygen -t rsa
#此过程会让输入密码,输入即可
ssh-copy-id 192.168.133.128
ssh-copy-id 192.168.133.131
ssh-copy-id 192.168.133.130
slave2上
#生成秘钥
ssh-keygen -t rsa
#此过程会让输入密码,输入即可
ssh-copy-id 192.168.133.128
ssh-copy-id 192.168.133.129
ssh-copy-id 192.168.133.131
7.2 安装配置MHA
集群中各节点mha 安装部署如下
节点名称 | 安装软件 |
mha | mha node,mha manager |
master2 | mha node |
slave1 | mha node |
slave2 | mha node |
mha上安装manager和node
安装manager需要使用到perl模块,具体详情可参见github
On RHEL/CentOS distribution, you can install MHA Manager rpm package as below.
## Install dependent Perl modules
# yum install perl-DBD-MySQL
# yum install perl-Config-Tiny
# yum install perl-Log-Dispatch
# yum install perl-Parallel-ForkManager
## Install MHA Node, since MHA Manager uses some modules provided by MHA Node.
# rpm -ivh mha4mysql-node-X.Y-0.noarch.rpm
## Finally you can install MHA Manager
# rpm -ivh mha4mysql-manager-X.Y-0.noarch.rpm
https://github.com/yoshinorim/mha4mysql-manager/wiki/Installation#installing-mha-manager
# 安装node
yum localinstall -y mha4mysql-node-0.58-0.el7.centos.noarch.rpm
# 安装manager
yum install -y mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
master2 、slave1 和slave2 安装node
# 安装node
yum localinstall -y mha4mysql-node-0.58-0.el7.centos.noarch.rpm
7.3 为mha授权
在master2、slave1和slave2授权,开启数据的远程访问,为测试方便此处不设任何限制,生产环境应该设置固定ip;
grant all on *.* to 'root'@'%' identified by 'root';
7.4 mha配置文件
在mha虚拟机上为mha开辟一个工作目录
mkdir /mha
编辑mha配置文件
vim /etc/masterha_default.cnf
内容如下
[server default]
user=root
password=root
manager_workdir=/mha
manager_log=/mha/manager.log
remote_workdir=/mha
ssh_user=root
repl_user=root
repl_password=root
ping_interval=1
[server1]
hostname=192.168.133.128
ssh_port=22
candidate_master=1
[server2]
hostname=192.168.133.129
ssh_port=22
candidate_master=1
[server3]
hostname=192.168.133.130
ssh_port=22
candidate_master=1
7.5 验证ssh互通
masterha_check_ssh --conf=/etc/masterha_default.cnf
7.6 检查mysql主从复制
masterha_check_repl -conf=/etc/masterha_default.cnf
7.7 启动MHA管理程序
masterha_manager --conf=/etc/masterha_default.cnf &
8 测试IP漂移
我们将主库master2关闭,查看mha的日志
#将master2上的主库关闭
systemctl stop mysqld.service
#查看mha日志
tail -f /mha.manager.log
ip漂移至129备用主库
查看mha状态已停止
masterha_check_status -conf=/etc/masterha_default.cnf
问题汇总
1 虚拟机安装完成后,没有ip
解决办法,修改网卡配置,将ONBOOT修改为yes
vim /etc/sysconfig/network-scripts/ifcfg-eno16777736
修改改完成后,重启网关
systemctl restart network.service
2 tar: Unexpected EOF in archive
解压失败,将压缩包删除,重新上传解压
3 主从配置失效
The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work
此问题是由于我的mysql是通过虚拟机复制得到,导致UUID一样,我们将auto.cnf删除,此文件会重新生成。
或者手动将uuid进行更改;
vim /var/lib/mysql/auto.cnf
4 log event entry exceeded max_allowed_packet
当主库运行较长时间,进行过大量DDL操作,从库从二进制较早地址开始复制,超过一个数据包的大小,我们将数据包改大即可。
set @@global.max_allowed_packet=32*1024*1024;
select @@global.max_allowed_packet/1024/1024 MB;
5 yum install perl-Parallel-ForkManager 出现No package perl-Parallel-ForkManager available.
我们通过安装企业版 Linux 附加软件包(EPEL)解决
#centos 7适用
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
6 MHA Last failover was done at 2020/08/14 01:14:10. Current time is too early to do failover again
rm -rf /etc/mha/manager/mha.failover.complete
7 There are 2 non-slave servers! MHA manages at most one non-slave server. Check configurations
此问题是由主库奔溃后,备用主从库,转正升级为主库,当主库再次启动时,就会造成多主模式,故报错。我们将备用主从库重新指向主库即可。
#取消主库
reset master;
#指向主库
change master to master_host='192.168.126.128',master_port=3306,master_user='root',master_password='root',master_log_file='log-bin.000011',master_log_pos=154;
#开启从库功能
start slave;