mysql主从复制

一、mysql主从复制

master-slave
官方参考文档
下图是一个一主两从的架构。

在这里插入图片描述

1. master配置

vim /etc/my.cnf
/etc/init.d/mysqld restart

在这里插入图片描述
在这里插入图片描述

2. slave配置

  1. 初始化slave
# 在master上复制mysql到slave
scp -r /usr/local/mysql/ server2:/usr/local/
scp /etc/my.cnf server2:/etc
# 在slave上对mysql进行初始化
vim /etc/my.cnf
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
vim .bash_profile
source .bash_profile
mkdir -p /data/mysql
useradd -M -d /data/mysql -s /sbin/nologin mysql
id mysql
chown mysql.mysql /data/mysql
mysqld --initialize --user=mysql
/etc/init.d/mysqld start
mysql_secure_installation

在这里插入图片描述

  1. 同步

在slave上面操作,填写关于master的信息。
在这里插入图片描述

在这里插入图片描述

3. 测试

在这里插入图片描述

在这里插入图片描述

4. mysqldump复制

如果是在新的服务器上的slave,由于在master上面操作后,序号发生了变化,无法对之前的内容再次同步,因此选用mysqldump进行复制。

# 在master操作
FLUSH TABLES WITH READ LOCK; # 在mysql里面先对表进行锁定,只读不能写入
mysqldump -p123456 sxl > dump.sql # 对master上的数据库进行备份
scp dump.sql server3:
# 在slave2上面的操作
mysqladmin -p123456 create sxl # 如果没有库,需要先创建库
mysql -p123456 sxl < dump.sql
# 在master操作
UNLOCK TABLES; # 解锁
# 在slave2上面的操作
mysql> CHANGE MASTER TO
    -> MASTER_HOST='192.168.228.11',
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='123456',
    -> MASTER_LOG_FILE='mysql-bin.000001',
    -> MASTER_LOG_POS=1506;
mysql> start slave;
mysql> show slave status\G;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

二、mysql主从半同步复制(GTID)

当读操作远远大于写操作时候,才选用一主多从架构。
问题:
由于master和slave网络连接故障,数据就无法同步了。

解决:
类似于计算机网络里面的停止等待协议。使用半同步模式。这样就可以解决数据丢失的问题。

GTID参考文档-IO
在这里插入图片描述

# 在slave中
mysql> stop slave;
# 在master中
vim /etc/my.cnf
/etc/init.d/mysqld restart
# 在slave中
vim /etc/my.cnf
/etc/init.d/mysqld restart
mysql> stop slave;

在这里插入图片描述

# 在slave中
mysql> CHANGE MASTER TO MASTER_HOST='192.168.228.11', MASTER_USER='repl', MASTER_PASSWORD = '123456', MASTER_AUTO_POSITION = 1;
mysql> start slave;
mysql> show slave status\G;

在这里插入图片描述

GTID参考文档-半同步复制

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; # master操作
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; # slave操作
SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%semi%'; # 查看是否安装成功

SET GLOBAL rpl_semi_sync_master_enabled = 1; # master操作
SET GLOBAL rpl_semi_sync_slave_enabled = 1; # slave操作
STOP SLAVE IO_THREAD; # slave操作
START SLAVE IO_THREAD; # slave操作

在这里插入图片描述

在这里插入图片描述

# 写入/etc/my.cnf,重启后依然生效
rpl_semi_sync_master_enabled=1	# master操作
rpl_semi_sync_slave_enabled=1  # slave操作

在这里插入图片描述

mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%'; # 查看半同步变量
SHOW STATUS LIKE 'Rpl_semi_sync%'; # 查看半同步状态

在这里插入图片描述

停掉两个slave之后,进行操作

在这里插入图片描述

三、mysql多组并行复制

  • 写的操作很多,就需要横向扩容
  • 多组并行复制,使得master-slave都是可以同步和写的

这解决了同步过程中延迟的问题。

1. master操作

# 在所有节点上都执行此操作,保持环境的纯净。
/etc/init.d/mysqld stop
cd /data/mysql/
rm -rf *

在这里插入图片描述

vim /etc/my.cnf

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"


server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW


plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "server1:33061"
group_replication_group_seeds= "server1:33061,server2:33061,server3:33061"
group_replication_bootstrap_group=off

group_replication_ip_whitelist="192.168.228.0/24,127.0.0.1/8"
group_replication_single_primary_mode=0FF
group_replication_enforce_update_everywhere_checks=0N
group_replication_allow_local_disjoint_gtids_join=1

在这里插入图片描述

mysqld --initialize --user=mysql
/etc/init.d/mysqld start 
mysql -p
mysql> alter user root@localhost identified by '123456'; #修改密码
mysql> SET SQL_LOG_BIN=0; # 关闭日志
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY '123456';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1; # 开启日志

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
mysql> SET GLOBAL group_replication_bootstrap_group=ON; # 此操作只在master
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF; # 此操作只在master
mysql> SELECT * FROM performance_schema.replication_group_members; # 查看是否配置成功

在这里插入图片描述

2. slave操作

# 在所有节点上都执行此操作,保持环境的纯净。
/etc/init.d/mysqld stop
cd /data/mysql/
rm -rf *
vim /etc/my.cnf

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"


server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW


plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "server2:33061"
group_replication_group_seeds= "server1:33061,server2:33061,server3:33061"
group_replication_bootstrap_group=off

group_replication_ip_whitelist="192.168.228.0/24,127.0.0.1/8"
group_replication_single_primary_mode=0FF
group_replication_enforce_update_everywhere_checks=0N
group_replication_allow_local_disjoint_gtids_join=1

在这里插入图片描述

mysqld --initialize --user=mysql
/etc/init.d/mysqld start 
mysql -p
mysql> alter user root@localhost identified by '123456'; #修改密码
mysql> SET SQL_LOG_BIN=0; # 关闭日志
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY '123456';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1; # 开启日志

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
mysql> START GROUP_REPLICATION;
mysql> SELECT * FROM performance_schema.replication_group_members; # 查看是否配置成功

在这里插入图片描述

3. 测试

mysql> CREATE DATABASE test;
mysql> USE test;
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
mysql> INSERT INTO t1 VALUES (1, 'Luis');
mysql> SELECT * FROM t1;
mysql> SHOW BINLOG EVENTS;

在三个节点上任意操作,其他节点都会同步操作

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值