MySQL 5.7 - Replication

MySQL 5.7 - Replication

Links

16.1 Configuring Replication

16.1.1 Binary Log File Position Based Replication Configuration Overview

16.1.2 Setting Up Binary Log File Position Based Replication

16.1.2.1 Setting the Replication Master Configuration

[mysqld]
log-bin=mysql-bin
server-id=<unique_int,min:1,max:2^32-1>

#innodb_flush_log_at_trx_commit=1
#sync_binlog=1

Links:

16.1.2.2 Creating a User for Replication

在 master 节点单独创建一个仅为 replication 存在的用户。

CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.example.com';

for examples:

CREATE USER 'repl'@'192.168.3.%' IDENTIFIED BY 'Replication.0';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'192.168.3.%';

16.1.2.3 Obtaining the Replication Master Binary Log Coordinates

16.1.2.4 Choosing a Method for Data Snapshots

16.1.2.5 Setting Up Replication Slaves

16.1.2.6 Adding Slaves to a Replication Environment

16.1.3 Replication with Global Transaction Identifiers

16.1.3.1 GTID Format and Storage

16.1.3.2 GTID Life Cycle

16.1.3.3 GTID Auto-Positioning

16.1.3.4 Setting Up Replication Using GTIDs

前置准备工作请查阅源文档。

第1步:同步服务器。 只有在不使用 GTID 的情况下复制已经复制的服务器时,才需要执行此步骤。对于新服务器,请继续执行步骤3。通过发出以下命令,通过在每台服务器上设置 read_only 系统变量为 ON, 使服务器成为只读:

mysql> SET @@GLOBAL.read_only = ON;

等待所有正在进行的事务提交或回滚。然后,让 slave 赶上 master。在继续之前确保 slave 已处理所有更新是非常重要的。

如果将二进制日志用于复制以外的任何其他日志,例如进行即时备份和还原,请等待直到不需要 包含没有GTID的事务的旧二进制日志。理想情况下,等待服务器清除所有二进制日志,并等待任何现有备份过期。

重要
重要的是要了解包含没有GTID的事务的日志不能在启用了GTID的服务器上使用。在继续之前,您必须确保拓扑中的任何位置都不存在没有GTID的事务。

第2步:停止两台服务器。 使用 mysqladmin 停止每个服务器,如下所示,username是具有足够权限来关闭服务器的MySQL用户:

shell> mysqladmin -uusername -p shutdown

步骤3:启用两台启用了GTID的服务器。 要启用基于 GTID 的复制,每个服务器必须通过将 gtid_mode 变量设置为 ON 来启动 GTID 模式,并启用 enforce_gtid_consistency 变量以确保仅记录对基于GTID的复制安全的语句。例如:

cat >> /etc/my.cnf << EOF
# Replication
gtid_mode=ON
enforce-gtid-consistency=true

EOF

Links:

此外,在配置从站设置之前,应该使用 --skip-slave-start 选项启动从站。master 必须始终启用二进制日志记录才能进行复制。slave 在使用 mysql.gtid_executed 表时,不必强制启用二进制日志记录以使用 GTID 。如果需要在从属服务器上禁用二进制日志记录,可以通过指定从属服务器 --skip-log-bin--skip-log-slave-updates 选项来执行此操作 。

# 永久更改 mysqld 的环境变量 MYSQLD_OPTS
# method 1 (NOT Recommended):
vim /usr/lib/systemd/system/mysqld.service
systemctl reload
# method 2 (Recommend):
echo "MYSQLD_OPTS='--skip-slave-start --skip-log-bin --skip-log-slave-updates'" >> /etc/sysconfig/mysql
# method 3:
systemctl edit mysqld
>
[Service]
Environment="MYSQLD_OPTS='--skip-slave-start --skip-log-bin --skip-log-slave-updates'"
>

# 临时更改 mysqld 的环境变量 MYSQLD_OPTS
systemctl set-environment MYSQLD_OPTS='--skip-slave-start --skip-log-bin --skip-log-slave-updates'

systemctl status mysqld
systemctl restart mysqld
ps -ef | grep mysqld

Links:

步骤4:配置从站以使用基于GTID的自动定位。 告诉从属设备使用具有基于 GTID 的事务的主服务器作为复制数据源,并使用基于 GTID 的自动定位而不是基于文件的定位。在 slave 上发出 CHANGE MASTER TO 声明,包括MASTER_AUTO_POSITION 选项,告诉 slave, master 的交易是由 GTID 识别的。

您可能还需要为主服务器的主机名和端口号提供适当的值,以及复制用户帐户的用户名和密码,从服务器可以使用该帐户连接到主服务器;如果已经在步骤1之前设置了这些,并且不需要进行进一步的更改,则可以从此处显示的语句中安全地省略相应的选项。

mysql -uroot -ppassw0rd
CHANGE MASTER TO
    MASTER_HOST = 'rack6-4.discluster2',
    MASTER_PORT = 3306,
    MASTER_USER = 'repl',
    MASTER_PASSWORD = 'Replication.0',
    MASTER_AUTO_POSITION = 1;

无论是 MASTER_LOG_FILE 还是 MASTER_LOG_POS 都不要在 MASTER_AUTO_POSITION 等于 1 时使用。尝试这样做会导致 CHANGE MASTER TO 失败引发错误。

如果要清除 master 的连接数据:

STOP SLAVE;
RESET SLAVE ALL;
SHOW SLAVE STATUS \G;

Links:

步骤5:进行新备份。 由于您已启用 GTID,因此在启用 GTID 之前创建的现有备份现在无法在这些服务器上使用。此时进行新备份,这样您就不会没有可用的备份。

例如,您可以 FLUSH LOGS 在要进行备份的服务器上执行。然后显式地进行备份或等待您可能已设置的任何定期备份例程的下一次迭代。

步骤6:启动从站并禁用只读模式。 像这样启动 slave:

START SLAVE;
SHOW SLAVE STATUS \G;

仅当您在 步骤1 中将服务器配置为只读时,才需要执行以下步骤。要允许服务器再次开始接受更新 (建议维持 slave 的只读模式),请发出以下语句:

SET @@GLOBAL.read_only = OFF;

参考:

set read_only and super_read_only on slaves:

vim /etc/my.cnf
>
[mysqld]
read_only = 1
super_read_only = 1
>

remove SUPER privileges from normal users:

UPDATE mysql.user SET super_priv='N' WHERE user!='root' AND user!='mysql.session';
FLUSH PRIVILEGES;
SELECT Host,User,super_priv FROM mysql.user;

注意: 当 master 中有二进制日志不能在 slave 中复现时,可能会报错,例如:

Error 'Table 'xxxxx.xxxx' doesn't exist' on query.:

参考 主从复制错误处理总结, 经测试,删除 slave_skip_errors=1146 后依然会报错,不推荐。

参考 Mysql开启GTID后遇到错误跳过方法, 只适用于跳过少量错误, 不推荐。

参考 GTID,以下演示手动批量备份包含GTID的数据库:

dump all databases:

## on master server:

mysqldump -uroot -ppassw0rd --single-transaction --set-gtid-purged=on --triggers --routines --events --all-databases > /data/share/backups/db/mysql/rack6-2/rack6-2.$(date +%y%m%d.%H%M%S)
mysqldump -uroot -ppassw0rd --single-transaction --set-gtid-purged=on --triggers --routines --events --all-databases > /data/share/backups/db/mysql/rack6-4/rack6-4.$(date +%y%m%d.%H%M%S)

## on slave server:

mysql -uroot -ppassw0rd
mysql>
STOP SLAVE;
RESET MASTER;
mysql>

# rack6-3
mysql -uroot -ppassw0rd < /data/share/backups/db/mysql/rack6-2/rack6-2.190122.171128
# rack6-5
mysql -uroot -ppassw0rd < /data/share/backups/db/mysql/rack6-4/rack6-4.190122.170416

or, dump some databases:

## on master server:

## backups one database:
mysqldump -uroot -ppassw0rd --single-transaction --set-gtid-purged=on --triggers --routines --events scm > /data/share/backups/db/mysql/scm/scm.$(date +%y%m%d)
## backups many databases:
mysqldump -uroot -ppassw0rd --single-transaction --set-gtid-purged=on --triggers --routines --events --databases amon hive hue oozie > /data/share/backups/db/mysql/rack6-4/rack6-4.$(date +%y%m%d)

## on slave server:

mysql -uroot -ppassw0rd
mysql>
STOP SLAVE;
RESET MASTER;
mysql>

mysql -uroot -ppassw0rd scm < /data/share/backups/db/mysql/scm/scm.190121
mysql -uroot -ppassw0rd < /data/share/backups/db/mysql/rack6-4/rack6-4.190121

after above:

START SLAVE;
SHOW SLAVE STATUS \G;

其他参考:

16.1.3.5 Using GTIDs for Failover and Scaleout

16.1.3.6 Restrictions on Replication with GTIDs

16.1.3.7 Stored Function Examples to Manipulate GTIDs

16.1.4 MySQL Multi-Source Replication

16.1.5 Changing Replication Modes on Online Servers

16.1.5.1 Replication Mode Concepts

16.1.5.2 Enabling GTID Transactions Online

## check mysql version
mysql --version
mysqld --version
SHOW GLOBAL VARIABLES LIKE 'gtid_mode';
SELECT @@global.gtid_mode;

SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;

16.1.5.3 Disabling GTID Transactions Online

16.1.5.4 Verifying Replication of Anonymous Transactions

16.1.6 Replication and Binary Logging Options and Variables

16.1.7 Common Replication Administration Tasks

16.1.7.1 Checking Replication Status

SHOW SLAVE STATUS\G;
SHOW PROCESSLIST \G;
SHOW SLAVE HOSTS;

16.1.7.2 Pausing Replication on the Slave

mysql> STOP SLAVE;
mysql> STOP SLAVE IO_THREAD;
mysql> STOP SLAVE SQL_THREAD;
mysql> START SLAVE;
mysql> START SLAVE IO_THREAD;
mysql> START SLAVE SQL_THREAD;

16.2 Replication Implementation

16.3 Replication Solutions

16.3.1 Using Replication for Backups

16.3.2 Handling an Unexpected Halt of a Replication Slave

16.3.3 Using Replication with Different Master and Slave Storage Engines

16.3.4 Using Replication for Scale-Out

16.3.5 Replicating Different Databases to Different Slaves

注意: 如果 slave 只需要同步固定几个数据库,可以使用这些限制,否则不推荐使用。

您可以通过正常配置主站和从站来实现此分离,然后在每个从站上使用 --replicate-wild-do-table 配置选项限制每个从站进程的二进制日志语句 。

重要
使用基于语句的复制时,你应该不使用 --replicate-do-db,因为在使用基于语句的复制(SBR)时,根据当前选择的数据库的不同,该选项的效果也可能不同。这也适用于混合格式复制,因为可能会使用基于语句的格式复制某些更新。
但是,如果仅使用基于行的复制(RBR),则应该可以安全地使用 --replicate-do-db,因为在这种情况下,当前选定的数据库对选项的操作没有影响。

参考:

vim /etc/sysconfig/mysql
>
## SBR,RBR,Mixed
MYSQLD_OPTS='--replicate-wild-do-table=mysql.% --replicate-wild-do-table=amon.% --replicate-wild-do-table=hive.% --replicate-wild-do-table=hue.% --replicate-wild-do-table=oozie.%'

## RBR
MYSQLD_OPTS='--replicate-do-db=mysql --replicate-do-db=amon --replicate-do-db=hive --replicate-do-db=hue --replicate-do-db=oozie'
>

systemctl restart mysqld
systemctl status mysqld

16.3.6 Improving Replication Performance

16.3.7 Switching Masters During Failover

16.3.8 Setting Up Replication to Use Encrypted Connections

16.3.9 Semisynchronous Replication

16.3.10 Delayed Replication

16.4 Replication Notes and Tips

猜你喜欢

转载自blog.csdn.net/weixin_34072857/article/details/86845420