上一篇介绍了集群架构的理论,以此为基础,我们现在来搭建一下集群,实现主从复制,读写分离,分库分表等。
1、环境介绍:
Centos7 + mysql-5.7.28 + mha0.58
2、搭建主从复制:
- Mysql版本:
- 安装mysql前先安装net-tools,因为安装server时需要依赖 。 命令:yum install net-tools。
- 接着删除自带的mariadb依赖:rpm -e mariadb-libs-5.5.56-2.el7.x86_64 --nodeps (rpm -qa|grep mariadb命令先查看有没有)。按顺序安装相关包:
- 初始化mysql得到用户密码,启动mysql
- 登录mysql重置密码
- 配置master节点的配置文件: vim /etc/my.cnf ,完成后重启并登录mysql
- 给所有root用户授权
- Master状态
- 配置slave节点(两台的serverid分别是5和6):
- 配置完成后,重新登录mysql,并配置要复制的master节点信息(包括master的ip,端口,用户,密码,binlog文件和复制的起始位置)
- change master to master_host='192.168.0.120',master_port=3306,master_user='root',master_password='root',master_log_file='mysql-bin.000001',master_log_pos=869
3、接下来引入半同步复制:
在配置文件my.cnf启用(使用set global命令,重启后还是不生效,所以我这里在my.cnf中配置:)
- rpl_semi_sync_master_enabled=1
- rpl_semi_sync_master_timeout=1000
重新启动并登录
然后在两台slave的my.cnf中开启半同步复制:
- rpl_semi_sync_slave_enabled=1
重新启动并登录
4、引入并行复制:
- binlog_group_commit_sync_delay=1000
- binlog_group_commit_sync_no_delay_count=100
- slave_parallel_type=LOGICAL_CLOCK --基于组提交的并行复制
- slave_parallel_workers=8 --线程数
- relay_log_recovery=1 --开启relay_log复制
- master_info_repository=TABLE
- relay_log_info_repository=TABLE --选用TABLE类型提升性能 (重启后依旧还是FILE类型,这个有疑问)
设置ssh免登录
每台mysql节点之间要做免登录,另外mha的manager节点也要对node免登录。每个节点对自己也要免登录,防止切换过程中出现问题。
在安装mha相关node和manager的包之前,需要在每个节点安装相关依赖包
Node节点:
yum -y install perl-DBD-MySQL ncftp perl-DBI.x86
Manage节点:
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y
yum install perl-DBD-MySQL -y
yum install perl-Config-Tiny -y
yum install perl-Log-Dispatch perl-Parallel-ForkManager -y
yum install perl-Parallel-ForkManager -y
所有节点上安装node包:
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
Manage上安装manange包:
rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
在manager节点上,新建mha配置文件目录和工作目录,并新建配置文件mysql_mha.cnf
配置配置文件
准备配置文件中指定的虚拟master_ip_failover脚本
#为了防止脑裂发生,推荐生产环境采用脚本的方式来管理虚拟 ip,而不是使用 keepalived来完成。
vi /etc/mha/scripts/master_ip_failover#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;my (
$command, $ssh_user, $orig_master_host,
$orig_master_ip,$orig_master_port, $new_master_host, $new_master_ip,$new_master_port
);#定义VIP变量
my $vip = '192.168.0.26/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";GetOptions(
'command=s' => \$command,
'ssh_user=s' => \$ssh_user,
'orig_master_host=s' => \$orig_master_host,
'orig_master_ip=s' => \$orig_master_ip,
'orig_master_port=i' => \$orig_master_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
);exit &main();
sub main {
print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
if ( $command eq "stop" || $command eq "stopssh" ) {
my $exit_code = 1;
eval {
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}elsif ( $command eq "start" ) {
my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
};if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
exit 0;
}
else {
&usage();
exit 1;
}
}sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
return 0 unless ($ssh_user);
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub usage {
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}
验证ssh登录是否成功:
masterha_check_ssh --conf=/etc/mha/mysql_mha.cnf
验证复制链路检查是否成功:
masterha_check_repl --conf=/etc/mha/mysql_mha.cnf
报错了:
针对以上两个错误需要修改:
1、因为slave也会被选为master,所以在slave的配置文件中也要配置bin-log,并且设置要复制或不复制的db,须和master保持一致。
2、给指定的master_ip_failover给与操作权限
chmod +x /usr/bin/master_ip_failover
对了,还需注意在每个slave中也要授权。。。终于好了!!!!!!!!
后台启动mha:nohup masterha_manager --conf=/etc/mha/mysql_mha.cnf &
- 查看日志:
有个需要注意的地方: 启动的时候加上 --ignore_last_failover 参数 。。。要不然第一次切换后,后面8小时内默认不会再切换了。。。