数据库的读写分离

一 、电商项目中数据库瓶颈

  1. 使用redis缓存减小数据库的压力 , 从而提升数据库的效率
  2. 单个数据库同时负责读写操作 , 底层可能会出现锁的现象: 同步锁 , 事务锁 , 乐观锁 , 悲观锁
  3. 单个数据库同时负责读写操作 , 效率还是不高 , 所以引入了数据库的集群 , 尽可能的减少锁的存在 , 利用集群的不同数据完成读和写的分离
  4. 引入读写分离的主从结构
    1. 主: 写数据
    2. 从: 备份数据 , 被读数据
  5. Master和slave的主从复制过程
    1. master负责写数据 , slave负责更新数据 , 需要同步
    2. 实现原理:
      1. 配置主从结构先在主上打开一个二进制日志的文件(Binary.log),在master写操作时,就会把写的命令存入到这个二进制文件中(insert,update,delete)slave开启一个IO线程,线程定时读取主节点的二进制文件,将新的命令抓取过来存放到本地一个中继日志中(relay.log);slave上还有一个定时启动的线程叫sql,监控本地的中继日志,一旦有新的命令发现,将会把中继日志中的命令执行一遍这样一来,主从结构就完成了数据的备份;

二、 安装linux版的mysql(percona)

  1. 可以实现最终一致性
  2. 回忆CAP理论:
    1. 数据一致性是强一致性的 , 完美一致性 —- 分布式系统中 , 任何一个时间点 , 所有的系统数据均相同 。
  3. 但是并不是所有的情景都需要满足数据强一致性 。
    1. 比如: 抢购 , 并不是要求前台的抢单数据立刻和数据库的最终抢到的结果一致 , 而是先给你一个反馈, 数据并没有实现一致 , 在一段时间后再去完成一致性 。 这就是数据库的弱一致性(最终一致性是弱一致性中的一种, 允许系统间的数据在某一个时间点不同 , 但是一段时间后会想通 。)
    2. 支付宝花掉银行卡的钱时必须使用强一致性 。
  4. 安装procona , 实现mysql主从结构(一个主节点 , 一个从节点)

    1. 安装cmake也可以使用 yum -y install cmake (-y表示在安装过程中所有的问答都是yes , 比较省事)
    2. 将Percona版的mysql上传到linux中 , 移动到自己的管理目录(我自己习惯新建一个software管理)中后解压 (tar -xvf 需要解压的压缩包) 。
    3. 在管理目录中新建一个mysql目录, 将刚刚解压出来的rpm文件存放 进去
    4. 在mysql目录下安装rpm文件

      依次执行 , 顺序不能乱
      rpm -ivh Percona-Server-56-debuginfo-5.6.24-rel72.2.el6.x86_64.rpm
      rpm -ivh Percona-Server-shared-56-5.6.24-rel72.2.el6.x86_64.rpm
      rpm -ivh Percona-Server-client-56-5.6.24-rel72.2.el6.x86_64.rpm
      rpm –ivh Percona-Server-server-56-5.6.24-rel72.2.el6.x86_64.rpm
      

    安装第四个的时候如果出现问题则需要安装libaio(使用yum install libaio下载并安装 ) 然后重新执行第四部即可 。

    1. 执行完成之后 , 检查两点

      1. /etc/profile下有没有my.cnf文件
      2. /var/lib/mysql目录中有没有mysql数据文件
    2. 启动mysql服务
    3. 检查 mysql是否启动成功
    4. 还可以通过命令执行停止(stop)或重启服务(restart)
    5. 修改mysql密码(在安装完 成之后 , 默认是没有密码的 直接输入mysql 即可 进入客户端, 需要手动设置密码)使用mysqladmin -u 用户名 password 密码
    6. 测试密码设置成功
    7. 开启3306端口(/sbin/iptables -I INPUT -p tcp –dport 3306 -j ACCEPT) 或者直接关闭防火墙(生产环境下千万别这样 , 安全系数太低)
    8. 查看防火墙状态
    9. 上传数据库文件
    10. 登录mysql客户端, 设置数据库编码后倒入sql文件
    11. 使用查询语句检查数据是否正确默认安装的mysql没有外部访问权限 , 需要开启访问权限(grant [权限] on [数据库名].[表明] to [用户名]@‘[web服务器的IP地址]’ identified by ‘[密码]’;)
    12. 按照以上配置在配置一台linux主机 , 接下来配置主从数据库
  5. 配置主从关系

    1. 选择一台服务器为主服务器(master) ,编辑master服务器的配置文件/etc/my.cnf
    2. 在[mysqlId]结点下加入两句话
    3. 重启服务 : service mysql restart
    4. 不让写数据 , 数据库锁表 mysql>flush tables with read lock;
    5. 查看master结点的状态(其中file就是指的二进制日志文件 , position指的是记录当前操作sql的步骤数(不是sql条数, 一条sql可能包含多步))记下position配置从节点需要使用
    6. 配置从节点
    7. 编辑/etc/my.cnf 加一行 server-id=2
    8. 重启从结点 service mysql restart
    9. 通过mysql命令配置同步日志的指向:

      mysql>change master to master_host='106.75.74.254', master_port=3306,
      master_user='root',master_password='root',
      master_log_file='mysql-bin.000001',
      master_log_pos=120;
      
    10. 其中:

      master_host        主服务器的IP地址(内网地址)
      master_port        主服务器的PORT端口
      master_log_file    和主服务器show master status中的File字段值相同
      master_log_pos        和主服务器show master status中的Position字段值相同
      
    11. 在从节点中开启主从复制命令

          mysql>start slave;                #stop slave;停止服务,出错时先停止,再重新配置mysql>show slave status\G;        #查看SLAVE状态,\G结果纵向显示。必须大写,这个命令无法再sqlyog中使用service mysql restart        #重启服务
      
    12. 从节点启动之后 ,主节点记得解除锁定(mysql>unlock tables;)

    13. 测试主节点 , 从节点 同步状态:

      1. 向主节点写入数据 , 后观察从节点主节点的数据被同步复制
      2. 向从节点中写入数据 , 观察主节点数据没有被复制 , 查看slave状态(show slave status)发现主从结构被破坏 , sql线程已经停止
      3. 此时需要从新挂载从节点
      4. 先清除错误数据
      5. 观察主节点pos(show master status )
      6. 从新执行挂载命令

        mysql>change master to master_host='106.75.74.254', master_port=3306,master_user='root',master_password='root',master_log_file='mysql-bin.000001', master_log_pos=120;
        
      7. 在从节点中从新启动主从结构(start slave)
      8. 结论: 虽然mysql支持主从关系 , 但是并没有维护读写分离的状态
  6. 主从配置完成 , 但是没有实现读写分离 , 从节点不能防止写入数据 。

三 、 amoba

  1. 实现的功能

    1. 读写分离(主从复制 + 分离)
    2. 负载均衡
    3. 自定义函数分库分表 (能够平均分配对数据访问的压力)
      1. 分库分表虽然能够完成, 但是会导致查询时的sql十分繁琐 。 但是对sql语句中的各种分库分表的常用语句进行封装成函数 , 将查询条件按照参数给对应的函数 , 获取查询的数据

四、 amoeba安装

  1. amoeba是基于java环境的 , 所以需要事先安装jdk环境

    1. 上传linux环境下的JDK文件 , 并解压
    2. 配置环境变量 , 并使环境变量 生效
  2. 获取amoeba资源 , 并上传至master所在 的服务器
  3. 解压安装
  4. 配置读写分离

    1. 修改配置文件 cd到conf中 vim dbServer.xml

      dbServers.xml
      <dbServer name="abstractServer" abstractive="true">
      类似一个总代理 抽象服务器<poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">amoeba管理的是数据库集群,需要一个当前总代理负责的数据库池的配置信息<dbServer name="server1"  parent="abstractServer"><factoryConfig><!-- mysql ip --><property name="ipAddress">127.0.0.1</property></factoryConfig>
      </dbServer>
      在dbServer中根据数据库节点配置相关信息,有多少个节点,就配置多少个dbServer的标签
      
      1. 主要修改一下配置: 第26 、28行设置amoeba的用户名和登录密码(为了方便 , 都改为root)
      2. 43 、 46行配置主数据库的名字(一般设置为master代表主节点)和地址
      3. 50 、 53 行配置从节点的名字(一般为slave序号)和地址
      4. 配置主从数据库工作策略

        <dbServer name="multiPool" virtual="true"><poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"><!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->//这里给了3个负载均衡策略 1 轮询2 权重3 高可用<property name="loadbalance">1</property>//这里我们使用轮询<!-- Separated by commas,such as: server1,server2,server1 --><property name="poolNames">slave,slave,master,slave,slave</property>//配置轮询的节点顺序</poolConfig>
        </dbServer>
        
      5. 此时amoeba主从数据库IP和访问策略已经配置完毕
      6. 接下来配置amoeba读写分离配置
      7. amoeba.xml是amoeba的核心配置文件 , 启动时会加载dbServer.xml使用其中的配置 ,才能实现负载均衡的效果 。
      8. 第10行配置访问amoeba的端口 , 默认为8066
      9. 配置访问amoeba时的用户名和密码
      10. 配置读写分离 , 主节点为做写数据的结点 , 从节点用于承载查询时的压力
      11. 配置文件完成 , 启动amoeba之前需要开发8066端口或者关闭防火墙 后再bin目录下执行 ./launcher start & g
      12. 发现报错 , 原因是amoeba对java环境的要求最小栈为228k , 而java默认的最小栈为128k , 所以需要修改amoeba的配置文件(添加一行DEFAULT_OPTS=”$DEFAULT-OPTS -server -Xms256m -Xmx256m -Xss256k”)
      13. 重新执行启动命令(在amoeba的bin目录下执行./launcher start &)
      14. 将JDBC连接数据库的地址改为amoeba所在的主机地址 , 端口改为8066 , 此时由amoeba代理的mysql集群已经实现了负载均衡和读写分离

总结

  1. 学习完成tomcat集群 、 niginx 、redis集群 、 amoeba 、 mysql主从复制+读写分离之后 ,一个高可用的架构已经呈现

问题 :

  1. 测试 server-id相同的情况下 , 会发生什么问题

互联网架构阶段 数据库读写分离 Amoeba相关推荐

  1. 大数据互联网架构阶段 数据库三范式与反范式

    数据库范式 一. 三范式 主键: 创建表时可以不设置主键 , 但是没有设置主键的表 , 底层会认为所有的键都是主键 ,所以在创建时使用了所有的字段创建索引 , 在查询时索引的存在几乎没有意义 . 复合 ...

  2. mysql数据库字段变形_详解如何利用amoeba(变形虫)实现mysql数据库读写分离

    摘要:这篇MySQL栏目下的"详解如何利用amoeba(变形虫)实现mysql数据库读写分离",介绍的技术点是"MySQL数据库.数据库读写分离.amoeba.MySQL ...

  3. 数据库读写分离架构详解

    RD:数据量太大,数据库扛不住了,帮忙申请一个从库,读写分离. DBA:数据量多少? RD:5000w左右. DBA:读写吞吐量呢? RD:读QPS约200,写QPS约30左右. 额,数据库读写分离虽 ...

  4. 解决数据库读写分离(转)

    如何配置mysql数据库的主从? 单机配置mysql主从:http://my.oschina.net/god/blog/496 常见的解决数据库读写分离有两种方案 1.应用层 http://neore ...

  5. 大数据互联网架构阶段 QuartZ定时任务+RabbitMQ消息队列

    QuartZ定时任务+RabbitMQ消息队列 一 .QuartZ定时任务解决订单系统遗留问题 情景分析: 在电商项目中 , 订单生成后 , 数据库商品数量-1 , 但是用户迟迟不进行支付操作 , 这 ...

  6. mysql读写分离java配置方法_springboot配置数据库读写分离

    为什么要做数据库读写分离 大多数互联网业务,往往读多写少,这时候,数据库的读会首先称为数据库的瓶颈,这时,如果我们希望能够线性的提升数据库的读性能,消除读写锁冲突从而提升数据库的写性能,那么就可以使用 ...

  7. 一文详解高性能数据库:读写分离

    虽然近十年来各种存储技术飞速发展,但关系数据库由于其 ACID 的特性和功能强大的 SQL 查询,目前还是各种业务系统中关键和核心的存储系统,很多场景下高性能的设计最核心的部分就是关系数据库的设计. ...

  8. 什么是mysql的读写分离_什么是数据库读写分离?

    原文:https://baijiahao.baidu.com/s?id=1614304400276051465&wfr=spider&for=pc 想用数据库"读写分离&qu ...

  9. 跟我学Springboot开发后端管理系统5:数据库读写分离

    在Matrix-web后台管理系统中,使用到了数据库的读写分离技术.采用的开源的Sharding-JDBC作为数据库读写分离的框架.Matrix-Web后台数据库这一块采用的技术栈如下: 使用Myba ...

最新文章

  1. ValueError: invalid literal for int() with base 10: “ ”
  2. centos 6.3安装mysql_centos6.3安装MySQL 5.6(转)
  3. 1分钟、2束光,3D打印出一座“柏林地标”,精度高于发丝 | Nature
  4. PHP开发经常遇到的几个错误
  5. 【软考-软件设计师】汇编程序基本原理
  6. 通用 PE 工具箱1.9.6(XP内核)by Uepon(李培聪)
  7. java删除目录下符合条件的文件
  8. 使用sp_addlinkedserver、sp_dropserver 、sp_addlinkedsrvlogin和sp_droplinkedsrvlogin 远程查询数据...
  9. Web开发技术——JQuery8(添加元素和删除元素)
  10. 肠道细菌四大“门派”——拟杆菌门,厚壁菌门,变形菌门,放线菌门
  11. The Best of Many Worlds_ Dual Mirror Descent for Online Allocation Problems
  12. Winodws update auto update client(wuauclt)
  13. HTC M7日文版HTL22刷机包 毒蛇2.5.0 ART NFC Sense6.0
  14. Mac下编译WebRTC(Mac和iOS版本)
  15. webservice概述及cxf在Java开发中应用(三) cxf客户端开发
  16. Xmanager 5 远程连接linux图形界面
  17. 20200722-Java面经-被血虐-面试问题及总结
  18. C语言所有头文件整理
  19. 人力资源管理的现状及发展趋势
  20. 图的最小生成树-Kruskal算法

热门文章

  1. Java super和this
  2. Python第四章__装饰器、迭代器
  3. js中的scroll和offset 的使用比较
  4. 领域驱动第四章-读书笔记
  5. 交流电机数字控制系统_敲黑板!新型变频调速控制系统对交流电动机设计的特殊要求...
  6. python的类变量和成员变量用法_Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析...
  7. html抽奖源码_开源FPGA开发板OpenICE 介绍及抽奖
  8. Ogitor的编译配置全过程
  9. Html的一些小东西
  10. 随机变量的分布函数-定义域问题