MySQL高可用负载均衡集群部署

  1. 简介

使用MySQL时随着时间的增长,用户量以及数据量的逐渐增加,访问量更是剧增,最终将会使MySQL达到某个瓶颈,那么MySQL的性能将会大大降低。这一结果也不利于软件的推广。

 

那么如何跨过这个瓶颈,提高MySQL的并发量呢?方法有很多,分布式数据库、读写分离、高可用负载均衡、增加缓存服务器等等。之前的文章里已经介绍了读写分离的方案了,接下来我将讲解MySQL高可用负载均衡这一方法。

 

其中实现高可用负载均衡的方法有很多,例如LVS+keepalived组合实现、haproxy+keepalived组合实现等等,这里我们采用haproxy+keepalived组合实现MySQL高可用负载均衡这一技术。

  1. 基本环境

四台linux虚拟主机

   

Linux版本CentOS6.6

 

MySQL 5.5(已安装好)

 

haproxy-1.5.14

 

keepalived-1.2.19

 

IP映射:

192.168.245.11  scm-node1(mysql1)

192.168.245.12  scm-node2(mysql2)

192.168.245.13  scm-node3(haproxy+keepalived)

192.168.245.14  scm-node4(haproxy+keepalived)

192.168.245.55(vip)

  1. 配置MySQL主主复制
    1. 主主复制介绍

主主复制就是两个mysql都能读能写,数据记录通过二进制传达给对方从而保持数据的一致性。

 

(192.168.95.11主从复制+192.168.95.12主从复制==192.168.95.11、192.168.95.12主主复制)

    1. 修改mysql配置

主主复制中必须要解决的事情就是自增主键的问题。

如果mysql1主键id增加到12了,此时二进制数据还没到达mysql2,那么mysql2恰好要插入数据,那么新数据主键id也是12,那不就是乱套了么!解决这一问题我们可以直接更改MySQL中的配置文件即可。

在scm-node1主机上修改mysql配置文件:

sudo vi /etc/my.cnf

在/etc/my.cnf中的[mysqld]后添加内容:

server-id=1

log-bin=mysql-bin

binlog_format=mixed

auto_increment_increment=2

auto_increment_offset=1

replicate-do-db=scm_base

 

在scm-node2主机上修改mysql配置文件:

sudo vi /etc/my.cnf

在/etc/my.cnf中的[mysqld]后添加内容:

server-id=2

log-bin=mysql-bin

binlog_format=mixed

auto_increment_increment=2

auto_increment_offset=2

replicate-do-db=scm_base

replicate-do-db=scm_hue

replicate-do-db=scm_hive

replicate-do-db=scm_oozie

replicate-do-db=scm_report

 

server-id 任意自然数n,只要保证两台MySQL主机不重复就可以了

log-bin 开启二进制日志

auto_increment_increment 步进值auto_imcrement,一般有n台主MySQL就填n

auto_increment_offset 起始值,一般填第n台主MySQL

binlog-ignore=mysql 忽略的库,多个可重复添加

replicate-do-db 要同步的数据库,多个可重复添加,默认所有库

 

配置好后重启MySQL:

sudo service mysqld restart

    1. 配置scm-node1主从复制
      1. 添加用户

在scm-node2主机上进入mysql命令行:

mysql –u root –p

在scm-node2主机上创建scm用户:

CREATE USER ‘scm’@‘scm-node1' IDENTIFIED BY ‘suning';

      1. 用户授权

在scm-node2主机上给用户scm授权:

GRANT REPLICATION SLAVE ON *.* TO ‘scm’@‘scm-node1’ IDENTIFIED BY ‘suning’;

FLUSH PRIVILEGES;

      1. 查看日志

在scm-node2主机上查看scm-node2二进制日志:

show master status;

      1. 配置master

在scm-node1主机上进入mysql命令行:

mysql –u root –p

在scm-node1主机上配置master:

change master to master_host='scm-node2', master_user='scm', master_password='suning', master_log_file='mysql-bin.000101', master_log_pos=120;

      1. 查看结果

在scm-node1主机上启动复制:

start slave;

在scm-node1主机上查看结果:

show slave status\G

配置主从复制成功。

    1. 配置scm-node2主从复制
      1. 添加用户

在scm-node1主机上进入mysql命令行:

mysql –u root –p

在scm-node1主机上创建scm用户:

CREATE USER ‘scm’@‘scm-node2' IDENTIFIED BY ‘suning';

      1. 用户授权

在scm-node1主机上给用户scm授权:

GRANT REPLICATION SLAVE ON *.* TO ‘scm’@‘scm-node2’ IDENTIFIED BY ‘suning’;

FLUSH PRIVILEGES;

      1. 查看日志

在scm-node1主机上查看scm-node1二进制日志:

show master status;

      1. 配置master

在scm-node2主机上进入mysql命令行:

mysql –u root –p

在scm-node1主机上配置master:

change master to master_host='scm-node1', master_user='scm', master_password='suning', master_log_file='mysql-bin.000245', master_log_pos=120;

      1. 查看结果

在scm-node2主机上启动复制:

start slave;

在scm-node2主机上查看结果:

show slave status\G

配置主从复制成功。

      1. 常见问题

问题1:

Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs;

these UUIDs must be different for replication to work.

原因:

文件/var/lib/mysql/auto.cnf中的uuid相同

解决方法:

删除其中一台主机中的/var/lib/mysql/auto.cnf文件,然后重启mysql服务。

  1. 安装haproxy
    1. 安装haproxy

sudo yum install -y haproxy

    1. 配置haproxy

在scm-node3、scm-node4主机上配置haproxy.cfg:

sudo vi /etc/haproxy/haproxy.cfg

/etc/haproxy/haproxy.cfg内容:

global

 

    log         127.0.0.1 local2         #日志定义级别

    chroot      /var/lib/haproxy         #当前工作目录

    pidfile     /var/run/haproxy.pid     #进程id

    maxconn     4000                     #最大连接数

    user        haproxy                  #运行改程序的用户

    group       haproxy

    daemon                                 #后台形式运行

    stats socket /var/lib/haproxy/stats

 

defaults

    mode                    tcp           #haproxy运行模式(http | tcp | health)

    log                     global

    option                  dontlognull

option                  redispatch    #serverId对应的服务器挂掉后,强制定向到其他健康的服务器

    retries                 3              #三次连接失败则服务器不用

    timeout http-request    10s

    timeout queue           1m

    timeout connect         10s            #连接超时

    timeout client          1m             #客户端超时

    timeout server          1m             #服务器超时

    timeout http-keep-alive 10s

    timeout check           10s            #心跳检测

    maxconn                 600            #最大连接数

 

listen stats                              #配置haproxy状态页(用来查看的页面)

    mode http

    bind :5000

    stats enable

    stats hide-version                    #隐藏haproxy版本号

stats uri     /haproxy                #一会用于打开状态页的uri

    stats realm   Haproxy\ Statistics     #输入账户密码时的提示文字

    stats auth    admin:admin             #用户名:密码

 

listen mysql

    balance     leastconn                 #使用最少连接方式调度

    server mysql1 192.168.95.11:3306 check port 3306 maxconn 300

server mysql2 192.168.95.12:3306 check port 3306 maxconn 300

    1. 启动haproxy

启动服务haproxy:

sudo service haproxy start

开机启动haproxy:

sudo chkconfig haproxy on

    1. 配置启动日志

在scm-node3、scm-node4主机上配置rsyslog.conf:

sudo vi /etc/rsyslog.conf

https://images2015.cnblogs.com/blog/789055/201704/789055-20170413220722689-1937574322.jpg

在scm-node3、scm-node4主机上重启rsyslog:

sudo service rsyslog restart

  1. 安装keepalived
    1. 安装keepalived

sudo yum install -y keepalived

    1. 配置keepalived

在scm-node3主机上配置keepalived.conf:

sudo vi /etc/keepalived/keepalived.conf

/etc/keepalived/keepalived.conf内容:

! Configuration File for keepalived

#简单的头部,这里主要可以做邮件通知报警等的设置,此处就暂不配置了;

global_defs {

    notificationd LVS_DEVEL

}

#预先定义一个脚本,方便后面调用,也可以定义多个,方便选择;

vrrp_script chk_haproxy {

    script “/etc/keepalived/chk.sh”  #具体脚本路径

    interval 2  #脚本循环运行间隔

}

#VRRP虚拟路由冗余协议配置

vrrp_instance VI_1 {   #VI_1 是自定义的名称;

state BACKUP    #MASTER表示是一台主设备,BACKUP表示为备用设备【我们这里因为设置为开启不抢占,所以都设置为备用】

    nopreempt      #开启不抢占

    interface eth0   #指定VIP需要绑定的物理网卡

virtual_router_id 11   #VRID虚拟路由标识,也叫做分组名称,该组内的设备需要相同

priority 130   #定义这台设备的优先级 1-254;开启了不抢占,所以此处优先级必须高于另一台

   

    advert_int 1   #生存检测时的组播信息发送间隔,组内一致

    authentication {    #设置验证信息,组内一致

        auth_type PASS   #有PASS 和 AH 两种,常用 PASS

        auth_pass asd    #密码

    }

    virtual_ipaddress {

        192.168.245.55    #指定VIP地址,组内一致,可以设置多个IP

    }

    track_script {    #使用在这个域中使用预先定义的脚本,上面定义的

        chk_haproxy

    }

   

notify_backup “/etc/init.d/haproxy restart”   #表示当切换到backup状态时,要执行的脚本

    notify_fault “/etc/init.d/haproxy stop”     #故障时执行的脚本

}

在scm-node4主机上配置keepalived.conf:

sudo vi /etc/keepalived/keepalived.conf

/etc/keepalived/keepalived.conf内容:

! Configuration File for keepalived

#简单的头部,这里主要可以做邮件通知报警等的设置,此处就暂不配置了;

global_defs {

    notificationd LVS_DEVEL

}

#预先定义一个脚本,方便后面调用,也可以定义多个,方便选择;

vrrp_script chk_haproxy {

    script “/etc/keepalived/chk.sh”  #具体脚本路径

    interval 2  #脚本循环运行间隔

}

#VRRP虚拟路由冗余协议配置

vrrp_instance VI_1 {   #VI_1 是自定义的名称;

state BACKUP    #MASTER表示是一台主设备,BACKUP表示为备用设备【我们这里因为设置为开启不抢占,所以都设置为备用】

    nopreempt      #开启不抢占

    interface eth0   #指定VIP需要绑定的物理网卡

virtual_router_id 11   #VRID虚拟路由标识,也叫做分组名称,该组内的设备需要相同

priority 120   #定义这台设备的优先级 1-254;开启了不抢占,所以此处优先级必须小于另一台

   

    advert_int 1   #生存检测时的组播信息发送间隔,组内一致

    authentication {    #设置验证信息,组内一致

        auth_type PASS   #有PASS 和 AH 两种,常用 PASS

        auth_pass asd    #密码

    }

    virtual_ipaddress {

        192.168.245.55    #指定VIP地址,组内一致,可以设置多个IP

    }

    track_script {    #使用在这个域中使用预先定义的脚本,上面定义的

        chk_haproxy

    }

   

notify_backup “/etc/init.d/haproxy restart”   #表示当切换到backup状态时,要执行的脚本

    notify_fault “/etc/init.d/haproxy stop”     #故障时执行的脚本

}

在scm-node3、scm-node4主机上创建chk.sh:

sudo vi /etc/keepalived/chk.sh

/etc/keepalived/chk.sh内容:

#!/bin/bash

 

if [ $(ps -C mysqld --no-header | wc -l) -eq 0 ]; then

    service mysqld start

    sleep 3

    if [ $(ps -C mysqld --no-header | wc -l) -eq 0 ]; then

        service keepalived stop

    fi

fi

 

if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then

    service haproxy start

    sleep 3

    if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then

        service keepalived stop

    fi

fi

在scm-node3、scm-node4主机上给chk.sh授权:

sudo chmod +x /etc/keepalived/chk.sh

注意:故障节点需要人工修复

    1. 启动keepalived

启动服务keepalived:

sudo service keepalived start

开机启动keepalived:

sudo chkconfig keepalived on

 

猜你喜欢

转载自blog.csdn.net/tony_328427685/article/details/83537279