精华内容
下载资源
问答
  • 数据库读写分离实现
    千次阅读
    2020-06-11 12:53:51

    在数据库的应用中,为了提高数据库的安全性,高可用性,以及业务系统对高并发的需求,除了需要使用主从复制以为,还需要使用数据库读写分离技术。

    读写分离原理

    所谓读写分离,即把对数据库的读取和写入(增/删/改)操作分开到不同的database server上(如下图),以提高数据库操作效率,和高并发性能。在数据库写入操作不频繁的场景中,也可以让负责写入操作的server分担一部分读取的压力。
    在这里插入图片描述

    实现读写分离的两种方式

    1. 应用程序层面实现,即:在应用程序代码中,指定读取数据的服务器和写入数据的服务器。
      优点:
      1)安装即用;
      2)降低了一定的部署难度;
      3)访问压力在一定级别下,性能很好
      缺点:
      1)系统架构调整,程序代码就需要跟着改变;
      2)难以实现高级应用,如:分库、分表;
      3)不适用于大型应用场景。

    2. 使用专门的中间件实现.
      优点:
      1)系统架构设计更灵活;
      2)可以实现一些高级控制,如:failover,监控,透明化水平拆分等。
      3)可以使用一些技术手段提高mysql的性能。
      4)对业务代码影响小,并且更安全。
      缺点:
      需要一定的开发运维团队支持。

    常见的中间件

    1. Mycat,社区爱好者在阿里Cobar的基础上二次开发的版本。
    2. Cobar,阿里开发的中间件,管理间件3000个mysql实例。
    3. Oneproxy,支付宝团队基于mysql官方proxy思想,使用c语言编写的一款商业收费中间件,注重性能和稳定性。
    4. Atlas,360团队基于mysql官方proxy思想,使用c语言编写的一款中间件,高并发下可能不稳定。
    5. Kingshared,前360Atlas团队成员使用GO语言编写,正在完善中。(2019年)
    更多相关内容
  • 本篇文章主要介绍了Spring boot实现数据库读写分离的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 这是用MySQL的读写分离技术,实现数据的写入和读取分别在不同的库上,提升了数据库服务能力。  同样,在Oracle作为后台数据库的架构中,我们也可以这么做。实现的方式有很多种。  有基于RAC架构的,使用其中某个...
  • Mysql数据库读写分离实现

    千次阅读 2020-05-16 16:45:08
    mysql-proxy是实现"读写分离(Read/Write Splitting)"的一个软件(MySQL官方提供 ,也叫中间件),基本的原理是让主数据库处理写操作(insert、update、delete),而从数据库处理查询操作(select)。而数据库的一致...

    1.读写分离的实现方式

    Mysql中可以实现读写分离的插件有mysql-proxy / Mycat / Amoeba ,mysql-proxy是系统自带的一个插件,此次实验主要用它来实现读写分离
    mysql-proxy是实现"读写分离(Read/Write Splitting)"的一个软件(MySQL官方提供 ,也叫中间件),基本的原理是让主数据库处理写操作(insert、update、delete),而从数据库处理查询操作(select)。而数据库的一致性则通过主从复制来实现

    MySQL-proxy 它能实现读写语句的区分主要依靠内部的一个lua脚本(能实现读写语句的判断)
    如果只在主服务器(写服务器)上完成数据的写操作,此时从服务器上没有执行写操作,是没有数据的
    这个时候需要使用另外一个技术来实现主从服务器的数据一致性,这个技术叫做 主从复制技术, 所以说主从复制是读写分离的基础
    读写分离(MySQL- Proxy)是指让master处理写操作,让slave处理读操作,非常适用于读操作量比较大的场景,可减轻master的压力
    使用mysql-proxy实现mysql的读写分离,mysql-proxy实际上是作为后端mysql主从服务器的代理,它直接接受客户端的请求,对SQL语句进行分析,判断出是读操作还是写操作,然后分发至对应的mysql服务器上
    因为数据库的写操作相对读操作是比较耗时的,所以数据库的读写分离,解决的是数据库的写入,影响了查询的效率

    2.实验环境

    server1(172.25.254.1)master(mysqld)
    server2(172.25.254.2)slave(mysqld)
    server3(172.25.254.3)代理端(mysql-proxy)
    server4(172.25.254.4)测试端(mariadb-server)

    3.实验

    3.1 在server1和server2先配置gtid主从复制

    gtid主从复制上篇博客已经说明,这里不再赘述,只展示最终效果
    可以看到server1上建立一个westos数据库,对应的server2上会同步过来
    在这里插入图片描述
    在这里插入图片描述

    3.2 配置server3代理端(mysql-proxy)

    在server3上搭建mysql-proxy代理服务器(实现客户端写在server1上、读server2上的数据)
    (1) 从物理机获取mysql-proxy安装包到server3
    在这里插入图片描述
    (2)在server3上进行配置

    [root@server3 ~]# systemctl status mysqld	##查看mysqld服务状态
    [root@server3 ~]# systemctl stop mysqld	##关闭mysqld服务,因为代理服务器要用3306端口
    [root@server3 ~]# tar zxf mysql-proxy-0.8.5-linux-glibc2-x86-64bit.tar.gz -C /usr/local/	##解压到/usr/local/目录下
    

    在这里插入图片描述
    做一个软连接以便管理

    ln -s mysql-proxy-0.8.5-linux-glibc2-x86-64bit mysql-proxy
    

    在这里插入图片描述
    mysql-proxy目录下是没有配置文件的,所以需要自行建立一个配置文件的目录,创建配置文件
    在这里插入图片描述
    使用下面两条命令可以查配置文件中写入的参数

    [root@server3 bin]# ./mysql-proxy --help
    [root@server3 bin]# ./mysql-proxy --help-proxy
    
    [mysql-proxy]	##指定语句块
    proxy-address=0.0.0.0:3306	##指定proxy访问的主机和端口,3306是一个对外的通用端口
    proxy-read-only-backend-addresses=172.25.254.2:3306	##读主机的ip和端口
    proxy-backend-addresses=172.25.254.1:3306	##执行写主机的ip和端口
    proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua	##指定读写分离操作使用的lua文件路径
    pid-file=/usr/local/mysql-proxy/log/mysql-proxy.pid	##pid存放路径
    log-file=/usr/local/mysql-proxy/log/mysql-proxy.log	##日志存放路径
    plugins=proxy	##指定使用的插件
    log-level=debug	##日志的等级
    keepalive=true	##开启守护进程
    daemon=true	##使用后台方式运行
    

    在这里插入图片描述
    保存后需要将配置文件的权限改为660,需要创建 log 目录
    在这里插入图片描述
    修改数据库发生读写分离时的最大和最小连接数

    [root@server3 mysql-proxy]# find . -name *.lua 
    ./share/doc/mysql-proxy/rw-splitting.lua
    [root@server3 mysql-proxy]# cd share/doc/mysql-proxy 
    [root@server3 mysql-proxy]# ls 
    [root@server3 mysql-proxy]# vim rw-splitting.lua		##将lua脚本里原本启动机制的最小4个最大8个连接,改为1和2
    min_idle_connections = 1, 最小连接数 
    max_idle_connections = 2, 最大连接数
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    (3)启动mysql-proxy

    /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf	##启动
    cat /usr/local/mysql-proxy/log/mysql-proxy.log	##查看日志
    

    在这里插入图片描述

    3.3 测试读写分离

    (1)在server1上创建新的用户并且授权

    mysql> grant insert,update,select on *.* to kkxili@'%' identified by 'Red1hat*';
    mysql> FLUSH PRIVILEGES;	##刷新授权表
    mysql> USE westos;
    Database changed
    mysql> CREATE TABLE linux (
        -> username varchar(10) not null,
        -> password varchar(15) not null);
    mysql>DESC linux;
    

    在这里插入图片描述
    (2)server3安装lsof
    在这里插入图片描述
    在这里插入图片描述
    (3)在用户端虚拟机server4上第一次连接数据库代理server3
    在这里插入图片描述
    在这里插入图片描述
    在server3上面:lsof -i:3306
    在这里插入图片描述
    在这里插入图片描述
    (4)在用户端虚拟机server4上第二次连接数据库代理server3
    在server3上面:lsof -i:3306
    在这里插入图片描述
    在这里插入图片描述
    (5)在用户端虚拟机server4上第三次连接数据库代理server3
    在server3上面:lsof -i:3306
    开始读写分离

    在这里插入图片描述
    在这里插入图片描述上面是读写分离的读访问测试
    写测试
    在用户端插入数据

    use westos;
    insert into linux values('user1','123');
    

    在这里插入图片描述
    server1和server2都可以看到插入的数据
    在这里插入图片描述
    在这里插入图片描述
    在server2中关闭主从复制
    用户端再次写入数据,看不到刚刚写的数据
    在这里插入图片描述
    写在server1上,可以查看到数据
    在这里插入图片描述
    在server2上实现了读写分离
    在这里插入图片描述
    server2重新开启主从复制可以看到数据
    在这里插入图片描述
    客户端读的是server2,server2只能读,不能写,因此看不到刚才写进去的东西,server1可以看到
    实现了客户端(虚拟机)对server1的写,对server2的读

    当访问数据库的用户数量很多时,数据库的代理就把后端的数据库实现读写分离
    server1是写的数据库、server2是读的数据库
    当server1和server2满足gtid的主从复制时,用户往数据库写入的数据其实是写入了server1,并没有写入server2,server2上面的数据是复制过去的,因此server1、server2、客户机上面都能查到刚刚写进去的数据,其实客户机查的是server2(读)
    当关闭server1和server2的异步复制时,客户机往数据库写入的数据只写进了server1,没有写进去server2,server2也没有复制一份
    因此server1可以查看到,server2和客户机上面都查不到刚刚写进去的数据,此时的客户机读的是server2

    展开全文
  • 如何实现数据库读写分离

    当访问量过多时,单一的数据库往往会超负荷使用,所以我今天为大家介绍一个读写分离的方法,使得项目的读与写分离开来,可以减少数据库的压力。

    我们首先需要准备两个服务器,我们这里已经提前准备好了两个Linux系统,并且都已经将MYSQL安装配置完成,并已经完成了主从复制功能。(不知道如何配置主从复制功能的见我另一篇文章)

    在pom文件中加入依赖

            <!--读写分离依赖 --> 
            <dependency>
                <groupId>org.apache.shardingsphere</groupId>
                <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
                <version>4.0.0-RC1</version>
            </dependency>

    然后修改yml配置文件

    我们先将之前配置的单数据源配置注释掉

    在spring下面配置如下内容,记得递进关系要严格按照我写的来,递进关系是yml格式的配置文件非常重要的格式。

      shardingsphere:
        datasource:
          names:
            master,slave
          # 主数据源
          master:
            type: com.alibaba.druid.pool.DruidDataSource
            driver-class-name: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://192.168.69.130:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
            username: root
            password: admin
          # 从数据源
          slave:
            type: com.alibaba.druid.pool.DruidDataSource
            driver-class-name: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://192.168.69.131:3306/tset?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
            username: root
            password: admin
        masterslave:
          # 读写分离配置
          load-balance-algorithm-type: round_robin #轮询
          # 最终的数据源名称
          name: dataSource
          # 主库数据源名称
          master-data-source-name: master
          # 从库数据源名称列表,多个逗号分隔
          slave-data-source-names: slave
        props:
          sql:
            show: true #开启SQL显示,默认false
      main:
        allow-bean-definition-overriding: true

    这里我们已经配置好了读写分离的依赖和配置文件,现在就已经可以正常启动了。

    展开全文
  • amoeba是阿里开发的一款数据库读写分离的项目(读写分离只是它的一个小功能),由于是基于java编写的,所以运行环境需要安装jdk; 前期准备工作: 1.两个数据库,一主一从,主从同步; master: 172.22.10.237:3306 ...
  • Internet的规模每一百天就会增长一倍,客户希望获得7天×24小时的不间断可用性及较快的系统反应时间,而不愿屡次看到某个站点“Server Too Busy”及频繁的...下面,我们先简单了解Oracle的负载均衡的实现方案。 Real Ap
  • Redis的主从架构,能帮助我们实现读多,写少的情况,下面这篇文章主要给大家介绍了关于Redis如何实现数据库读写分离的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习...
  • slave servers=server1,server2 user=slave password=CM@Mysql201 ​ # 提供读写分离服务端口号 [Read-Write-Listener] type=listener service=Read-Write-Service protocol=MySQLClient address=0.0.0.0 port=4006 ...

    目录

    一、版本说明

    二、 MySql安装

    三、读写中间件安装

    六、程序配置

    七、注意事项


    一、版本说明

    序号名称版本
    1mysql5.7.32
    2maxscale2.5.15
    • 建议在新环境实施

    二、 MySql安装

    1. 删除系统自带mariaDB旧包查看已经安装的rpm包

    rpm -qa | grep -i mariadb 

    2. 根据查询结果,删除已经安装的旧包

    rpm -e rpm旧包名称
    1. 查看是否有mariaDB遗留配置文件或者文件目录,如果有一并用 rm -rf 删除

    whereis mariadb
    1. 删除系统已有MySql(如果此数据库已正在使用请卸载前备份)

    2. 查看已经安装的rpm包

    rpm -qa | grep -i mysql
    1. \2. 根据查询结果,删除已经安装的旧包

    rpm -e rpm旧包名称
    1. 查看是否有MySql遗留配置文件或者文件目录,如果有一并用 rm -rf 删除

    whereis mysql
    1. 安装MySql数据库

    rpm -ivh mysql-community-common-5.7.32-1.el7.x86_64.rpm
    rpm -ivh mysql-community-libs-5.7.32-1.el7.x86_64.rpm
    rpm -ivh mysql-community-client-5.7.32-1.el7.x86_64.rpm
    rpm -ivh mysql-community-server-5.7.32-1.el7.x86_64.rpm
    1. 查看初始密码

    grep "password" /var/log/mysqld.log| more
    1. 修改初始密码及授权远程访问

    mysql -uroot -p
    mysql> use mysql
    mysql> flush privileges;
    mysql> grant all privileges on *.* to 'root'@'%' identified by 'CM@Mysql201' with grant option;
    mysql> flush privileges;
    mysql> quit
    1. 在主数据库添加主从同步账号

    mysql> GRANT all privileges ON *.* TO 'slave'@'%' IDENTIFIED BY 'CM@Mysql201' WITH GRANT OPTION;
    mysql> flush privileges;
    mysql> quit
    1. 修改主数据库配置文件

    2. 默认MySql配置文件路径 /etc/my.cnf主要参数修改如下

    # 指定全局唯一服务器ID,ID范围1~65536的任意一个值,但不能重复
    server-id = 1
    log-bin = mysql-bin
    binlog-ignore-db = information_schema
    binlog-ignore-db = performance_schema
    binlog_ignore_db = sys
    binlog_format = ROW
    1. 修改从数据库配置文件

    2. 默认MySql配置文件路径 /etc/my.cnf

    # 指定全局唯一服务器ID,ID范围1~65536的任意一个值,但不能重复
    server-id =2
    read-only=ON
    log-bin=bin-log
    1. 查看主数据库状态

    show master status;
    1. 显示类似如下结果,主要注意File、Position参数值,后面做同步的时候会用到

    1. 在从服务器配置主服务器

    change master to master_host='10.134.29.201',master_user='slave',master_password='CM@Mysql201',master_log_file='mysql-bin.000004',master_log_pos=953283316; 
    • 然后启动slave

    start slave;
    • 通过语句查看从数据库状态

    mysql> show slave status;
    • 显示类似如下信息则说明设置完成

    三、读写中间件安装

    1. 到官方网站对应的版本或者到我整理的网盘下载部署的包文件

    2. 链接:https://pan.baidu.com/s/1y6o_T4R7TRHURNxQEp9n4Q 
      提取码:rann

    3. 把下载的文件上传到服务器相应的文件目录,如:/opt/package

    4. 执行安装命令

    sudo rpm -ivh maxscale-2.5.15-1.rhel.7.x86_64.rpm
    1. 修改配置文件参数,主要修改存储路径、访问端口号、及内存大小限制默认maxscale.cnf路径/etc/maxscale.cnf主要参数修改如下,注意把服务器、账号信息配置为前面创建的账号

    [maxscale]
    threads=auto
    admin_host=0.0.0.0
    admin_secure_gui=false
    ​
    [server1]
    type=server
    address=10.134.29.201
    port=3306
    protocol=MySQLBackend
    [server2]
    type=server
    address=10.114.30.72
    port=3306
    protocol=MySQLBackend
    ​
    [MariaDB-Monitor]
    type=monitor
    module=mysqlmon
    servers=server1,server2
    user=slave
    password=CM@Mysql201
    monitor_interval=2000
    ​
    [Read-Write-Service]
    type=service
    router=readwritesplit
    router_options=master,slave
    servers=server1,server2
    user=slave
    password=CM@Mysql201
    ​
    # 提供读写分离服务端口号
    [Read-Write-Listener]
    type=listener
    service=Read-Write-Service
    protocol=MySQLClient
    address=0.0.0.0
    port=4006
    启动maxscale,常用命令# 启动maxscale服务
    systemctl start maxscale.service
    # 停止maxscale服务
    systemctl stop maxscale.service
    # 查看maxscale服务状态
    systemctl status maxscale.service
    # 查看MySql服务列表
    maxctrl list servers
    1. 在主服务器上创建一个链接账号如

    researchGRANT ALL PRIVILEGES ON *.* TO 'research'@'%' IDENTIFIED BY 'CM@Mysql201' WITH GRANT OPTION;
    flush privileges;
    1. 链接中间件跟Mysql类似,端口号为监听设置的端口号

    mysql -uresearch -p'CM@Mysql201' -h'172.16.1.51' -P4006

    六、程序配置

    修改项目的application.properties配置文件,把链接改成代理的地址配置如下

    spring.datasource.druid.url=jdbc:mysql://10.114.30.72:4006/iacl_cmp?characterEncoding=utf8&serverTimezone=Asia/Shanghai
    spring.datasource.druid.username=research
    spring.datasource.druid.password=CM@Mysql201

    七、注意事项

    1. 在部署数据库主从时,要注意数据的备份及不影响正常的业务

    展开全文
  • 数据库读写分离

    千次阅读 2022-05-12 21:30:36
    所谓读写分离就是把对数据库的读写操作分到不同的数据库服务上,以实现数据库的高性能和高并发能力;采用数据库的主从复制,一主一从或者一主多从,主服务器用来进行写操作,从服务器用来读操作 二:读写分离的弊端...
  • 数据库读写分离的优点

    千次阅读 2020-06-26 13:23:17
    今天,根据博主我作为程序猿的经验,来和大家分享一下数据库读写分离带来的优点。 一,读写分离带来的扩展性更强 在我们编码的过程中,随着项目的业务增多,必然会致使业务接口越来越多,接口越多,带来的维护成本就...
  • 实现在两台数据库主机上安装数据库实现主从并在另一台主机上搭建mycat组件实现读写分离 ​ 搭建主从 1.安装并初始化操作 在两台主机上安装数据库并初始化 [root@node3 ~]# yum install -y mariadb maria
  • Spring系列第52篇:Spring实现数据库读写分离

    千次阅读 多人点赞 2020-11-12 16:30:00
    1、背景大多数系统都是读多写少,为了降低数据库的压力,可以对主库创建多个从库,从库自动从主库同步数据,程序中将写的操作发送到主库,将读的操作发送到从库去执行。今天的主要目标:通过 spr...
  • 使用Oracle Active Data Guard实现PMS2.0数据库读写分离初探.pdf
  • 数据库读写分离

    千次阅读 2021-09-30 14:29:59
    读写分离的基本原理是将数据库读写操作分散到不同的节点上: 读写分离的基本实现是: 数据库服务器搭建主从集群,一主一从、一主多从都可以; 数据库主机负责读写操作,从机只负责读操作; 数据库主机通过复制将...
  • 资源中整合了SSM,并实现数据库读写分离。使用mybatis-generator动态生成mapper、dao、po,封装了常用的工具类,后期还继续维护,加上分布式缓存等等。
  • 下面我们重点介绍Sql Server 2005是如何实现负载均衡的,感兴趣的朋友可以参考下哈  Internet的规模每一百天会增长一倍,客户希望获得7天×24小时的不间断可用性及较快的系统反应时间,而不愿屡次看到某个站点...
  • 1.实现主从数据库读写分离 主库:写 从库(可多个):读 2.主数据库无法连接时 可设置从数据库是否 可写 3.所有从数据库无法连接时 可设置主数据库是否 可读 4.如果从数据库连接失败 可设置N秒内不再连接 利用yii扩展...
  • 数据库读写分离,主从同步实现方法

    万次阅读 多人点赞 2017-12-06 21:37:06
    通过实际的例子编码实现数据库读写分离实现数据库主从同步
  • 数据库配置读写分离(linux)

    千次阅读 2021-12-02 22:53:51
    linux系统读写分离实现
  • 数据库读写分离架构

    2018-01-15 10:11:07
    • 读写分离,解决“数据库读性能瓶颈”问题 • 水平切分,解决“数据库...• 对于互联网大数据量,高并发量,高可用要求高,一致性要求高,前端面向用户的业务场景,微服务缓存架构,可能比数据库读写分离架构更合适
  • 本代码为C#语言实现Redis数据库读写分离的实例。
  • Mysql数据库读写分离

    千次阅读 2022-01-27 10:04:15
    读写分离是基于主从复制上面布置的,需要使用Atlas软件,代理服务器上只需要安装mariadb客服端 三台服务器:一台做主,一台做从,一台安装Atlas软件 主从复制部署在我的主页里面有,需要的可以去看下,链接:...
  • Atlas是由奇虎360公发的基于MySQL协议的数据库中间件产品,它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了若干Bug,并增加了很多功能特性。目前该产品在360内部得到了广泛应用,覆盖80%以上的MySQL业务...
  • 实现数据库读写分离,只需在前述“数据库的负载均衡“这篇文章的内容上做两点修改即可实现: 一是在DeveloperSharp.xml配置文件中设置两个DatabaseCluster节点分别对应“读数据库”与“写数据库”。 二是建立两...
  • 配置SqlServer数据库读写分离

    千次阅读 2020-06-21 01:38:16
    安装完成之后,每台虚拟机都安装sqlserver2017数据库实例。确定2台虚拟机通讯正常。 服务器信息 计算机名称 Sql实例名称 ip 说明 Node1 Node1 192.168.137.128 主数据库服务器 N...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 158,534
精华内容 63,413
关键字:

数据库读写分离实现