Mysql主从配置(一主一从)

发布于 2023-05-13  339 次阅读


目标:主从的原理,怎么实现主从

主从复制的基本原理


复制的类型

  • 异步复制(Asynchronous Replication)
  • 半同步复制(Semisynchronous Replication)
  • 组复制(Group Replication)

1.异步复制

  • 原理简单
  • 对网络延迟要求比较小
  • 不保证日志被传送到了备库,可能会丢失数据

异步复制的原理

2.半同步复制

  • 原理简单
  • 对网络延迟有一定要求,最好在同一机房
  • 可以保证日志被传送到了备库,不易丢失数据
  • rpl_semi_sync_master_timeout 该参数可以设置主从超时时间(默认值:10秒),退化成异步复制(如果备库无法连接,也不会长时间影响主库)
  • 半同步是兼顾数据安全与效率的最好选择

半同步复制的原理

3. 组复制

  • 原理比较复杂
  • 需要依赖共识算法
  • 实际应用比较少
  • 是数据库走向原生分布式的示范

组复制的原理


实现一主一从

异步复制

1.mysql.cnf配置

配置完成后需要重启数据库

主库配置

 -- 主库
[mysqld]
secure_file_priv=/home # mysqldump备份后的路径,你可以设置到你想要的目录
server-id = 1 # 配置服务器ID,2个数据库server-id不一致即可
log_bin = /var/lib/mysql/binlog # 开启binlog,目录/var/lib/mysql/就会有binlog.000001这样的文件

从库配置

 -- 从库
[mysqld]
secure_file_priv=/home # mysqldump备份后的路径,你可以设置到你想要的目录
server-id = 2 # 配置服务器ID,2个数据库server-id不一致即可
log_bin = /var/lib/mysql/binlog # 开启binlog,目录/var/lib/mysql/就会有binlog.000001这样的文件

2.主从数据库配置

主库-查看binlog状态,参数用于后续从库同步使用

 -- 主库
-- 查看binlog读取的位置
SHOW MASTER STATUS;
FilePositionBinlog_Do_DBBinlog_Ignore_DBExecuted_Gtid_Set
binlog.0000331381

主库-全表加读锁,防止binlog备份时被更新

 -- 主库
-- 给主库加上全表读锁
FLUSH TABLES WITH READ LOCK;

主库-全表备份

 # 主库
# mysql5.6给全库备份
mysqldump -uroot -p123456 --all-databases --master-data > dbdump.sql

# mysql8.0给全库备份
mysqldump -uroot -p123456 --all-databases --source-data > dbdump.sql

mysqldump -uroot -p123456 --all-databases --triggers --routines --events  --source-data > dbdump.sql

主库-备份完成后,解锁全表

 -- 主库
-- 解锁
UNLOCK TABLES;

主库-把主库备份的文件复制到从库

 # 主库
# 通过scp传输到从库
scp dbdump.sql root@192.ip.0.0:/home/

# 因为我是开发环境用的是docker
docker cp mysql8:/home/dbdump.sql mysql/app/dbdump.sql
docker mysql/app/dbdump.sql mysql8-slave1:/home/dbdump.sql

从库-导入备份数据

 -- 从库
-- 从库还原
source /home/dbdump.sql

从库-查询状态

 -- 从库
-- 查询一下从库状态
show slave status;

-- 如果已经配置好,可以停止,再重置(如果没有则不需要重置)
stop slave;
reset slave;

从库-配置

 -- 从库
-- 配置从库 mysql5.6
CHANGE MASTER TO
  MASTER_HOST = '<主服务器的主机名>',
  MASTER_PORT = <主服务器的端口号>,
  MASTER_USER = '<复制账户用户名>',
  MASTER_PASSWORD = '<复制账户密码>',
  MASTER_LOG_FILE = '<主服务器的二进制日志文件名>',
  MASTER_LOG_POS = <主服务器的二进制日志位置>;

-- 示例
CHANGE MASTER TO
  MASTER_HOST = 'mysql8', -- 没有使用docker的填写ip即可
  MASTER_PORT = 3306 ,
  MASTER_USER = 'root',
  MASTER_PASSWORD = '123456',
  MASTER_LOG_FILE = 'binlog.000032', -- 上面主库查询出来的数据
  MASTER_LOG_POS = 157; -- 上面主库查询出来的数据

-- 示例 mysql8.0
-- GET_MASTER_PUBLIC_KEY=1, 这个是为了绕过SSL/HTTPS错误
CHANGE REPLICATION SOURCE TO
  GET_MASTER_PUBLIC_KEY=1,
  SOURCE_HOST = 'mysql8',
  SOURCE_PORT = 3306 ,
  SOURCE_USER = 'root',
  SOURCE_PASSWORD = '123456',
  SOURCE_LOG_FILE = 'binlog.000032', -- 上面主库查询出来的数据
  SOURCE_LOG_POS = 157; -- 上面主库查询出来的数据

从库-开启并查看状态

均为yes则异步同步开启成功

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

 -- 从库
-- 开启从库
START SLAVE;

-- 查看从库配置
show slave status \G;

异步复制(GTID)

简化了查询binlog步骤和配置写binlog部分

GTID(Global Transaction Identifier)

  • Mysql5.6引入了GTID
  • GTID可以给事务分配全局唯一ID
  • GTID方便了主从复制的配置,推荐打开
  • GTID对主从切换、故障恢复也有很大意义

如何启动GTID

主从均要设置

 -- 主从库
[mysqld]
secure_file_priv=/home # mysqldump备份后的路径,你可以设置到你想要的目录
server-id = 1 # 配置服务器ID,2个数据库server-id不一致即可
log_bin = /var/lib/mysql/binlog # 开启binlog,目录/var/lib/mysql/就会有binlog.000001这样的文件

# 启动GTID
gtid_mode = no
enforce-gtid-consistency = true

# mysql5.6 半同步复制设置
plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" rpl-semi-sync-master-enabled = 1 rpl-semi-sync-slave-enabled = 1

# mysql8.0 半同步复制设置
plugin-load = "rpl_semi_sync_source=semisync_source.so;rpl_semi_sync_replica=semisync_replica.so" rpl-semi-sync-source-enabled = 1 rpl-semi-sync-replica-enabled = 1

从库配置

 -- 从库
-- 停止
stop slave;

-- 配置从库
-- 示例 Mysql5.6
CHANGE MASTER TO
  MASTER_HOST = 'mysql8',
  MASTER_PORT = 3306 ,
  MASTER_USER = 'root',
  MASTER_PASSWORD = '123456',
  MASTER_AUTO_POSITION = 1;

-- 示例 Mysql8.0
-- GET_MASTER_PUBLIC_KEY=1, 这个是为了绕过SSL/HTTPS错误
CHANGE REPLICATION SOURCE TO
  GET_MASTER_PUBLIC_KEY=1,
  SOURCE_HOST = 'mysql8',
  SOURCE_PORT = 3306 ,
  SOURCE_USER = 'root',
  SOURCE_PASSWORD = '123456',
  SOURCE_AUTO_POSITION = 1;

-- 启动
START SLAVE;

-- 查看从库配置
show slave status \G;

半同步复制

半同步复制需要先完成上面异步复制的操作。

1.mysql.cnf配置

主库配置

 -- 主库
[mysqld]
secure_file_priv=/home # mysqldump备份后的路径,你可以设置到你想要的目录
server-id = 1 # 配置服务器ID,2个数据库server-id不一致即可
log_bin = /var/lib/mysql/binlog # 开启binlog,目录/var/lib/mysql/就会有binlog.000001这样的文件

# mysql5.6
plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" rpl-semi-sync-master-enabled = 1 rpl-semi-sync-slave-enabled = 1

# mysql8.0
plugin-load = "rpl_semi_sync_source=semisync_source.so;rpl_semi_sync_replica=semisync_replica.so" rpl-semi-sync-source-enabled = 1 rpl-semi-sync-replica-enabled = 1

从库配置

 -- 从库
[mysqld]
secure_file_priv=/home # mysqldump备份后的路径,你可以设置到你想要的目录
server-id = 2 # 配置服务器ID,2个数据库server-id不一致即可
log_bin = /var/lib/mysql/binlog # 开启binlog,目录/var/lib/mysql/就会有binlog.000001这样的文件

# mysql5.6
plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" rpl-semi-sync-master-enabled = 1 rpl-semi-sync-slave-enabled = 1

# mysql8.0
plugin-load = "rpl_semi_sync_source=semisync_source.so;rpl_semi_sync_replica=semisync_replica.so" rpl-semi-sync-source-enabled = 1 rpl-semi-sync-replica-enabled = 1

2.半同步复制配置

主库配置

 -- 主库
-- mysql 5.6
-- 启用插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
-- 全局设置
SET GLOBAL rpl_semi_sync_master_enabled = 1;

-----------分隔线--------------

-- mysql8.0
-- 启用插件
INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so'; 

-- 全局设置
SET GLOBAL rpl_semi_sync_source_enabled = 1;

从库配置

 -- 从库
-- mysql 5.6
-- 启用插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
-- 全局设置
SET GLOBAL rpl_semi_sync_slave_enabled = 1;

-----------分隔线--------------

-- mysql8.0
-- 启用插件
INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.so';

-- 全局设置
SET GLOBAL rpl_semi_sync_replica_enabled = 1;

查看是否成功

 -- 主从均可查看
-- 查看是否开启半同步
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';

SHOW GLOBAL VARIABLES LIKE 'rpl_semi_sync%';

参考


间歇性凌云壮志,持续性混吃等死