MySQL主从复制、读写分离

本文详细介绍了MySQL主从复制的原理、配置步骤及常见问题解决,涵盖语句、行和混合复制类型,以及如何通过三线程实现数据同步。此外,还深入探讨了读写分离的实现,包括Atlas数据中间层的安装与配置,实现数据库压力分担。


案例概述

在企业网站中,后端MySQL数据库只有一台时,会有以下问题

  • 单点故障,服务不可用
  • 无法处理大量的并发数据请求
  • 数据丢失—大灾难

在这里插入图片描述
改造方法

  • 增加MySQL数据库服务器,对数据进行备份,形成主备
  • 确保主备MySQL数据库服务器数据是一样的
  • 主服务器宕机了,备份服务器继续工作,数据有保障

MySQL主从复制与读写分离是密切相关的
在这里插入图片描述

MySQL主从复制原理

MySQL主从复制的类型

  • 基于语句的复制(默认)
    在主服务器上执行的语句,从服务器执行同样的语句
  • 基于行的复制
    把改变的内容复制到从服务器
  • 混合类型的复制
    一旦发现基于语句无法精确复制时,就会采用基于行的复制

主从复制的工作过程

在这里插入图片描述

  • 3个线程
    • MySQL通过3个线程来完成主从库间的数据复制
    • Binlog Dump线程跑在主库上
    • I/0线程和 SQL线程跑在从库上

当在从库上启动复制时,首先创建I/0程连接主库, 主库随后创建 Binlog Dump线程读取数据库事件并发送给 I/0线程, I0线程获取到事件数据后更新到从库的中继日志 Relay Log中去,之后从库上的 SQL线程读取中继日志RelayLog中更新的数据库事件并应用。

案例实施

  • 案例拓扑图
    在这里插入图片描述

搭建Mysql主从复制

  • 建立时间同步环境,在主节点上搭建时间同步服务器
    • 安装NTP
    yum -y install ntp
    
    • 将主服务器的时间与网络时间同步
    ntpdate ntp.aliyun.com
    
    • 配置NTP
    vim /etc/ntp.conf      添加如下两行
    server 127.127.1.0    开启本地ntp服务
    fudge 127.127.1.0 stratum 8  设置时区
    
    • 重启服务,设为开启自启
    systemctl restart ntpd
    systemctl enable ntpd
    
  • 在从节点上进行时间同步
yum -y install ntp
ntpdate 192.168.137.95
vim /etc/ntp.conf   添加ntp服务器
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
... 将默认的注释掉
server 192.168.137.95 iburst

systemctl restart ntpd
systemctl enable ntpd
  • 安装MySQL,略过

  • 配置MySQL主服务器

    • 在/etc/my.cnf中修改或者增加以下内容
    vim /etc/my.cnf
    server_id = 11  (修改)
    log_bin = master-bin  (修改)
    log-slave-updates = true  (增加)
    
    • 重启MySQL服务
    systemctl restart mysqld
    
    • 登录MySQL程序,给从服务器授权
    mysql -u root -p
    mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.137.%' IDENTIFIED BY '123456';
      mysql> FLUSH PRIVILEGES;
      mysql> show master status;
      +-------------------+----------+--------------+------------------+-------------------+
      | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
      +-------------------+----------+--------------+------------------+-------------------+
      | master-bin.000001 |     412 |              |                  |                   |
      +-------------------+----------+--------------+------------------+-------------------+
      其中File列显示日志名。Position列显示偏移量,这两个值在后面配置从服务器是会用到。slave应从该点在Master上进行新的更新。
    
  • 配置从服务器

    • 在/etc/my.cnf中修改或增加以下内容
    server_id = 22 (修改)
    relay-log=relay-log-bin	(增加)
    relay-log-index=slave-relay-bin.index (增加)
    
    • 重启Mysql服务
    systemctl restart mysqld
    
    • 登录mysql ,配置同步
      按主服务器结果更改下面命令中 master_log_filemaster_log_pos的参数
    mysql -u root -p
    mysql> change master to master_host='192.168.9.100',
    master_user='myslave',
    master_password='123456',
    master_log_file='master-bin.000002',master_log_pos=120;
    
    • 启动同步
    mysql>start slave;
    
    • 查看Slave状态,确保一下两个值为YES
      在这里插入图片描述
  • 验证主从复制效果

    • 在主、从服务器上登录mysql
    mysql -uroot -p
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | test               |
    | zzq                |
    +--------------------+
    5 rows in set (0.00 sec)
    

    主、从服务器执行结果应该一致

    • 在主服务器上新建数据库
    mysql> create database ABC;
    Query OK, 1 row affected (0.00 sec)
    
    • 在主、从服务器上查看数据库,显示数据库相同,则主从复制成功
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | ABC                |
    | mysql              |
    | performance_schema |
    | test               |
    | zzq                |
    +--------------------+
    6 rows in set (0.00 sec)
    
    • 搭建完成后,可以在主库show slave hosts查看有哪些从库节点
    mysql> show slave hosts;
    

    在这里插入图片描述

容易遇到的问题及解决

  • 问题:Slave_IO_Running: No
  • 可能的原因:二进制安装的mysql的UUID重复
  • 解决UUID重复的问题:
rm -f /usr/local/mysql/data/auto.cnf  删除记录UUID的文件
systemctl restart mysqld 重启后会自动生成新的auto.cnf
然后可以重新配置主从备份

读写分离

原理

  • 读写分离就是只在主服务器上写,只在从服务器上读
  • 主数据库处理事务性查询,而从数据库处理select查询
  • 数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库
    在这里插入图片描述

案例概述

  • 在企业应用中,在大量的数据请求下,单台数据库将无法承担所有的读写操作
    • 配置多台数据库服务器以实现读写分离
    • 本案例在主从复制的基础上实现读写分离

案例实施

Atlas概述

  • Atlas简介
    Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平台,每天承载的读写请求数达几十亿条。同时,有超过50家公司在生产环境中部署了Atlas,超过800人已加入了我们的开发者交流群,并且这些数字还在不断增加。
  • Atlas主要功能
    • 读写分离
    • 从库负载均衡
    • IP过滤
    • 自动分表
    • DBA可平滑上下线DB
    • 自动摘除宕机的DB
  • Atlas相对于官方MySQL-Proxy的优势
    • 将主流程中所有Lua代码用C重写,Lua仅用于管理接口
    • 重写网络模型、线程模型
    • 实现了真正意义上的连接池
    • 优化了锁机制,性能提高数十倍

准备工作

所有服务器关闭Firewalld或者进行规则设置
搭建Mysql主从复制环境
Atlas服务器环境安装

  • 环境准备
服务器IP
MySQL主192.168.137.95
MySQL从1192.168.137.96
MySQL从2192.168.137.97
MySQL Atlas代理服务器192.168.137.98

安装并配置Atlas软件

[root@localhost ~]# cd /usr/src/
[root@localhost src]# ls
Atlas-2.2.1.el6.x86_64.rpm  debug  kernels
[root@localhost src]# rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
[root@localhost src]# cd /usr/local/mysql-proxy/
[root@localhost mysql-proxy]# ls
bin  conf  lib  log
  • 安装好后,会默认在”/usr/local/mysql-proxy”下生成4个文件夹,以及需要配置的文件,各目录说明:
    • bin目录下放的是可执行文件
    1. “encrypt”是用来生成MySQL密码加密的,在配置的时候会用到
    2. “mysql-proxy”是MySQL自己的读写分离代理
    3. “mysql-proxyd”是360的,后面有个“d”,服务的启动、重启、停止。都是用他来执行的
    • conf目录下放的是配置文件
    1. “test.cnf”只有一个文件,用来配置代理的,可以使用vim来编辑
    2. lib目录下放的是一些包,以及Atlas的依赖
    3. log目录下放的是日志,如报错等错误信息的记录
  • 配置读写分离
  1. 配置master,slave1,slave2中开放权限给Atlas:
grant all on *.* to test@'192.168.137.%' identified by '123.com';
flush privileges;
  1. 加密用户名密码
    进入bin目录,使用encrypt来对数据库的密码进行加密,我的MySQL数据的用户名是test,密码是123.com,我需要对密码进行加密
[root@localhost bin]# ./encrypt 123.com
tF5TeinkMj8=
  1. 编辑test.cnf配置文件
vi /usr/local/mysql-proxy/conf/test.cnf

[mysql-proxy]

#带#号的为非必需的配置项目

#管理接口的用户名
admin-username = user

#管理接口的密码
admin-password = pwd

#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses = 192.168.137.95:3306

#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
proxy-read-only-backend-addresses = 192.168.137.96:3306@1,192.168.137.97:3306@1

#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
pwds = test:tF5TeinkMj8=
#Atlas监听的工作接口IP和端口
proxy-address = 0.0.0.0:1234

#Atlas监听的管理接口IP和端口
admin-address = 0.0.0.0:2345
  1. 配置无误后,启动Atlas软件
/usr/local/mysql-proxy/bin/mysql-proxyd test start
/usr/local/mysql-proxy/bin/mysql-proxyd test stop
  • 测试
  1. 在代理主机(Altas)上:
yum -y install mysql
mysql -h127.0.0.1 -P2345 -uuser -ppwd  (用管理账号user登录2345管理接口IP和端口)

MySQL [(none)]> select * from help;
+----------------------------+---------------------------------------------------------+
| command                    | description                                             |
+----------------------------+---------------------------------------------------------+
| SELECT * FROM help         | shows this help                                         |
| SELECT * FROM backends     | lists the backends and their state                      |
| SET OFFLINE $backend_id    | offline backend server, $backend_id is backend_ndx's id |
| SET ONLINE $backend_id     | online backend server, ...                              |
| ADD MASTER $backend        | example: "add master 127.0.0.1:3306", ...               |
| ADD SLAVE $backend         | example: "add slave 127.0.0.1:3306", ...                |
| REMOVE BACKEND $backend_id | example: "remove backend 1", ...                        |
| SELECT * FROM clients      | lists the clients                                       |
| ADD CLIENT $client         | example: "add client 192.168.1.2", ...                  |
| REMOVE CLIENT $client      | example: "remove client 192.168.1.2", ...               |
| SELECT * FROM pwds         | lists the pwds                                          |
| ADD PWD $pwd               | example: "add pwd user:raw_password", ...               |
| ADD ENPWD $pwd             | example: "add enpwd user:encrypted_password", ...       |
| REMOVE PWD $pwd            | example: "remove pwd user", ...                         |
| SAVE CONFIG                | save the backends to config file                        |
| SELECT VERSION             | display the version of Atlas                            |
+----------------------------+---------------------------------------------------------+
16 rows in set (0.00 sec)

MySQL [(none)]> select * from backends;
+-------------+--------------------+-------+------+
| backend_ndx | address            | state | type |
+-------------+--------------------+-------+------+
|           1 | 192.168.9.100:3306 | up    | rw   |
|           2 | 192.168.9.3:3306   | up    | ro   |
|           3 | 192.168.9.4:3306   | up    | ro   |
+-------------+--------------------+-------+------+
3 rows in set (0.00 sec)

2.通过代理访问Mysql

[root@localhost bin]# mysql -h192.168.9.5  -utest -p123.com -P1234
MySQL [(none)]> select * from mytest.t1;
+-----+
| id  |
+-----+
|   1 |
|  10 |
|  30 |
|  40 |
| 100 |
| 200 |
+-----+
6 rows in set (0.00 sec)

MySQL [(none)]> select * from mytest.t1;
+-----+
| id  |
+-----+
|   1 |
|  10 |
|  20 |
|  40 |
| 100 |
| 200 |
+-----+
  1. 在MASTER/测试机上创建一个表
create database db_test;
use db_test;
create table zang (id int(10),name varchar(10),address varchar(20));
  1. 分别在两台从服务器上停止复制。
stop slave;
  1. 在主服务器上,插入数据
use db_test;
insert into zang values('1','zhang','this_is_master');
  1. 在从服务器上,手动插入其他内容
slave1:
use db_test;
insert into zang values('2','zhang','this_is_slave1');
slave2:
use db_test;
insert into zang values('3','zhang','this_is_slave2');
  1. 测试读操作
    在测试机上第一次查询结果:在这里插入图片描述

在测试机上第二次查询结果:在这里插入图片描述

在测试机上第三次查询结果:在这里插入图片描述

在client主机上插入一条语句:
insert into zang values(‘20’,‘hello’,‘write_test’);
在client上查询不到,最终只有在MASTER上才能看到这条语句内容,说明写操作只能在Master上。
由此验证:已经实现了MYSQL读写分离,目前所有的写操作都在MASTER主服务器上,用来避免数据的不同步,所有的读操作都分摊给了slave从服务器,用来分担数据库压力。

下载前可以先看下教程 https://pan.quark.cn/s/a426667488ae 标题“仿淘宝jquery图片左右切换带数字”揭示了这是一个关于运用jQuery技术完成的图片轮播机制,其特色在于具备淘宝在线平台普遍存在的图片切换表现,并且在整个切换环节中会展示当前图片的序列号。 此类功能一般应用于电子商务平台的产品呈现环节,使用户可以便捷地查看多张商品的照片。 说明中的“NULL”表示未提供进一步的信息,但我们可以借助标题来揣摩若干核心的技术要点。 在构建此类功能时,开发者通常会借助以下技术手段:1. **jQuery库**:jQuery是一个应用广泛的JavaScript框架,它简化了HTML文档的遍历、事件管理、动画效果以及Ajax通信。 在此项目中,jQuery将负责处理用户的点击动作(实现左右切换),并且制造流畅的过渡效果。 2. **图片轮播扩展工具**:开发者或许会采用现成的jQuery扩展,例如Slick、Bootstrap Carousel或个性化的轮播函数,以达成图片切换的功能。 这些扩展能够辅助迅速构建功能完善的轮播模块。 3. **即时数字呈现**:展示当前图片的序列号,这需要通过JavaScript或jQuery来追踪并调整。 每当图片切换时,相应的数字也会同步更新。 4. **CSS美化**:为了达成淘宝图片切换的视觉效果,可能需要设计特定的CSS样式,涵盖图片的排列方式、过渡效果、点状指示器等。 CSS3的动画和过渡特性(如`transition`和`animation`)在此过程中扮演关键角色。 5. **事件监测**:运用jQuery的`.on()`方法来监测用户的操作,比如点击左右控制按钮或自动按时间间隔切换。 根据用户的交互,触发相应的函数来执行...
垃圾实例分割数据集 一、基础信息 • 数据集名称:垃圾实例分割数据集 • 图片数量: 训练集:7,000张图片 验证集:426张图片 测试集:644张图片 • 训练集:7,000张图片 • 验证集:426张图片 • 测试集:644张图片 • 分类类别: 垃圾(Sampah) • 垃圾(Sampah) • 标注格式:YOLO格式,包含实例分割的多边形点坐标,适用于实例分割任务。 • 数据格式:图片文件 二、适用场景 • 智能垃圾检测系统开发:数据集支持实例分割任务,帮助构建能够自动识别和分割图像中垃圾区域的AI模型,适用于智能清洁机器人、自动垃圾桶等应用。 • 环境监控与管理:集成到监控系统中,用于实时检测公共区域的垃圾堆积,辅助环境清洁和治理决策。 • 计算机视觉研究:支持实例分割算法的研究和优化,特别是在垃圾识别领域,促进AI在环保方面的创新。 • 教育与实践:可用于高校或培训机构的AI课程,作为实例分割技术的实践数据集,帮助学生理解计算机视觉应用。 三、数据集优势 • 精确的实例分割标注:每个垃圾实例都使用详细的多边形点进行标注,确保分割边界准确,提升模型训练效果。 • 数据多样性:包含多种垃圾物品实例,覆盖不同场景,增强模型的泛化能力和鲁棒性。 • 格式兼容性强:YOLO标注格式易于与主流深度学习框架集成,如YOLO系列、PyTorch等,方便研究人员和开发者使用。 • 实际应用价值:直接针对现实世界的垃圾管理需求,为自动化环保解决方案提供可靠数据支持,具有重要的社会意义。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值