MYSQL5.7.24UAT或仿真环境搭建

MYSQL5.7.24UAT或仿真环境搭建

一般一个公司里的应用是从dev db启动再到test db,都没有问题再到uat db或者仿真环境,进行上线的最后测试;当然这里面设计很多技术:如sql审计、功能测试、性能测试等;
目标:
1.可以快速构建UAT DB即时是TB级别的数据库
2.数据的时效性,最多落后生产数据库24小时
3.UAT验证的数据,在第二天会被回退了
4.DB支撑有效模拟线上业务

技术:
1.mysql复制框架
2.LVM snapshot技术
3.python脚本自动化

整体架构图


我们要完成S2->S2_1->S2_1_0复制逻辑及自动化过程

一、在UAT DB的server上构建MYSQL复制架构S2_1
0.创建mysql用户
1.构建如下目录

cd /
mkdir -p {mysqlog2,mysqlog,conf,data}
mkdir -p /snap_data/mysql

2.授权目录

cd /
chown mysql:mysql -R /snap_data
chown mysql:mysql -R {mysqlog2,mysqlog,conf,data}

3.构建mysql复制,这里不具体介绍搭建步骤,注意一下几点:

a.S2_1 DB 的数据库目录放在data目录下,这个目录必须要基于LVM方式创建的
b.S2_1 DB 的日志目录放在mysqlog目录下
c.S2_1 和S2_1_0的配置文件目录放置在conf下名字如下,建议两个参数配置一样,但端口和server_id保持不一样
[root@localhost conf]# ls
my.cnf my_snap.cnf
d.S2_1_0的数据目录放在/snap_data下,实际是一个lvm快照直接挂上来
e.主要socket文件命名S2_1为mysql.sock S2_1_0为mysql3307.sock
f.mysql软件目录为/usr/local/mysql

4.搭建完毕,利用如下步骤进行测试,没有问题可以进行自动化
0_1 0_2这个两个步骤在初次搭建时无需执行,在后续需要执行

0_1).关闭S2_1_0实例

/usr/local/mysql/bin/mysqladmin -uroot -proot -S/tmp/mysql3307.sock shutdown

0_2).umount S2_1_0目录

fuser -k /dev/mapper/vg_mysql-mysqllvsnap
umount /dev/mapper/vg_mysql-mysqllvsnap
lvremove /dev/mapper/vg_mysql-mysqllvsnap <<<<需要y确认

0).关闭S2_1复制线程

/usr/local/mysql/bin/mysql -uroot -proot-S /tmp/mysql.sock
stop slave

1).关闭S2_1 mysql进程

/usr/local/mysql/bin/mysqladmin -uroot -phandpay76! -S/tmp/mysql.sock shutdown

2).umount S2_1的data目录挂在点

fuser -k /dev/mapper/vg_mysql-lv_mysql
umount /dev/mapper/vg_mysql-lv_mysql

3).创建快照

lvcreate -L 200G -s -n mysqllvsnap /dev/mapper/vg_mysql-lv_mysql

4).mount S2_1的data目录挂在点

mount /dev/mapper/vg_mysql-lv_mysql /data

5).启动 S2_1 mysql进程

/usr/local/mysql/bin/mysqld --defaults-file=/conf/my.cnf &

6).mount S2_1_0

mount /dev/mapper/vg_mysql-mysqllvsnap /snap_data/

7).启动S2_1_0 mysql进程

/usr/local/mysql/bin/mysqld --defaults-file=/conf/my_snap.cnf &

8).将S2_1_0 mysql复制线程关闭,及信息擦除

stop slave;
reset slave all;

9).start S2_1 io thread

start slave io_thread;

5.构建自动化脚本,请参考

https://github.com/trsenzhang/AOMmysql下的preDBcreate.sh脚本

15分钟核心业务切换(switchover)演练

整个过程,业务不连续时间为小于15min,操作需在业务低峰期进行操作,里面涉及DNS,NAT转发,ADG switchover等成熟技术,防火墙策略,业务验证等技术;
整个流程是:
1.提前做个端口转发的透明网关(如果已有,可忽略),将其直接访问db集群的流量,放到网关上做转发
2.进行DB switchover操作,具体操作会在下面描述细节,作为DBA出生的我,可能更关注这块
3.检查应用报错信息(因为应用服务器有300多台),我们这里采用日志平台进行错误应用观察跟踪,这个业务量还是很大
4.验证业务有效性
5.拆除透明网关
6.验证业务有效性

切换机构图如下:

一、转发网关利用iptales NAT技术进行修改数据包ip,port等信息,此时不会对包里的数据进行修改,脚本如下:

[root@trsen ~]# cat 1.sh
#!/bin/bash

export SERVER1="10.10.10.105"
export SERVER1_BACKEND="10.10.10.52"
export SERVER2="10.10.10.106"
export SERVER2_BACKEND="10.10.10.53"


iptables -F -t nat

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -d ${SERVER1} -j DNAT --to-destination ${SERVER1_BACKEND}
iptables -t nat -A POSTROUTING -s ${SERVER1_BACKEND} -j SNAT --to-source ${SERVER1}
iptables -t nat -A PREROUTING -d ${SERVER2} -j DNAT --to-destination ${SERVER2_BACKEND}
iptables -t nat -A POSTROUTING -s ${SERVER2_BACKEND} -j SNAT --to-source ${SERVER2}
You have mail in /var/spool/mail/root

[root@trsen ~]# cat 2.sh
#!/bin/bash

export SERVER1="10.10.10.105"
export SERVER1_BACKEND="10.10.10.42"
export SERVER2="10.10.10.106"
export SERVER2_BACKEND="10.10.10.43"


iptables -F -t nat

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -d ${SERVER1} -j DNAT --to-destination ${SERVER1_BACKEND}
iptables -t nat -A POSTROUTING -s ${SERVER1_BACKEND} -j SNAT --to-source ${SERVER1}
iptables -t nat -A PREROUTING -d ${SERVER2} -j DNAT --to-destination ${SERVER2_BACKEND}
iptables -t nat -A POSTROUTING -s ${SERVER2_BACKEND} -j SNAT --to-source ${SERVER2}

二、切换前准备
1.通过业务,要做大操作了,商讨操作时间及可能影响情况及需要的支持,当然是业务有效性验证了
2.sys检查应用自动化启动脚本,及批量修改解析主机host信息,此处不过多说明

a.检查数据库service_name连接数量是否与该实例配置连接数量一致
b.检查代理服务器该虚拟机数据库连接数与实例的配置连接数量一致

3.dba检查db是否满足switchover操作:
a.参数
FAL_CLIENT
FAL_SERVER
LOG_ARCHIVE_CONFIG
DB_FILE_NAME_CONVERT
LOG_FILE_NAME_CONVERT
STANDBY_FILE_MANAGEMENT
DB_NAME
DB_UNIQUE_NAME
LOG_ARCHIVE_FORMAT
REMOTE_LOGIN_PASSWORDFILE
log_archive_dest_1
log_archive_dest_2
log_archive_dest_3
log_archive_dest_5
log_archive_dest_6
log_archive_dest_4
log_archive_dest_state_1
log_archive_dest_state_2
log_archive_dest_state_3
log_archive_dest_state_5
log_archive_dest_state_6
log_archive_dest_state_4
CONTROL_FILES
b.tnsnames.ors配置信息
c.standbylog 信息主备是否一致
d.对外提service name主备是否一致
4.检查网络策略
5.针对如上操作,分别进行测试验证,如网关转,switchover,自动化脚本等测试

三、开始切换
1).dba对数据进行操作

0.在主库锁定用户5253
alter user TEST account lock ;

检查LOCK用户状况
select username,account_status from dba_users where account_status='OPEN';

1.关闭service5253
srvctl stop service -d hpaydb
srvctl status service -d hpaydb

srvctl stop service -d hpaypr
srvctl status service -d hpaypr

###############################################################################################
----------------------------------可选操作流程-------------------------------------------------
SQL>alter database flashback on;
SQL>create restore point before_switch guarantee flashback database;

关闭可能造成blocking的job和参数
SQL>SELECT * FROM DBA_JOBS_RUNNING;
SQL>SELECT OWNER, JOB_NAME, START_DATE, END_DATE, ENABLED FROM DBA_SCHEDULER_JOBS WHERE ENABLED='TRUE' AND OWNER <> 'SYS';

##当前值1000
ALTER SYSTEM SET job_queue_processes=0 SCOPE=BOTH SID='*';

sys用户执行

关闭自动信息统计任务
BEGIN
DBMS_AUTO_TASK_ADMIN.DISABLE(
client_name => 'auto optimizer stats collection',
operation => NULL,
window_name => NULL);
END;
/

BEGIN
DBMS_AUTO_TASK_ADMIN.DISABLE(
client_name => 'auto space advisor',
operation => NULL,
window_name => NULL);
END;
/

BEGIN
DBMS_AUTO_TASK_ADMIN.DISABLE(
client_name => 'sql tuning advisor',
operation => NULL,
window_name => NULL);
END;
/

切换HPAY用户,关闭定时任务
BEGIN
DBMS_SCHEDULER.DISABLE(name => 'DBA_TEST'); 
END;
/
-------------------------------------------end-------------------------------------------------
###############################################################################################

2.主备库kill所有session(当时生成执行脚本)5253
select 'alter system kill session '''||sid||','||serial#||'''immediate ;' from v$session 
where username in('TEST');

3.查询主备库的日志应用情况
主备库查询:
select distinct thread#,max(sequence#)over(partition by thread#) from v$log_history;
select distinct thread#,max(sequence#)over(partition by thread#) from v$archived_Log where applied='YES';
SELECT * FROM V$DATAGUARD_STATS;
如果以上查询两边的日志应用已经基本同步,则可以继续第二步。否则需要等待同步进程继续,或者手动推送缺少的归档日志,然后注册应用。
alter system switch logfile;

4.主库上查询switchover_status状态5253
select switchover_status from v$database;
状态为TO STANDBY可以直接切换,如果状态为SESSIONS ACTIVE,则第一种方法,停掉应用,第二种切换时加入WITH SESSION SHUTDOWN参数。


5.关闭主备第一节点(有个小坑:如果备库是rac的,mrp进程一定要启在存活的节点)
5253主库:srvctl stop instance -d hpaydb -n hpaydb1
4243备库:srvctl stop instance -d hpaypr -n hpaypr1

6.检查备库gap 4243
select * from v$archive_gap;

7.主库做checkpoint 5253
ALTER SYSTEM CHECKPOINT;

8.执行主库切换到备库操作:(主库变为STANDBY DATABASE)5253
select open_mode, database_role, switchover_status from v$database;
此时如果状态还是不能,那么重启实例----srvctl stop instance -d hpaydb -n hpaydb2
alter database commit to switchover to physical standby WITH SESSION SHUTDOWN;

9.关闭主库重启5253
shutdown immediate;
startup mount;
alter database open read only;
alter database recover managed standby database using current logfile disconnect from session;
检查是否逆转
select switchover_status from v$database;

10.备库上查询switchover_status状态4243
SELECT SWITCHOVER_STATUS FROM V$DATABASE;
状态为TO PRIMARY可以直接切换,如果状态为SESSIONS ACTIVE,则第一种方法,停掉会话,第二种切换时加入WITH SESSION SHUTDOWN参数。

11.备库切换到主库操作:(备库变为Primary Database)4243
alter database commit to switchover to primary WITH SESSION SHUTDOWN;

12.启动新主库4243
alter database open;
SELECT SWITCHOVER_STATUS FROM V$DATABASE;

13.启动节点实例
4243新主库:srvctl start instance -d hpaypr -n hpaypr1
5253新备库:srvctl start instance -d hpaydb -n hpaydb1

14.在新主库执行日志切换(测试新的主备库日志同步)4243
alter system switch logfile;

15.在新主库解锁用户4243
alter user TEST account unlock ;

检查用户解锁状况(原先有31用户open)
select count(1) from dba_users where account_status='OPEN';

###############################################################################################
----------------------------------可选操作流程-------------------------------------------------
18.在新的主库打开定时任务
BEGIN
DBMS_SCHEDULER.ENABLE(name => 'DBA_TEST');
END;
/

打开自动信息统计及sql turning
BEGIN
DBMS_AUTO_TASK_ADMIN.ENABLE(
client_name => 'auto optimizer stats collection',
operation => NULL,
window_name => NULL);
END;
/

BEGIN
DBMS_AUTO_TASK_ADMIN.ENABLE(
client_name => 'auto space advisor',
operation => NULL,
window_name => NULL);
END;
/

BEGIN
DBMS_AUTO_TASK_ADMIN.ENABLE(
client_name => 'sql tuning advisor',
operation => NULL,
window_name => NULL);
END;
/

验证定时任务
SQL>select client_name,status from dba_autotask_client;
SQL>SELECT * FROM user_scheduler_jobs where JOB_creator='HPAY' and state='SCHEDULED';
删除还原点
SQL>drop restore point before_switch;
打开pq
ALTER SYSTEM SET job_queue_processes=1000 SCOPE=BOTH SID='*';
----------------------------------end-------------------------------------------------
###############################################################################################

16.检查service4243
srvctl status service -d hpaypr

srvctl start service -d hpaypr
srvctl status service -d hpaypr

17.检查crs信息4243
crs_stat -t/crsctl stat res -t

18.启停mrp进程信息
alter database recover managed standby database cancel;
alter database recover managed standby database using current logfile disconnect from session;

2).sys在我切换期间,将转发网关修改至新主库,待我操作完毕后,观察应用运行情况,进行debug,如果网络策略问题,应用需要重启,jndi连接信息不一致等问题进行手工解决
3).通知业务测试人员进行业务有效性验证
4).转发网关拆除(此步骤,是在线,一般不影响业务),我们把它放在第二天进行处理
5).网关拆除后,通知业务测试人员,进行测试

四、通知总结
1.问题总结
2.通知完成状态