一、复制概述

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. AD域撤销域用户管理员权限方案

    一.简介 公司大部分主机加入域已有一段时间了,由于某软件没管理员权限不能执行,所以管理员权限一直没撤销,不能完全实现域的管理效果.但起码实现了域用户脱离不了域的控制:http://www.cnblog ...

  2. 基于英特尔® 至强™ 处理器 E5 产品家族的多节点分布式内存系统上的 Caffe* 培训

    原文链接 深度神经网络 (DNN) 培训属于计算密集型项目,需要在现代计算平台上花费数日或数周的时间方可完成. 在最近的一篇文章<基于英特尔® 至强™ E5 产品家族的单节点 Caffe 评分和 ...

  3. L2-011. 玩转二叉树

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA28AAAHQCAIAAAC5rsUiAAAgAElEQVR4nO3dzYts953n+foXcpUL0Q

  4. hibernate三种状态

    转自:http://www.cnblogs.com/xiaoluo501395377/p/3380270.html 学过hibernate的人都可能都知道hibernate有三种状态,transien ...

  5. 连接有密码的mongodb

    mongoose: db.openSet("mongodb://admin:pass@192.168.1.100:27017/mydb");

  6. SQL Server中行列转换 Pivot UnPivot

    SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...

  7. 做中学(Learning by Doing)之背单词-扇贝网推荐

    做中学(Learning by Doing)之背单词-扇贝网推荐 看完杨贵福老师(博客,知乎专栏,豆瓣)的「继续背单词,8个月过去了」,我就有写这篇文章的冲动了,杨老师说: 有时候我会感觉非常后悔,如 ...

  8. HDU3068 回文串 Manacher算法

    好久没有刷题了,虽然参加过ACM,但是始终没有融会贯通,没有学个彻底.我干啥都是半吊子,一瓶子不满半瓶子晃荡. 就连简单的Manacher算法我也没有刷过,常常为岁月蹉跎而感到后悔. 问题描述 给定一 ...

  9. Fragment完全解析

    Android Fragment 的使用,一些你不可不知的注意事项 Fragment全解析系列(一):那些年踩过的坑 Fragment全解析系列(二):正确的使用姿势 Fragment之我的解决方案: ...

  10. PHP的CURL

    使用CURL完成一个请求: 初始化连接句柄 设置CURL选项 执行并获取结果 释放CURL连接句柄 发送GET请求 function doGetRequest($url,$data,$timeout ...