MyCat高可用搭建

发布于 2022-07-28  1.47k 次阅读


#1. 前期准备

名称
IP
端口
MySQL Master
192.168.68.151
3306
MySQL Slave
192.168.68.152
3306
MyCat节点1
192.168.68.133
8066
MyCat节点2
192.168.68.134
8066
HaProxy节点1/keepalived Matser
192.168.68.133
虚拟IP:192.168.68.222
HaProxy节点1/keepalived Backup
192.168.68.134
虚拟IP:192.168.68.222

集群规划图:

注:主要讲配置不演示安装,再之前的博客中有关于MySQL,MyCat,Keepalived,Haproxy等的安装(在搜索栏搜索即可)

#2. MySQL的配置(一主一从)

步骤:

  1. 配置Master主机
  2. 配置Slave从机

#2.1 配置Master

步骤:

  1. 配置my.cnf文件
  2. 重启,后进入MySQL
  3. 创建一个Slave账号
  4. 查看Master状态

① 在Master的配置文件(/etc/my.cnf)中,添加如下内容

#mysql服务ID,必须保证整个集群环境中的唯一性
server-id=1

#mysql binlog 日志的存储路径和文件名
log-bin=/var/lib/mysql/mysqlbin

#设置logbin格式
#binlog_format=STATMENT

#是否只读,1代表只读,0代表读写
read-only=0

#忽略的数据,指不需要同步的数据库
#binlog-ignore-db=mysql

#指定同步的数据库
binlog-do-db=wqltest

② 配置完成之后,重启MySQL

systemctl restart mysqld.service

③ 创建同步数据的账户,并继续授权操作(这个账户给slave使用)

grant replication slave on *.* to 'slavewql'@'192.168.68.134' identified by '123456789';

flush privileges;

④ 查master的状态

show master status;

状态释义:

  1. File:从哪个日志文件开始推送日志文件
  2. Position:从哪个位置开始推送日志
  3. Binlog_Do_DB:指定需要同步的数据库
  4. Binlog_Ignore_DB:指定不需要同步的数据库

#2.2 配置Slave

① 在slave端配置文件/etc/my.cnf中,添加如下内容

#mysql服务ID,唯一
server-id=2

#mysql binlog 日志的存储路径和文件名
log-bin=/var/lib/mysql/mysqlbin

#启动中继日志
relay-log=mysql-relay

② 重启MySQL服务

systemctl restart mysqld.service

③ 指定master主节点位置

change master to master_host='192.168.68.133',
master_user='slavewql',
master_password='123456789',
master_log_file='mysqlbin.000007',
master_log_pos=154;

指定当前从库对应的主库的IP地址,用户,密码,从那个日志文件开始的,那个位置开始同步推送日志

注:这些消息查看master状态时有

④ 开启同步操作

start slave;

⑤ 查看slave的状态

show slave status\G;

#3. MyCat配置

两台Mycat一样的配置

① 检查MySQL主从复制是否配置成功

② 配置Schema.xml文件

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!--逻辑库-->
    <schema name="ZC_DB" checkSQLschema="true" sqlMaxLimit="100">
        <!--逻辑表-->
        <table name="wql" dataNode="dn1" primaryKey="id" rule="mod-long"/>
    </schema>

    <!--数据节点,绑定dataHost数据源和database数据库-->
    <dataNode name="dn1" dataHost="localhost1" database="fq" />

    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
              writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
        <!--心跳检测-->
        <heartbeat>select user()</heartbeat>
        <!--writeHost数据写入节点,也就是数据源-->
        <writeHost host="hostM1" url="jdbc:mysql://192.168.68.151:3306" user="root"
                   password="123456789">
            <readHost host="hostS1" url="jdbc:mysql://192.168.68.152:3306" user="root" password="123456789"/>
                    
        </writeHost>
    </dataHost>
</mycat:schema>

#4. Haproxy的配置

① 配置文件(133和134两台服务器都一样)

global
    maxconn 100000
    chroot /apps/haproxy
    stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
    uid 99
    gid 99
    daemon
    pidfile /var/lib/haproxy/haproxy.pid
    log 127.0.0.1 local2 info

defaults
    option http-keep-alive
    option  forwardfor
    maxconn 100000
    mode http
    timeout connect 300000ms
    timeout client  300000ms
    timeout server  300000ms

listen stats
    mode http
    bind 0.0.0.0:9999
    stats enable
    log global
    stats uri     /haproxy-status
    stats auth    haadmin:123456

listen web_port
    bind 0.0.0.0:80
    mode http
    log global
    server web1  127.0.0.1:8080  check inter 3000 fall 2 rise 5

② 启动Haproxy

/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.conf

#6. Keepalived配置

① 编写检测haproxy的shell脚本haproxy_check.sh

#!/bin/bash
##判断haproxy的进程是否存在,不存在即为0
A=`ps -C haproxy --no-header | wc -l`

if [$A -eq 0];then
    #不存在就重新启动
    /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.conf
    
    echo "haproxy restart……" &> /dev/null
    #延时3秒
    sleep 3s
    #当haproxy宕机时,关闭keepalived
    if [`ps -C haproxy --no-header | wc -l` -eq 0];then
        kill -9 $(ps -ef | grep keepalived)
    fi
fi

② 192.168.68.133配置文件

global_defs {
   notification_email {
    #邮箱可以随便添
     fq@qq.com
   }
    #邮箱可以随便添
   notification_email_from wql@qq.com
    #必须填写同一个网段
   smtp_server 192.168.68.1
   smtp_connect_timeout 30
    #名称改为haproxy01
   router_id haproxy01
    #使用默认
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script chk_haproxy{ ##引入一个脚本
    
    script "/etc/keepalived/haproxy_check.sh"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    #标记为MASTER
    state MASTER
    #填写自己的网卡,我的为ens33,有些为eth0需要根据自己的linux虚拟机而定
    interface ens33
    #两台keepalived用同一个id
    virtual_router_id 51
    #优先级,MASTER要比BACKUP的数字大
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }    
    ##将track_script块加入instance配置块
    track_script{
    chk_haproxy ##检查Haproxy服务是否存活
    }

    virtual_ipaddress {
        #虚拟的主机IP,也可以填写多个
        192.168.68.222
    }        
}
③ 192.168.68.134配置文件
global_defs {
   notification_email {
    #邮箱可以随便添
     fq@qq.com
   }
    #邮箱可以随便添
   notification_email_from wql@qq.com
    #必须填写同一个网段
   smtp_server 192.168.68.1
   smtp_connect_timeout 30
    #名称改为haproxy01
   router_id haproxy01
    #使用默认
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script chk_haproxy{ ##引入一个脚本
    
    script "/etc/keepalived/haproxy_check.sh"
    interval 2
    weight 2
}


vrrp_instance VI_1 {
    #标记为MASTER
    state BACKUP
    #填写自己的网卡,我的为ens33,有些为eth0需要根据自己的linux虚拟机而定
    interface ens33
    #两台keepalived用同一个id
    virtual_router_id 51
    #优先级,MASTER要比BACKUP的数字大
    priority 77
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }    
    ##将track_script块加入instance配置块
    track_script{
    chk_haproxy ##检查Haproxy服务是否存活
    }

    virtual_ipaddress {
        #虚拟的主机IP,也可以填写多个
        192.168.68.222
    }        
}

④ 启动keepalived

/usr/local/sbin/keepalived start

⑤ 配置完成后重启,并查看虚拟IP是否绑定:

 ip a

测试:使用虚拟IP访问haproxy监控台