MySQL主从复制架构详解(附带配置过程)
MySQL 主从复制指单台 MySQL 服务器的数据复制到另一台 MySQL 服务器上。这种方案不需要复杂的配置,数据可以从单台 Master 主机复制到任意数量的 Slave 主机上。
复制使用异步方式,从 MySQL 5.5 版本开始增加了半同步复制,有效地提高了复制的可靠性。
该架构可将读写请求分离到不同的机器上执行,但需要应用程序实现不同的连接池,将读操作负载均衡到多个从服务器主机上,提高系统整体读操作的处理能力。但只有单台主服务器可以写数据,所以写操作无法负载均衡,也限制了其扩展性;并且当主服务器发生故障时,系统将无法写数据,存在单点故障。
本架构通常适用于对可用性要求不高的场景,例如在线备份,将其中一台从服务器用于备份数据,避免了备份对主服务器产生的影响。如下图所示。

图 1 单主多从示意图
从图中可以看出应用程序可以访问多个从服务器主机,压力可以分布在不同的从服务器主机上,在应用层和从服务器中间可以添加 LVS,便可实现负载均衡,同时从服务器可以水平扩展来提高系统整体读性能。
脚本有三个参数分别是:软件包、安装目录、配置文件,需要指定这三个参数才能顺利安装,如下所示:
MySQL 安装完成后,即可对它们进行配置,具体操作步骤说明如下:
1) 在主服务器主机上开启 binlog 日志,保持 server-id 的唯一性,这一步最好安装 MySQL 之前就写在配置文件中。
2) 在主服务器上配置复制所需要的账户 repl,如下所示:
3) 接着,在从服务器 1 和从服务器 2 上分别配置主服务器信息,如下所示:
至此,MySQL 的主从服务器就配置好了。
1) 在 LVS 主机上安装 LVS 相关软件,可以通过 yum 的方式,如下所示:
2) 安装完毕,开始配置 LVS,编辑 lvs 的配置文件:
3) 分别在从服务器 1 和从服务器 2 上安装 arptables_jf,进行 arp 设置,设置完成后启动 arptable_jf 服务,并设置其开机自动启动。(下面是从服务器 1 的配置,从服务器 2 请读者自行配置。)
4) 启动 LVS 服务,并设置其开机自动启动:
5) 启动 LVS 服务后,可以通过 ipvsadm 命令来检查 LVS 状态是否正常:
到此为止,大家已经学会了如何配置一个最简单的 MySQL 高可用架构。当然这种架构存在单点故障问题,可以为主服务器准备一台备份机器来解决。接下来就在此架构基础上来进一步完善它的可用性。
复制使用异步方式,从 MySQL 5.5 版本开始增加了半同步复制,有效地提高了复制的可靠性。
MySQL主从架构设计
该架构由单台主服务器和多台从服务器构成,主服务器主要接受来自应用程序的写请求,从服务器接受读请求,在从服务器与应用层之间可以搭建负载均衡设备。例如:LVS、Haproxy、F5 等。该架构可将读写请求分离到不同的机器上执行,但需要应用程序实现不同的连接池,将读操作负载均衡到多个从服务器主机上,提高系统整体读操作的处理能力。但只有单台主服务器可以写数据,所以写操作无法负载均衡,也限制了其扩展性;并且当主服务器发生故障时,系统将无法写数据,存在单点故障。
本架构通常适用于对可用性要求不高的场景,例如在线备份,将其中一台从服务器用于备份数据,避免了备份对主服务器产生的影响。如下图所示。

图 1 单主多从示意图
从图中可以看出应用程序可以访问多个从服务器主机,压力可以分布在不同的从服务器主机上,在应用层和从服务器中间可以添加 LVS,便可实现负载均衡,同时从服务器可以水平扩展来提高系统整体读性能。
MySQL主从架构配置环境
下面准备了 4 台机器,一台为主服务器、两台从服务器,一台用来做负载均衡。具体的设置如下表所示。| 主机名 | IP 地址 | 角色 | 备注 |
|---|---|---|---|
| 主服务器 | 192.168.1.20 | 主机 | 数据库写 |
| 从服务器 服务器 1 | 192.168.1.21 | 从机 | 数据库读 |
| 从服务器 服务器 2 | 192.168.1.22 | 从机 | 数据库读 |
| LVS | 192.168.1.23 | LVS | 负载均衡 |
服务器的安装配置
首先在主服务器、从服务器 1、从服务器 2 三台主机上安装 MySQL 数据库。把 MySQL 安装脚本上传到需要安装 MySQL 的服务器上,然后执行脚本操作。脚本有三个参数分别是:软件包、安装目录、配置文件,需要指定这三个参数才能顺利安装,如下所示:
#!/bin/env bash
# FileName: mysql_install_local.sh
#!/usr/bin/env bash
fullname=$1
prefix=$2
myncf=$3
fname=`basename $fullname`
realname=`echo "$fname" | awk -F '.tar' `print $1` `
if [ -z "$fullname" ]; then
echo "Usage: $0 /home/xyz/mysql-xxx.tar.gz /path/to/install_prefix /path/to/my.cnf"
exit 1
fi
echo "Create MySQL user"
t=`grep mysql /etc/passwd`
if [[ -z $tt ]]; then
groupadd -f mysql
useradd -g mysql -d /dev/null -s /sbin/nologin mysql
fi
echo "Clean old MySQL"
rm -rf $prefix/mysql
echo "Unpacking..."
if [[ ! -d $prefix ]]; then
mkdir -p $prefix
fi
tar xfz $fullname -C $prefix 2> /tmp/mysqlinstall.log
echo "Setting up symlink mysql->mysql-XYZ..."
ln -s $prefix/$realname $prefix/mysql 2>/tmp/mysqlinstall.log
echo "export PATH=$PATH:$prefix/mysql/bin" >> /etc/profile
source /etc/profile
test -x $prefix/mysql/bin/mysqld
[ $? != 0 ] && exit 1
test -x $prefix/mysql/bin/mysql
[ $? != 0 ] && exit 1
if [[ -f /etc/my.cnf ]]; then
mv /etc/my.cnf{,.old}
fi
cp $myncf /etc/my.cnf
echo "Initial MySQL Database"
if [[ $PWD != $prefix/mysql ]]; then
cd $prefix/mysql/
fi
./scripts/mysql_install_db --user=mysql --defaults-file=/etc/my.cnf 2>/tmp/mysqlinstall.log
grep -i 'ok'
if [[ $? != 0 ]]; then
echo "initial mysql database failed see /tmp/mysqlinstall.log "; exit 1
fi
cp -f support-files/mysql_server /etc/init.d/mysql
echo "Installing of MySQL is complete"
echo "You can start MySQL server /etc/init.d/mysql start"
MySQL 安装完成后,即可对它们进行配置,具体操作步骤说明如下:
1) 在主服务器主机上开启 binlog 日志,保持 server-id 的唯一性,这一步最好安装 MySQL 之前就写在配置文件中。
2) 在主服务器上配置复制所需要的账户 repl,如下所示:
mysql> grant replication slave on *.* to repl@%; Query OK, 0 rows affected (0.05 sec) mysql>flush privileges; Query OK, 0 rows affected (0.01 sec)
3) 接着,在从服务器 1 和从服务器 2 上分别配置主服务器信息,如下所示:
mysql>change master to master_host=’192.168.1.20’, master_user=’repl’,
master_password=’repl_password’;
Query OK, 0 rows affected (0.05 sec)
mysql>slave start;
Query OK, 0 rows affected (0.01 sec)
mysql>show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.20
Master_User: repl
Master_Port: 3306
Connect_Retry: 3
Master_Log_File: mysql-bin.001
Read_Master_Log_Pos: 79
Relay_Log_File: mysql-relay-bin.001
Relay_Log_Pos: 548
Relay_Master_Log_File: mysql-bin.001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 79
Relay_Log_Space: 552
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 8
1 row in set (0.00 sec)
下面了解一下其中主要的几个变量的含义:
- Master_Host:被复制的主机地址;
- Master_User:在主服务器上创建的用于复制的账户;
- Master_Port:主服务器上 MySQL 运行的端口;
- Slave_IO_Running:显示 I/O 线程运行状态;
- Slave_SQL_Running:显示 SQL 线程运行状态;
- Last_Error:当复制中断时,此处会显示错误原因,并由此来修复复制;
- Seconds_Behind_Master:显示从服务器中 I/O 线程与 SQL 线程之间的时间差。可以反映出主从服务器之间的网络快慢。
至此,MySQL 的主从服务器就配置好了。
LVS的安装配置
接下来可以配置 LVS,用来做负载均衡,具体操作步骤说明如下:1) 在 LVS 主机上安装 LVS 相关软件,可以通过 yum 的方式,如下所示:
root@LVS#yum install ipvsadm piranha
2) 安装完毕,开始配置 LVS,编辑 lvs 的配置文件:
root@LVS#vi /etc/sysconfig/ha/lvs.cf
serial_no = 26
primary = 192.168.1.10 #配置虚拟IP
service = lvs
heartbeat = 1
heartbeat_port = 539
keepalive = 6
deadtime = 18
network = direct
debug_level = NONE
monitor_links = 1
syncdaemon = 0
virtual mysql {
active = 1
address = 192.168.1.23 eth0:1 #配置LVS的主机物理网口IP
vip_nmask = 255.255.255.0
port = 3306
use_regex = 0
load_monitor = none
scheduler = wrr #负载方式可选wrr加权轮询,或wlc加权最小连接
protocol = tcp
timeout = 6
reentry = 15
quiesce_server = 0
server Slave-1 {
address = 192.168.1.21 #Slave-1的主机IP
active = 1
port = 3306
weight = 1
}
server Slave-2 {
address = 192.168.1.22 #Slave-2的主机IP
active = 1
port = 3306
weight = 1
}
3) 分别在从服务器 1 和从服务器 2 上安装 arptables_jf,进行 arp 设置,设置完成后启动 arptable_jf 服务,并设置其开机自动启动。(下面是从服务器 1 的配置,从服务器 2 请读者自行配置。)
root@Slave-1# yum install arptables_jf root@Slave-1# arptables -A IN -d 192.168.1.10 -j DROP root@Slave-1# arptables -A OUT -s 192.168.1.10 -j mangle --mangle-ip-s 192.168.1.21 root@Slave-1# echo "ip addr add 192.168.1.10 dev lo" >> /etc/rc.local root@Slave-1# service arptables_jf start root@Slave-1# chkconfig –level 2345 arptables_jf on
4) 启动 LVS 服务,并设置其开机自动启动:
root@LVS#service pulse start root@LVS#chkconfig –level 2345 pulse on
5) 启动 LVS 服务后,可以通过 ipvsadm 命令来检查 LVS 状态是否正常:
root@LVS# ipvsadm –L –n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.1.10:3306 wrr -> 192.168.1.21:3306 Route 1 1 0 -> 192.168.1.22:3306 Route 1 2 0从结果中可以看到,虚拟 IP 为 192.168.1.10,转发端口是 3306,真实主机的 IP 是 192.168.1.21 和 192.168.1.22。当应用程序访问 192.168.1.10 的 3306 端口时,连接会自动被转发的 21 和 22 这两台机器上,此时再看 LVS 的状态,ActiveConn 的值就会有变化,说明 LVS 已经正常工作了。
到此为止,大家已经学会了如何配置一个最简单的 MySQL 高可用架构。当然这种架构存在单点故障问题,可以为主服务器准备一台备份机器来解决。接下来就在此架构基础上来进一步完善它的可用性。
ICP备案:
公安联网备案: