常见两种模式“一主多从”和“级联复制”两种,基本都很简单,都是依赖binlog日志文件进行同步,binlog日志会记录DDL和部分DDL语句,进行同步时从库会重新执行这些语句从而实现主从同步。
配置主/从服务器的server_id
,如果不清楚mysql服务器server_id,使用命令 SHOW VARIABLES LIKE 'server_id';
可以查询,server_id的值没有严格规定,保证全局唯一性即可,server_id值默认是1。
debian服务器编辑命令如下:nano /etc/mysql/my.conf ,加入下面节点,假设主库设置1,从库设置2,保存之后重启数据库systemctl restart mysql
[mysqld]
server-id=1 #主库配置加入
[mysqld]
server-id=2 #从库配置加入
步骤2(非必要):
主机上执行 show master status;
显示最新的日志文件和当前位置。
File当前正在写入的二进制日志文件名。
Position当前二进制日志文件的偏移量,表示下一个要写入的位置。
Binlog_Do_DB主服务器上配置的需要记录到二进制日志中的数据库。
Binlog_Ignore_DB主服务器上配置的不需要记录到二进制日志中的数据库。
Executed_Gtid_Set在 GTID 模式下,该属性表示已经执行过的全局事务标识符的集合
步骤3:
从服务器连接主服务器进行主从同步,在从服务器上面执行如下代码:
CHANGE REPLICATION SOURCE to
SOURCE_HOST='192.168.3.107',
SOURCE_USER='root',
SOURCE_PASSWORD='1234',
SOURCE_LOG_FILE='binlog.000009',
SOURCE_LOG_POS=0;
SOURCE_HOST:主库连接地址
SOURCE_USER:账号
SOURCE_PASSWORD:密码
SOURCE_LOG_FILE:主库当前二进制文件名
SOURCE_LOG_POS:当前二进制日志文件的偏移量
执行完成之后可以通过show REPLICA status;
可以查看复制集群状态,通过如下命令可以启动,暂停,删除集群。
show REPLICA status; #查看
start REPLICA; #开始
stop REPLICA; #暂停
RESET REPLICA ALL; #删除
通过设置SOURCE_HOST地址连接主库或从库,就可以轻松实现一主多从,或一主一从一从的链式架构。
GTID 模式(推荐)
主从复制中mysql提供一种GTID 模式,SHOW GLOBAL VARIABLES LIKE 'gtid_mode';
查看Gtid模式的状态。gtid是一种新的日志格式,gtid每个事务都有一个唯一的GTID,保证了事务在整个复制拓扑中的唯一性,主要与传统日志格式区别就是以事务为单位而传统日志是基于日志位置。
RESET MASTER;
重置主库的binlog日志,注意一旦重置日志将丢失所有日志数据,将从00001开始,编辑nano /etc/mysql/my.cnf
,各个数据库的server_id按1-5排序下去,主库和从库都需要配置。
[mysqld]
server-id=1
gtid_mode=on
enforce_gtid_consistency=true
gtid_mode:开启gtid模式。
enforce_gtid_consistency:强制GTID一致性,这有助于提高数据的可靠性和一致性,防止数据丢失或损坏。
从库执行如下代码:
CHANGE REPLICATION SOURCE to
SOURCE_HOST='192.168.3.107',
SOURCE_USER='root',
SOURCE_PASSWORD='123',
SOURCE_AUTO_POSITION=1;
你会发现SOURCE_LOG_FILE和SOURCE_LOG_POS将不再需要填写,因为gtid的好处之一就是会自动定位日志文件和位置,减少配置复杂性。其它的集群管理与传统的命令一致。
#主库常用命令
show master status #查看主库状态
reset master; #重置主库binlog日志
#从库常用命令
show replica status; #查看从库状态
start replica; #开始同步
stop replica; #暂停同步
reset replica all; #重置(删除)全部同步
select * from performance_schema.replication_applier_status_by_worker; #查看同步线程的信息(主要用于查看具体报错信息)
#其它
show variables like 'server_id'; #查看server_id
show global variables like 'gtid_mode'; #查看gtid状态