快速笔记02-MySQL主从复制原理半同步操作步骤及原理

==========================================================
一:MySQL主从复制规划

主库:(MySQL master) IP:10.0.0.52 PROT:3306从库1:(MySQL slave) IP:10.0.0.52 PORT:3307从库2:(MySQL slave) IP:10.0.0.52 PORT:3308

==========================================================
二:检查环境
(1)检查MySQL数据库多实例是否启动

netstat -lntup|grep 330tcp        0      0 0.0.0.0:3306         0.0.0.0:*     LISTEN      20434/mysqld        tcp        0      0 0.0.0.0:3307         0.0.0.0:*     LISTEN      15120/mysqld        tcp        0      0 0.0.0.0:3308         0.0.0.0:*     LISTEN      19578/mysqld

(2)开启MySQL主库的Binlog功能

 grep log-bin /data/3306/my.cnf

(3)设置server-id,此处ID不可以相同否则最后出现IO错误

 grep server-id /data/{3306,3307,3308}/my.cnf/data/3306/my.cnf:server-id = 1/data/3307/my.cnf:server-id = 3/data/3308/my.cnf:server-id = 8

==========================================================
三:因为从库现在还没有数据,或者数据不统一我们需要导入数据

wget ftp://10.0.0.1/backup-mysql-salt.tar.gztar xf backup-mysql-salt.tar.gzzcat /root/bak_2016-07-27.sql.gz|mysql -uroot -poldboy -S /data/3306/mysql.sockmysql -uroot -poldboy -S /data/3306/mysql.sockshow databases; #检查数据库是否导入select user,host from mysql.user;

==========================================================
四:主库上面的操作(3306)
(1)主库需要授权slave访问的用户rep

mysql -uroot -poldboy -S /data/3306/mysql.sock #登录第一个实例的MySQL数据库grant replication slave on *.* to ‘rep‘@‘172.16.1.%‘ identified by ‘oldboy123‘;flush privileges;show grants for [email protected]‘172.16.1.%‘; #查看用户的权限select user,host from mysql.user;

提示:replication slave 为mysql同步的必须权限,此处不要授权all权限
(2)锁表、查看binlog文件及位置点,主库导出全备,需要锁表(-x –master-date=2)

flush table with read lock; #锁表,窗口不能退出,退出失效show master status; #锁表后查看主库状态,临界点,将来恢复就从0004开始| mysql-bin.000004 |   600457 |              |                  |

(3)将MySQL主库的数据进行备份

mkdir /server/backup/ -pmysqldump -uroot -poldboy123 -S /data/3306/mysql.sock -A -B --events|gzip >/server/backup/rep3307_bak$(date +%F).sql.gz #由于之前导入的数据库为全量的所以以前的密码为oldboy123ls -lrt /server/backup/

(4)解锁MySQL数据库的数据表,并查看msater的状态

unlock table; #解锁MySQL数据库的数据表show master status;

提示:如果解锁之后还是mysql-bin.000004 说明是正确的,如果动了说明没有锁住表
提示:如果mysqldump 加了-F 他就会更改刷新binlog

五:从库1上面的操作(3307)
提示:一定要确保从库的server_id与从库的不同

grep server-id /data/{3306,3307}/my.cnf /data/3306/my.cnf:server-id = 1/data/3307/my.cnf:server-id = 3

(1)把主库的备份数据导入到从库

cd /server/backup/gzip -d rep3307_bak2016-07-29.sql.gzmysql -uroot -poldboy -S /data/3307/mysql.sock <rep3307_bak2016-07-29.sql

提示从库的密码为oldboy
(2)登录从库检查主库1查看数据是否导入成功

mysql -uroot -poldboy -S /data/3307/mysql.sockshow databases;select user,host from mysql.user;

(3)刷新用户的权限

flush privileges;

(4)查找位置点,配置master.info,以下为主库的位置点

show master status; (主数据库执行此命令)| mysql-bin.000004 |   600457 |              |                  |CHANGE MASTER TO MASTER_HOST=‘172.16.1.52‘,  #这是主库的IP(域名也可以需要做解析)MASTER_PORT=3306,              #主库的端口,从库端口和主库不可以相同MASTER_USER=‘rep‘,            #这是主库上创建用来复制的用户repMASTER_PASSWORD=‘123456‘    #rep的密码MASTER_LOG_FILE=‘mysql-bin.000025‘, #这里是show master status时看到的查询二进制日志文件名称,这里不能多空格MASTER_LOG_POS=9155;       #这里是show master status时看到的二进制日志偏移量,不能多空格

提示:3307操作此步:会在/data/3307/data下面产生master.info文件
(5)登录3307从库,配置复制参数,去掉上述语句中的注释,执行如下

mysql -uroot -poldboy -S /data/3307/mysql.sockCHANGE MASTER TO MASTER_HOST=‘172.16.1.61‘,MASTER_PORT=3306,MASTER_USER=‘rep‘,MASTER_PASSWORD=‘oldboy123‘,MASTER_LOG_FILE=‘mysql-bin.000003‘,MASTER_LOG_POS=600457;Query OK, 0 rows affected (0.02 sec) #出现此信息表示成功

提示:3307操作此步:会在/data/3307/data下面产生master.info文件

ll /data/3307/data/master.info

(6)上述步骤成功后,开启从库复制开关。

start slave;show slave status\G #G后面一定不要加封号,会报错的

(7)主从是否成功,最关键的为下面的3项状态参数

mysql -uroot -poldboy123 -S /data/3307/mysql.sock -e "show slave status\G"|egrep "IO_Running|SQL_Running|_Behind_Master"Slave_IO_Running: Yes #这个是I/O线程状态,状态为Yes表示I/O线程工作正常Slave_SQL_Running: Yes #这个是SQL线程状态,状态为Yes表示I/O线程工作正常Seconds_Behind_Master: 0 #这是个复制过程中,从库比主库的延迟的秒数

(8)测试主库与从库是否同步
1.在主库添加一个新的数据库chris

create database chris;

2.检查从库是否有chris这个数据库

mysql> show databases;| chris              |

删除主库的chirs数据库检查从库是否删除

drop database chris; (主库执行)mysql> show databases; (从库执行)

==========================================================
六:从库2上的操作(3308)快速配置
思路:因为我们已经有了一个MySQL从库,所以只需将3307的从库复制到3308即可
(1)从主库中导出数据库,导入从库

mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock -B -F --master-data=1 -A --events|gzip >/server/backup/rep3308_bak$(date +%F).sql.gz 提示:--master-data=1会将备份时的位置点记录下来CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000009‘, MASTER_LOG_POS=107;

(2)将数据导入从库3308

cd /server/backup/gzip -d rep3308_bak2016-07-29.sql.gzmysql -uroot -poldboy -S /data/3308/mysql.sock < ./rep3308_bak2016-07-29.sql

(3)检查3308数据库是否生成master.info文件

ll /data/3308/data/master.info

(4)登录3308从库,配置复制参数

mysql -uroot -poldboy -S /data/3308/mysql.sockCHANGE MASTER TO MASTER_HOST=‘172.16.1.52‘,MASTER_PORT=3306,MASTER_USER=‘rep‘,MASTER_PASSWORD=‘oldboy123‘;

(5)上述步骤成功后,开启从库复制开关。

start slave;show slave status\G #G后面一定不要加封号,会报错的

(6)主从是否成功,最关键的为下面的3项状态参数

mysql -uroot -poldboy123 -S /data/3307/mysql.sock -e "show slave status\G"|egrep "IO_Running|SQL_Running|_Behind_Master"Slave_IO_Running: Yes #这个是I/O线程状态,状态为Yes表示I/O线程工作正常Slave_SQL_Running: Yes #这个是SQL线程状态,状态为Yes表示I/O线程工作正常Seconds_Behind_Master: 0 #这是个复制过程中,从库比主库的延迟的秒数

==========================================================
七:当我们使用show slave status\G查看主从复制出现故障时,可以看情况跳过
(1)临时停止同步开关

stop slave;

(2)将同步指针向下移动一个,如果多次不同步可以重复操作

set global sql_slave_skip_counter =1;

(3)开启同步开关

start slave;

(4)查看同步信息是否正常

show slave status\G

==========================================================
八:测试主库与从库是否可以实现同步

mysql -uroot -poldboy123 -S /data/3306/mysql.sockmysql -uroot -poldboy123 -S /data/3307/mysql.sockmysql -uroot -poldboy123 -S /data/3308/mysql.sock

(1)在主库上创建一个数据库

create database liyajin;(主库执行)

(2)查看从库1,从库2是否有同步过来

show databases; (从库1执行)| liyajin            |show databases; (从库2执行)| liyajin            |

(3)将主库中的liyajin数据库删除,

mysql> drop database liyajin; (主库执行)

(4)查看从库是否也会删除

show databases; (从库1执行)show databases; (从库2执行)

(5)最后查看从库的同步状态是否有错误,如果没有错误则MySQL主从复制配置成功

show slave status\G

提示:一般删除数据库都会有提示同步错误,我们需要设置忽略错误即可

九:现在我们来将配置好的MySQL数据库打包成RPM包

依赖包:ncurses-devel libaio-devel cmake

将LAMP环境进行RPM打包

(1):设置打包完成后执行的脚本

mkdir /server/scripts/ -pvim /server/scripts/mysql-init.sh#!/bin/bashuseradd -u 505 mysql -s /sbin/nologin -Mchown -R mysql.mysql /data//data/3306/mysql start/data/3307/mysql start/data/3308/mysql start\cp /application/mysql/bin/* /usr/local/sbin/cat >>/etc/rc.local<<EOF#mysql multi instances/data/3306/mysql start/data/3307/mysql start/data/3308/mysql startEOF

(3):LAP一键RPM包打包(打包以前要关闭数据库)

/data/3306/mysql stop/data/3307/mysql stop/data/3308/mysql stopfpm -s dir -t rpm -n mysqld -v 1.0 --description ‘3306,3307,3308‘ -d ‘ncurses-devel libaio-devel cmake‘ --post-install /server/scripts/mysql-init.sh /application /usr/local/lib/ /usr/local/bin/ /data/

总结:
三个实例数据库密码都是oldboy123
(4)将制作完成的RPM上传到服务器上安装即可

yum -y localinstall lamp-1.0-1.x86_64.rpm

(5)安装完成以后的检查80与3306端口是否打开

ll /application/netstat -ltnp

(2)配置YUM客户端-客户端配置

cd /etc/yum.repos.d/rm -f /etc/yum.repos.d/{CentOS-Base.repo,epel.repo}mv CentOS-Base.repo CentOS-Base.repo.bakcat >/etc/yum.repos.d/etiantian.repo<<EOF[etiantian]name=Serverbaseurl=http://10.0.0.61enabled=1gpgcheck=0EOFyum clean allyum makecacheyum repolistcd
时间: 2024-10-05 00:34:28

快速笔记02-MySQL主从复制原理半同步操作步骤及原理的相关文章

MySQL主从复制:半同步、异步

MySQL主从复制:半同步.异步 大纲 前言 如何对MySQL进行扩展? MySQL Replication WorkFlow MySQL主从复制模式 实战演练 MySQL异步复制实现 MySQL半同步复制实现 实验中的思考 总结 前言 本篇我们介绍MySQL Replication的相关内容, 我们首先介绍MySQL CLuster的实现原理和如何一步步构建一个MySQL Replication Cluster 看懂本文需要了解: MySQL基本操作,MySQL日志类型及其作用 如何对MySQ

MySQL主从复制介绍:使用场景、原理和实践

MySQL主从复制介绍:使用场景.原理和实践 MySQL数据库的主从复制方案,和使用scp/rsync等命令进行的文件级别复制类似,都是数据的远程传输,只不过MySQL的主从复制是其自带的功能,无需借助第三方工具,而且,MySQL的主从复制并不是数据库磁盘上的文件直接拷贝,而是通过逻辑的binlog日志复制到要同步的服务器本地,然后由本地的线程读取日志里面的SQL语句重新应用到MySQL数据库中. 1.1.1 MySQL主从复制介绍 MySQL数据库支持单向.双向.链式级联.环状等不同业务场景的

Mysql 主从复制之半同步复制(基于gtid)

Mysql主从复制mysql主从复制原理:从库有两个线程IO线程和SQL线程1.从库的IO线程向主库的主进程发送请求,主库验证从库,交给主库IO线程负责数据传输;2.主库IO线程对比从库发送过来的master.info里的信息,将binlog文件信息,偏移量和binlog文件名等发送给从库3.从库接收到信息后,将binlog信息保存到relay-bin中,同时更新master.info的偏移量和binlog文件名4.从库的SQL线程不断的读取relay-bin的信息,同时将读到的偏移量和文件名写

mysql主从复制、半同步复制、主主复制、及从库升级为主库讲解

一.主从复制结构 binlog dump --- io thread  ---  relay log ---- sql thread 1.总体讲解 主从复制时是异步的 半同步是在主从架构下安装插件来达到半同步的 半同步的优点:保证至少一个节点的数据和主节点的数据一致,缺点影响性能 导致主从不同步的原因是 现在的服务器都是单核多线程或者多核多线程,导致主节点可以同时执行多条读写操作,而记录二进制日志则必须按顺序有先后的记录,从节点在一条一条复制过去,生成中继日志,再执行语句. 多个库复制的话,可以

mysql主从复制异步半同步实例

建立mysql的复制 node1: mysql> show master status;+------------------+----------+--------------+------------------+-------------------+| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+-----

MySQL主从复制、半同步复制和主主复制

同步,异步,半同步复制的比较: 同步复制:Master提交事务,直到事务在所有的Slave都已提交,此时才会返回客户端,事务执行完毕.缺点:完成一个事务可能会有很大的延迟. 异步复制:当Slave准备好才会向Master请求binlog.缺点:不能保证一些事件都能够被所有的Slave所接收. 半同步复制:半同步复制工作的机制处于同步和异步之间,Master的事务提交阻塞,只要一个Slave已收到该事务的事件且已记录.它不会等待所有的Slave都告知已收到,且它只是接收,并不用等其完全执行且提交.

mysql主从复制中的半同步复制

实验mysql借助google提供的插件,完成半同步复制模型: 物理机依然是win7系统,虚拟机为centos7: 主节点:192.168.255.2 从节点:192.168.255.3 先配置为主从复制模型: 在主节点: ]# vim /etc/my.cnf 从节点: ]# vim /etc/my.cnf 启动两节点的myslq服务: ]# systemctl start mariadb.service 在主节点: 配置有复制权限的账号: > GRANT REPLICATION SLAVE,R

Mysql主从复制、读写分离工作原理+配置

Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysqlinstance(我们称之 Slave).在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程)在 Slave 端,另外一个线程(IO线程)在 Master 端. MySQL 复制的基本过程如下: 1. Slave 上面的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开

mysql主从复制架构及实现

MySQL主从复制架构及实现 1.原理: 复制功能及作用: 数据分布 负载均衡:进行读操作的负载均衡,适用于读密集型的应用 可以用于备份 高可用和故障切换 MySQL的升级测试 主从复制: 从服务器:     IO线程:从master请求二进制日志信息,并保存至中继日志:     SQL线程:从relay log中读取日志信息,在本地完成重放: 主节点:     dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于向其发送binary log events: