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 高可用架构。当然这种架构存在单点故障问题,可以为主服务器准备一台备份机器来解决。接下来就在此架构基础上来进一步完善它的可用性。