首页 > 编程笔记 > MySQL笔记 阅读:52

MySQL主从复制架构详解(附带配置过程)

MySQL 主从复制指单台 MySQL 服务器的数据复制到另一台 MySQL 服务器上。这种方案不需要复杂的配置,数据可以从单台 Master 主机复制到任意数量的 Slave 主机上。

复制使用异步方式,从 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)
下面了解一下其中主要的几个变量的含义:
至此,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 高可用架构。当然这种架构存在单点故障问题,可以为主服务器准备一台备份机器来解决。接下来就在此架构基础上来进一步完善它的可用性。

相关文章