简介
使用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