MySQL主从复制基础实践

MySQL主从复制应用场景:

在实际应用场景中,MySQL复制90%以上都是一个Master复制到一个或者多个Slave的架构模式,主要用于读压力比较大的应用的数据库端廉价扩展解决方案。因为只要Master和Slave的压力不是太大(尤其是Slave端压力)的话,异步复制的延时一般都很少很少。尤其是自从Slave端的复制方式改成两个线程处理之后,更是减小了Slave端的延时问题。而带来的效益是,对于数据实时性要求不是特别Critical的应用,只需要通过廉价的pcserver来扩展Slave的数量,将读压力分散到多台Slave的机器上面,即可通过分散单台数据库服务器的读压力来解决数据库端的读性能瓶颈,毕竟在大多数数据库应用系统中的读压力还是要比写压力大很多。这在很大程度上解决了目前很多中小型网站的数据库压力瓶颈问题,甚至有些大型网站也在使用类似方案解决数据库瓶颈。

MySQL复制过程

    SLAVE:
        IO thread:向主服务器请求二进制日志中的事件
        SQL thread:从中继日志中读取事件并在本地执行         
    MASTER:
        binlog dump: 将IO thread请求的事件发送给对方
  • 下图描述了复制过程

    该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
    下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
    SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
    此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。

    示例:主从复制的配置

    版本
        1、双方的mysql版本要一致:
        2、如果不一致,主的要低于从的;
    
    从哪开始复制:
        1、都从0开始;
        2、主服务器已经运行一段时间,并且存在不小的数据集;
            把主服务器备份,然后在从服务器恢复,从主服务器上备份时所处的位置开始复制;

    配置过程:

    主服务器:
        1、改server-id 
        2、启用二进制日志
        3、创建有复制权限的账号
    从服务器: 
        1、改server-id 
        2、启用中继日志
        3、连接主服务器 
        4、启动复制线程
    连接主服务器的命令:
        CHANGE MASTER TO 
            MASTER_HOST = ‘‘,   #指定主服务器ip地址
            MASTER_PORT=‘‘,     #指定主服务器mysql端口
            MASTER_USER= ‘‘,    #指定主服务器上授权的用户名
            MASTER_PASSWORD=‘‘, #授权用户的密码
            MASTER_LOG_FILE=‘‘, #指定从主服务器的哪一个二进制开始复制,不指定从默认为位置
            MASTER_LOG_POS=;    #指定从主服务器二进制日志的那个点开始复制

主机地址规划:

MASTER:192.168.2.197
SLAVE:192.168.2.111

两台服务器部署MySQL(本例采用MariaDB-10)

  • 两台服务器安装方式相同这里只演示master端安装

1.创建mysql用户及mysql组

[[email protected] ~]# groupadd -g 301 -r mysql
[[email protected] ~]# useradd -r -g mysql -u 301 -s /sbin/nologin mysql

2.安装MariaDB

[[email protected] ~]# tar xf mariadb-10.0.24-linux-x86_64.tar.gz -C /usr/local/    #解压至/usr/local/目录下
[[email protected] ~]# cd /usr/local/
[[email protected] local]# mv mariadb-10.0.24-linux-x86_64 mysql     #重命名为mysql
[[email protected] local]# cd mysql/
[[email protected] mysql]# ll
total 208
-rw-r--r--  1 wangenzhi wangenzhi 17987 Feb 18 04:59 COPYING
-rw-r--r--  1 wangenzhi wangenzhi 26545 Feb 18 04:59 COPYING.LESSER
-rw-r--r--  1 wangenzhi wangenzhi  1980 Feb 18 04:59 CREDITS
-rw-r--r--  1 wangenzhi wangenzhi  8245 Feb 18 04:59 EXCEPTIONS-CLIENT
-rw-r--r--  1 wangenzhi wangenzhi  8694 Feb 18 04:59 INSTALL-BINARY
-rw-r--r--  1 wangenzhi wangenzhi 90917 Feb 18 04:59 README
drwxr-xr-x  2 root  root   4096 May 17 10:31 bin
drwxr-xr-x  3 root  root   4096 May 17 10:31 data
drwxr-xr-x  3 root  root   4096 May 17 10:30 include
drwxr-xr-x  3 root  root   4096 May 17 10:30 lib
drwxr-xr-x  4 root  root   4096 May 17 10:31 man
drwxr-xr-x 11 root  root   4096 May 17 10:30 mysql-test
drwxr-xr-x  2 root  root   4096 May 17 10:31 scripts
drwxr-xr-x 28 root  root   4096 May 17 10:30 share
drwxr-xr-x  4 root  root   4096 May 17 10:31 sql-bench
drwxr-xr-x  3 root  root   4096 May 17 10:31 support-files
[[email protected] mysql]# chown -R root.mysql ./*  #将mysql下所有文件权限修改为属主root,属组mysql
[[email protected] mysql]# ll
total 208
-rw-r--r--  1 root mysql 17987 Feb 18 04:59 COPYING
-rw-r--r--  1 root mysql 26545 Feb 18 04:59 COPYING.LESSER
-rw-r--r--  1 root mysql  1980 Feb 18 04:59 CREDITS
-rw-r--r--  1 root mysql  8245 Feb 18 04:59 EXCEPTIONS-CLIENT
-rw-r--r--  1 root mysql  8694 Feb 18 04:59 INSTALL-BINARY
-rw-r--r--  1 root mysql 90917 Feb 18 04:59 README
drwxr-xr-x  2 root mysql  4096 May 17 10:31 bin
drwxr-xr-x  3 root mysql  4096 May 17 10:31 data
drwxr-xr-x  3 root mysql  4096 May 17 10:30 include
drwxr-xr-x  3 root mysql  4096 May 17 10:30 lib
drwxr-xr-x  4 root mysql  4096 May 17 10:31 man
drwxr-xr-x 11 root mysql  4096 May 17 10:30 mysql-test
drwxr-xr-x  2 root mysql  4096 May 17 10:31 scripts
drwxr-xr-x 28 root mysql  4096 May 17 10:30 share
drwxr-xr-x  4 root mysql  4096 May 17 10:31 sql-bench
drwxr-xr-x  3 root mysql  4096 May 17 10:31 support-files
[[email protected] mysql]# cp support-files/my-large.cnf /etc/my.cnf #复制配置文件模板
cp: overwrite `/etc/my.cnf‘? y
[[email protected] mysql]# cp support-files/mysql.server /etc/init.d/mysqld #复制mysql启动脚本
[[email protected] mysql]# chmod +x /etc/init.d/mysqld
[[email protected] mysql]# chkconfig --add mysqld  #添加为系统服务
[[email protected] mysql]# chkconfig mysqld on
[[email protected] mysql]# mkdir -pv  /mydata/{data,binlogs} #创建用于存放数据文件的目录和存放二进制日志文件的目录,生产环境中应当放置于不同的磁盘中避免磁盘故障导致数据全部丢失
mkdir: created directory `/mydata‘
mkdir: created directory `/mydata/data‘
mkdir: created directory `/mydata/binlogs‘
[[email protected] mysql]# chown -R mysql.mysql /mydata/data/
[[email protected] mysql]# chown -R mysql.mysql /mydata/binlogs/

3.修改mysql配置文件

[[email protected] mysql]# vi /etc/my.cnf 
[mysqld]
datadir = /mydata/data  #添加数据目录的位置
log-bin=/mydata/binlogs/master-bin #修改二进制日志的存放位置及名称
保存退出

4.初始化mysql

[[email protected] mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mydata/data/

--user= 指定mysql用户
--datadir= 指定存放mysql数据的目录

[[email protected] mysql]# ls /mydata/data/ #初始化成功会在/mydata/data目录下生成下面文件
aria_log.00000001  aria_log_control  ib_logfile0  ib_logfile1  ibdata1  mysql  performance_schema  test

5.启动mysql服务

[[email protected] mysql]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS! 
[[email protected] mysql]# ss -tnl|grep 3306
LISTEN 0  150  :::3306:::*

6.为了方便使用命令配置一下环境变量

[[email protected] mysql]# vi /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
[[email protected] mysql]# . /etc/profile.d/mysql.sh
[[email protected] mysql]# ln -sv /usr/local/mysql/include/ /usr/include/mysql
`/usr/include/mysql‘ -> `/usr/local/mysql/include/‘
[[email protected] mysql]# vi /etc/ld.so.conf.d/mysql.conf
/usr/local/mysql/lib
[[email protected] mysql]# ldconfig

注意以上安装两台服务器完全相同操作,下面配置复制过程需单独操作


7.在MASTER服务器授权复制用户

MariaDB [(none)]> grant replication slave,replication client on *.* to ‘repluser‘@‘192.168.2.111‘ identified by ‘replpass‘;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> \q
Bye

8.在SLAVE服务器上修改配置文件

[[email protected] mysql]# vi /etc/my.cnf 
datadir = /mydata/data  #在[mysqld]标签下添加datadir指定目录位置
server-id   = 11     #修改server-id 不能与MASTER相同

# Replication Slave (comment out master section to use this)
#
# To configure this host as a replication slave, you can choose between
# Replication Master Server (default)
# binary logging is required for replication
#log-bin=mysql-bin  #SLAVE服务器不需要记录二进制日志将其注释

# binary logging format - mixed recommended
#binlog_format=mixed    #注释掉

# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id   = 11     #修改为11
relay-log = /mydata/binlogs/relay-bin #添加中继日志存放位置

9.启动SLAVE服务器上的mysql

[[email protected] mysql]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS! 
[[email protected] mysql]# ss -tnl|grep 3306
LISTEN 0  150  :::3306:::*

10.配置SLAVE连接MASTER

MariaDB [(none)]> change master to
-> master_host=‘192.168.2.197‘, #指定master服务器地址
-> master_user=‘repluser‘,      #master创建的授权用户
-> master_password=‘replpass‘,  #授权用户的密码
-> master_log_file=‘master-bin.000003‘, #指定从哪个二进制日志开始复制,在MASTER端执行show master status;查看
-> master_log_pos=657;  #指定从master二进制日志中的哪个pos位置开始,在MASTER端执行show master status;查看
Query OK, 0 rows affected (0.09 sec)

MariaDB [(none)]> show slave status\G  #查看SLAVE端的状态
*************************** 1. row ***************************
   Slave_IO_State: 
  Master_Host: 192.168.2.197
  Master_User: repluser
  Master_Port: 3306
Connect_Retry: 60
  Master_Log_File: master-bin.000003 #master端的二进制日志名称
  Read_Master_Log_Pos: 657  #读到哪个位置
   Relay_Log_File: relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: master-bin.000003
 Slave_IO_Running: No  #从服务器上的IO复制线程在没启动时没有运行
Slave_SQL_Running: No  #从服务器上的SQL线程也是没有运行

11.启动SLAVE复制线程

MariaDB [(none)]> start slave; #启动SLAVE复制线程命令
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> show slave status\G  #查看当前状态
*************************** 1. row ***************************
   Slave_IO_State: Waiting for master to send event
  Master_Host: 192.168.2.197
  Master_User: repluser
  Master_Port: 3306
Connect_Retry: 60
  Master_Log_File: master-bin.000003
  Read_Master_Log_Pos: 657
   Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 536
Relay_Master_Log_File: master-bin.000003
 Slave_IO_Running: Yes  #线程为启动模式
Slave_SQL_Running: Yes  #线程为启动模式

12.验证主从复制

  • 在MASTER端创建一个数据库

MariaDB [(none)]> create database mydb; #创建mydb数据库
Query OK, 1 row affected (0.03 sec)

MariaDB [(none)]> show master status;  #POS值为778
+-------------------+----------+--------------+------------------+
| File  | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000003 |  778 |  |  |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
  • 在SLAVE端查看同步状态

MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
   Slave_IO_State: Waiting for master to send event
  Master_Host: 192.168.2.197
  Master_User: repluser
  Master_Port: 3306
Connect_Retry: 60
  Master_Log_File: master-bin.000003
  Read_Master_Log_Pos: 778  #从服务器读到的值也为778,说明复制没有问题
   Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 657
Relay_Master_Log_File: master-bin.000003
 Slave_IO_Running: Yes
Slave_SQL_Running: Yes
MariaDB [(none)]> show databases; #通过show命令查看mydb数据库也存在
+--------------------+
| Database   |
+--------------------+
| information_schema |
| mydb   |
| mysql  |
| performance_schema |
| test   |
+--------------------+
5 rows in set (0.03 sec)

小结:

配置主从复制的步骤:
        主服务器:
            1、改server-id 
            2、启用二进制日志
            3、创建有复制权限的账号
    从服务器: 
        1、改server-id 
        2、启用中继日志
        3、连接主服务器 
        4、启动复制线程
    连接主服务器的命令:
        CHANGE MASTER TO 
            MASTER_HOST = ‘‘,   #指定主服务器ip地址
            MASTER_PORT=‘‘,     #指定主服务器mysql端口
            MASTER_USER= ‘‘,    #指定主服务器上授权的用户名
            MASTER_PASSWORD=‘‘, #授权用户的密码
            MASTER_LOG_FILE=‘‘, #指定从主服务器的哪一个二进制开始复制,不指定从默认为位置
            MASTER_LOG_POS=;    #指定从主服务器二进制日志的那个点开始复制


本人作为刚入行的新手觉得配置一个简单的主从复制比较简单,但往往除了问题能够快速定位并解决问题再是我们学习的关键。写得有错误的地方希望大家帮忙纠正欢迎大家加我QQ一起讨论学习,QQ:510749025

时间: 2024-09-30 00:13:39

MySQL主从复制基础实践的相关文章

MySQL主从复制原理实践

MySQL主从复制 MySQL主从复制实则是将原本创建和修改数据库的SQL命令集合复制到从库本地,在从库本地重新执行这些SQL命令来建立与主库一样的数据.搭建从库以后,包括复制主库当前截止位置的所有数据,和接下来主库还在不断增长的数据.事实上,停库备份全部数据再复制过去没什么问题,问题在于怎么实时复制数据库增长的这段数据?而这就要借助binlog日志的功能... 主从复制原理 1)开启主库log-bin功能,是为了用户在写数据库过程中,MySQL会同时建立一份binlog日志来记录数据库所做的增

MySQL主从复制(Master-Slave)实践

MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的拓展.多个数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数据库的负载性能. 下图就描述了一个多个数据库间主从复制与读写分离的模型(来源网络): 在一主多从的数据库体系中,多个从服务器采用异步的方式更新主数据库的变化,业务服务器在执行写或者相关修改数据库的操作是在主服务器上进行的,读操作则是在各从服务器上进行.如果配置了多个从服务器或者多个主服务器又涉及到相应的负载均衡问题,关于负载均衡具体的技术

高可用架构篇--MyCat在MySQL主从复制基础上实现读写分离

点击链接加入群[Dubbo技术交流2群]:https://jq.qq.com/?_wv=1027&k=46DcDFI 一.环境 操作系统:CentOS-6.6-x86_64-bin-DVD1.iso JDK版本:jdk1.7.0_45 MyCat版本:Mycat-server-1.4-release-20151019230038-linux.tar.gz MyCat节点IP:192.168.1.203      主机名:edu-mycat-01  主机配置:4核CPU.4G内存 MySQL版本:

mysql数据库基础实践--交大软件工程数据库课程实践

=========================1.创建数据库和表========================= 共有6张表,学生信息表,班级信息表,教师信息表,课程表,选课表,教师任课表 #班级信息表class,结构如下 字段名 字段类型 约束条件 字段含义说明 classno varchar(6) Primary key 班级号 classname Varchar(20) Not null 班级名称 classspecial Varchar2(20) 所属专业 classdept Va

MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 转载

http://heylinux.com/archives/1004.html MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面. 因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy

重新学习Mysql数据13:Mysql主从复制,读写分离,分表分库策略与实践

一.MySQL扩展具体的实现方式 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量. 关于数据库的扩展主要包括:业务拆分.主从复制.读写分离.数据库分库与分表等.这篇文章主要讲述数据库分库与分表 (1)业务拆分 在?大型网站应用之海量数据和高并发解决方案总结一二?一篇文章中也具体讲述了为什么要对业务进行拆分. 业务起步初始,为了加快应用上线和快速迭代,很多应用都采用集中式的架构.随着业务系统的扩大,系统变得越来越复杂,越来越难以维护,开发效率变得越

【大型网站技术实践】初级篇:搭建MySQL主从复制经典架构 一、业务发展驱动数据发展

一.业务发展驱动数据发展 随着网站业务的不断发展,用户量的不断增加,数据量成倍地增长,数据库的访问量也呈线性地增长.特别是在用户访问高峰期间,并发访问量突然增大,数据库的负载压力也会增大,如果架构方案不够健壮,那么数据库服务器很有可能在高并发访问负载压力下宕机,造成数据访问服务的失效,从而导致网站的业务中断,给公司和用户造成双重损失.那么,有木有一种方案能够解决此问题,使得数据库不再因为负载压力过高而成为网站的瓶颈呢?答案肯定是有的. 目前,大部分的主流关系型数据库都提供了主从热备功能,通过配置

MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践

Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面. 因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的. 如下图所示: 下面是我在实际工作过程中所整理的笔记,在此分享出来,以供大家参考. 一.MySQL的安装与

mysql主从复制实践之单数据库多实例

1.主从复制数据库实战环境准备 MySQL主从复制实践对环境的要求比较简单,可以是单机单数据库多实例的环境,也可以是两台服务器之间,每台服务器都部署一个独立的数据库的环境.本文以单机数据库多实例的环境进行实践. 2.主从复制服务器角色定义 序号 数据库角色 数据库IP信息 数据库port信息 数据库配置路径 1 master 192.168.1.20 3306 /data/3306 2 slave1 192.168.1.20 3307 /data/3307 3 slave2 192.168.1.