我们选择主主互热备做生产环境MYSQL高可用方案,该方案的优点是在压力大的时候,仍然可以通过设置负载均衡来做业务分发。而且最重要的是配置简单,两份配置都一样,改个IP就可以就喜欢简单的东西。
目前考虑负债均衡分发可能有同步过程中引起数据不一致的问题,我们使用主主机制做数据即时同步,用KeepAliveD做数据库监控及故障自动切换。
实现:
1.数据库主从设置:
MYSQL安装完成后,mysql的配置修改为:
写道
[mysqld]
datadir=/usr/local/mysql/data
socket=/var/lib/mysql/mysql.sock
max_connection=1000
log-bin=mysql-bin
server-id=2
//这块两台服务器需要设置成不同
binlog-do-db=CU
binlog-do-db=FAE
binlog-do-db=HA
//它是用于主从同步时,给master用的配置参数。来说明需要复制那些库给从库。因为有时主从不是要把全部的DB都复制给从库。
binlog-ignore-db=mysql
//安全起见,无论如何不从主同步系统DB
replicate-do-db=CU
replicate-do-db=FAE
replicate-do-db=HA
//从主读取的库
replicate-ignore-db=mysql
//安全起见,无论如何不从主同步系统DB
log-slave-updates
#slave-skip-errors=all
#auto_increment_increment=2
#auto_increment_offset=2
//不是用负载均衡模式,用的是主主模式,所以这块不需要设置
[mysql.server]
user=mysql
basedir=/usr/local/mysql
[client]
socket=/var/lib/mysql/mysql.sock
datadir=/usr/local/mysql/data
socket=/var/lib/mysql/mysql.sock
max_connection=1000
log-bin=mysql-bin
server-id=2
//这块两台服务器需要设置成不同
binlog-do-db=CU
binlog-do-db=FAE
binlog-do-db=HA
//它是用于主从同步时,给master用的配置参数。来说明需要复制那些库给从库。因为有时主从不是要把全部的DB都复制给从库。
binlog-ignore-db=mysql
//安全起见,无论如何不从主同步系统DB
replicate-do-db=CU
replicate-do-db=FAE
replicate-do-db=HA
//从主读取的库
replicate-ignore-db=mysql
//安全起见,无论如何不从主同步系统DB
log-slave-updates
#slave-skip-errors=all
#auto_increment_increment=2
#auto_increment_offset=2
//不是用负载均衡模式,用的是主主模式,所以这块不需要设置
[mysql.server]
user=mysql
basedir=/usr/local/mysql
[client]
socket=/var/lib/mysql/mysql.sock
配置好之后,在两台机器上分别给从建立账号,登录两台Mysql,执行以下语句:
写道
CHANGE MASTER TO
MASTER_HOST='192.***.***.***',
MASTER_USER='repl_user',
MASTER_PASSWORD='hj3****’;
MASTER_HOST='192.***.***.***',
MASTER_USER='repl_user',
MASTER_PASSWORD='hj3****’;
注意的一点就是,使用sqlyog,一定要使用12.09以上的版本,否者主从同步会出现脏数据,因为sqlyog的老版本在修改数据库的时候,某些时候不会产生binlog,导致这些修改数据不会同步。
2.故障检测和主从切换。
我们使用keepalived和shell脚本搞定。
原理:两台数据库服务器上同时部署Keepalived。Keepalived所有节点会互相通信,互报平安。一旦抢到主的机器的Keepalived没有心跳了,从机器的Keepalived会把主的IP抢过来。Keepalived会定期调用shell脚本检测本机mysql是否可用。一旦本机mysq不可用,Keepalived会通知其他机器的Keepalived抢主的IP来实现故障切换。
Keepalived的配置:
写道
! Configuration File for keepalived
#Keepalived组的名称,各个组之间互相不影响
global_defs {
router_id cu_ha_router
}
#检测MYSQL的实例
vrrp_instance mysql {
state BACKUP # 主也配置为SLAVE
interface eth0 #绑定虚拟IP的网络接口
virtual_router_id 101 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority 150 #节点的优先级(1-254之间),备用节点必须比主节点优先级低
nopreempt # 不抢占,注意加上
advert_int 1 #组播信息发送间隔,两个节点设置必须一样
authentication { #设置验证信息,两个节点必须一致
auth_type PASS
auth_pass xmotor
}
#一定要注意这块子网掩码的计算,写错了可能会影响整台的网络访问
virtual_ipaddress {
172.*.*.201/20
}
track_script {
chk_mysql
}
#我们使用的是亚马逊云,不能使用组播模式(advertisement),所以必须使用单播模式。单播模式需要增加以下配置。我们做过测试,单播模式支持三台或以上的机器。
unicast_src_ip 172.31.2.1 #localIp
unicast_peer {
172.31.2.124 #Resource-02
#172.31.0.207 #Management
}
#以下四个脚本分别在机器变成主、从、失败、宕机的时候执行的脚本,目前我们只记录一条日志
notify_master "/home/keepalived/scripts/mysql_be_master.sh"
notify_backup "/home/keepalived/scripts/mysql_be_slave.sh"
notify_fault "/home/keepalived/scripts/mysql_fault.sh"
notify_stop "/home/keepalived/scripts/mysql_stop.sh"
}
#检测MYSQL函数
vrrp_script chk_mysql
{
script "/home/keepalived/scripts/mysql_chk.sh eth0 root root"
interval 2
timeout 2
fall 3
}
vrrp_script chk_redis
{
script "/home/keepalived/scripts/redis_check.sh 6391 eth0"
interval 2
timeout 2
fall 3
}
vrrp_script chk_mongo
{
script "/home/keepalived/scripts/mongo_chk.sh eth0"
interval 2
timeout 2
fall 3
}
vrrp_instance redis {
state BACKUP
interface eth0 #绑定虚拟IP的网络接口
virtual_router_id 102 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority 100 #节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int 1 #组播信息发送间隔,两个节点设置必须一样
authentication { #设置验证信息,两个节点必须一致
auth_type PASS
auth_pass xmotor
}
virtual_ipaddress {
172.*.*.202/20
}
track_script {
chk_redis
}
unicast_src_ip 172.*.*.1 #localIp
unicast_peer {
172.*.*.124 #Resource-02
#172.*.*.207 #Management
}
notify_master "/home/keepalived/scripts/redis_be_master.sh 6391"
notify_backup "/home/keepalived/scripts/redis_be_slave.sh 172.*.*.* 6391"
notify_fault "/home/keepalived/scripts/redis_fault.sh 6391"
notify_stop "/home/keepalived/scripts/redis_stop.sh 6391"
}
vrrp_instance mongodb {
state BACKUP
interface eth0 #绑定虚拟IP的网络接口
virtual_router_id 103 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority 100 #节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int 1 #组播信息发送间隔,两个节点设置必须一样
authentication { #设置验证信息,两个节点必须一致
auth_type PASS
auth_pass xmotor
}
unicast_src_ip 172.*.*.1 #localIp
unicast_peer {
172.*.*.124 #Resource-02
#172.*.*.207 #Management
}
virtual_ipaddress {
172.*.*.203/20
}
track_script {
chk_mongo
}
notify_master "/home/keepalived/scripts/mongo_be_master.sh"
notify_backup "/home/keepalived/scripts/mongo_be_slave.sh"
notify_fault "/home/keepalived/scripts/mongo_fault.sh"
notify_stop "/home/keepalived/scripts/mongo_stop.sh"
}
#Keepalived组的名称,各个组之间互相不影响
global_defs {
router_id cu_ha_router
}
#检测MYSQL的实例
vrrp_instance mysql {
state BACKUP # 主也配置为SLAVE
interface eth0 #绑定虚拟IP的网络接口
virtual_router_id 101 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority 150 #节点的优先级(1-254之间),备用节点必须比主节点优先级低
nopreempt # 不抢占,注意加上
advert_int 1 #组播信息发送间隔,两个节点设置必须一样
authentication { #设置验证信息,两个节点必须一致
auth_type PASS
auth_pass xmotor
}
#一定要注意这块子网掩码的计算,写错了可能会影响整台的网络访问
virtual_ipaddress {
172.*.*.201/20
}
track_script {
chk_mysql
}
#我们使用的是亚马逊云,不能使用组播模式(advertisement),所以必须使用单播模式。单播模式需要增加以下配置。我们做过测试,单播模式支持三台或以上的机器。
unicast_src_ip 172.31.2.1 #localIp
unicast_peer {
172.31.2.124 #Resource-02
#172.31.0.207 #Management
}
#以下四个脚本分别在机器变成主、从、失败、宕机的时候执行的脚本,目前我们只记录一条日志
notify_master "/home/keepalived/scripts/mysql_be_master.sh"
notify_backup "/home/keepalived/scripts/mysql_be_slave.sh"
notify_fault "/home/keepalived/scripts/mysql_fault.sh"
notify_stop "/home/keepalived/scripts/mysql_stop.sh"
}
#检测MYSQL函数
vrrp_script chk_mysql
{
script "/home/keepalived/scripts/mysql_chk.sh eth0 root root"
interval 2
timeout 2
fall 3
}
vrrp_script chk_redis
{
script "/home/keepalived/scripts/redis_check.sh 6391 eth0"
interval 2
timeout 2
fall 3
}
vrrp_script chk_mongo
{
script "/home/keepalived/scripts/mongo_chk.sh eth0"
interval 2
timeout 2
fall 3
}
vrrp_instance redis {
state BACKUP
interface eth0 #绑定虚拟IP的网络接口
virtual_router_id 102 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority 100 #节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int 1 #组播信息发送间隔,两个节点设置必须一样
authentication { #设置验证信息,两个节点必须一致
auth_type PASS
auth_pass xmotor
}
virtual_ipaddress {
172.*.*.202/20
}
track_script {
chk_redis
}
unicast_src_ip 172.*.*.1 #localIp
unicast_peer {
172.*.*.124 #Resource-02
#172.*.*.207 #Management
}
notify_master "/home/keepalived/scripts/redis_be_master.sh 6391"
notify_backup "/home/keepalived/scripts/redis_be_slave.sh 172.*.*.* 6391"
notify_fault "/home/keepalived/scripts/redis_fault.sh 6391"
notify_stop "/home/keepalived/scripts/redis_stop.sh 6391"
}
vrrp_instance mongodb {
state BACKUP
interface eth0 #绑定虚拟IP的网络接口
virtual_router_id 103 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority 100 #节点的优先级(1-254之间),备用节点必须比主节点优先级低
advert_int 1 #组播信息发送间隔,两个节点设置必须一样
authentication { #设置验证信息,两个节点必须一致
auth_type PASS
auth_pass xmotor
}
unicast_src_ip 172.*.*.1 #localIp
unicast_peer {
172.*.*.124 #Resource-02
#172.*.*.207 #Management
}
virtual_ipaddress {
172.*.*.203/20
}
track_script {
chk_mongo
}
notify_master "/home/keepalived/scripts/mongo_be_master.sh"
notify_backup "/home/keepalived/scripts/mongo_be_slave.sh"
notify_fault "/home/keepalived/scripts/mongo_fault.sh"
notify_stop "/home/keepalived/scripts/mongo_stop.sh"
}
下面是检测mysql的脚本,可用返回0,不可用返回1。
写道
#!/bin/bash
#define mysql variable
NETBOARD=$1
MYSQL_USER=$2
MYSQL_PWD=$3
LOGFILE="/var/log/keepalived/mysql/mysql-check.log"
# 看3306端口是否开这
mysql_alive=`netstat -nl | awk 'NR>2{if ($4 ~ /.*:3306/) {print "Yes";exit 0}}'`
#记录日志
echo "[CHECK]" >> $LOGFILE
date >> $LOGFILE
# 取出网关的IP地址
gate=`route -n | grep $NETBOARD | grep UG | awk '{print $2}'`
# 查看网关是否通畅
ping -w 1 -c 1 $gate >/dev/null
ret=$?
#连不上网关,记录日志,返回1
if [ $ret != 0 ];then
echo "Network Gate is not connected" >> $LOGFILE 2>&1
exit 1
fi
Slave_IO_Running=""
Slave_SQL_Running=""
# 如果MYSQL端口是通的,登录mysql,执行mysql语句,检查mysql状态
if [ "$mysql_alive" == "Yes" ];then
Slave_IO_Running=`mysql -u${MYSQL_USER} -p${MYSQL_PWD} -e"show slave status\G" | grep "Slave_IO_Running:" | awk '{print $2}'`
Slave_SQL_Running=`mysql -u${MYSQL_USER} -p${MYSQL_PWD} -e"show slave status\G" | grep "Slave_SQL_Running:" | awk '{print $2}'`
if [ "$Slave_IO_Running" != "" -a "$Slave_SQL_Running" != "" ];then
echo "Success, Slave_IO_Running = $Slave_IO_Running, Slave_SQL_Running = $Slave_SQL_Running" >> $LOGFILE 2>&1
exit 0
else
mysql -u${MYSQL_USER} -p${MYSQL_PWD} -e"show slave status\G"
getSlaveStatusResult=$?
echo "Failed, Reason: $getSlaveStatusResult" >> $LOGFILE 2>&1
exit 1
fi
else
echo "Mysql Down" >> $LOGFILE 2>&1
exit 1
fi
#define mysql variable
NETBOARD=$1
MYSQL_USER=$2
MYSQL_PWD=$3
LOGFILE="/var/log/keepalived/mysql/mysql-check.log"
# 看3306端口是否开这
mysql_alive=`netstat -nl | awk 'NR>2{if ($4 ~ /.*:3306/) {print "Yes";exit 0}}'`
#记录日志
echo "[CHECK]" >> $LOGFILE
date >> $LOGFILE
# 取出网关的IP地址
gate=`route -n | grep $NETBOARD | grep UG | awk '{print $2}'`
# 查看网关是否通畅
ping -w 1 -c 1 $gate >/dev/null
ret=$?
#连不上网关,记录日志,返回1
if [ $ret != 0 ];then
echo "Network Gate is not connected" >> $LOGFILE 2>&1
exit 1
fi
Slave_IO_Running=""
Slave_SQL_Running=""
# 如果MYSQL端口是通的,登录mysql,执行mysql语句,检查mysql状态
if [ "$mysql_alive" == "Yes" ];then
Slave_IO_Running=`mysql -u${MYSQL_USER} -p${MYSQL_PWD} -e"show slave status\G" | grep "Slave_IO_Running:" | awk '{print $2}'`
Slave_SQL_Running=`mysql -u${MYSQL_USER} -p${MYSQL_PWD} -e"show slave status\G" | grep "Slave_SQL_Running:" | awk '{print $2}'`
if [ "$Slave_IO_Running" != "" -a "$Slave_SQL_Running" != "" ];then
echo "Success, Slave_IO_Running = $Slave_IO_Running, Slave_SQL_Running = $Slave_SQL_Running" >> $LOGFILE 2>&1
exit 0
else
mysql -u${MYSQL_USER} -p${MYSQL_PWD} -e"show slave status\G"
getSlaveStatusResult=$?
echo "Failed, Reason: $getSlaveStatusResult" >> $LOGFILE 2>&1
exit 1
fi
else
echo "Mysql Down" >> $LOGFILE 2>&1
exit 1
fi
相关推荐
本篇文档为Mysql双主热备+LVS+Keepalived高可用操作记录,可作为线上实操手册,有需要的朋友可以拿走,希望能帮助到有用到的人~
### MySQL数据库高可用方案研究 #### 一、引言 随着信息技术的发展,数据库已经成为现代企业应用的核心组件之一。它不仅存储着企业的宝贵资产,如客户信息、产品信息、订单信息等,还是支撑关键业务应用正常运行的...
在本例中,我们将使用Windows Server 2016的故障转移群集来实现MySQL的双机热备。 1. **前期准备工作**: - **物理部署**:理解双机热备的基本架构,包括两台服务器和共享存储。这里我们采用虚拟机环境,每台...
- Group Replication:MySQL的高级复制方案,提供强一致性的多主复制,能够在节点间自动解决冲突。 - 硬件冗余:使用RAID技术保护数据,部署热备服务器以防硬件故障。 4. MySQL数据一致性 4.1. 背景 数据一致性是...
为了实现实时备份,可以结合MySQL的复制功能或使用专门的备份工具,例如MySQL的binlog(二进制日志)可以用于同步数据变化,实现热备份。在集群环境中,数据的实时备份通常涉及到主从复制,即一个主节点写入数据后,...
- **提供方**:北京微彩华创科技有限公司,专注于服务器高可用软件的研发、生产和销售,以技术创新和服务为核心,保障企业级客户的业务稳定和数据安全。 #### 二、产品特点 ##### 1. 远程监控与管理 - **远程监控*...
高可用数据库架构设计通过MySQL Replication的双机主从热备策略,实现了数据的实时同步和故障切换能力,以保证互联网服务的连续性和稳定性。然而,实现这样的架构需要考虑到数据一致性、故障切换的自动化以及备份...
高可用数据库架构设计的目标是确保MySQL数据库服务不受单点故障的影响。即使主服务器(A服务器)发生故障,如宕机或磁盘损坏,系统仍能正常运行,因为还有一台备用的数据库服务器提供服务。在这种情况下,通常采用双机...
因此,为Nginx实施高可用方案显得尤为重要。 ### 双机热备方案 双机热备方案指的是两台服务器共同提供服务,一台为主服务器(MASTER)提供服务,另一台为备用服务器(BACKUP)。当主服务器出现故障时,备用服务器...
### 知识点一:MySQL数据库管理系统的特性与优化 #### MySQL优势: 1. **处理大规模数据能力**:能够高效地处理包含上千万条记录的大型数据库,这得益于其优秀的性能设计与高度优化的内核。 2. **SQL标准支持**:...
4. **HDFS高可用**:作为Hive的数据存储层,HDFS本身具有高可用特性,包括NameNode的热备和检查点机制,确保数据的持久性和服务连续性。 5. **故障恢复策略**:配置适当的故障恢复策略,如HDFS的快速重启、Hive查询...
**Elasticsearch 分布式搜索解决方案** 随着大数据时代的到来,数据量呈指数级增长,传统的数据库解决方案面临挑战。当系统数据量达到10亿、100亿条时,我们需要考虑以下几个方面来优化检索和系统架构: 1. **选择...
该框架的核心组件包括Nginx作为负载均衡器、Keepalived实现高可用性、Apache作为后端服务器、MySQL集群用于数据管理以及Memcached作为缓存服务。 #### 二、负载均衡与高可用性 - **Nginx**:作为主负载均衡器,能够...
不同性能集群间通过共享的方式组成高可用性能集群,实现负载均衡和资源的有效利用。集群内的服务器可以采用高性能服务器,如MySQL、MSSQL、Oracle、PHP和Tomcat等,确保高效的数据分析和请求处理。 六、云计算数据...
在PostgreSQL集群中,可以利用主从复制、分区、读写分离、并行处理等技术实现高性能、高可用性、高可伸缩性的数据库解决方案。 ### 结论 PostgreSQL是一个不断进步且强大的开源数据库管理系统。它的灵活性、高可用...