暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

mysql数据库主主架构配置实录

原创 DER322 2021-12-24
609

一、 背景

 

此前门户mysql的架构是主从架构,而且主从不同步了,此次调整,是把主从,调整成双主,并实现数据同步。

操作时间是2021.12.18  22:00,本人实操的真实案例,首发墨天轮!

 

二、架构对比

 

主从架构

双主架构

架构说明

主从+keepalived , 主库node1 ,从库node2

 

双主+keepalived 数据库node1和node2

 

架构详情

1. 此时的 从库 node2 的作用只是起到一个对主库node1 数据备份作用,如果主库node1挂掉, vip 会漂移到从库node2,但是从库node2 只能进行读取,不能进行数据写入。

2. 如果只是为了数据的安全,单纯的起到实时的备份,可以选择 主从架构 + keepalived

3. 如果真的主库挂掉了,会影响到业务的,此时如果让从库接替主库的工作,需要人工进行干预,调整从库参数。这样对业务的影响比较久。从库node2需要重启数据库。

 

1. 双主模式的架构,就是两个数据库 互相是对方的主库,互相又是对方的从库,如果此时业务连接的主库挂掉,vip 会漂到另一个节点的数据库,不影响业务的读写,
   从库也不需要人工的干预,业务可以及时的正常访问。保证了业务的实时访问。
 
2. 如果为了数据的安全和一致性,避免有人为的操作,对数据node2进行更改,对数据库 node2 设置为只读(可以在线调整,不需要重启数据库),当此时用的主库node1挂掉后,vip 漂移到另一个node2的主库上面,然后只需要调整node2,取消node2为只读,数据库就可以进行正常的写了,这样可以极大的缩短对业务的影响。当挂掉的主库修复好了,启动数据库同步,此时的node2数据库的数据会同步到node1,不需要人为的进行数据初始化了。

 

 

 

三、操作过程

 

为方便描述,先规定服务器 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双主架构调整成功!

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论