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

3 篇文章 0 订阅
1 篇文章 0 订阅

简介

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

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

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

基本环境

四台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)

配置MySQL主主复制

主主复制介绍

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

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

修改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

配置scm-node1主从复制

添加用户

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

mysql –u root –p

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

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

用户授权

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

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

查看日志

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

show master status;

在这里插入图片描述

配置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;

查看结果

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

start slave;

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

show slave status\G

在这里插入图片描述

配置主从复制成功。

配置scm-node2主从复制

添加用户

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

mysql –u root –p

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

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

用户授权

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

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

查看日志

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

show master status;

在这里插入图片描述

配置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;

查看结果

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

start slave;

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

show slave status\G

在这里插入图片描述

配置主从复制成功。

常见问题

问题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服务。

安装haproxy

安装haproxy

sudo yum install -y haproxy

配置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

启动haproxy

启动服务haproxy:

sudo service haproxy start

开机启动haproxy:

sudo chkconfig haproxy on

配置启动日志

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

sudo vi /etc/rsyslog.conf

在这里插入图片描述

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

sudo service rsyslog restart

安装keepalived

安装keepalived

sudo yum install -y keepalived

配置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

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

启动keepalived

启动服务keepalived:

sudo service keepalived start

开机启动keepalived:

sudo chkconfig keepalived on

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值