目录:

【0】需求
  目前使用Mysql数据库,100GB+数据量,需要实现1主3从环境。
  需要实现SSL安全复制,同时需要测试异常宕机切换演练

【1】实验环境
  数据库架构:主从复制,基于主库搭建3个从库,采用Xtrabackup + GTID + 无损同步复制
【2】配置主从
  【2.0】配置文件 my.cnf(/etc/my.cnf)
  【2.1】主库创建复制用户并授权
  【2.2】主库准备测试数据
【3】搭建主从
  【3.1】查看备份截止的GTID
  【3.2】主从配置
  【3.3】核验
【4】配置 SSL 安全协议
  #【4.1】在主服务器上面创建 ssl/rsa 文件
  #【4.2】在主服务器上修改my.cnf,并重启mysql
  #【4.3】在主服务器上创建一个 SSL 认证的复制用户
  #【4.4】在从服务上开启SSL功能
    #把主服务生成的证书传给从服务器(在主服务器上执行)
  #【4.5】修改从服务的配置文件
  #【4.6】测试 SSL 连通性
  #【4.7】在从库配置基于 SSL 的主从
  #【4.8】测试 SSL 复制及数据验证

【5】故障切换
情况思路:
   当主库(201)宕机了,暂时不能修复。
   先找一台从库(比如202)来当主库,所有从库重新执行新主库(202)。
   如果原主库(201)修好了,那么把它当做一个新从库使用,执行新主库(202)。
【5.1】模拟主库宕机
【5.2】检查从库状态
【5.3】切换步骤(把 192.168.1.202 做新主库)
  #【5.3.1】确保所有的relay log 全部读取完毕
  #【5.3.2】对新主库 192.168.1.202 进行配置
  #【5.3.3】在新主库(202)上查看是否有复制用户,没有则新建
  #【5.3.4】配置另外2台从库(203~204)到新主库(202)
    #在203,204机器上操作
  #【5.3.5】校验
  #【5.3.6】在新主库中开启事件
  #【5.3.7】通知业务,调整数据库IP

正文:

【0】需求

  目前使用Mysql数据库,100GB+数据量,需要实现1主3从环境。

  需要实现SSL安全复制,同时需要测试异常宕机切换演练

【1】实验环境

  操作系统:CentOS 7.5

  数据库版本:MySQL 5.7.24

  数据库架构:主从复制,基于主库搭建3个从库,采用Xtrabackup + GTID + 无损同步复制

  主库IP:192.168.1.201  port:3306

  主库IP:192.168.1.202  port:3306

  主库IP:192.168.1.203  port:3306

  主库IP:192.168.1.204  port:3306

  

  大致步骤思路:

    (1)配置好主从

    (2)配置好SSL

    (3)故障切换演练

【2】配置主从

【2.0】配置文件 my.cnf(/etc/my.cnf)

#replication_new
log_bin=/mysql/log//mysql-bin #开启binlog
log_bin_index=/mysql/log//mysql-bin.index
binlog_format=row
binlog_rows_query_log_events=on
max_binlog_size= bind-address=0.0.0.0
server_id=2013306 #务必记得修改

expire_logs_days= #超过7天的binlog清理
innodb_support_xa=
binlog_cache_size=1M
log_bin_trust_function_creators= #同步存储过程、函数、触发器
innodb_flush_log_at_trx_commit=
sync_binlog=
transaction-isolation=read-committed

#slave parameter 如果是从库,务必放开
#relay_log=/mysql/log//relaylog/mysql-relay.log
#read_only=1  
#slave-parallel-type=LOGICAL_CLOCK
#slave-parallel-workers=
#master_info_repository=table #master_info 会记录到 mysql.slave_master_info
#relay_log_info_repository=table #relay_log 会记录到,mysql.slave_relay_log_info
#relay_log_recovery=
#slave_skip_errors=ddl_exist_errors
#slave_preserve_commit_order=1 #5.7的增强半同步
#如果是5.,参数前面加上loose_,如下列,如果是5. 则直接使用 rpl_semi_sync_master_enabled= 之类的就好了。
#我这里是5.7就直接做增强半同步了(loseless Semisynchronous ) plugin_dir=/mysql/app/mysql/lib/plugin/
plugin_load=rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so
loose_rpl_semi_sync_master_enabled= #MySQL开启主的半同步复制(rpl_semi_sync_master_enabled)
loose_rpl_semi_sync_slave_enabled= #MySQL5.6开启从的半同步复制
loose_rpl_semi_sync_master_timeout= #超时5秒,切回异步
rpl_semi_sync_master_wait_for_slave_count= #至少收到1个slave发会的ack
rpl_semi_sync_master_wait_point=AFTER_SYNC #MySQL .7的方法,AFTER_SYNC(default value,增强半同步) & AFTER_COMMIT(传统半同步)
#GTID mode
gtid_mode=on
enforce_gtid_consistency=1
log-slave-updates=1

【2.1】主库创建复制用户并授权

create user 'rpl'@'192.168.1.%' identified by '';
grant replication slave on *.* to 'rpl'@'192.168.1.%';
flush privileges;
select user,host from mysql.user;

【2.2】主库准备测试数据

or 下载与使用测试库:https://www.cnblogs.com/gered/p/10360034.html

or 下面使用测试数据:(这里我们用这个吧)

注意事件参数,set global event_scheduler=1;  要永久生效请配置到 My.cnf中去

-- 【2.2.1】构造test库和test库下的test1,test2,test3表。test4表用于模拟业务一直在运行
create database test;
use test;
create table test1(id int);
insert into test1 values(1);
create table test2(id int);
insert into test2 values(2);
create table test3(id int);
insert into test3 values(3);
commit;
create table test4(id int);
insert into test4 values(4);
commit; -- 【2.2.2】构造存储过程sp_test4来循环插入test4表,模拟业务运行
use test;
drop procedure if exists sp_test4;
delimiter $$
create procedure sp_test4()
begin
declare n int;
set n=11;
while(n<=20)
do
insert into test.test4 values(n);
commit;
set n=n+1;
end while;
end $$
delimiter ; -- 【2.2.3】构造事件,来调度sp_test4过程
use test;
set global event_scheduler=1; delimiter $$
create event if not exists event_test4
on schedule every 5 second
on completion preserve
enable
do
begin
call sp_test4();
end $$
delimiter ; -- 为了防止测试数据量累计导致卡顿,我这里5小时做一次truncate
delimiter $$
create event if not exists event_truncate_test4
on schedule every 5 hour
on completion preserve
enable
do
begin
truncate table test.test4;
end $$
delimiter ;

下载与使用xtrabackup:

  (4.15)mysql备份还原——物理备份之XtraBackup的下载与安装

  (4.16)mysql备份还原——物理备份之XtraBackup实践

在主服务器上:

# 主服务器备份
innobackupex --defaults-file=/etc/my.cnf -uroot -p123456 --no-timestamp /mysql/backup/full.bak #主服务器的备份 传输到从机器
scp -r /mysql/backup/full.bak root@192.168.1.202:/mysql/backup/
scp -r /mysql/backup/full.bak root@192.168.1.203:/mysql/backup/
scp -r /mysql/backup/full.bak root@192.168.1.204:/mysql/backup/
#在从服务器还原
innobackupex --apply-log /mysql/backup/full.bak
service mysql stop
cd /mysql/data/3306
mkdir data
innobackupex --defaults-file=/etc/my.cnf --copy-back /mysql/backup/full.bak
chown -R mysql:mysql /mysql
chmod -R 755 /mysql --因为默认从库的event选项是关闭的,所以从库不会执行,且加了read only。

【3】搭建主从

【3.1】查看备份截止的GTID

  

【3.2】主从配置

#在从服务器上执行
stop slave;
reset slave;
reset master;
SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
SET @@SESSION.SQL_LOG_BIN= 0;
set global gtid_purged='2c8b1813-e26f-11e9-adce-000c29658c19:1-417';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
show master status; change master to
master_host='192.168.1.201',
master_user='rpl',
master_password='',
master_port=3306,
master_auto_position=1; start slave;

【3.3】核验

(1)show slave status\G

(2)show processlist;

(3)select count(1) from test.test4;

【4】配置 SSL 安全协议

#【4.1】在主服务器上面创建 ssl/rsa 文件
cd /mysql/data/3306/data
mysql_ssl_rsa_setup --datadir=/mysql/data/3306/data --user=mysql --uid=mysql

注意,权限要是mysql的,不然可能用不了。

#【4.2】在主服务器上修改my.cnf,并重启mysql
[mysqld]
echo "ssl-ca=/mysql/data/3306/data/ca.pem">>/etc/my.cnf
echo "ssl-cert=/mysql/data/3306/data/server-cert.pem">>/etc/my.cnf
echo "ssl-key=/mysql/data/3306/data/server-key.pem">>/etc/my.cnf
#systemctl restart mysql
service mysql restart
#check log and status
tail -100f /mysql/log/3306/mysql.err
show variables like '%ssl%';
show variables like 'tls_version'; #【4.3】在主服务器上创建一个 SSL 认证的复制用户
create user 'rplssl'@'192.168.1.%' identified by '123456';
grant replication slave on *.* to 'rplssl'@'192.168.1.%';
flush privileges;
select user,host from mysql.user; #【4.4】在从服务上开启SSL功能
#把主服务生成的证书传给从服务器(在主服务器上执行
cd /mysql/data/3306/data
scp ca.pem client-cert.pem client-key.pem root@192.168.1.202:/mysql/data/3306/data/
scp ca.pem client-cert.pem client-key.pem root@192.168.1.203:/mysql/data/3306/data/
scp ca.pem client-cert.pem client-key.pem root@192.168.1.204:/mysql/data/3306/data/ #在从服务器
chown mysql:mysql /mysql/data/3306/data/*
chmod 755 /mysql/data/3306/data/* #【4.5】修改从服务的配置文件
echo "ssl-ca=/mysql/data/3306/data/ca.pem" >> /etc/my.cnf
echo "ssl-cert=/mysql/data/3306/data/server-cert.pem" >>/etc/my.cnf
echo "ssl-key=/mysql/data/3306/data/server-key.pem" >>/etc/my.cnf
#systemctl restart mysql
service mysql restart
#check log and status
tail -100f /mysql/log/3306/mysql.err
show variables like '%ssl%';
show variables like 'tls_version';
  

#【4.6】测试 SSL 连通性

mysql -u'rplssl' -p123456 -h192.168.1.201 --ssl-ca=/mysql/data/3306/data/ca.pem --ssl-cert=/mysql/data/3306/data/client-cert.pem --ssl-key=/mysql/data/3306/data/client-key.pem

#【4.7】在从库配置基于 SSL 的主从

stop slave;

change master to
master_host='192.168.1.201',
master_port=3306,
master_user='rplssl',
master_password='123456',
master_auto_position=1,
master_ssl=1,
master_ssl_ca='/mysql/data/3306/data/ca.pem',
master_ssl_cert='/mysql/data/3306/data/client-cert.pem',
master_ssl_key='/mysql/data/3306/data/client-key.pem';

start slave;

show slave status\G

show processlist;

#【4.8】测试 SSL 复制及数据验证

#(1)主库上抓包,查看是否能加密传输:

tcpdump -i ens34 -nn -XX ip dst host 192.168.1.201 and tcp dst port 3306

#(2)测试数据

select count(1) from test.test4;

#(3)构造新数据测试

create databases test1;

create table test1(id int);

insert into test1.test1 values(1);

commit;

【5】故障切换

有2种情况

  (1)有SSL

    建议方案1:先按无SSL的切换,然后在等原主修复好,切换回原主

    建议方案2:先按无SSL的切换,然后再按上面的重新配置操作 SSL。

  (2)无SSL

    生成中巨多。

情况思路:

  当主库(201)宕机了,暂时不能修复。

  先找一台从库(比如202)来当主库,所有从库重新执行新主库(202)。

  如果原主库(201)修好了,那么把它当做一个新从库使用,执行新主库(202)。

#【5.1】模拟主库宕机
select count() from test.test4;
shutdown -h now #【5.2】检查从库状态
select count(1) from test.test4;
show processlist;
show slave status\G

【5.3】切换步骤(把 192.168.1.202 做新主库)

#【5.3.】确保所有的relay log 全部读取完毕
stop slave io_thread;
show slave status\G
show processlist; #对比
Master_log_file | Read_Master_Log_Pos
Relay_master_log_file | Exec_Master_Log_Pos
#核心还是查看Relay_master_log_file 和 Exec_Master_Log_Pos,哪个从库的值最大就是主库。 #【5.3.2】对新主库 192.168.1.202 进行配置
stop slave;
reset master;
reset slave all; #参数文件 my.cnf
read-only=1
slave相关的等等....全部注释掉 #systemctl restart mysqld;
service mysql restart #【5.3.3】在新主库(202)上查看是否有复制用户,没有则新建
select user,host from mysql.user;
-- create replication user: rpl
create user 'rpl'@'192.168.1.%' identified by '123456';
grant replication slave on *.* to 'rpl'@'192.168.1.%';
flush privileges;
select user,host from mysql.user;
#【5.3.4】配置另外2台从库(203~204)到新主库(202)
#在203,204机器上操作
stop slave;
reset slave all;
reset master; change master to
master_host='192.168.1.202',
master_port=3306,
master_user='rpl',
master_password='123456',
master_auto_position=1; start slave; #【5.3.5】校验
show slave status\G
show processlist;
select count(1) from test.test4; #【5.3.6】在新主库中开启事件
set global event_scheduler=1;
#如果要永久开,最好还是加入到 my.cnf 中去。 #【5.3.7】通知业务,调整数据库IP

(5.13)mysql高可用系列——1主3从复制(SSL)的更多相关文章

  1. (5.8)mysql高可用系列——MySQL中的GTID复制(实践篇)

    一.基于GTID的异步复制(一主一从)无数据/少数据搭建 二.基于GTID的无损半同步复制(一主一从)(mysql5.7)基于大数据量的初始化 正文: [0]概念 [0.5]GTID 复制(mysql ...

  2. MySQL高可用架构之MySQL5.7组复制MGR

    MySQL高可用架构之MySQL5.7组复制MGR########################################################################### ...

  3. (5.15)mysql高可用系列——MHA实践

    关键词:MHA,mysql mha [1]需求 采用mysql技术,实现MHA高可用主从环境,预计未来数据量几百G MHA概念参考:MYSQL高可用技术概述 [2]环境技术架构 [2.1]MHA简介 ...

  4. (5.1)mysql高可用系列——高可用架构方案概述

    关键词:mysql高可用概述,mysql高可用架构 常用高可用方案 20190918 现在业内常用的MySQL高可用方案有哪些?目前来说,用的比较多的开源方案分内置高可用与外部实现,内置高可用有如下: ...

  5. MySQL高可用系列之MHA(二)

    一.參数说明 MHA提供了一系列配置參数.深入理解每一个參数的详细含义,对优化配置.合理使用MHA非常重要.非常多高可用性也都是通过合理配置一些參数而实现的. MHA包含例如以下配置參数,分别说明例如 ...

  6. (5.3)mysql高可用系列——mysql复制之复制的参数

    参考:https://www.iteye.com/blog/shift-alt-ctrl-2269539 详情 [1]参数 #[1.1]基本参数 bind-address=192.168.1.201 ...

  7. (5.6)mysql高可用系列——MySQL Utilities 管理工具

    关键词:mysql工具集,mysql管理工具,mysql utilities [1]安装mysql utilities cd /download wget https://cdn.mysql.com/ ...

  8. (5.3)mysql高可用系列——mysql复制(理论篇)【续写中】

    关键词:mysql主从复制,mysql复制,MGR,mysql并行复制 目录 [1]mysql支持的复制类型 [2]mysql的主从4种同步方式介绍 (1)异步 (2)同步 (3)5.6 半同步 (4 ...

  9. (5.10)mysql高可用系列——percona-toolkit工具下的pt-table-checksum 在线验证主从一致性【续写中】

    关键词:percona-toolkit 工具包中包含 pt-table-checksum工具,在线验证主从一致性 [1]percona-toolkit 工具包 [1.1]percona-toolkit ...

随机推荐

  1. 010_linuxC++之_运算符重载

    (一)运算符重载:运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型. (二)实现类不同对象里中变量的相加 (三)程序 #include <iostream> ...

  2. 快速弄清JavaScript中undefined和null的区别

    ES6的7大数据类型里面有这俩玩意:undefined和null,让接触不深的学习者常常产生混淆,这俩玩意的区别在哪呢? 字面意思上来看,undefined是未(被我们)阐明的,未说明的,null则意 ...

  3. 2019CSP-J第二轮 B题C题

    B.简单模拟 /* 寻找每一张公交票可用的最早的地铁优惠票,使用过之后一定要销毁*/ #include <iostream> #include <cstdio> #includ ...

  4. 2017.9.23 NOIP2017 金秋杯系列模拟赛 day1 T1

    回形遍历( calc .cpp/c/pas) 时间限制:1s内存 限制: 256MB [问题 描 述] 给出一个 n*m 的棋盘,按如下方式遍历,请问(x,y)往后 z 步走到的是哪个格子. [输入] ...

  5. 小程序列表倒计时 wxs 实现

    效果 代码 js //拿到服务器时间 var serverLocalDate = data.serverLocalDate; //调用函数开始计时 this.serverLocalDate(serve ...

  6. pyqt5的简单进度条程序

    # -*- coding: utf-8 -*- # @Author : FELIX # @Date : 2018/5/17 16:43 from PyQt5.QtCore import QBasicT ...

  7. chromedriver安装

    chromedriver.exe下载 淘宝的镜像地址可以下载 https://npm.taobao.org/mirrors/chromedriver/ 找到自己chrome浏览器适合的chromeDr ...

  8. 终端和vim中文编码问题

    一. 终端中文显示乱码 有网友说修改 /var/lib/locales/supported.d/locale 和 /etc/default/locale 就可以了但是如果多人共用一台机器没有root权 ...

  9. DockerFile 简单使用

    Dockerfile 是用来构建 Docker 镜像的构建文件,是由一系列命令和参数构成的脚本. 以 CentOS 为例(https://hub.docker.com/_/centos): FROM ...

  10. 客户端连接虚拟机上的MYSQL报错

    这个原因是因为虚拟机的数据库拒绝其他主机访问 所以需要设置虚拟机的mysql 打开mysql mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' ID ...