目录
- 集群技术
- 简介
- 1、Mysql主从复制类型
- 2、Mysql主从复制原理
- 一、一主一从(M-S) ( 自动GTID )
- 1、一主master1
- 2、一从master2
- 二、双主(M-M)
- 1、master2上创建用户
- 2、master1连接主服务器
- 三、双主双从(M-M-S-S)
- 1、同步现有数据库
- 2、设置从服务器
- 四、IO/SQL不为Yes的情况
集群技术
简介
1、Mysql主从复制类型
- 一主一从
- 主主复制
- 一主多从(扩展系统读取的性能,因为读是在从库读取的)
- 多主一从(5.7开始支持)
2、Mysql主从复制原理
步骤:
- 主库master的更新事件(update、insert、delete)被写到binlog。
- 从库发起连接,连接到主库。
- 此时主库创建一个binlog dump thread线程,把binlog的内容发送到从库
- 从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log。
- 从库还会创建一个SQL线程,从relay log里面读取内容,将更新内容写入到slave的db。
一、一主一从(M-S) ( 自动GTID )
设置master1为master2的主服务器
1、一主master1
(1) 通过vim /etc/my.cnf
修改配置文件,启动二进制日志,服务器ID,GTID
log_bin 二进制开启
server-id=1 服务器 ID
gtid_mode=ON gtid的模式为 开
enforce_gtid_consistency=1 存主从信息的临时表-强制开启
(2)重新启动数据库
systemctl restart mysqld
(3)授权复制用户 rep
grant replication slave,replication client on *.* to 'rep'@'10.8.162.%' identified by 'QianFeng@123';
授权
flush privileges;
手动刷新
(4)备份数据
mysqldump -p'QianFeng@123' --set-gtid-purged=OFF --all-databases --single-transaction --master-data=2 --flush-logs >all.sql
备份主服务器数据库内容
scp all.sql master2:/tmp
备份内容拷贝到从服务器
注:
--all-databases -A 导出全部数据库
--single-transaction 保证导出时数据库的一致性状态
--set-gtid-purged=OFF 从开启GTID的库中导出数据到未开启GTID的库中,在导出的文件中去掉相应的gtid内容
--flush-logs 备份之前刷新binlog日志
master-data=2 在mysqldump出来的文件包含CHANGE MASTER TO这个语句,处于被注释状态
2、一从master2
(1) 通过vim /etc/my.cnf
修改配置文件,启动二进制日志,服务器ID,GTID
server-id=2
gtid_mode = ON
enforce_gtid_consistency=1
master-info-repository=TABLE
relay-log-info-repository=TABLE 从服务器连接主服务器的信息和中继日志存放在master_info和relay_log中
(2)重新启动数据库,让配置生效
systemctl restart mysqld
(3)还恢复手动同步数据
两种方式
1.在数据库外
mysql -uroot -p'QianFeng@123' < /tmp/2020-1-1-mysql-full.sql
2.在数据库内
source /tmp/2020-1-1-mysql-full.sql
(4)在 从 上设置主服务器
mysql> change master to
master_host='master1', 主服务器名(域名解析/IP)
master_user='rep', 主库的授权用户为 rep
master_password='QianFeng@123', 授权用户rep登录数据库的密码
master_auto_position=1; 主库 自动位置 开启
(5)启动slave,并查看是否成功
start slave;
show slave status\G; 查看状态是否为双 YES
(6)验证
二、双主(M-M)
目前已经设置master1为master2的主服务器,只需设置master2为master1的主服务器
1、master2上创建用户
grant replication slave,replication client on *.* to 'rep'@'10.8.162.%' identified by 'QianFeng@123';
授权
flush privileges;
手动刷新
2、master1连接主服务器
(1)在master1上设置主服务器(master2)
mysql>change master to
master_host='192.168.0.104',
master_user='feng',
master_password='123456',
master_auto_position=1;
(2)启动 从 master1,查看IO和SQL是否为双Yes
start slave;
show slave status\G
三、双主双从(M-M-S-S)
设置master1和master2主服务器 ,设置 slave1 和 slave2 从服务器
原理:
多源复制加入了一个叫做Channel的概念, 每一个Channel都是一个独立的Slave,都有一个IO_THREAD和SQL_THREAD。原理和普通复制一样。我们只需要对每一个Master执行Change Master 语句,只需要在每个语句最后使用For Channel来进行区分。
由于复制的原理没有改变,在没有开启GTID的时候Master的版本可以是MySQL5.5、5.6、5.7。并且从库需要master-info-repository、relay-log-info-repository设置为table
,否则会报错。
1、同步现有数据库
(1)master1导出所有数据
mysqldump -p'QianFeng@123' --set-gtid-purged=OFF --all-databases --single-transaction --master-data=2 --flush-logs > -all.sql
注:
主库 master1 备份内容 ( 已经是双主,只备份一个库即可 )
slave1 和 slave2从服务器操作一样
(2)把主库备份内容导入到Slave中,保持数据一致
scp -r all.sql slave1:/tmp
2、设置从服务器
(1)通过vim /etc/my.cnf
修改配置文件,启动 slave 1 从服务器ID,gtid
server-id=3
gtid_mode=ON
enforce_gtid_consistency=1
master-info-repository=TABLE
relay-log-info-repository=TABLE
(2)重新启动数据库,让配置生效
systemctl restart mysqld
(3)设置从服务器
mysql> change master to #master 1 设置主服务器
master_host='10.8.162.14',
master_user='rep',
master_password='QianFeng@123',
master_auto_position=1 for channel '10.8.162.14';
mysql> change master to #master 2 设置主服务器
master_host='10.8.162.81',
master_user='rep',
master_password='QianFeng@123',
master_auto_position=1 for channel '10.8.162.81';
(4)启动slave 1,双主一从设置成功了,slave1 和 slave2 从服务器操作一样
四、IO/SQL不为Yes的情况
如果同步效果不正常,进行以下操作:
在2台机器数据保持一致的情况下。
从节点:
stop slave; 停止同步
reset slave; 清除主节点信息
主节点:
reset master; 清除bin1og日志
再来到从节点:
change master to.....
注:
reset slave
:删除master.info文件和relay-log.info 文件以及所有的relay log 文件并重新启用一个新的relaylog文件。
reset slave all
:删除所有信息
reset master
:将删除日志索引文件中记录的所有binlog文件,创建一个新的日志文件 起始值从000001 开始。
reset master 不能用于有任何slave 正在运行的主从关系的主库。因为在slave 运行时刻 reset master 命令不被支持,reset master 将master 的binlog从000001 开始记录,slave 记录的master log 则是reset master 时主库的最新的binlog,从库会报错无法找的指定的binlog文件。