集群技术,一主一从的部署和原理方式

news2024/9/21 22:59:29

集群概述

所谓集群,就是将多台服务器集中在一起,同时处理用户对服务器的请求

比如,我们现在开启的这一台mysql服务器,可以同时处理1000个用户的请求,那么我们开启两个这样的服务器,就可以同时处理2000

数据库集群之间最重要的是数据一致性

Replication

集群图示:

请添加图片描述
类型:

  • M

  • M-S

  • M-S-S…

  • M-M

  • M-M-S-S

    M表示主服务器

    S表示从服务器

    需要从主服务器备份到从服务器,即主从复制

    我们需要通过配置,完成自动的主从复制

原理图示:

图示1
请添加图片描述
概念:

  1. 在主库上把数据更改(DDL DML DCL)记录到二进制日志(Binary Log)中。
  2. 从库和主库连接,此时从库会开启io现成和sql线程
  3. 备库I/O线程将主库上的日志复制到自己的中继日志(Relay Log)中。
  4. 备库SQL线程读取中继日志中的事件,将其重放到备库数据库之上。

集群案例

环境
  • 环境三部曲

    • 1.全新服务器-互相通信
    • 2.全新安装mysql8.0-分别安装
    • 3.配置域名解析

配置静态ip

  • 2台服务器ip分别是

  • 192.168.145.141

  • 192.168.145.142

  • 配置mysql8.0yum源头

    • 下载安装包
    • yum源 几台服务器都有,其中19,29,39,49安装yum源
    • mysql8.0安装包,19,29,39,49安装
  • 141服务器操作如下:

在19服务器下操作:

 wget https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
 yum install  mysql80-community-release-el9-1.noarch.rpm

 yum install   mysql-community-server  --downloadonly -y
find / -iname "*mysql*.rpm"  //查找包的位置

cd /var/cache/dnf/mysql80-community-22d3d3ecd3d92106/packages/

scp ./*.rpm 192.168.145.142:~/

141安装mysql
yum install -y *.rpm
启动数据库
systemctl start mysqld


grep 'password' /var/log/mysqld.log
mysqladmin -uroot -p'复制的密码' password "Lixinyi@123"

mysql -uroot -p'Lixinyi@123';
show databases;

其他同理

142:

  [root@localhost ~]# ls
  anaconda-ks.cfg                                         mysql-community-common-8.0.38-1.el9.x86_64.rpm
  install_mysql.sh                                        mysql-community-icu-data-files-8.0.38-1.el9.x86_64.rpm
  mysql-community-client-8.0.38-1.el9.x86_64.rpm          mysql-community-libs-8.0.38-1.el9.x86_64.rpm
  mysql-community-client-plugins-8.0.38-1.el9.x86_64.rpm  mysql-community-server-8.0.38-1.el9.x86_64.rpm
  
  [root@localhost ~]# chmod +x install_mysql.sh
  //开始安装
  [root@localhost ~]# ./install_mysql.sh
  
  
一主一从(M-S)(1)
  • 主(master1)

    • 部署一台新mysql服务器。准备好域名解析。

    • 准备数据1(验证主从同步使用)

      • master1

         create database master1db;
         create table master1db.master1tab(name char(50));
         insert into master1db.master1tab values (1111);
         insert into master1db.master1tab values (2222);
        
    • 开启二进制日志

      • master1

         [root@localhost ~]# vim /etc/my.cnf
         log_bin
         server-id=1
         [root@localhost ~]# systemctl restart mysqld
         重启生效
         
         ---------------------------------------------
         log_bin   开启二进制日志
         server-id 集群中二进制的编号 不要重复
        
    • 创建复制用户

      • master1
创建用户:
mysql> create user  'rep'@'192.168.145.%' identified by 'Lixinyi@123';
 
 授权:
 mysql>grant replication slave, replication client on *.* to 'rep'@'192.168.145.%' ;
下面是这条命令的详细解释:

grant: 这是SQL的关键字,用于授权用户特定的权限。
replication slave: 这个权限允许用户请求在主服务器复制二进制日志事件到从服务器,这通常用于MySQL的主从复制功能。

replication client: 这个权限允许用户查询主服务器或从服务器的状态,以及执行SHOW SLAVE 
STATUS和SHOW MASTER STATUS等命令。

on *.*: 这表示对所有数据库和所有表进行授权。
to ‘rep’@‘192.168.229.%’: 这表示将权限授予用户名为rep的用户,并且这个用户可以从192.168.229.*这个IP地址范围内的任何主机连接到MySQL服务器。这里的%是一个通配符,表示匹配该IP段内的任何具体IP地址。

简而言之,这条命令的意思是:“为从192.168.229.*这个IP地址范围内的任何主机连接到MySQL服务器的rep用户授予复制从服务器和复制客户端的权限”。这通常用于设置MySQL的主从复制功能,其中rep用户将用于从主服务器复制数据到从服务器。

备份master数据库的数据

  • master1

    刚才是先添加的数据,然后才开启的二进制日志。二进制日志中没有记录一开始添加数据的记录。

    所以需要我们对之前的数据先进行一个手动备份

    退出mysql登陆页
    
    mysqldump -uroot -p'Lixinyi@123' --all-databases --single-transaction --master-data=2 --flush-logs > `date +"%F-%H"`-mysql-all.sql
    
    
    # ls
    2024-07-15-14-mysql-all.sql 
    
    注释:
    --single-transaction  保持服务的可以用性,服务保持开机状态
    master-data=2         帮我开启记录 记录二进制节点的位置
    --flush-logs          刷新二进制日志  对二进制日志进行分割
    

    发送给另一台主机:

     scp -r ./2024-07-15-14-mysql-all.sql    192.168.145.142:/tmp
    
    

    观察二进制日志分割点:

     vim ./2024-07-15-14-mysql-all.sql
    
    查看第24行:
    CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.000002', MASTER_LOG_POS=157;
    
      • 准备数据2(验证主从同步使用)

      ​ 刚刚备份的是之前开始的数据,我们现在模拟真实的生产环境,在备份后,又产生了新的数据

      • master1

        mysql -uroot -p'Lixinyi@123'
        
        insert into master1db.master1tab values (33333333);
        insert into master1db.master1tab values (44444);
        
  • 从(master2)

    • 测试rep用户是否可用

      • master2

        部署数据库应用

        mysql -h master1 -urep -p'Lixinyi@123'
        
        用授权的账号登陆
        
        • 预防账户问题,防火墙、selinux都要关闭。
    • 启动服务器序号

      [root@localhost ~]#vim /etc/my.cnf
      不用在从设备上开启二进制日志,没有人向master2请求日志。
      
      server-id=2
      
      服务器ID是必须设置的。
      
      [root@localhost ~]# systemctl restart mysqld
      
      mysql -uroot -p'Lixinyi@123'
       测试服务器是否修改正确。能否正常登陆。
      
    • 手动同步数据

       mysql>  set sql_log_bin=0;
       mysql>  source /tmp/2024-07-15-03-mysql-all.sql
      
      注释:
       set sql_log_bin=0;  设置当前数据库服务器的二进制日志临时关闭
       
       source /tmp/2024-07-15-14-mysql-all.sql  根据日志文件还原数据库
      

      验证是否正确完成备份:

       
      mysql> show databases;
      +--------------------+
      | Database           |
      +--------------------+
      | information_schema |
      | master1db          |
      | mysql              |
      | performance_schema |
      | sys                |
      +--------------------+
      5 rows in set (0.00 sec)
      
      
      
      mysql> select * from master1db.master1tab;
      +------+
      | name |
      +------+
      | 1111 |
      | 2222 |
      +------+
      
      
    • 设置主服务器

      配置主从关系

mysql> change master to
master_host='192.168.145.142',
master_user='rep',
master_password='Lixinyi@123',
master_log_file='localhost-bin.000002',
master_port=3306,
master_log_pos=157;


ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'master to master_host='master1',master_user='rep',master_password='Lixinyi@123' at line 1

  • 原因:

    在MySQL 8.0中,CHANGE MASTER TO 语句用于配置复制。但是,从MySQL 8.0.14开始,该语句已经被弃用,并建议使用新的语句 CHANGE REPLICATION SOURCE TO

      CHANGE REPLICATION SOURCE TO
        SOURCE_HOST = '192.168.145.142',
        SOURCE_USER = 'rep',
        SOURCE_PASSWORD = 'Lixinyi@123',
        SOURCE_PORT = 3306,
        SOURCE_LOG_FILE = 'localhost-bin.000002',
        SOURCE_LOG_POS = 158;
    
      change replication source to
        source_host = '192.168.145.142',
        source_user = 'rep',
        source_password = 'Lixinyi@123',
        source_port = 3306,
        source_log_file = 'localhost-bin.000002',
        source_log_pos = 158;
    
      mysql> change replication source to source_host = '192.168.145.142',source_user = 'rep',source_password = 'Lixinyi@123',source_port = 3306,source_log_file = 'localhost-bin.000002',source_log_pos = 158;
      
    注意,二进制日志的位置,应该参照主服务器备份时生成的新位置。
    
    
    
  • 启动从服务器的复制线程

    mysql> start slave;
    
    
  • 查看启动状态(IO-YES/SQL-YES)

    show slave status\G;
    
    mysql> show slave status\G;
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: master1
                      Master_User: rep
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: localhost-bin.000003
              Read_Master_Log_Pos: 154
                   Relay_Log_File: localhost-relay-bin.000003
                    Relay_Log_Pos: 375
            Relay_Master_Log_File: localhost-bin.000003
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    
    

    请添加图片描述

  • 从服务器查看数据库,看数据是否一致

    mysql> select * from master1db.master1tab;
    +----------+
    | name     |
    +----------+
    | 1111     |
    | 2222     |
    | 33333333 |
    | 44444    |
    +----------+
    
    3333,4444就是主从集群同步过来的数据
    
    
  • 返回主服务器(master1)更新数据,在从服务器(master2)观察是否同步。

    master1主服务器添加数据
    
    mysql> insert into master1db.master1tab values (55555);
    
    
    从master2查看数据:
    
    mysql> select * from master1db.master1tab;
    +----------+
    | name     |
    +----------+
    | 1111     |
    | 2222     |
    | 33333333 |
    | 44444    |
    | 55555    |
    +----------+
    已经同步了
    

    注意:

    如果从服务器添加了数据,主服务器是不会同步的

    不要这样操作,不要操作

    因为主从复制的原理,就是从服务器来同步主服务器,如果从服务器擅自添加数据,添加的数据就属于脏数据

    了解,不要去实验操作!!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1933101.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity3d开发google chrome的dinosaur游戏

游戏效果 游戏中: 游戏中止: 一、制作参考 如何制作游戏?【15分钟】教会你制作Unity小恐龙游戏!新手15分钟内马上学会!_ unity教学 _ 制作游戏 _ 游戏开发_哔哩哔哩_bilibili 二、图片资源 https://download.csdn.…

电脑压缩视频文件 电脑压缩视频大小的方法

在数字化时代,视频已成为我们记录生活、分享快乐的重要工具。然而,大尺寸的视频文件常常让分享和存储变得棘手。如何在保持视频画质的前提下,轻松减小视频文件大小?今天,就让我们一起探索苹果电脑上的几种高效视频压缩…

前端书籍翻页效果

目录 前端书籍翻页效果前言代码示例创建模板页面css样式编写js代码 结论 前端书籍翻页效果 前端实现翻书效果,附带vue源码 源码下载地址 前言 实际业务开发中,有时候会遇到需要在前端页面内实现翻书效果的需求,本篇文章就为大家介绍如何使…

STM32MP135裸机编程:唯一ID(UID)、设备标识号、设备版本

0 资料准备 1.STM32MP13xx参考手册1 唯一ID(UID)、设备标识号、设备版本 1.1 寄存器说明 (1)唯一ID 唯一ID可以用于生成USB序列号或者为其它应用所使用(例如程序加密)。 (2)设备…

stm32入门-----EXTI外部中断(上 ——理论篇)

目录 前言 一、中断系统 1.基本概念 2.执行过程 二、stm32中断 1.stm32中断类型 2.NVIC总管 3.NVIC的优先级分组 三、EXIT外部中断 1.基本概念 2.AFIO复用IO口 3.EXIT执行过程 前言 本期我们就开始进入到学习stm32的中断系统了,在此之前我们学习过51的知道中…

Iterator 与 ListIterator:Java 集合框架中的遍历器比较

Iterator 与 ListIterator:Java 集合框架中的遍历器比较 1、Iterator1.1 特点 2、ListIterator2.1 特点 3、Iterator 和 ListIterator 的区别4、示例4.1 使用 Iterator 遍历 Set4.2 使用 ListIterator 遍历 List 并修改 5、总结 💖The Begin&#x1f49…

《昇思25天学习打卡营第24天| 文本解码原理》

文本解码原理--以MindNLP为例 回顾:自回归语言模型 根据前文预测下一个单词 一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积 𝑊_0:初始上下文单词序列𝑇: 时间步当生成EOS标签时,停止生成。 MindNLP/huggi…

SpringBoot框架学习笔记(二):容器功能相关注解详解

1 Spring 注入组件的注解 Component、Controller、 Service、Repository这些在 Spring 中的传统注解仍然有效,通过这些注解可以给容器注入组件 2 Configuration 2.1 应用实例 需求说明: 演示在 SpringBoot, 如何通过Configuration 创建配置类来注入组件 回顾…

少儿编程启蒙宝典:Scratch动画游戏108变

一、编程教育的时代价值与意义 随着数字时代的深入发展,社会对人才的需求正发生深刻变革,计算思维与编程能力已成为衡量个人竞争力的重要指标。在此背景下,培养孩子们运用计算思维解决实际问题的能力,成为教育领域的重要任务。编…

【PPT笔记】1-3节 | 默认设置/快捷键/合并形状

文章目录 说明笔记1 默认设置1.1 OFFICE版本选择1.1.1 Office某某数字专属系列1.1.2 Office3651.1.3 产品信息怎么看 1.2 默认设置1.2.1 暗夜模式1.2.2 无限撤回1.2.3 自动保存(Office2013版本及以上)1.2.4 图片压缩1.2.5 字体嵌入1.2.6 多格式导出1.2.7…

C++ | Leetcode C++题解之第235题二叉搜索树的最近公共祖先

题目&#xff1a; 题解&#xff1a; class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {TreeNode* ancestor root;while (true) {if (p->val < ancestor->val && q->val < ancestor->val) {anc…

音视频开发入门教程(2)配置FFmpeg编译 ~共210节

在上一篇博客介绍了安装&#xff0c;音视频开发入门教程&#xff08;1&#xff09;如何安装FFmpeg&#xff1f;共210节-CSDN博客 感兴趣的小伙伴&#xff0c;可以继续跟着老铁&#xff0c;一起开始音视频剪辑功能&#xff0c;&#x1f604;首先查看一下自己的电脑是几核的&…

《昇思25天学习打卡营第20天|GAN图像生成》

生成对抗网络&#xff08;GAN&#xff09;是一种深度学习模型&#xff0c;用于生成逼真的图像。在手写数字识别的任务中&#xff0c;GAN 可以用来生成与真实手写数字相似的图像&#xff0c;以增强模型的训练数据集。GAN 主要由两个部分组成&#xff1a;生成器&#xff08;Gener…

httpx 的使用

httpx 是一个可以支持 HTTP/2.0 的库 还有一个是&#xff1a; hyper 库 这里有一个由HTTP/2.0的网站&#xff1a; https://spa16.scrape.center/ 使用 requests 库 进行爬取 import requests url https://spa16.scrape.center/ response requests.get(url) print(response…

Lua基础知识入门

1 基础知识 标识符&#xff1a;标识符的定义和 C语言相同&#xff1a;字母和下划线_ 开头&#xff0c; 下划线_ 大写字母一般是lua保留字&#xff0c; 如_VERSION 全局变量&#xff1a;默认情况下&#xff0c;变量总是认为是全局的&#xff0c;不需要申明&#xff0c;给一个变…

28_EfficientNetV2网络详解

V1&#xff1a;https://blog.csdn.net/qq_51605551/article/details/140487051?spm1001.2014.3001.5502 1.1 简介 EfficientNetV2是Google研究人员Mingxing Tan和Quoc V. Le等人在2021年提出的一种深度学习模型&#xff0c;它是EfficientNet系列的最新迭代&#xff0c;旨在提…

golang单元测试性能测试常见用法

关于go test的一些说明 golang安装后可以使用go test工具进行单元测试 代码片段对比的性能测试,使用起来还是比较方便,下面是一些应用场景 平时自己想做一些简单函数的单元测试&#xff0c;不用每次都新建一个main.go 然后go run main.go相对某个功能做下性能测试 看下cpu/内存…

Anthropic推出1亿美元AI基金,加剧与OpenAI的竞争|TodayAI

人工智能初创公司Anthropic和风险投资公司Menlo Ventures宣布&#xff0c;他们将共同推出一支价值1亿美元的基金&#xff0c;以支持早期初创公司并推动它们使用Anthropic的技术。这个名为Anthology Fund的新基金&#xff0c;将为初创公司提供资金和技术支持&#xff0c;旨在模仿…

三、GPIO口

我们在刚接触C语言时&#xff0c;写的第一个程序必定是hello world&#xff0c;其他的编程语言也是这样类似的代码是告诉我们进入了编程的世界&#xff0c;在单片机中也不例外&#xff0c;不过我们的传统就是点亮第一个LED灯&#xff0c;点亮电阻&#xff0c;电容的兄弟&#x…

锁策略和CAS指令

锁策略 一、锁策略的引入二、锁策略的分类&#xff08;1&#xff09;乐观锁和悲观锁&#xff08;2&#xff09;重量级锁和轻量级锁&#xff08;3&#xff09; 自旋锁和挂起等待锁&#xff08;4&#xff09;可重入锁和不可重入锁&#xff08;5&#xff09;公平锁和非公平锁&…