目录

一、清除原从数据库数据及主从关系

1.1、关闭主从数据库原有的主从关系

从库停止salve

  1. mysql> stop salve;

查看主从关系连接状态,确保IO线程和SQL线程停止运行

  1. mysql> show slave status\G;
  2. ......
  3. Slave_IO_Running: NO
  4. Slave_SQL_Running: NO
  5. ......

1.2、清除从数据库原有数据

从库删除原有tsc数据库

  1. mysql> drop database tsc;

从库重新创建tsc数据库

  1. mysql> create database tsc;

二、将主库上的数据备份到从库

2.1、备份主库数据到从库

从库备份主库数据到本地,该过程主库不会锁表。

  1. [root@mysql-2 ~]# mysqldump -umaster -pSenseTime#2020 -h 192.168.116.128 --single-transaction tsc > /root/tsc.sql;

查询备份到从库本地tsc.sql文件的大小,保证数据量充足。

  1. [root@mysql-2 ~]# ll /root/tsc.sql -h

2.2、在从库使用tsc.sql文件恢复主库数据

查看是否存在tsc数据库

  1. mysql> show databases;

进入tsc数据库

  1. mysql> use tsc;

在从数据库上开始备份数据

  1. mysql> source /root/tsc.sql;

备份完成后,检查从库tsc库中的数据表数量

  1. mysql> show tables;

检查各数据表中的数据条数

  1. mysql> select count(*) from tb_fever_treatment;
  2. +----------+
  3. | count(*) |
  4. +----------+
  5. | 50056 |
  6. +----------+
  7. 1 row in set (0.01 sec)

三、建立主主关系

3.1、修改数据库配置文件并重启生效

修改主库mysql配置文件

  1. [root@mysql-1 ~]# vi /etc/my.cnf
  2. [mysqld]
  3. datadir=/var/lib/mysql
  4. socket=/var/lib/mysql/mysql.sock
  5. symbolic-links=0
  6. log-error=/var/log/mysqld.log
  7. pid-file=/var/run/mysqld/mysqld.pid
  8. log_bin=master-bin
  9. binlog_format=MIXED
  10. server_id=1
  11. gtid-mode=on
  12. enforce-gtid-consistency
  13. skip-name-resolve
  14. skip-host-cache
  15. #在原有配置上增加以下内容
  16. auto-increment-offset=2
  17. auto-increment-increment=2
  18. relay_log=mysql-relay-bin
  19. log-slave-updates=on

修改从库mysql配置文件

  1. [root@mysql-2 ~]# vi /etc/my.cnf
  2. [mysqld]
  3. datadir=/var/lib/mysql
  4. socket=/var/lib/mysql/mysql.sock
  5. symbolic-links=0
  6. log-error=/var/log/mysqld.log
  7. pid-file=/var/run/mysqld/mysqld.pid
  8. log_bin=master-bin
  9. binlog_format=MIXED
  10. server_id=2
  11. gtid-mode=on
  12. enforce-gtid-consistency
  13. skip-name-resolve
  14. skip-host-cache
  15. #在原有配置上增加以下内容
  16. auto-increment-offset=2
  17. auto-increment-increment=2
  18. relay_log=mysql-relay-bin
  19. log-slave-updates=on

重启主数据库并验证。

  1. [root@mysql-1 ~]# systemctl restart mysqld
  2. [root@mysql-1 ~]# systemctl status mysqld

重启从数据库并验证。

  1. [root@mysql-2 ~]# systemctl restart mysqld
  2. [root@mysql-2 ~]# systemctl status mysqld

3.2、建立数据库主主关系

以mysql-1为主、mysql2为从建立主从关系

查看mysql-1的master状态,记录下file和position的值

  1. mysql> show master status\G;
  2. *************************** 1. row ***************************
  3. File: master-bin.000522
  4. Position: 438
  5. Binlog_Do_DB:
  6. Binlog_Ignore_DB:
  7. Executed_Gtid_Set: 37f084e8-9161-11eb-abf6-000c29f882cb:12-13,
  8. 87366c38-9164-11eb-988a-000c293c71e0:1-14,
  9. 87366c38-9164-11eb-988a-000c293c71e1:1-10
  10. 1 row in set (0.00 sec)

在mysql-2上建立主从关系

  1. mysql> change master to master_host='192.168.116.128',master_port=3306,master_user='master',master_password='SenseTime#2020',master_log_file='master-bin.000522',master_log_pos=438;

在mysql-2上打开主从关系

  1. mysql> start slave;

在mysql-2上查看主从关系,当IO线程和SQL线程都在运行时则主从建立成功

  1. mysql> show slave status\G;
  2. ......
  3. Slave_IO_Running: Yes
  4. Slave_SQL_Running: Yes
  5. ......
以mysql-2为主、mysql-1为从建立主从关系

查看mysql-2的master状态,记录下file和position的值

  1. mysql> show master status\G;
  2. *************************** 1. row ***************************
  3. File: master-bin.002054
  4. Position: 1948
  5. Binlog_Do_DB:
  6. Binlog_Ignore_DB:
  7. Executed_Gtid_Set: 37f084e8-9161-11eb-abf6-000c29f882cb:12-13,
  8. 87366c38-9164-11eb-988a-000c293c71e0:1-13,
  9. 87366c38-9164-11eb-988a-000c293c71e1:1-10
  10. 1 row in set (0.00 sec)

在mysql-1上建立主从关系

  1. mysql> change master to
  2. master_host='192.168.116.129',master_port=3306,master_user='master',master_password='SenseTime#2020',master_log_file='master-bin.002054',master_log_pos=1948;

在mysql-1上打开主从关系

  1. mysql> start slave;

在mysql-1上查看主从关系,当IO线程和SQL线程都在运行时则主从建立成功

  1. mysql> show slave status\G;

3.3、主主关系建立失败回退方案

若主主关系建立失败,则撤销主主关系,mysql-1对外提供服务不受影响,user用户无感知。

在mysql-1上运行:

  1. mysql> stop slave;

在mysql-2上运行:

  1. mysql> stop slave;

四、开启keepalived服务,为主主数据库创建VIP

4.1、配置mysql-1 keepalived服务的配置文件

  1. [root@mysql-1 ~]# vi /etc/keepalived/keepalived.conf
  2. ! configuration File for keepalived
  3. global_defs {
  4. router_id master
  5. }
  6. vrrp_script check_mysql {
  7. script "/etc/keepalived/check_mysql_second.sh"
  8. interval 2
  9. }
  10. vrrp_instance VI_1 {
  11. state MASTER
  12. interface ens33
  13. virtual_router_id 51
  14. priority 150
  15. advert_int 1
  16. nopreempt
  17. authentication {
  18. auth_type PASS
  19. auth_pass 1111
  20. }
  21. virtual_ipaddress {
  22. 192.168.116.150
  23. }
  24. track_script {
  25. check_mysql
  26. }
  27. }

配置mysql-1的mysqld健康状态脚本并赋予权限

  1. [root@mysql-1 ~]# vi /etc/keepalived/check_mysql_second.sh
  2. #!/bin/bash
  3. counter=$(ss -antlp | grep 3306 | wc -l)
  4. if [ "${counter}" -eq 0 ]; then
  5. /usr/bin/systemctl stop keepalived.service
  6. fi
  7. [root@mysql-1 ~]# chmod 755 /etc/keepalived/check_mysql_second.sh

4.2、配置mysql-2的 keepalived服务的配置文件

  1. [root@mysql-2 ~]# vi /etc/keepalived/keepalived.conf
  2. ! configuration File for keepalived
  3. global_defs {
  4. router_id master
  5. }
  6. vrrp_script check_mysql {
  7. script "/etc/keepalived/check_mysql_second.sh"
  8. interval 2
  9. }
  10. vrrp_instance VI_1 {
  11. state BACKUP
  12. interface ens33
  13. virtual_router_id 51
  14. priority 50
  15. advert_int 1
  16. nopreempt
  17. authentication {
  18. auth_type PASS
  19. auth_pass 1111
  20. }
  21. virtual_ipaddress {
  22. 192.168.116.150
  23. }
  24. track_script {
  25. check_mysql
  26. }
  27. }

配置mysql-2的mysqld健康状态脚本并赋予权限

  1. [root@mysql-2 ~]# vi /etc/keepalived/check_mysql.sh
  2. #!/bin/bash
  3. counter=$(ss -antlp | grep 3306 | wc -l)
  4. if [ "${counter}" -eq 0 ]; then
  5. /usr/bin/systemctl stop keepalived.service
  6. fi
  7. [root@mysql-1 ~]# chmod 755 /etc/keepalived/check_mysql_second.sh

4.3、分别在mysql-1、mysql-2上启动keepalived服务

在mysql-1上启动keepalived服务并检查状态

  1. [root@mysql-1 ~]# systemctl start keepalived
  2. [root@mysql-1 ~]# systemctl status keepalived

在mysql-2上启动keepalived服务并检查状态

  1. [root@mysql-2 ~]# systemctl start keepalived
  2. [root@mysql-2 ~]# systemctl status keepalived

4.4、检查mysql-1、mysql-2的VIP使用情况

正常情况下VIP要求落在mysql-1上,当mysql-1的mysql退出后,VIP落到mysql-2上,即使mysql-1恢复后也补抢占VIP。

检查mysql-1的VIP使用情况

  1. [root@mysql-1 ~]# ip address

检查mysql-2的VIP使用情况

  1. [root@mysql-2 ~]# ip address

4.5、切换客户端访问数据库的IP地址为VIP

需改需要访问mysql程序的配置文件,访问地址由mysql-1的IP(本例中为192.168.116.128)改为VIP(本例中为192.168.116.150)。

五、数据库主从架构变更为主主架构的结果验证

5.1、高可用特性验证

数据主主架构的高可用,是指当有client连接mysql集群时,一台mysql主机停服后,另一台mysql能够无缝切换对外提供服务,client侧无感知或感知不强烈。

模拟mysql client用户连接mysql,创建服务器虚拟机(主机名为)user。

在user上访问数据库的VIP,并使用mysql服务。

  1. [root@user ~]# mysql -umaster -pSenseTime#2020 -h 192.168.116.150
  2. mysql> select UUID();
  3. +--------------------------------------+
  4. | UUID() |
  5. +--------------------------------------+
  6. | 8aa2591c-94ef-11eb-93de-000c29309533 |
  7. +--------------------------------------+
  8. 1 row in set (0.01 sec)

在mysql-1上停止mysqld服务,并查看IP,发现mysql-1上已经没有VIP

  1. [root@mysql-1 ~]# systemctl stop mysqld
  2. [root@mysql-1 ~]# ip address

此时mysql-1上的mysqld已经停止运行,但在user服务器上仍然能够正常访问mysql服务,查看UUID,发现UUID已经变化,说明keepalived实现了VIP在mysql-1和mysql-2上的无缝切换。

  1. mysql> select UUID();
  2. +--------------------------------------+
  3. | UUID() |
  4. +--------------------------------------+
  5. | f78cfe1b-94ef-11eb-9622-000c293c71e0 |
  6. +--------------------------------------+
  7. 1 row in set (0.02 sec)

恢复mysql-1上的mysqld服务后,发现VIP仍然在mysql-2上,实现了VIP的非抢占特性。

5.2、一致性特征验证

一致性特征是指,mysql client在一个数据库上进行数据操作后,其他数据库上能够同步发生相应的数据变化。

在mysql-1上,对数据库进行数据插入操作。

  1. mysql> INSERT INTO tb_fever_treatment(`id`,`temp`,`device_id`) VALUES(123293,35.3,'123213213213');
  2. Query OK, 1 row affected (0.00 sec)

在mysql-2上,能够查询到对应的数据。

  1. mysql> select id,temp,device_id from tb_fever_treatment where id=123293;
  2. +--------+------+--------------+
  3. | id | temp | device_id |
  4. +--------+------+--------------+
  5. | 123293 | 35.3 | 123213213213 |
  6. +--------+------+--------------+
  7. 1 row in set (0.00 sec)

5.3、数据完整性验证

数据完整性是指在mysql主主建立的过程中,mysql-2是否能够百分百的同步到mysql-1上的数据。

在mysql-1上查询表中的行数:

  1. mysql> use tsc;select count(*) from tb_fever_treatment;
  2. Database changed
  3. +----------+
  4. | count(*) |
  5. +----------+
  6. | 50056 |
  7. +----------+
  8. 1 row in set (0.04 sec)

在mysql-2上查询表中的行数:

  1. mysql> use tsc;select count(*) from tb_fever_treatment;
  2. Database changed
  3. +----------+
  4. | count(*) |
  5. +----------+
  6. | 50053 |
  7. +----------+
  8. 1 row in set (0.03 sec)

发现mysql-2上的数据比mysql-1上的少,即mysql-2上的数据和mysql-1上的数据同步不完整。

由于在生产环境上进行主主改造,需要尽量保证mysql-1服务的连续性,故在2.1、备份主库数据到从库章节中,备份主库数据时,加入了“--single-transaction”选项,即备份过程不锁表,此时当有数据在主库写入时,无法备份到文件中去,因此在从库使用备份文件同步主库数据时,存在部分数据丢失。

六、数据库崩溃恢复方案

生产环境对数据库操作存在一定风险,尽管本文已经对操作步骤进行了一定的规范和操作示例,但为了最大程度保证数据安全,需要预备一套数据库崩溃后的数据恢复方案。

6.1、数据恢复前置条件

  • mysqld服务可以正常启动
  • 数据库备份文件完整,假设备份文件路径为/root/mysqlDump/databaseDump.sql。

6.2、数据库恢复操作

mysql安装并正常启动后(次试数据库没有数据),根据原有数据文件对数据库进行恢复。

创建数据库:

  1. mysql> create database tsc;

对数据库进行备份:

  1. mysql> use tsc;
  2. mysql> source /root/mysqlDump/databaseDump.sql;

检查数据条数,出现如下结果说明数据恢复成功。

  1. mysql> use tsc;select count(*) from tb_fever_treatment;
  2. Database changed
  3. +----------+
  4. | count(*) |
  5. +----------+
  6. | 50053 |
  7. +----------+
  8. 1 row in set (0.03 sec)

6.3验证数据库恢复后的可用性

在需要使用mysql服务的客户端上(本文为user服务器),连接mysql服务并查询。

  1. [root@user ~]# mysql -umaster -pSenseTime#2020 -h192.168.116.150 --execute='use tsc;select count(*) from tb_fever_treatment';
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. +----------+
  4. | count(*) |
  5. +----------+
  6. | 50053 |
  7. +----------+

正常显示数据条数,说明客户端可以正常查询数据库,数据库恢复成功。

生产环境中mysql数据库由主从关系切换为主主关系的更多相关文章

  1. 生产环境中mysql+keepalive双主模式,keepalive守护进程实现双主切换提供数据库服务

    mysql+keepalive实现浮动地址自动切换,由于keepalive无自带健康检查功能,所以必须自动编写健康检查守护进程(监控DB1和DB2数据库的监控状态,来保证浮动地址双机自动切换.) 一, ...

  2. 生产环境中,数据库升级维护的最佳解决方案flyway

    官网:https://flywaydb.org/ 转载:http://casheen.iteye.com/blog/1749916 1.  引言 想到要管理数据库的版本,是在实际产品中遇到问题后想到的 ...

  3. 生产环境中,通过域名映射ip切换工具SwitchHosts

    项目中,经常需要配置host.将某个域名指向某个ip.手动配置C:\Windows\System32\drivers\etc\hosts,非常不方便.这里分享一个可以高效切换host工具:Switch ...

  4. Mysql数据库的主从与主主

    前言: 首先,我们得知道我们为什么要做数据库的主从与主主,而后,再讨论他们的优劣与特点:为什么要做主从呢?因为Mysql数据库没有增量备份的机制,当数据量太大的时候备份是个难以解决的问题.但是mysq ...

  5. mysql数据库的主从同步,实现读写分离 g

    https://blog.csdn.net/qq_15092079/article/details/81672920 前言 1 分别在两台centos 7系统上安装mysql 5.7 2 master ...

  6. mysql数据库的主从同步,实现读写分离

    大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器来处理如此多的数据库连接操作,数据库必然会崩溃,特别 ...

  7. mysql8在生产环境中的配置

    一,配置文件的位置 [root@yjweb ~]# ll /etc/my.cnf -rw-r--r-- 1 root root 935 Mar 11 16:52 /etc/my.cnf 说明:通常我们 ...

  8. 理解Docker(6):若干企业生产环境中的容器网络方案

    本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  9. 更改XAMPP中MySQL数据库的端口号

    更改XAMPP中MySQL数据库的端口号 如果电脑上已安装MySql数据库,还想用XAMPP中自带的数据库就需要更改XAMPP中数据库的端口号,避免和已安装的数据库冲突.本例以更改为3307端口号为例 ...

随机推荐

  1. React & Didact

    React & Didact A DIY guide to build your own React https://github.com/pomber/didact https://gith ...

  2. npm init & npx create & yarn create

    npm init & npx create & yarn create https://create-react-app.dev/docs/getting-started/#creat ...

  3. DBA 的效率加速器——CloudQuery v1.3.0 上线!

    好久不见! 自 CloudQuery v1.2.1 发布至今,已有月余,在此期间我们收到了很多朋友对 CloudQuery 的反馈和建议,很多朋友表达了对 v1.3.0 的期待,非常感谢. Cloud ...

  4. Python 与 excel的简单应用

    1.pip openpyxl库: pip install openpyxl -i http://pypi.douban.com/simple --trust-host pypi.douban.com ...

  5. C语言指针基本知识

    对程序进行编译的时候,系统会把变量分配在内存单位中,根据不同的变量类型,分配不同的字节大小.比如int整型变量分配4个字节,char字符型变量分配1个字节等等.被分配在内存的变量,可以通过地址去找到, ...

  6. vue中将分号去掉,将双引号变为单引号的配置

    在项目根目录下创建.prettierrc文件,文件内容如下: { "semi": false, "singleQuote": true } 实现vs code中 ...

  7. Linux 查看磁盘是否为SSD

    第一步,找到磁盘 ll /dev/sd* ll /dev/vd*   第二步,查对应磁盘类型 cat /sys/block/sda/queue/rotational 结果: 返回0:SSD盘 返回1: ...

  8. alpine jdk 中文乱码

    一.概述 使用alpine镜像构建了一个oracle jdk的镜像,运行java业务时,查看日志,显示中文乱码. 但是,基于Alpine Linux的Docker基础镜像的镜像文件很小,也有代价: 把 ...

  9. JDBC 连接池 & Template

    数据库连接池 # 概念:其实就是一个容器(集合),存放数据库连接的容器. * 当系统初始化号以后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容其中获取连接对象,用户访问完之后,会将 ...

  10. android分析之消息处理

    前序:每个APP对应一个进程,该进程内有一个ActivityThread的线程,称为主线程(即UI主线程),此外,还有其他线程,这个再论. android的消息系统分析. 每个Thread只对应一个L ...