MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第1张图片

本章内容

MySQL复制介绍

实验一:建立新的主从复制

实验二:已有旧的主,建立新从

实验三:三台服务器实现级联复制

复制架构中应该注意的问题

实验四:提升从服务器为主服务器

实验五:实现主主复制

实验六:实现半同步复制

复制过滤器

实验七:实现SSL加密复制

复制的监控和维护

 

MySQL复制

扩展方式:

Scale Up:纵向扩展,如增加CPU、内存等,但性能的提升往往不是线性的,会越来越差

Scale Out:横向扩展,把请求分散在多台机器上,扩展的效果更好,也更常用

MySQL的扩展

读写分离

复制:每个节点都有相同的数据集

向外扩展

二进制日志

单向

复制的功用:

数据分布

负载均衡读

备份

高可用和故障切换

MySQL升级测试(灰度发布,要逐台升级)

 

MySQL读写分离

读写分离应用:

mysql-proxyOracle

https://downloads.mysql.com/archives/proxy/

AtlasQihoo

https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md

dbproxy:美团

https://github.com/Meituan-Dianping/DBProxy

Amoeba

https://sourceforge.net/projects/amoeba/

 

主从复制读写分离示意图

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第2张图片

 

主从复制线程

主节点:

dump Thread:为每个SlaveI/O Thread启动一个dump线程,用于通过tcp长连接向其发送binary log events

从节点:

I/O Thread:向Master请求二进制日志事件,并保存于中继日志中

SQL Thread:从中继日志中读取日志事件,在本地完成重放

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第3张图片

 

MySQL垂直分区

数据库的拆分,有垂直分区和水平分片等方式。垂直分区一般是将没有john关系的数据拆分开,放到不同的数据库中

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第4张图片

 

MySQL水平分片(Sharding

水平分片则是水平拆分成若干片,例如按照用户ID来拆分,然后分布在不同的数据库服务器中

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第5张图片

 

对应shard中查询相关数据

水平分片就涉及到一个调度的问题,负责调度的是分片管理器,负责将不同的请求调度到对应的库中

分片管理器一般是自研的,配合应用程序才能来实现这样的功能;当然达到这样的规模的话,企业一定有大量的研发人员了

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第6张图片

 

跟复制功能相关的文件

master.info:用于保存slave连接至master时的相关信息,例如账号、密码、服务器地址等

relay-log.info:保存在当前slave节点上已经复制的当前二进制日志和本地replay log日志的对应关系

 

MySQL复制

主从复制特点:

异步复制

主从数据不一致比较常见

复制架构:

Master/Slave

Master/Master(不建议用,容易产生数据不一致的问题)

环状复制(不建议用)

一主多从(常用)

从服务器还可以再有从服务器(常用)

一从多主:适用于从服务器有多个不同的数据库

复制需要考虑二进制日志事件记录格式

STATEMENT5.0之前)

ROW5.1之后,推荐)

MIXED(至少要用这个)


 MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第7张图片


主从配置

主从配置过程:参看官网

https://mariadb.com/kb/en/library/setting-up-replication/

https://dev.mysql.com/doc/refman/5.5/en/replication-configuration.html

主节点配置:

(1) 启用二进制日志

[mysqld]

log_bin

(2) 为当前节点设置一个全局惟一的ID

[mysqld]

server_id=#

log-basename=master 可选项,设置datadir中日志名称,确保不依赖主机名

(3) 创建有复制权限的用户账号

GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'HOST' IDENTIFIED BY 'replpass';

 

从节点配置:

(1) 启动中继日志

[mysqld]

server_id=# 为当前节点设置一个全局惟的ID

relay_log=relay-log relay log的文件路径,默认值hostname-relay-bin

relay_log_index=relay-log.index 默认值hostname-relay-bin.index

(2) 使用有复制权限的用户账号连接至主服务器,并启动复制线程

mysql> CHANGE MASTER TO

 MASTER_HOST='host',

 MASTER_USER='repluser',

 MASTER_PASSWORD='replpass',

 MASTER_LOG_FILE='mysql-bin.xxxxx',

 MASTER_LOG_POS=#;

 MASTER_CONNECT_RETRY=10;

mysql> START SLAVE [IO_THREAD|SQL_THREAD];

 

实验一:建立新的主从复制


MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第8张图片

准备两台虚拟机分别作为主从服务器,在本次实验中,主服务器的IP192.168.30.3,提示符为master,从服务器的IP192.168.30.4,提示符为slave1


在主服务器:

1、修改配置文件

vim /etc/my.cnf

server_id=1                       #主节点ID号设为1

log_bin                              #启用二进制日志

binlog_format=row          #二进制日志事件记录格式选ROW

log-basename=master     #可选项,指定二进制文件前缀

innodb_file_per_table      #单表存储

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第9张图片

systemctl restart mariadb              #重启mysql服务使配置生效

2、创建有复制权限的用户账号

mysql> grant replication slave on *.* to repluser@'192.168.30.%' identified by 'centos';

3、查看二进制日志的起点

mysql> show master logs;

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第10张图片

如上图,记录一下,之后就从master-bin.000003的位置400开始复制

4、导入一个数据库hellodb

[root@master ~]#mysql < hellodb_innodb.sql

此时可以查看一下当前的二进制日志信息,发现已发生变化

mysql> show master logs;

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第11张图片

 

在从服务器:

5、修改配置文件

vim /etc/my.cnf

server_id=2

read_only

innodb_file_per_table

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第12张图片

systemctl restart mariadb              #重启mysql服务使配置生效

6、使用有复制权限的用户账号连接至主服务器

mysql> CHANGE MASTER TO

  MASTER_HOST='192.168.30.3',

  MASTER_USER='repluser',

  MASTER_PASSWORD='centos',

  MASTER_PORT=3306,

  MASTER_LOG_FILE='master-bin.000003',

  MASTER_LOG_POS=400,

  MASTER_CONNECT_RETRY=10;

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第13张图片

mysql> start slave;     #启动复制线程

7、查看从服务器的工作状态

mysql> show slave status\G

看到从服务器已经开始正常工作

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第14张图片

mysql> show databases;

看到hellodb数据库已经复制过来了

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第15张图片

8、继续测试

切回主服务器,创建数据库db1

mysql> create database db1;

切回从服务器,我们看到,从服务器同步成功

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第16张图片

 

MySQL复制

如果主节点已经运行了一段时间,且有大量数据时,如何配置并启动slave节点

通过备份恢复数据至从服务器

复制起始位置为备份时,二进制日志文件及其POS

如果要启用级联复制,需要在从服务器启用以下配置

[mysqld]

log_bin

log_slave_updates

 

实验二:已有旧的主,建立新从

主服务器数据库仍沿用实验一的主服务器,作为已经运行了一段时间且有数据的服务器

数据库初始信息如下:

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第17张图片

从服务器为新环境下的服务器

 

在主服务器:

1、修改配置文件

vim /etc/my.cnf

server_id=1

log_bin

binlog_format=row

log-basename=master     #可选项

innodb_file_per_table

systemctl restart mariadb              #重启mysql服务使配置生效

2、创建有复制权限的用户账号

mysql> grant replication slave on *.* to repluser@'192.168.30.%' identified by 'centos';

3、使用mysqldump对主服务器数据库进行全备份

mysqldump -A -F --single-transaction --master-data=1 > all.sql

scp all.sql 192.168.30.4:/root  #将全备份文件拷贝到新的从服务器

 

在从服务器:

4、修改配置文件

vim /etc/my.cnf

server_id=2

read_only

innodb_file_per_table

systemctl restart mariadb              #重启mysql服务使配置生效

5、修改全备份文件添加主服务器信息

vim all.sql

找到此行

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第18张图片

替换为:

CHANGE MASTER TO

  MASTER_HOST='192.168.30.3',

  MASTER_USER='repluser',

  MASTER_PASSWORD='centos',

  MASTER_PORT=3306,

  MASTER_LOG_FILE='master-bin.000004',  #本来已有不要改

  MASTER_LOG_POS=245,  #本来已有不要改

  MASTER_CONNECT_RETRY=10;

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第19张图片

6、在从服务器上导入全备份

mysql < all.sql

此时我们看到全备份中数据库已导入成功

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第20张图片

7、启动复制线程

mysql > start slave;

mysql> show slave status;        #查看从服务器的工作状态

看到从服务器已开始正常工作

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第21张图片

8、继续测试

切换到主服务器,继续测试,创建数据库db2

mysql> create database db2;

切换回从服务器,我们看到,从服务同步成功

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第22张图片

 

实验三:三台服务器实现级联复制

如果主服务器既承担写操作又承担多台从服务器的复制工作,负担可能会比较大,这时候如果只用1台服务器从主服务器复制,其他的服务器再从这台服务器上复制,可一定程度上减轻主服务器的负担

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第23张图片

但是,中间的服务器即使启用了二进制日志,也不会记录从主服务器上复制过来的那些二进制数据,需要额外加一个设置,才能启动级联传输

[mysqld]

log_slave_updates

 

准备三台虚拟机分别作为主服务器、中间服务器和从服务器,在本次实验中,主服务器的IP192.168.30.3,提示符为master,中间服务器的IP192.168.30.4,提示符为slave1,从服务器的IP192.168.30.5,提示符为slave2

 

在主服务器:

1、修改配置文件

vim /etc/my.cnf

server_id=1

log_bin

binlog_format=row

innodb_file_per_table

systemctl restart mariadb              #重启mysql服务使配置生效

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第24张图片

2、创建有复制权限的用户账号

mysql> grant replication slave on *.* to repluser@'192.168.30.%' identified by 'centos';

 

在中间服务器:

3、修改配置文件

vim /etc/my.cnf

server_id=2

log_bin

binlog_format=row

log_slave_updates

read_only

innodb_file_per_table

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第25张图片

systemctl restart mariadb              #重启mysql服务使配置生效

4、使用有复制权限的用户账号连接至主服务器

mysql> CHANGE MASTER TO

  MASTER_HOST='192.168.30.3',

  MASTER_USER='repluser',

  MASTER_PASSWORD='centos',

  MASTER_PORT=3306,

  MASTER_LOG_FILE='mariadb-bin.000001',

  MASTER_LOG_POS=245,

  MASTER_CONNECT_RETRY=10;

mysql> start slave;     #启动复制线程

 

在从服务器:

5、修改配置文件

vim /etc/my.cnf

server_id=3

read_only

innodb_file_per_table

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第26张图片

systemctl restart mariadb              #重启mysql服务使配置生效

6、使用有复制权限的用户账号连接至中间从服务器

mysql> CHANGE MASTER TO

  MASTER_HOST='192.168.30.4',

  MASTER_USER='repluser',

  MASTER_PASSWORD='centos',

  MASTER_PORT=3306,

  MASTER_LOG_FILE='mariadb-bin.000001',

  MASTER_LOG_POS=245,

  MASTER_CONNECT_RETRY=10;

mysql> start slave;     #启动复制线程

7、查看从服务器的工作状态

mysql> show slave status\G

看到从服务器已经开始工作

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第27张图片

 

8、测试

在主服务器,导入hellodb数据库

#mysql < hellodb_innodb.sql

在中间服务器,我们看到,hellodb数据库已同步成功

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第28张图片

在从服务器, hellodb数据库也已同步成功,至此我们实现了MySQL数据库的级联复制

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第29张图片

 

复制架构中应该注意的问题

1、限制从服务器为只读

在从服务器上设置read_only=ON

注意:此限制对拥有SUPER权限的用户均无效

阻止所有用户, 包括主服务器复制的更新

mysql> FLUSH TABLES WITH READ LOCK;  #这项一般不设

2RESET SLAVE

在从服务器清除master.info relay-log.info, relay log ,开始新的relay log ,注意:需要先STOP SLAVE

RESET SLAVE ALL 清除所有从服务器上设置的主服务器同步信息如:PORT, HOST, USER PASSWORD

3、如何保证主从复制的事务安全

参看https://mariadb.com/kb/en/library/server-system-variables/

master节点启用参数:

sync_binlog=1 每次写后立即同步二进制日志到磁盘,性能差

如果用到的为InnoDB存储引擎:

innodb_flush_log_at_trx_commit=1 每次事务提交立即同步日志写磁盘

innodb_support_xa=ON 默认值,分布式事务MariaDB10.3.0废除

sync_master_info=# #次事件后master.info同步到磁盘

slave节点启用服务器选项:

skip_slave_start=ON 不自动启动slave

slave节点启用参数:

sync_relay_log=# #次写后同步relay log到磁盘

sync_relay_log_info=# #次事务后同步relay-log.info到磁盘

 

实验四:提升从服务器为主服务器

当主服务器宕机时,就需要提升一台从服务器为主服务器,然而各台从服务器的数据同步进度可能是不一样的,所以最好找出数据同步最完整的从服务器提升为主服务器。

那么怎么看哪一台从服务器的数据同步得是最完整的呢?方法是查看各台从服务器的mysql文件夹下的master.info文件,文件中的第2和第3行,即表示已同步的主服务器二进制文件和位置,二进制文件和位置最大的那台从服务器,即是同步得最完整的从服务器。

cat /var/lib/mysql/master.info

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第30张图片

将此服务器配置修改为主服务器配置

vim /etc/my.cnf

server_id=1

log_bin

binlog_format=row

清除其它从服务器上的所有原有master信息

mysql> reset slave all;

最后更改其它从服务器的上的master设置即可

mysql> CHANGE MASTER TO

  MASTER_HOST='192.168.30.X',

  MASTER_USER='repluser',

  MASTER_PASSWORD='centos',

  MASTER_PORT=3306,

  MASTER_LOG_FILE='mariadb-bin.00000X',

  MASTER_LOG_POS=XXX,

  MASTER_CONNECT_RETRY=10;

mysql> start slave;

 

主主复制

主主复制:互为主从

容易产生的问题:数据不一致;因此慎用

考虑要点:自动增长id

配置一个节点使用奇数id

auto_increment_offset=1 开始点

auto_increment_increment=2 增长幅度

另一个节点使用偶数id

auto_increment_offset=2

auto_increment_increment=2

 

主主复制的配置步骤:

(1) 各节点使用一个惟一server_id

(2) 都启动binary logrelay log

(3) 创建拥有复制权限的用户账号

(4) 定义自动增长id字段的数值范围各为奇偶

(5) 均把对方指定为主节点,并启动复制线程

 

实验五:实现主主复制

准备两台虚拟机分别作为主服务器1和主服务器2,在本次实验中,主服务器1IP192.168.30.3,提示符为master1,主服务器2IP192.168.30.4,提示符为master2

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第31张图片

 在主服务器1

1、修改配置文件

vim /etc/my.cnf

server_id=1

log_bin

binlog_format=row

auto_increment_offset=1       #开始点

auto_increment_increment=2       #增长幅度,当3台为环状复制时,改为3

innodb_file_per_table

systemctl restart mariadb              #重启mysql服务使配置生效

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第32张图片

2、创建有复制权限的用户账号

mysql> grant replication slave on *.* to repluser@'192.168.30.%' identified by 'centos';

3、使用有复制权限的用户账号连接至主服务器2

mysql> CHANGE MASTER TO

  MASTER_HOST='192.168.30.4',

  MASTER_USER='repluser',

  MASTER_PASSWORD='centos',

  MASTER_PORT=3306,

  MASTER_LOG_FILE='mariadb-bin.000001',

  MASTER_LOG_POS=245,

  MASTER_CONNECT_RETRY=10;

mysql> start slave;     #在主服务器2也配置好后,启动复制线程

 

在主服务器2

4、修改配置文件

vim /etc/my.cnf

server_id=2

log_bin

binlog_format=row

auto_increment_offset=2       #开始点

auto_increment_increment=2       #增长幅度

innodb_file_per_table

systemctl restart mariadb              #重启mysql服务使配置生效

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第33张图片

5、创建有复制权限的用户账号

mysql> grant replication slave on *.* to repluser@'192.168.30.%' identified by 'centos';

6、使用有复制权限的用户账号连接至主服务器1

mysql> CHANGE MASTER TO

  MASTER_HOST='192.168.30.3',

  MASTER_USER='repluser',

  MASTER_PASSWORD='centos',

  MASTER_PORT=3306,

  MASTER_LOG_FILE='mariadb-bin.000001',

  MASTER_LOG_POS=245,

  MASTER_CONNECT_RETRY=10;

mysql> start slave;     #启动复制线程

 

7、测试

在主服务器1创建db1数据库:

mysql> create database db1;

在主服务器2创建db2数据库:

mysql> create database db2;

分别查看两台主服务器均同步成功

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第34张图片

在主服务器1的数据库中不指定ID添加数据时,默认以奇数递增;

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第35张图片

在主服务器2的数据库中不指定ID添加数据时,默认以偶数递增;

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第36张图片

 主主复制就是通过此种方法来避免数据可能出现的冲突。

 

半同步复制

默认情况下,MySQL的复制功能是异步的,异步复制可以提供最佳的性能,主库把binlog日志发送给从库即结束,并不验证从库是否接收完毕。这意味着当主服务器或从服务器端发生故障时,有可能从服务器没有接收到主服务器发送过来的binlog日志,这就会造成主服务器和从服务器的数据不一致,甚至在恢复时造成数据的丢失

半同步复制的机制是只有当主节点和从节点同步完成,仅有一台从节点同步完成即可,返回写入完成,这样的机制保证了数据的安全性。如果主服务器宕机了,至少还有一台从服务器的数据是一致的。在生产环境中,一般都要搭建半同步复制。如果是级联复制的话,在主服务器和中间服务器上搭建半同步复制即可。

(图)

主服务器需要安装的mysql插件:semisync_master.so

从服务器需要安装的mysql插件:semisync_slave.so

 

实验六:实现半同步复制

在主服务器:

安装semisync_master.so插件

       mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

启用master半同步功能

       mysql> SET GLOBAL rpl_semi_sync_master_enabled=1;

查看master半同步相关变量、相关状态

       mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';

       mysql> SHOW GLOBAL STATUS LIKE '%semi%';

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第37张图片

 

在从服务器:

安装semisync_slave.so插件

       mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

启用slave半同步功能

       mysql> SET GLOBAL rpl_semi_sync_slave_enabled=1;

查看slave半同步相关变量

       mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第38张图片

 

至此,主从服务器的半同步复制就搭建完成了。重启mariadb服务的话,配置将失效,如果想永久启用,可写入配置文件中。

 

复制过滤器

让从节点仅复制指定的数据库,或指定数据库的指定表

两种实现方式:

(1) 服务器选项:主服务器仅向二进制日志中记录与特定数据库相关的事件

注意:此项和binlog_format相关

参看:https://mariadb.com/kb/en/library/mysqld-options/#-binlog-ignore-db

无法作为动态变量修改,只能作为选项写入配置文件中

binlog_do_db = 数据库白名单列表,多个数据库需多行实现

binlog_ignore_db = 数据库黑名单列表

问题:基于二进制还原将无法实现;不建议使用

(2) 从服务器SQL_THREADreplay中继日志中的事件时,仅读取与特定数据库(特定表)相关的事件并应用于本地

问题:会造成网络及磁盘IO浪费

 

复制过滤器从服务器上的相关设置

replicate_do_db= 指定复制库的白名单

replicate_ignore_db= 指定复制库黑名单

replicate_do_table= 指定复制表的白名单

replicate_ignore_table= 指定复制表的黑名单

replicate_wild_do_table= foo%.bar% 支持通配符

replicate_wild_ignore_table=

show variables like 'replicate%';

 

MySQL复制加密

基于SSL复制:

在默认的主从复制过程或远程连接到MySQL/MariaDB所有的链接通信中的数据都是明文的,外网里访问数据或则复制,存在安全隐患。通过SSL/TLS加密的方式进行复制的方法,来进一步提高数据的安全性

配置实现:

参看:https://mariadb.com/kb/en/library/replication-with-secure-connections/

主服务器开启SSL[mysqld] 加一行ssl

master配置证书和私钥;并且创建一个要求必须使用SSL连接的复制账号

slave端使用CHANGER MASTER TO 命令时指明ssl相关选项

 

Master配置

[mysqld]

log-bin

server_id=1

ssl

ssl-ca=/etc/my.cnf.d/ssl/cacert.pem

ssl-cert=/etc/my.cnf.d/ssl/master.crt

ssl-key=/etc/my.cnf.d/ssl/master.key

 

Slave配置

mysql>CHANGE MASTER TO

MASTER_HOST='MASTERIP',

MASTER_USER='rep',

MASTER_PASSWORD='centos',

MASTER_LOG_FILE='mariadb-bin.000001',

MASTER_LOG_POS=245,

MASTER_CONNECT_RETRY=10,

MASTER_SSL=1,

MASTER_SSL_CA = '/etc/my.cnf.d/ssl/cacert.pem',

MASTER_SSL_CERT = '/etc/my.cnf.d/ssl/slave.crt',

MASTER_SSL_KEY = '/etc/my.cnf.d/ssl/slave.key';

 

实验七:实现SSL加密复制

准备3台虚拟机分别作为主服务器、从服务器和CA服务器,在本次实验中,主服务器的IP192.168.30.3,提示符为master,从服务器的IP192.168.30.4,提示符为slaveCA服务器的IP192.168.30.5,提示符为ca

特别提示:在配置之前先检查mysql服务是否支持ssl功能,如果have_ssl的值为'DISABLED'则支持;如果为'NO'则不支持,需要再重新编译安装或者安装具有ssl功能的版本

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第39张图片

 CA服务器:

1、生成CA的私钥

mkdir /etc/my.cnf.d/ssl

cd /etc/my.cnf.d/ssl

openssl genrsa 2048 > cakey.pem

2、生成CA的自签名

openssl req -new -x509 -key cakey.pem -out cacert.pem -days 3650

CN

beijing

beijing

wind.com

opt

ca.wind.com

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第40张图片

此时ssl目录下的文件有

ls /etc/my.cnf.d/ssl

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第41张图片

3、在本机生成masterslave的私钥:

同时生成主服务器master的私钥和签名请求

openssl req -newkey rsa:2048 –days 3650 -nodes -keyout master.key > master.csr

CN

beijing

beijing

wind.com

opt

master.wind.com

颁发master证书

openssl x509 -req -in master.csr -CA cacert.pem -CAkey cakey.pem -set_serial 01 > master.crt

此时ssl目录下的文件有

ls /etc/my.cnf.d/ssl

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第42张图片

继续生成从服务器的私钥和签名请求

openssl req -newkey rsa:2048 -days 3650 -nodes -keyout slave.key > slave.csr

CN

beijing

beijing

wind.com

opt

slave.wind.com

颁发slave证书

openssl x509 -req -in slave.csr -CA cacert.pem -CAkey cakey.pem -set_serial 02 > slave.crt

此时ssl目录下文件有

ls /etc/my.cnf.d/ssl

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第43张图片

4、将ssl文件夹复制到主服务器和从服务器

scp -r /etc/my.cnf.d/ssl 192.168.30.3:/etc/my.cnf.d

scp -r /etc/my.cnf.d/ssl 192.168.30.4:/etc/my.cnf.d

主服务器保留下列文件 cacert.pem master.crt master.key

从服务器保留下列文件 cacert.pem slave.crt slave.key      

 

在主服务器:

5、修改配置文件

vim /etc/my.cnf

server_id=1

log_bin

binlog_format=row

innodb_file_per_table

ssl

ssl-ca=/etc/my.cnf.d/ssl/cacert.pem

ssl-cert=/etc/my.cnf.d/ssl/master.crt

ssl-key=/etc/my.cnf.d/ssl/master.key

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第44张图片

systemctl restart mariadb              #重启mysql服务使配置生效

mysql> show variables like '%ssl%';       #查看是否生效

MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制_第45张图片

6、创建有复制权限且要求必须以加密方式连接的用户账号

mysql> grant replication slave on *.* to repluser@'192.168.30.%' identified by 'centos' require ssl;

可以在slave端测试replusr用户的ssl连接

[root@slave ssl]#mysql -urepluser -pcentos -h192.168.30.3 --ssl-ca=cacert.pem --ssl-cert=slave.crt --ssl-key=slave.key

 

在从服务器:

方法一:

7、修改配置文件

vim /etc/my.cnf

server_id=2

log_bin

binlog_format=row

innodb_file_per_table

systemctl restart mariadb              #重启mysql服务使配置生效

8、使用有复制权限的用户账号连接至主服务器

mysql> CHANGE MASTER TO

  MASTER_HOST='192.168.30.3',

  MASTER_USER='repluser',

  MASTER_PASSWORD='centos',

  MASTER_LOG_FILE='mariadb-bin.000001',

  MASTER_LOG_POS=245,

  MASTER_CONNECT_RETRY=10,

  MASTER_SSL=1,

  MASTER_SSL_CA = '/etc/my.cnf.d/ssl/cacert.pem',

  MASTER_SSL_CERT = '/etc/my.cnf.d/ssl/slave.crt',

  MASTER_SSL_KEY = '/etc/my.cnf.d/ssl/slave.key';

mysql> start slave;     #启动复制线程

 

方法二:

7、写入配置文件

stop slave;

reset slave all;

vim /etc/my.cnf

server_id=2

log_bin

binlog_format=row

innodb_file_per_table

ssl

ssl-ca=/etc/my.cnf.d/ssl/cacert.pem

ssl-cert=/etc/my.cnf.d/ssl/slave.crt

ssl-key=/etc/my.cnf.d/ssl/slave.key

systemctl restart mariadb              #重启mysql服务使配置生效

8、使用有复制权限的用户账号连接至主服务器

mysql> CHANGE MASTER TO

  MASTER_HOST='192.168.30.3',

  MASTER_USER='repluser',

  MASTER_PASSWORD='centos',

  MASTER_LOG_FILE='mariadb-bin.000001',

  MASTER_LOG_POS=245,

  MASTER_CONNECT_RETRY=10,

  MASTER_SSL=1;

mysql> start slave;     #启动复制线程

 

复制的监控和维护

(1) 清理日志

PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }

RESET MASTER

RESET SLAVE

(2) 复制监控

SHOW MASTER STATUS

SHOW BINLOG EVENTS

SHOW BINARY LOGS

SHOW SLAVE STATUS

SHOW PROCESSLIST

(3) 从服务器是否落后于主服务

Seconds_Behind_Master: 0

(4) 如何确定主从节点数据是否一致

percona-tools

(5) 数据不一致如何修复

删除从数据库,重新复制