虚拟机linux搭建MySql集群(以及自己踩的坑)
MHA高可用搭建
虚拟机固定ip设置,最少要3台机子,一主两从,最好再加一个机子部署MHA(或者在从库部署MHA)。
linux安装mysql,MHA插件只能在linux环境下用,不用费力去弄windows版了。
MySql主从搭建
Master节点
使用vi /etc/my.cnf命令修改Master配置文件,嫌麻烦的可以直接用WinSCP去找到文件,直接复制信息。
#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> 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;
![](https://img.haomeiwen.com/i27319482/ead5b543a170a5fe.png)
position应该是日志写入位置,所以每次修改主库,都会发生变化。
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; //开启同步
修改主库时需要先关闭同步
stop slave;
主库查询,可以查看现在同步是哪台主机。
show slave status;
配置半同步复制
Master节点
登录MySQL,在MySQL命令行执行下面命令安装插件
linux:install plugin rpl_semi_sync_master soname 'semisync_master.so';
windows:INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.dll';//MHA插件不支持windows,最好还是用linux
show variables like '%semi%';//查看开启状态
# 自动开启半同步复制
rpl_semi_sync_master_enabled=ON
rpl_semi_sync_master_timeout=1000
Slave节点
linux:install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
windows:install plugin rpl_semi_sync_slave soname 'semisync_slave.dll';
# 自动开启半同步复制
rpl_semi_sync_slave_enabled=ON
都需要重启服务器才会生效
systemctl restart mysqld
SSH互通
生成公钥私钥
ssh-keygen -t rsa
在三台MySQL服务器分别执行下面命令,密码输入系统密码,将公钥拷到MHA Manager服务器上(192.168.31.126MHA服务器IP)
ssh-copy-id 192.168.31.126
在MHA查看密钥
cat /root/.ssh/authorized_keys
如果找不到!可能不是用的root创建;用户不同,生成密钥的文件夹也不同
/home/xxx/.ssh/id_rsa.pub
cat /home/xxx/.ssh/authorized_keys
一般用root
将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.(对应ip):/root/.ssh/authorized_keys
MHA Manager执行下面命令,检测下与三台MySQL是否实现ssh互通。
ssh 192.168.31.(对应ip)
exit
MHA安装
manager只需要在MHA主机上安装
https://github.com/yoshinorim/mha4mysql-manager/releases/tag/v0.58
node所有主机都需要安装
https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58
node安装
MHA的Node依赖于perl-DBD-MySQL,所以要先安装perl-DBD-MySQL。
yum install perl-DBD-MySQL -y
没有可用软件包 perl-DQL。
全称为 Extra Packages for Enterprise Linux 企业版 Linux 额外包,需要我们更新下 epel 这个第三方库。
yum install -y epel-release
再执行之前命令
实际问题的粘贴到虚拟机的命令被截断了,这也是经常发生的问题,要检查一下复制内容。
安装node,命令需要在该文件的文件夹下执行
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
manager安装
MHA的manager又依赖了perl-Config-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
rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm//安装manager
MHA 配置文件
在MHA主机上操作
mkdir -p /var/log/mha/app1//创建文件夹
touch /var/log/mha/app1/manager.log//创建日志文件
配置监控全局配置文件,vim是创建文件并输入内容
vim /etc/masterha_default.cnf
[server default]
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 命令编辑文件
[server default]
#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 配置检测
masterha_check_ssh --conf=/etc/mha/app1.cnf
显示ALL SSH connection tests passed successfully.
检测MySQL主从复制
masterha_check_repl --conf=/etc/mha/app1.cnf
出现“MySQL Replication Health is OK.”证明MySQL复制集群没有问题。
主从检查报错
There is no alive server. We can't do failover
#主库用户名,在master mysql的主库执行下列命令建一个新用户
#create user 'mha'@'%' identified by '123123';
#grant all on *.* to mha@'%' identified by '123123';//这段从库也要执行
#flush privileges;
MHA Manager启动
MHA服务器上执行
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 &
跟踪日志
tail -f /var/log/mha/app1/manager.log
ctrl+c 退出跟踪
然后可以用systemctl stop mysqld关掉master主机的MySql来测试效果。
重新上线的服务器怎么连入MHA?
![](https://img.haomeiwen.com/i27319482/7ee28e1b6ca7de6b.png)
很明显server1被移除了,想要重新连入就要在配置文件中重新添加。
![](https://img.haomeiwen.com/i27319482/cf692d99650f8c04.png)
然后server1并没有同步;还是需要去mysql数据库作为从库重新配置。
![](https://img.haomeiwen.com/i27319482/d33860ae1e72f9d4.png)
![](https://img.haomeiwen.com/i27319482/016750e14775f9f4.png)