• 【MySQL集群一】CentOS 7上搭建MySQL集群:一主一从、多主多从


    在这里插入图片描述

    介绍

    MySQL集群允许您创建高可用性的数据库环境,提供故障容忍性和负载均衡。在本博客中,我们将演示如何在两台CentOS 7服务器上搭建MySQL集群,包括一主一从和多主多从的配置。

    一主一从

    步骤1:准备工作

    在开始之前,确保您已经完成以下准备工作:

    • 两台CentOS 7服务器,可以是物理机或虚拟机。
    • 确保服务器之间可以互相访问,互相能ping通。
    • 演示环境是两台试用云服务器。
      腾讯云服务器

    步骤2:安装MySQL

    在两台服务器上安装MySQL,请参考:CentOS7服务器Yum安装MySQL5.7

    步骤3:配置主服务器

    在主服务器上编辑MySQL配置文件:

    sudo vim /etc/my.cnf
    
    • 1

    添加或修改以下配置项:

    [mysqld]
    # 每个MySQL服务器都需要一个唯一的标识符(server-id),用于区分主从服务器,以及避免复制冲突。
    server-id=22
    # 用于开启MySQL的日志功能,以便记录增删改操作。二进制日志文件将记录所有这些更改,并用于主从复制。
    log-bin = mysql-bin
    # 设置logbin格式
    binlog_format=STATEMENT
    # 用于指定需要同步的数据库。如果你希望同步特定的数据库,可以设置多个binlog-do-db选项,每个选项指定一个数据库;可设置为通配符模式:ddz_*(表示同步以ddz_开头的数据库)
    binlog-do-db=ddz_test
    # 屏蔽不需要同步的系统库
    binlog-ignore-db=mysql
    binlog-ignore-db=information_schema
    # 从服务器是否记录自己的日志。如果启用(1),从服务器会记录在执行复制时的所有更改。
    log-slave-updates=1 
    # 用于指定错误日志的文件名和位置。
    # log-error=
    # 指定MySQL服务器进程ID的文件名和位置。
    # pid-file=
    # 控制MySQL在处理已经建立的连接时,允许待处理的的最大连接数。
    # back_log=
    # 限制MySQL的最大连接数。
    # max_connections=
    # 限制每个用户允许的最大连接数。
    # max_user_connections=
    # 限制通信缓冲区中的数据量大小,默认大小为1MB。
    # max_allowed_packet=
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    可更具自己需要灵活配置。

    binlog_format 主要是用来调整binlog的记录格式。
    MySQL的binlog(二进制日志)用于记录数据库中的所有更改,这些日志可以用于主从复制和数据恢复等。binlog_format 选项可以控制binlog的记录格式,它有三个可选值:STATEMENT、ROW和MIXED。

    STATEMENT:每一条修改数据的SQL语句都会记录到binlog中,但不会记录每一条sql语句和每一行的数据变化。在slave端复制时,sql进程会解析成和原来master端执行过的相同的sql再次执行。优点是减少binlog日志量,节约磁盘IO,提高性能。缺点是在某些情况下会导致主从复制不一致,比如sleep()函数、last_insert_id()以及user-defined functions(udf)等可能会出现问题。

    ROW:在ROW格式下,binlog中会记录每一行数据被修改后的情况,然后在slave端对相同的数据进行修改。优点是可以清楚地记录每一行数据修改的细节。缺点是数据量太大,可能会增加磁盘IO和内存消耗。

    MIXED:MIXED模式是以上两种模式的混合使用。一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog。MySQL会根据执行的SQL语句选择日志保存方式。

    保存并关闭文件。然后重启MySQL服务:

    sudo systemctl restart mysqld
    
    • 1

    步骤4:创建复制用户

    登录到MySQL服务器,创建用于复制的用户:

    # 登录
    mysql -u root -p
    
    # 在MySQL中执行以下命令
    # 创建用户
    CREATE USER 'replication'@'%' IDENTIFIED BY 'your_password';
    # 指定IP
    # CREATE USER 'replication'@'192.168.1.13' IDENTIFIED BY 'your_password';
    # 配置授权
    GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
    # 指定IP
    # GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.1.13';
    # 刷新缓存
    FLUSH PRIVILEGES;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    查看是创建成功,只需执行一下SQL:

    SELECT USER,HOST FROM mysql.user;
    
    • 1

    在这里插入图片描述

    步骤5:备份主服务器数据,如果没有数据则省略这一步

    在主服务器上创建数据备份:

    mysqldump -u root -p --database mydb > mydb.sql
    
    • 1

    步骤6:配置从服务器

    在从服务器上编辑MySQL配置文件:

    sudo vim /etc/my.cnf
    
    • 1

    添加或修改以下配置项:

    [mysqld]
    # 每个MySQL服务器都需要一个唯一的标识符(server-id),用于区分主从服务器,以及避免复制冲突。
    server-id=33
    # 用于指定需要同步的数据库。如果你希望同步特定的数据库,可以设置多个binlog-do-db选项,每个选项指定一个数据库;可设置为通配符模式:ddz_*(表示同步以ddz_开头的数据库)
    binlog-do-db=ddz_test
    # 屏蔽不需要同步的系统库
    binlog-ignore-db=mysql
    binlog-ignore-db=information_schema
    # 主从复制架构中非常重要的一部分,它用于确保从服务器能够及时地获取和应用主服务器的更改,以保持与主服务器的数据一致性。
    relay-log=mysql-relay
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    保存并关闭文件,重启mysql。

    sudo systemctl restart mysqld
    
    • 1

    然后导入主服务器的数据备份(没有数据则省略这一步)

    mysql -u root -p < mydb.sql
    
    • 1

    步骤7:配置主从复制

    回到主服务器,获取主服务器的状态:

    mysql -u root -p
    
    # 在MySQL中执行以下命令
    SHOW MASTER STATUS;
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    记录下返回的文件名和位置。

    回到从服务器,配置从服务器连接到主服务器:

    # 登录
    mysql -u root -p
    
    # 在MySQL中执行以下命令,将 'file_name' 和 'position' 替换为上一步中记录的值
    CHANGE MASTER TO MASTER_HOST='主服务器的IP地址', MASTER_USER='replication', MASTER_PASSWORD='your_password', MASTER_LOG_FILE='file_name', MASTER_LOG_POS=position;
    
    # 开启同步功能
    START SLAVE;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    查看是否开启成功:

    SHOW SLAVE STATUS;
    
    • 1

    这两项都为Yes则开启成功。
    在这里插入图片描述

    步骤8:测试主从复制

    在主服务器上创建一个新的数据库并添加一些数据,然后在从服务器上验证是否同步。

    # 创建数据库
    CREATE DATABASE ddz_test;
    # 创建表
    CREATE TABLE ddz_test.test_user (
    	`id` INT NOT NULL AUTO_INCREMENT,
    	`name` VARCHAR ( 50 ) DEFAULT NULL,
    PRIMARY KEY ( `id` )) ENGINE = INNODB DEFAULT CHARSET = utf8;
    # 新增一条数据
    INSERT INTO ddz_test.test_user(`name`)VALUES('测试你个老六');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    进入主从MySQL上验证是否都有数据。

    处理宕机情况

    处理Slave宕机

    MySQL slave服务器宕机后重启,它不会自动恢复同步复制Master的数据,我们需要做一些操作来手动重新同步。具体步骤如下:

    1. 首先,你需要在Slave服务器上暂停复制。你可以使用以下SQL命令来操作:
    STOP SLAVE;
    
    • 1
    1. 进入Master服务备份数据:
    # 备份所有数据库
    mysqldump -u root -p --all-databases --master-data > backup.sql
    # 备份指定数据库 ddz替换成你的数据库
    mysqldump -u root -p --databases ddz --master-data > backup.sql
    
    • 1
    • 2
    • 3
    • 4
    1. 进入Slave导入数据:
    # 导入所有数据库
    mysql -u [username] -p < backup.sql
    # 导入指定数据库
    mysql -u [username] -p ddz < backup.sql
    
    • 1
    • 2
    • 3
    • 4
    1. 然后,你需要获取Master服务器上当前的二进制日志文件和位置。在Master服务器上,你可以使用以下SQL命令获取:
    SHOW MASTER STATUS;
    
    • 1
    1. 在Slave服务器上,你需要配置Master服务器的这些信息。你可以使用以下SQL命令设置:
    RESET SLAVE;
    CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='replication_user', MASTER_PASSWORD='replication_user_password', MASTER_LOG_FILE='recorded_log_file', MASTER_LOG_POS=recorded_log_position;
    
    • 1
    • 2

    这里的 recorded_log_filerecorded_log_position 就是你备份时记录的 master 的 binlog 文件和位置。

    1. 最后,你需要在Slave服务器上重新开始复制。你可以使用以下SQL命令开始复制:
    START SLAVE;
    
    • 1

    如果步骤正确,Slave服务器现在应该重新开始复制Master服务器上的数据。

    另外,如果你希望Slave服务器在重启后自动开始复制,你可以在my.cnf(MySQL配置文件)中设置一个参数,如下:

    [mysqld]
    skip-slave-start=false
    
    • 1
    • 2

    然后重启你的MySQL服务。
    但是必须注意,如果Master和Slave不处于同步状态,开启这个选项可能会导致数据不一致的问题。所以按需开启。

    处理Master宕机

    1. 调用 SHOW SLAVE STATUS 获取 Relay_Master_Log_File 和 Exec_Master_Log_Pos, 记录下得到的这两个值。
    SHOW SLAVE STATUS;
    
    • 1
    1. 调用 STOP SLAVE; 命令停止复制过程。调用 RESET MASTER; 命令清空二进制日志。
    STOP SLAVE;
    RESET MASTER;
    
    • 1
    • 2
    1. 提升 Slave 为新 Master :
    CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=<Exec_Master_Log_Pos>;
    
    • 1
    1. 然后调用 START SLAVE; 在停止进程的位置启动复制进程。
    START SLAVE;
    
    • 1
    1. 确保所有的 Slave 重新连接新的 Master:如果有多个 Slave,需要在每个 Slave 上更新他们的 Master 信息,以指向新的 Master。

    2. 检查数据完整性:在所有的重要操作之后,别忘记对数据库进行必要的检验,确保数据的完整性和准确性。

    3. 恢复原 Master :修复原 Master 服务器后,可以将其设置为新的 Slave,然后将数据从新的 Master 同步过去,之后再将其提升为 Master,完成故障恢复。

    一主多从

    要配置多主多从,重复步骤6到步骤8在另一台服务器上。

    多主多从

    要配置多主多从,重复步骤3到步骤8在另一对服务器上。

    总结:
    通过完成上述步骤,您将在两台CentOS 7服务器上成功搭建了MySQL集群,包括一主一从和多主多从的配置。这将提高数据库的可用性和性能,使您能够更好地处理数据库工作负载和故障容忍性。如果需要更多节点,只需重复配置多主多从的步骤。希望这个博客对您有所帮助!

  • 相关阅读:
    C++ builder XE 关于intraweb TChart转换成IWimage的网页显示处理
    java通过FTP跨服务器动态监听读取指定目录下文件数据
    多数据源时,时间字段插入数据库前后不一致?
    【第18章】MyBatis-Plus主键生成策略
    java基于微信小程序的英语四六级学习考试系统 uniapp 小程序
    运维问题解决常用命令
    05.STLvector、list、stack、queue
    springboot设置时区
    如何配置jupyter远程交互环境?
    2022年 6 月面试题 100 + 大全(合适各级 Java 人员)
  • 原文地址:https://blog.csdn.net/weixin_45626288/article/details/132932381