【mysql-5】mysql集群架构-实战

上一篇介绍了集群架构的理论,以此为基础,我们现在来搭建一下集群,实现主从复制,读写分离,分库分表等。

一:主从复制

 

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、接下来引入半同步复制:

  • Master节点下载半同步复制插件,登录mysql下载:  install plugin rpl_semi_sync_master soname 'semisync_master.so';

在配置文件my.cnf启用(使用set global命令,重启后还是不生效,所以我这里在my.cnf中配置:)

  • rpl_semi_sync_master_enabled=1  
  • rpl_semi_sync_master_timeout=1000

重新启动并登录

  • slave节点下载半同步复制插件(依然不使用set global命令,因为重启后又会失效:):   install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

然后在两台slave的my.cnf中开启半同步复制:

  • rpl_semi_sync_slave_enabled=1

重新启动并登录

  •  在master中作写操作,可以看到master的日志中使用了半同步复制:如下

 

4、引入并行复制:

  • master的my.cnf中设置组提交同步延迟时间为1s,提交数量为100,并重新登陆mysql
  • binlog_group_commit_sync_delay=1000
  • binlog_group_commit_sync_no_delay_count=100
  • slave的my.cnf中配置 基于组提交的并行复制方式:
  • 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类型,这个有疑问)
  • 在主库执行写操作后,查询slave系统库中的并行复制信息表,可以看到并行复制的信息

 

二:MHA方案:

设置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 {
        print
        "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 &

  1. 查看日志:

 

有个需要注意的地方: 启动的时候加上 --ignore_last_failover 参数 。。。要不然第一次切换后,后面8小时内默认不会再切换了。。。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值