MySQL之主从复制、级联复制、主主复制、半同步复制和加密复制
时间:2018-10-24 17:21 来源:51cto.com 作者:51cto
本章内容
MySQL复制介绍
实验一:建立新的主从复制
实验二:已有旧的主,建立新从
实验三:三台服务器实现级联复制
复制架构中应该注意的问题
实验四:提升从服务器为主服务器
实验五:实现主主复制
实验六:实现半同步复制
复制过滤器
实验七:实现SSL加密复制
复制的监控和维护
MySQL复制
扩展方式:
Scale Up:纵向扩展,如增加CPU、内存等,但性能的提升往往不是线性的,会越来越差
Scale Out:横向扩展,把请求分散在多台机器上,扩展的效果更好,也更常用
MySQL的扩展
读写分离
复制:每个节点都有相同的数据集
向外扩展
二进制日志
单向
复制的功用:
数据分布
负载均衡读
备份
高可用和故障切换
MySQL升级测试(灰度发布,要逐台升级)
MySQL读写分离
读写分离应用:
mysql-proxy:Oracle
https://downloads.mysql.com/archives/proxy/
Atlas:Qihoo
https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md
dbproxy:美团
https://github.com/Meituan-Dianping/DBProxy
Amoeba:
https://sourceforge.net/projects/amoeba/
主从复制读写分离示意图
主从复制线程
主节点:
dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于通过tcp长连接向其发送binary log events
从节点:
I/O Thread:向Master请求二进制日志事件,并保存于中继日志中
SQL Thread:从中继日志中读取日志事件,在本地完成重放
MySQL垂直分区
数据库的拆分,有垂直分区和水平分片等方式。垂直分区一般是将没有john关系的数据拆分开,放到不同的数据库中
MySQL水平分片(Sharding)
水平分片则是水平拆分成若干片,例如按照用户ID来拆分,然后分布在不同的数据库服务器中
对应shard中查询相关数据
水平分片就涉及到一个调度的问题,负责调度的是分片管理器,负责将不同的请求调度到对应的库中
分片管理器一般是自研的,配合应用程序才能来实现这样的功能;当然达到这样的规模的话,企业一定有大量的研发人员了
跟复制功能相关的文件
master.info:用于保存slave连接至master时的相关信息,例如账号、密码、服务器地址等
relay-log.info:保存在当前slave节点上已经复制的当前二进制日志和本地replay log日志的对应关系
MySQL复制
主从复制特点:
异步复制
主从数据不一致比较常见
复制架构:
Master/Slave
Master/Master(不建议用,容易产生数据不一致的问题)
环状复制(不建议用)
一主多从(常用)
从服务器还可以再有从服务器(常用)
一从多主:适用于从服务器有多个不同的数据库
复制需要考虑二进制日志事件记录格式
STATEMENT(5.0之前)
ROW(5.1之后,推荐)
MIXED(至少要用这个)
主从配置
主从配置过程:参看官网
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];
实验一:建立新的主从复制
准备两台虚拟机分别作为主从服务器,在本次实验中,主服务器的IP为192.168.30.3,提示符为master,从服务器的IP为192.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 #单表存储
systemctl restart mariadb #重启mysql服务使配置生效
2、创建有复制权限的用户账号
mysql> grant replication slave on *.* to repluser@'192.168.30.%' identified by 'centos';
3、查看二进制日志的起点
mysql> show master logs;
如上图,记录一下,之后就从master-bin.000003的位置400开始复制
4、导入一个数据库hellodb
[root@master ~]#mysql < hellodb_innodb.sql
此时可以查看一下当前的二进制日志信息,发现已发生变化
mysql> show master logs;
在从服务器:
5、修改配置文件
vim /etc/my.cnf
server_id=2
read_only
innodb_file_per_table
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> start slave; #启动复制线程
7、查看从服务器的工作状态
mysql> show slave status\G
看到从服务器已经开始正常工作
mysql> show databases;
看到hellodb数据库已经复制过来了
8、继续测试
切回主服务器,创建数据库db1
mysql> create database db1;
切回从服务器,我们看到,从服务器同步成功
MySQL复制
如果主节点已经运行了一段时间,且有大量数据时,如何配置并启动slave节点
通过备份恢复数据至从服务器
复制起始位置为备份时,二进制日志文件及其POS
如果要启用级联复制,需要在从服务器启用以下配置
[mysqld]
log_bin
log_slave_updates
实验二:已有旧的主,建立新从
主服务器数据库仍沿用实验一的主服务器,作为已经运行了一段时间且有数据的服务器
数据库初始信息如下:
从服务器为新环境下的服务器
在主服务器:
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
找到此行
替换为:
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;
6、在从服务器上导入全备份
mysql < all.sql
此时我们看到全备份中数据库已导入成功
7、启动复制线程
mysql > start slave;
mysql> show slave status; #查看从服务器的工作状态
看到从服务器已开始正常工作
8、继续测试
切换到主服务器,继续测试,创建数据库db2
mysql> create database db2;
切换回从服务器,我们看到,从服务同步成功
实验三:三台服务器实现级联复制
如果主服务器既承担写操作又承担多台从服务器的复制工作,负担可能会比较大,这时候如果只用1台服务器从主服务器复制,其他的服务器再从这台服务器上复制,可一定程度上减轻主服务器的负担
但是,中间的服务器即使启用了二进制日志,也不会记录从主服务器上复制过来的那些二进制数据,需要额外加一个设置,才能启动级联传输
[mysqld]
log_slave_updates
准备三台虚拟机分别作为主服务器、中间服务器和从服务器,在本次实验中,主服务器的IP为192.168.30.3,提示符为master,中间服务器的IP为192.168.30.4,提示符为slave1,从服务器的IP为192.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服务使配置生效
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
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
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
看到从服务器已经开始工作
8、测试
在主服务器,导入hellodb数据库
#mysql < hellodb_innodb.sql
在中间服务器,我们看到,hellodb数据库已同步成功
在从服务器, hellodb数据库也已同步成功,至此我们实现了MySQL数据库的级联复制
复制架构中应该注意的问题
1、限制从服务器为只读
在从服务器上设置read_only=ON
注意:此限制对拥有SUPER权限的用户均无效
阻止所有用户, 包括主服务器复制的更新
mysql> FLUSH TABLES WITH READ LOCK; #这项一般不设
2、RESET 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
将此服务器配置修改为主服务器配置
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 log和relay log
(3) 创建拥有复制权限的用户账号
(4) 定义自动增长id字段的数值范围各为奇偶
(5) 均把对方指定为主节点,并启动复制线程
实验五:实现主主复制
准备两台虚拟机分别作为主服务器1和主服务器2,在本次实验中,主服务器1的IP为192.168.30.3,提示符为master1,主服务器2的IP为192.168.30.4,提示符为master2
在主服务器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服务使配置生效
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服务使配置生效
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;
分别查看两台主服务器均同步成功
在主服务器1的数据库中不指定ID添加数据时,默认以奇数递增;
在主服务器2的数据库中不指定ID添加数据时,默认以偶数递增;
主主复制就是通过此种方法来避免数据可能出现的冲突。
半同步复制
默认情况下,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%';
在从服务器:
安装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%';
至此,主从服务器的半同步复制就搭建完成了。重启mariadb服务的话,配置将失效,如果想永久启用,可写入配置文件中。
复制过滤器
让从节点仅复制指定的数据库,或指定数据库的指定表
两种实现方式:
(1) 服务器选项:主服务器仅向二进制日志中记录与特定数据库相关的事件
注意:此项和binlog_format相关
参看:https://mariadb.com/kb/en/library/mysqld-options/#-binlog-ignore-db
无法作为动态变量修改,只能作为选项写入配置文件中
binlog_do_db = 数据库白名单列表,多个数据库需多行实现
binlog_ignore_db = 数据库黑名单列表
问题:基于二进制还原将无法实现;不建议使用
(2) 从服务器SQL_THREAD在replay中继日志中的事件时,仅读取与特定数据库(特定表)相关的事件并应用于本地
问题:会造成网络及磁盘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服务器,在本次实验中,主服务器的IP为192.168.30.3,提示符为master,从服务器的IP为192.168.30.4,提示符为slave,CA服务器的IP为192.168.30.5,提示符为ca。
特别提示:在配置之前先检查mysql服务是否支持ssl功能,如果have_ssl的值为'DISABLED'则支持;如果为'NO'则不支持,需要再重新编译安装或者安装具有ssl功能的版本
在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
此时ssl目录下的文件有
ls /etc/my.cnf.d/ssl
3、在本机生成master和slave的私钥:
同时生成主服务器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
继续生成从服务器的私钥和签名请求
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
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
systemctl restart mariadb #重启mysql服务使配置生效
mysql> show variables like '%ssl%'; #查看是否生效
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) 数据不一致如何修复
删除从数据库,重新复制
(责任编辑:IT)
本章内容 MySQL复制介绍 实验一:建立新的主从复制 实验二:已有旧的主,建立新从 实验三:三台服务器实现级联复制 复制架构中应该注意的问题 实验四:提升从服务器为主服务器 实验五:实现主主复制 实验六:实现半同步复制 复制过滤器 实验七:实现SSL加密复制 复制的监控和维护
MySQL复制 扩展方式: Scale Up:纵向扩展,如增加CPU、内存等,但性能的提升往往不是线性的,会越来越差 Scale Out:横向扩展,把请求分散在多台机器上,扩展的效果更好,也更常用 MySQL的扩展 读写分离 复制:每个节点都有相同的数据集 向外扩展 二进制日志 单向 复制的功用: 数据分布 负载均衡读 备份 高可用和故障切换 MySQL升级测试(灰度发布,要逐台升级)
MySQL读写分离 读写分离应用: mysql-proxy:Oracle https://downloads.mysql.com/archives/proxy/ Atlas:Qihoo https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md dbproxy:美团 https://github.com/Meituan-Dianping/DBProxy Amoeba: https://sourceforge.net/projects/amoeba/
主从复制读写分离示意图
主从复制线程 主节点: dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于通过tcp长连接向其发送binary log events 从节点: I/O Thread:向Master请求二进制日志事件,并保存于中继日志中 SQL Thread:从中继日志中读取日志事件,在本地完成重放
MySQL垂直分区 数据库的拆分,有垂直分区和水平分片等方式。垂直分区一般是将没有john关系的数据拆分开,放到不同的数据库中
MySQL水平分片(Sharding) 水平分片则是水平拆分成若干片,例如按照用户ID来拆分,然后分布在不同的数据库服务器中
对应shard中查询相关数据 水平分片就涉及到一个调度的问题,负责调度的是分片管理器,负责将不同的请求调度到对应的库中 分片管理器一般是自研的,配合应用程序才能来实现这样的功能;当然达到这样的规模的话,企业一定有大量的研发人员了
跟复制功能相关的文件 master.info:用于保存slave连接至master时的相关信息,例如账号、密码、服务器地址等 relay-log.info:保存在当前slave节点上已经复制的当前二进制日志和本地replay log日志的对应关系
MySQL复制 主从复制特点: 异步复制 主从数据不一致比较常见 复制架构: Master/Slave Master/Master(不建议用,容易产生数据不一致的问题) 环状复制(不建议用) 一主多从(常用) 从服务器还可以再有从服务器(常用) 一从多主:适用于从服务器有多个不同的数据库 复制需要考虑二进制日志事件记录格式 STATEMENT(5.0之前) ROW(5.1之后,推荐) MIXED(至少要用这个)
主从配置 主从配置过程:参看官网 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];
实验一:建立新的主从复制
准备两台虚拟机分别作为主从服务器,在本次实验中,主服务器的IP为192.168.30.3,提示符为master,从服务器的IP为192.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 #单表存储
systemctl restart mariadb #重启mysql服务使配置生效 2、创建有复制权限的用户账号 mysql> grant replication slave on *.* to repluser@'192.168.30.%' identified by 'centos'; 3、查看二进制日志的起点 mysql> show master logs;
如上图,记录一下,之后就从master-bin.000003的位置400开始复制 4、导入一个数据库hellodb [root@master ~]#mysql < hellodb_innodb.sql 此时可以查看一下当前的二进制日志信息,发现已发生变化 mysql> show master logs;
在从服务器: 5、修改配置文件 vim /etc/my.cnf server_id=2 read_only innodb_file_per_table
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> start slave; #启动复制线程 7、查看从服务器的工作状态 mysql> show slave status\G 看到从服务器已经开始正常工作
mysql> show databases; 看到hellodb数据库已经复制过来了
8、继续测试 切回主服务器,创建数据库db1 mysql> create database db1; 切回从服务器,我们看到,从服务器同步成功
MySQL复制 如果主节点已经运行了一段时间,且有大量数据时,如何配置并启动slave节点 通过备份恢复数据至从服务器 复制起始位置为备份时,二进制日志文件及其POS 如果要启用级联复制,需要在从服务器启用以下配置 [mysqld] log_bin log_slave_updates
实验二:已有旧的主,建立新从 主服务器数据库仍沿用实验一的主服务器,作为已经运行了一段时间且有数据的服务器 数据库初始信息如下:
从服务器为新环境下的服务器
在主服务器: 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 找到此行
替换为: 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;
6、在从服务器上导入全备份 mysql < all.sql 此时我们看到全备份中数据库已导入成功
7、启动复制线程 mysql > start slave; mysql> show slave status; #查看从服务器的工作状态 看到从服务器已开始正常工作
8、继续测试 切换到主服务器,继续测试,创建数据库db2 mysql> create database db2; 切换回从服务器,我们看到,从服务同步成功
实验三:三台服务器实现级联复制 如果主服务器既承担写操作又承担多台从服务器的复制工作,负担可能会比较大,这时候如果只用1台服务器从主服务器复制,其他的服务器再从这台服务器上复制,可一定程度上减轻主服务器的负担
但是,中间的服务器即使启用了二进制日志,也不会记录从主服务器上复制过来的那些二进制数据,需要额外加一个设置,才能启动级联传输 [mysqld] log_slave_updates
准备三台虚拟机分别作为主服务器、中间服务器和从服务器,在本次实验中,主服务器的IP为192.168.30.3,提示符为master,中间服务器的IP为192.168.30.4,提示符为slave1,从服务器的IP为192.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服务使配置生效
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
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
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 看到从服务器已经开始工作
8、测试 在主服务器,导入hellodb数据库 #mysql < hellodb_innodb.sql 在中间服务器,我们看到,hellodb数据库已同步成功
在从服务器, hellodb数据库也已同步成功,至此我们实现了MySQL数据库的级联复制
复制架构中应该注意的问题 1、限制从服务器为只读 在从服务器上设置read_only=ON 注意:此限制对拥有SUPER权限的用户均无效 阻止所有用户, 包括主服务器复制的更新 mysql> FLUSH TABLES WITH READ LOCK; #这项一般不设 2、RESET 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
将此服务器配置修改为主服务器配置 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 log和relay log (3) 创建拥有复制权限的用户账号 (4) 定义自动增长id字段的数值范围各为奇偶 (5) 均把对方指定为主节点,并启动复制线程
实验五:实现主主复制 准备两台虚拟机分别作为主服务器1和主服务器2,在本次实验中,主服务器1的IP为192.168.30.3,提示符为master1,主服务器2的IP为192.168.30.4,提示符为master2
在主服务器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服务使配置生效
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服务使配置生效
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; 分别查看两台主服务器均同步成功
在主服务器1的数据库中不指定ID添加数据时,默认以奇数递增;
在主服务器2的数据库中不指定ID添加数据时,默认以偶数递增;
主主复制就是通过此种方法来避免数据可能出现的冲突。
半同步复制 默认情况下,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%';
在从服务器: 安装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%';
至此,主从服务器的半同步复制就搭建完成了。重启mariadb服务的话,配置将失效,如果想永久启用,可写入配置文件中。
复制过滤器 让从节点仅复制指定的数据库,或指定数据库的指定表 两种实现方式: (1) 服务器选项:主服务器仅向二进制日志中记录与特定数据库相关的事件 注意:此项和binlog_format相关 参看:https://mariadb.com/kb/en/library/mysqld-options/#-binlog-ignore-db 无法作为动态变量修改,只能作为选项写入配置文件中 binlog_do_db = 数据库白名单列表,多个数据库需多行实现 binlog_ignore_db = 数据库黑名单列表 问题:基于二进制还原将无法实现;不建议使用 (2) 从服务器SQL_THREAD在replay中继日志中的事件时,仅读取与特定数据库(特定表)相关的事件并应用于本地 问题:会造成网络及磁盘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服务器,在本次实验中,主服务器的IP为192.168.30.3,提示符为master,从服务器的IP为192.168.30.4,提示符为slave,CA服务器的IP为192.168.30.5,提示符为ca。 特别提示:在配置之前先检查mysql服务是否支持ssl功能,如果have_ssl的值为'DISABLED'则支持;如果为'NO'则不支持,需要再重新编译安装或者安装具有ssl功能的版本
在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
此时ssl目录下的文件有 ls /etc/my.cnf.d/ssl
3、在本机生成master和slave的私钥: 同时生成主服务器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
继续生成从服务器的私钥和签名请求 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
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
systemctl restart mariadb #重启mysql服务使配置生效 mysql> show variables like '%ssl%'; #查看是否生效
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) 数据不一致如何修复 删除从数据库,重新复制 (责任编辑:IT) |