1:搭建一个主从的机构

先安装两台机器
mysql安装手册https://dev.mysql.com/doc/refman/8.0/en/binary-installation.html
推荐大家使用宝塔面板,可以省掉非常多的MySQL安装的问题

开启远程登录:

开启远程登录
use mysql;
update user set host=’%’ where user=’root’;
flush privileges;

2:同步理论

缓解压力,
1:数据安全
也可以搭建一个互主的架构

2:读写分离
读写分离需要从客户端应用来实现,比如shardingSphere

3:故障转移—高可用
master宕机,可以切换到另一台作为主服务。提供功能读写
主从数据同步时高可用的前提
主从的切换,依靠其他中间件:MMM,MHA MGR

读写分离不一定用,有点浪费资源
主从,高可用可以搭建的必要

同步的原理

一般是:binlog日志文件传输的
主服务器打开binlog,从服务跟主服务建立连接,传输binlog文件
主库会IO dump线程,把binlog日志传输给从库

从库会把binlog日志重写relay文件,把操作重演一遍。
1656081890842.png

binlog 的用出还可以缓存数据同步 把binlog同步到其他的地方,如es,Redis ,kafka canal中间件就可以吧数据实时流转出去

前提: mysql版本必须一致,至少从服务要高于主服务

3.1:配置master主服务器

配置 /etc/my.cnf 配置,打开binlog

[mysqld]

随便一个唯一标识
server-id=47
#开启binlog
log_bin=master-bin
log_bin-index=master-bin.index
skip-name-resolve
# 设置连接端口
port=3306
# 设置mysql的安装目录
basedir=/usr/local/mysql
# 设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql/mysql-files
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password

重启服务即可

service mysqld restart

分配权限

登录主数据库
mysql -u root -p
GRANT REPLICATION SLAVE ON . TO ‘root’@’%’;
flush privileges;
#查看主节点同步状态:
show master status;

show master status; 查看文件名称,以及开始同步的位置,要在从库配置的 File和Position记录的是当前日志的binlog文件以及文件中的索引

image.png

3.2:配置slave从服务器

同样配置my.cnf

[mysqld]
#主库和从库需要不一致,唯一标识即可
server-id=48
#打开MySQL中继日志
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
#打开从服务二进制日志
log-bin=mysql-bin
#使得更新的数据写进二进制日志中
log-slave-updates=1
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=/usr/local/mysql
# 设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql/mysql-files
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password

查看主结点同步状态

登录从服务
mysql -u root -p;
#设置同步主节点:
CHANGE MASTER TO
MASTER_HOST=’192.168.232.128’,
MASTER_PORT=3306,
MASTER_USER=’root’,
MASTER_PASSWORD=’root’,

主结点binlog文件
MASTER_LOG_FILE=’master-bin.000004’,

对应的位置
MASTER_LOG_POS=156
GET_MASTER_PUBLIC_KEY=1;
#开启slave
start slave;
#查看主从同步状态
show slave status;
或者用 show slave status \G; 这样查看比较简洁

注意,CHANGE MASTER指令中需要指定的MASTER_LOG_FILE和MASTER_LOG_POS必须与主服务中查到的保持一致。 并且后续如果要检查主从架构是否成功,也可以通过检查主服务与从服务之间的File和Position这两个属性是否一致来确定。

image.png

3.4:集群的扩展

1:全部数据库同步,和选择数据库同步

如果是针对重要的数据库,或者表做同步的配置
首先:

master端 my.cnf,指定那些表需要备份,那些不需要

需要同步的二进制数据库名
binlog-do-db=masterdemo
#只保留7天的二进制日志,以防磁盘被日志占满(可选)
expire-logs-days = 7
#不备份的数据库
binlog-ignore-db=information_schema
binlog-ignore-db=performation_schema
binlog-ignore-db=sys

slave端:与主库对应

如果salve库名称与master库名相同,使用本配置
replicate-do-db = masterdemo
#如果master库名[mastdemo]与salve库名[mastdemo01]不同,使用以下配置[需要做映射]
replicate-rewrite-db = masterdemo -> masterdemo01
#如果不是要全部同步[默认全部同步],则指定需要同步的表
replicate-wild-do-table=masterdemo01.t_dict
replicate-wild-do-table=masterdemo01.t_num

show master status 查看 binglog_do_db binlog_ignore_db查看是那些表在同步,那些表不会同步

2:读写分离配置

主从,,数据只能从主流向从,是单向的,
MySQL本身不能提供这种服务,只能依赖其他中间件如:shardingSphere

可以做到限制用户写数据,在服务中设置 read_only = 1 (set global read_only = 1) 皆可以实现slave只能从主同步日志了,而不会有写的操作

read_only 是只读模式,只限制了普通用户的权限, 但super用户,还是可以执行CUD操作 但是super_read_only = 0 :就可以吧超级用户写操作也禁止掉,但是主从复制也会被禁止

3:其他集群方式

互为主从
环形主从
就是主节点可以从其他slave同步binlog的方式

这些事基于binlog的方式搭建,

3.5:GTID方式同步集群

show master status; executed_gtid_set :是指另一个种同步方式 基于GTID搭建: 全局事务ID,本质也是binlog,只是基于全局事务ID标识、 全局事务ID ,全部唯一,递增的分布式ID.

Mysql5.6版本引入
全局唯一事务ID ,
首先:从服务器会告诉主服务器从哪些事务的GTID ,主库会把所有从库没有执行的事务发给从库
GTID复制保证只执行一次,避免偏移量问题造成的数据不一致

搭建方式:
master 的my.cnf

gtid_mode=on enforce_gtid_consistency=on log_bin=on server_id=单独设置一个 binlog_format=row

slave的my.cnf

gtid_mode=on enforce_gtid_consistency=on log_slave_updates=1 server_id=单独设置一个

重启即可

4:集群的扩容

一主一从,扩展一主多从,只需要增加binlog复制就行
如果运行一段时间,再加从结点,就需要增加数据恢复操作
可以通过数据备份,再执行即可

mysqldump -u root -p —all-databases > backup.sql
#输入密码 把数据dump下来,把backup.sql发送到从服务器上,再执行即可 mysql -u root -p < backup.sql
#输入密码

5:半同步复制

异步复制,默认方式,dump线程与主服务是分开的
image.png

半同步复制,写的时候同步dump线程,等待slave结果 保证数据安全
会等待10秒,接受slave的ack,超时就降级为异步

不能保证完全一致,还有一定程度的延迟,性能会下降

image.png

2;搭建半同步复制

需要在lib/plugin 中安装semisync_master.so和semisync_slave.so两个文件中 分别对应主服务,和从服务按照文件

image.png

master安装

安装semisync_master模块

安装命令

mysql> install plugin rpl_semi_sync_master soname ‘semisync_master.so’;
Query OK, 0 rows affected (0.01 sec)
#rpl_semi_sync_master_timeout 半同步复制等待应答最长等待时间默认10秒
mysql> show global variables like ‘rpl_semi%’;
+—————————————————————-+——————+
| Variable_name | Value |
+—————————————————————-+——————+
| rpl_semi_sync_master_enabled | OFF |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+—————————————————————-+——————+
6 rows in set, 1 warning (0.02 sec)

rpl_semi_sync_master_wait_point 是表示一种半同步复制方式
#打开半同步复制的开关
mysql> set global rpl_semi_sync_master_enabled=ON;
Query OK, 0 rows affected (0.00 sec)

半同步复制有两种方式

  1. after_sync,默认的,主库写入binlog,复制给从库,等待从库相应,从库返回成功,主库提交,主库给客户端回应
  2. after_commit,不是默认的,主库写入binlog,等待复制到从库,主库就提交本地事务,再等待从库返回给自己响应,主库再给客户端回应

    slave安装

    mysql> install plugin rpl_semi_sync_slave soname ‘semisync_slave.so’;
    Query OK, 0 rows affected (0.01 sec)

mysql> show global variables like ‘rpl_semi%’;
+————————————————-+———-+
| Variable_name | Value |
+————————————————-+———-+
| rpl_semi_sync_slave_enabled | OFF |
| rpl_semi_sync_slave_trace_level | 32 |
+————————————————-+———-+
2 rows in set, 1 warning (0.01 sec)

mysql> set global rpl_semi_sync_slave_enabled = on;
Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like ‘rpl_semi%’;
+————————————————-+———-+
| Variable_name | Value |
+————————————————-+———-+
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+————————————————-+———-+
2 rows in set, 1 warning (0.00 sec)

mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

要重启slave服务

6:数据延迟问题

可以配置dump多线程并行复制binlog数据
5.7开始支持多线程复制
slave_parallel_workers 大于0的数
slave_parallel_type 设置为LOGICAL_CLOCK