一、复制概述

Mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。

请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。

二、MySQL支持复制的类型也就是二进制日志格式:

  1. 基于语句的复制:  在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高
  2. 基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从mysql5.0开始支持
  3. 混合类型的复制: 默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。

三、复制的特点:

  • 数据分布
  • 负载均衡
  • 备份
  • 高可用性和可用行

四、复制进程的实现:

Mysql的复制(replication)是一个异步或半同步的复制,从一个Mysql 实例(称之为Master)复制到另一个Mysql 实例(称之Slave)。实现整个复制操作主要由三个进程完成的,其中两个进程在Slave(Sql进程和IO进程),另外一个进程在 Master(IO进程)上。
    要实施复制,首先必须打开Master端的binary log(bin-log)功能,否则无法实现。因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。

具体过程如下:

  • Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
  • Master接收到来自Slave的IO进程的请求后,通过负责复制的IO进程根据请求信息读取制定日志指定位置之后的日志信息,返回给Slave 的IO进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置;
  • Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”;
  • Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。

五、配置过程:

MySQL主从复制配置:

环境:
    master.test.com-->172.16.3.201
    slave.test.com-->172.16.3.203

   master.test.com-->172.16.3.201

1、启用二进制日志
        vim /etc/mysql/my.cnf
            # 确保[mysqld]中有如下语句
                log-bin=mysql-bin

# 保存退出
 
    2、设置一个在当前集群中唯一的server-id
        vim /etc/mysql/mys.cnf
            # 定位至如下行
                server-id       = 1
            # 把其值设置为11,也可以设置其他
                server-id       = 11
            # 保存退出
        上述过程用sed实现:
            sed -i '/^server-id/s@1@11@' /etc/mysql/my.cnf
    3、创建一个有复制权限的账号包括[replication slave,replication client]:
        mysql -e "grant replication client,replication slave on *.* to 'repluser'@'172.16.3.203' identified by 'replpass'; flush privileges;"
    4、service mysqld restart

  slave.test.com-->172.16.3.203

1、启用中继日志
            vim /etc/mysql/my.cnf
                # 在里面的mysqld段中加入如下内容:开启中继日志
                    relay-log = relay-bin
                # 保存退出
            用sed实现:
                sed -i '/\[mysqld\]/a relay-log = relay-bin' /etc/mysql/my.cnf
        2、设置一个在当前集群中唯一的server-id
            vim /etc/mysql/my.cnf
                # 定位至如下行
                    server-id    =1
                # 把其值设置为其21,也可以设置为其他
                    server-id    =21
                # 保存退出
            # 用sed实现
                sed -i '/^server-id/s@1@21@' /etc/mysql/my.cnf
        3、设置MySQL只读
            用sed实现:
                sed -i '/\[mysqld\]/a read-only = on' /etc/mysql/my.cnf
         4、service mysqld restart
        5、使用有复制权限账号连接至主服务器
            mysql -e "change master to master_host='172.16.3.201', master_user='repluser', master_password='replpass', master_log_file='binlog.000033', master_log_pos=553, master_connect_retry=5, master_heartbeat_period=2"
        6、启动从服务器
            mysql -e "start slave"

可能遇到的报错:

ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MariaDB error log

解决方法:

该报错如果出现,就会出现在slave中,处理方法如下:
        MariaDB [(none)]> reset slave;
        MariaDB [(none)]> change master to master_host='172.16.3.201', master_user='repluser', master_password='replpass', master_log_file='binlog.000033', master_log_pos=245, master_connect_retry=5, master_heartbeat_period=2;
        Query OK, 0 rows affected (0.01 sec)
        MariaDB [(none)]> start 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: 172.16.3.201
                          Master_User: repluser
                          Master_Port: 3306
                        Connect_Retry: 5
                      Master_Log_File: binlog.000033
                  Read_Master_Log_Pos: 245
                       Relay_Log_File: relay-bin.000002
                        Relay_Log_Pos: 526
                Relay_Master_Log_File: binlog.000033
                     Slave_IO_Running: Yes
                    Slave_SQL_Running: Yes
                      Replicate_Do_DB:
                  Replicate_Ignore_DB:
                   Replicate_Do_Table:
               Replicate_Ignore_Table:
              Replicate_Wild_Do_Table:

自动化部署MySQL主从复制集群【脚本实现】:

说明:通过shell脚本实现自动化部署MySQL主从复制集群,这里我就不解释每一步的意义了,在前面的介绍,有每一步骤的详细解释,我这个脚本仅供大家参考,经过了我的亲测,可以自动化部署,如有哪里不足还请大家多多给些意见,我也是新手,大家一起学习,嘿嘿

master_slave.sh

#!/bin/bash 

if [[ $# -eq 0 ]]; then
echo "Usage: /bin/bash `basename $0` master_ip slave_ip"
exit 1
fi master_ip=$1
slave_ip=$2 sed -i '/^server-id/s@1@11@' /etc/mysql/my.cnf mysql -e "grant replication client,replication slave on *.* to 'repluser'@"${slave_ip}" identified by 'replpass'; flush privileges;" service mysqld restart cat > test_master_slave.sh << EOF
#!/bin/bash sed -i '/\[mysqld\]/a relay-log = relay-bin' /etc/mysql/my.cnf sed -i '/^server-id/s@1@21@' /etc/mysql/my.cnf sed -i '/\[mysqld\]/a read-only = on' /etc/mysql/my.cnf service mysqld restart mysql -e "change master to master_host='172.16.3.101', master_user='repluser', master_password='replpass', master_log_file='binlog', master_log_pos=55, master_connect_retry=5, master_heartbeat_period=2" mysql -e "start slave"
EOF master_log=`mysql -e "show master status" | grep 'bin' | awk '{print $1}'`
master_log_position=`mysql -e "show master status" | grep 'bin' | awk '{print $2}'` sed -i "/binlog/s@binlog@${master_log}@" test_master_slave.sh
sed -i "/log_pos/s@55@${master_log_position}@" test_master_slave.sh
sed -i "/master_host/s@172.16.3.101@${master_ip}@" test_master_slave.sh echo ${master_log}
echo ${master_log_position} scp test_master_slave.sh node2:/root ssh node2 "/bin/bash /root/test_master_slave.sh"

该脚本用到了shell的基本知识,还有sed、awk等的很基础的知识;

MySQL主从复制原理及配置详细过程以及主从复制集群自动化部署的实现的更多相关文章

  1. Mysql主从复制原理及配置

    Mysql主从复制原理及配置 1.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其 ...

  2. STM32F0xx_EXIT中断配置详细过程

    Ⅰ.概述 EXIT外部中断在使用到按键或者开关控制等应用中比较常见,低功耗中断唤醒也是很常见的一种.因此,EXIT在实际项目开发中也是比较常见的一种. STM32F0中外部中断EXIT属于中断和事件的 ...

  3. STM32F0xx_看门狗(独立+窗口)配置详细过程

    Ⅰ.概述 对于看门狗,我觉得做单片机或者嵌入式开发的人员来说并不陌生,今天总结STM32F0看门狗的功能,F0的看门狗有两种:独立和窗口看门狗. 今天提供两种看门狗的软件工程实例,供大家下载. 两种看 ...

  4. STM32F0xx_RTC实时时钟配置详细过程

    Ⅰ.概述 今天总结RTC(Real Time Clock)实时时钟相关的知识,顺带将BKP简单总结一下. STM32的RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待 ...

  5. STM32F0xx_SPI读写(Flash)配置详细过程

    Ⅰ.概述 关于SPI(Serial Peripheral Interface)串行外设接口可以说是单片机或者嵌入式软件开发人员必须掌握的一项通信方式,就是你在面试相关工作的时候都可能会问及这个问题.在 ...

  6. STM32F0xx_TIM输出PWM配置详细过程

    前言 前面我说过STM32的定时器功能很强大,今天就来总结一下它的另外一个“强大”功能:TIM的比较输出功能,输出可调PWM波形.直接调用函数接口“TIM2_CH1_PWM(uint32_t Freq ...

  7. STM32F0xx_DAC输出电压配置详细过程

    前言 数模转换DAC的功能在现实应用中所占的分量,相对定时器TIM.串口USART等要小的多,这也是ST为什么内部集成DAC模块相对来说不是那么多的原因.但在有需要使用数模转换功能的项目中,自带的这个 ...

  8. STM32F0xx_TIM输入捕获(计算频率)配置详细过程

    前言 关于STM32的定时器,可谓是功能强大,估计没有多少人研究完STM32定时器的所有功能(包括我也没有),只是使用常用的一些功能,后续我会推出关于STM32定时器的更多功能. STM32芯片多数为 ...

  9. STM32F0xx_ADC采集电压配置详细过程

    前言 关于ADC这一块的功能基本上也算是CortexM芯片的标配了.ST的每一块芯片都有这个功能,只是说因型号不同,通道数.位数等有所不同.STM8的芯片大多数都是10的,也就是说分辨率可达到:参考电 ...

随机推荐

  1. 大数据慎行,数据管理要落实到KPI

    近年来,"大数据"一词被IT和互联网行业广泛提及,但真正落到实处的案例没有多少,大数据量支撑.数据挖掘技术.非结构化数据是阻碍的主要原因.大多数企业的信息化并没有达到到成熟水平,关 ...

  2. java基础学习02(简单的java程序)

    简单的java程序 一.完成的目标 1. 理解java程序的基本组成 2. 如何对程序代码进行注释 3. java标识符的命名规则 4. 了解java中的关键字 5. 使用java定义变量或声明变量 ...

  3. Struts2入门案例

    struts2最简便的案例   Struts 2是一个MVC框架,以WebWork框架的设计思想为核心,吸收了Struts 1的部分优点.Struts 2拥有更加广阔的前景,自身功能强大,还对其他框架 ...

  4. xcode8权限以及相关设置

    我们需要打开info.plist文件添加相应权限的说明,否则程序在iOS10上会出现崩溃. 具体如下图: QQ20160914-0.png 注意,添加的时候,末尾不要有空格麦克风权限:Privacy ...

  5. PAT 1049. 数列的片段和(20)

    给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1 ...

  6. [LeetCode] Reconstruct Itinerary 重建行程单

    Given a list of airline tickets represented by pairs of departure and arrival airports [from, to], r ...

  7. [LeetCode] Remove Duplicate Letters 移除重复字母

    Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...

  8. Visual Studio 使用Web Deploy 3.6发布项目

    工具:Web Deploy 3.6 点击下载 (强烈推荐使用独立的Web Deploy 安装包安装) 配置: 1.安装web deploy,安装好之后,点击IIS根目录,此处应有如下图标 另外,需要注 ...

  9. php代码基础

    如何接入新浪api <?php function getWeiboData() { $count = 15; // 参数source后面输入你的授权号 $url = "https:// ...

  10. jQuery 邮箱下拉列表自动补全

    综述 我想大家一定见到过,在某个网站填写邮箱的时候,还没有填写完,就会出现一系列下拉列表,帮你自动补全邮箱的功能.现在我们就用jQuery来实现一下. 博主原创代码,如有代码写的不完善的地方还望大家多 ...