一、 背景
此前门户mysql的架构是主从架构,而且主从不同步了,此次调整,是把主从,调整成双主,并实现数据同步。
操作时间是2021.12.18 22:00,本人实操的真实案例,首发墨天轮!
二、架构对比
|
|
主从架构 |
双主架构 |
|
架构说明 |
主从+keepalived , 主库node1 ,从库node2 |
双主+keepalived 数据库node1和node2 |
|
架构详情 |
1. 此时的 从库 node2 的作用只是起到一个对主库node1 数据备份作用,如果主库node1挂掉, vip 会漂移到从库node2,但是从库node2 只能进行读取,不能进行数据写入。 |
1. 双主模式的架构,就是两个数据库 互相是对方的主库,互相又是对方的从库,如果此时业务连接的主库挂掉,vip 会漂到另一个节点的数据库,不影响业务的读写, |
三、操作过程
为方便描述,先规定服务器
192.168.102.136为主库,192.168.102.137为备库,尽管最终都是主库,文中mysql的登录密码已隐藏。
1、 修改复制用户的密码
set
password for repl@192.168.102.136 = password('repl');
Query OK,
0 rows affected, 1 warming (0.00 sec)
set
password for repl@192.168.102.137 = password('repl');
Query OK,
0 rows affected, 1 warming (0.00 sec)
flush
privileges;
commit;
2、 主库备份数据
xtrabackup --defaults-file=/etc/my.cnf --user=root
--password=****** --backup --target-dir=/data/backup/fullback12 -parallel=2
cd /data/backup
du –sh fullback12
显示51G
3、 传输到备库
scp -r /mysql/backup/fullback12 root@192.168.102.137:/data/backup
4、 在传输的过程,备库可以同时操作
service mysqld stop
cd /data/mysqldata13306
mv mydata
mydata_bak
mv innodb_log
innodb_log_bak
mv
innodb_ts innodb_ts_bak
mv undo undo_bak
mkdir mydata
mkdir innodb_log
mkdir innodb_ts
mkdir undo
chown -R mysql:mysql ./*
等主库传输入备库成功之后
备库进行恢复数据(xtrabackup为第三方工具)
xtrabackup --dufaults-file=/etc/my.cnf --prepare
--user-memory=1G --target-dir=/data/backup/fullback12
--parallel=2
cd /data/mysqldata13306
rsync -avrP /mysql/backup/fullback12/* --exclude='xtrabackup_*'
/data/mysqldata13306/
5、 根据my.cnf的配置,把文件移到相应的目录下面
mv undo00* undo
mv ib_logfile*
innod_log
mv ibdata*
innodb_ts
mv ibtmpl
innodb_ts
cd
mysqldata13306/mydata
cat auto.cnf
mv kehua@002dhap
mydata
mv mysql mydata
mv
performance_schema mydata
mv protal mydata
mv sys mydata
6、 启动备库
chown -R mysql:mysql
/data/mysqldata13306/*
service mysqld start
mysql -uroot -pkehua@*********
两边都通过show databases,比较库名。相同。
7、 在当前的零时会话关闭二进制,在清理一下gtid
先通过:cat xtrabackup_binlog_info,复制gtid
再执行
set
@MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
set @@SESSION.SQL_LOG_BIN = 0;
set @@GLOBAL.GTID_PURGED ='上面复制的gtid';
set @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
8、 主备进行同步操作
备库:
change master to
master_host='192.168.102.136',master_port=13306, master_user='repuser',
master_password='repl', master_auto_position=1;
主库:
change master to
master_host='192.168.102.137',master_port=13306, master_user='repuser',
master_password='repl', master_auto_position=1;
两边都执行:
Start slave;
show slave status\G;发现有异常。
备库:
show global variables like '%gtid%'; (复制gtid_executed:29badb59-4105-11e9-85d2-005056966f92:1-2)
主库:
set global gtid_purged = '29badb59-4105-11e9-85d2-005056966f92:1-2';
reset slave;
show slave status\G; 正常。
如果在备份前切换下日志flush logs,这一步就不会出错了。
9、 测试数据同步
主库:
create
database testdb;
create
table testdb.testtb (id int,name varchar(40));
insert
into testdb.testtb values
(1,'test211'),(2,'test212'),(3,'test213'),(4,'test214'),(5,'test215');
commit;
备库:
select *
from testdb.testtb;
主库:
drop
databases testdb;
反过来再操作一次。
可通过以下语句检查两边的库的大小,及表的数量
门户的表的数量:
select table_name, table_rows from information_schma.tables
where TABLE_SCHEMA = 'portal' order by table_rows desc;
查看每个库的大小
select table_schema "Database Name", SUM(
data_length + index_length ) / 1024 / 1024 / 1024 "Database Size in
MB" from information_schema.TABLES group by table_schema;
10、
配置keepalived并启动
cd /etc/keepalived
cat cat keepalived.conf
为方便比较,我做成表格,左右比较
|
主库 |
备库 |
|
! Configuration File for
keepalived global_defs { router_id
MASTER-HA } vrrp_script chk_mysql_port {
script "/opt/chk_mysql.sh"
interval 2
weight -5
fall 2
rise 1 } vrrp_instance VI_1 {
state BACKUP
interface eno16780032
mcast_src_ip 192.168.102.136
virtual_router_id 80
priority 100
nopreempt
advert_int 1
authentication { auth_type PASS auth_pass 1111
}
virtual_ipaddress { 192.168.102.154
} track_script {
chk_mysql_port
} } |
! Configuration File for
keepalived global_defs { router_id
MASTER-HA } vrrp_script chk_mysql_port {
script "/opt/chk_mysql.sh"
interval 2
weight -5
fall 2
rise 1 } vrrp_instance VI_1 {
state BACKUP
interface eno16780032
mcast_src_ip 192.168.102.137
virtual_router_id 80
priority 99
nopreempt
advert_int 1
authentication { auth_type PASS auth_pass 1111
}
virtual_ipaddress { 192.168.102.154
} track_script {
chk_mysql_port } } |
可以看出,两边的配置,除了IP(已标粗)不一样,其它完全一致。
两边都启动keepalived:
systemctl start keepalived
11、
测试vip漂移
主库
Service mysqld stop
此时日志显示:
Dec 19
00:36:58 Portal-db1 systemd: Stopping LVS and VRRP High Availability Monitor...
Dec 19
00:36:58 Portal-db1 Keepalived[25726]: Stopping Keepalived v1.2.10 (01/26,2014)
Dec 19
00:36:58 Portal-db1 Keepalived_vrrp[25728]: VRRP_Instance(VI_1) sending 0
priority
Dec 19
00:36:58 Portal-db1 Keepalived_vrrp[25728]: VRRP_Instance(VI_1) removing
protocol VIPs.
Dec 19
00:36:58 Portal-db1 avahi-daemon[929]: Withdrawing address record for
192.168.102.154 on eno16780032.
Dec 19
00:36:58 Portal-db1 systemd: Stopped LVS and VRRP High Availability Monitor.
备库
日志显示:
Dec 19
00:37:06 Portal-db2 Keepalived_vrrp[15904]: VRRP_Instance(VI_1) Transition to MASTER STATE (*****)
Dec 19
00:37:07 Portal-db2 Keepalived_vrrp[15904]: VRRP_Instance(VI_1) Entering MASTER
STATE
Dec 19
00:37:07 Portal-db2 Keepalived_vrrp[15904]: VRRP_Instance(VI_1) setting
protocol VIPs.
Dec 19
00:37:07 Portal-db2 Keepalived_healthcheckers[15903]: Netlink reflector reports
IP 192.168.102.154 added
Dec 19
00:37:07 Portal-db2 Keepalived_vrrp[15904]: VRRP_Instance(VI_1) Sending
gratuitous ARPs on eno16780032 for 192.168.102.154
Dec 19
00:37:07 Portal-db2 avahi-daemon[937]: Registering new address record for
192.168.102.154 on eno16780032.IPv4.
Dec 19 00:37:12 Portal-db2 Keepalived_vrrp[15904]:
VRRP_Instance(VI_1) Sending gratuitous ARPs on eno16780032 for 192.168.102.154
上面标红的字可能看出:备库137,已经成功接管。
主库开启数据库,备库停止数据库,主库136也可以成功接管。
至此,mysql双主架构调整成功!




