C05S15-MySQL读写分离

一、MySQL读写分离

1. 读写分离概述

读写分离是MySQL的一种架构策略,读数据和写数据的操作在不同的MySQL服务器上进行操作。实现读写分离的MySQL集群采取主从复制模式,主从复制模式中MySQL节点最少为3个,1个主节点,2个从节点。当写入数据时,主节点负责把数据写入数据库,然后把数据同步到从节点。

2. 主从复制工作原理

  1. 主节点开启二进制日志文件,操作会记录在二进制日志文件当中。
  2. 从节点开启中继日志文件,在一定时间内会探测主节点的二进制日志文件是否发生变化。如果变化,就会开启一个I/O线程,请求主节点二进制日志的事件。
  3. 主节点也会为从每个节点的I/O线程开启一个dump线程向从节点发送二进制事件,从节点会将获取到的二进制事件保存到本地的中继日志文件中,然后调用SQL线程读取二进制事件,对数据库进行相应操作。

3. 主从复制模式

  1. 异步复制

    MySQL的默认方式,主节点写入客户端提交的数据后,结果会立即返回客户端。主节点不会关心从节点是否接收和处理数据。主节点如果崩溃,未提交的数据可能不能够提交到从节点,导致数据不完整,可以结合MySQL的高可用进行故障切换。

  2. 全同步复制

    主节点写入客户端提交的数据后,从节点也处理完数据,才会给客户端返回结果。需要等所有节点都完成写入,才会进入下一步的操作。

  3. 半同步复制

    介乎于全同步模式和异步模式之间,主库接受到写入操作,会等待至少一个从库完成了写入之后才会返回给客户端。

4. 主从复制延迟优化

  1. 网络延迟

    数据库的各节点都部署在同一个局域网内,尽可能不跨网段。

  2. 硬件原因

    受到磁盘的I/O性能,使用性能较好的CPU,根据需求扩容节点的内存。尽可能使用物理机部署数据库,而不采用云服务器。

  3. 架构原因

    优化主从架构配置,保证写入操作都是在主节点完成。

  4. MySQL配置原因
    在MySQL服务的my.cnf文件中进行双一配置。

    innodb_flush _log_at_trx_commit=1
    sync_binlog=1
    
    • innodb_flush _log_at_trx_commit

      控制InnoDB存储引擎在事务提交时日志刷新到磁盘的行为。

      值为0时,事务提交不会刷新日志,而是每秒刷新一次,性能提高,安全性降低;值为1时,事务提交会刷新日志,确保事务的持久性,提高数据安全;值为2时,事务提交的相关日志会写入内存,而不是写入本地硬盘。

    • sync_binlog

      控制MySQL主服务器在二进制日志写入时的同步行为。

      值为0时,二进制日志会写入内存,而不实时保存在本地磁盘;值为1时,MySQL会将二进制日志实时写入本地磁盘。

    除此之外,还可以配置innodb_buffer_pool_size,用于设置InnoDB存储引擎的缓冲池大小。缓冲池使用的是内存空间,通常是设置为内存大小的一半或三分之一。

二、MySQL读写分离架设

1. 架设主从复制

主节点:192.168.1.131

从节点:192.168.1.132、192.168.1.133

节点的时间要同步,不然无法正常通信。

1.1 配置主节点

  1. 编辑主节点的my.cnf文件,开启二进制日志文件,并允许从节点将写入自己二进制日志,并开启普通日志。

    server-id = 1
    log-bin=master-bin
    binlog_format = MIXED
    log-slave-updates=true
    
    general_log=ON
    general_log_file=/usr/local/mysql/data/mysql.log
    
  2. 重启MySQL服务。

    systmctl restart mysqld
    
  3. 登录MySQL终端,创建从节点用户,并授权。

    CREATE USER 'myslave'@'192.168.1.%' IDENTIFIED WITH mysql_native_password BY '123456';
    GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.1.%';
    FLUSH PRIVILEGES;
    
  4. 在MySQL终端中查看主节点状态。

    SHOW MASTER STATUS;
    

1.2 配置从节点

  1. 配置从节点服务器的my.cnf文件。开启中继日志文件和普通日志文件。其中一台的id设置为2,一台的id设置为3。

    server-id = 2 # 另一台设置为3
    relay-log=relay-log-bin
    relay-log-index=slave-relay-bin.index
    relay_log_recovery = 1
    
    general_log=ON
    general_log_file=/usr/local/mysql/data/mysql.log
    
  2. 重启MySQL服务。

    systmctl restart mysqld
    
  3. 登录MySQL字段,同步主节点。

    CHANGE master to master_host='192.168.1.131',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=845;
    
    • master_log_file:配置主节点的二进制日志文件。
    • master_log_pos:配置主节点的二进制日志起始偏移量。
    • master_log_file和master_log_pos根据查看主节点状态时显示的文件名称和偏移量进行设置。
  4. 在终端中启动从节点,并查看从节点状态。

    start slave;
    show slave status\G;
    
    # 状态信息中的I/O和SQL线程均为Yes时,表名成功同步
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes 
    
    • Slave_IO_Running:从节点与主节点进行I/O通信的线程。

    • Slave_SQL_Running:从节点控制自己MySQL的线程。

    • Slave_IO_Running显示为No的原因

      1. 主节点和从节点之间网络不通,或节点设置了防火墙。
      2. 主节点、从节点的my.cnf配置文件有误,通常是节点的id冲突。
      3. 从节点访问主节点的用户没有授权。
      4. 同步节点时的用户名、密码、日志文件名或偏移量有误。

1.3 验证主从复制

  1. 在主节点上登录MySQL终端,创建一个数据库。

    CREATE DATABASE test;
    
  2. 在从节点的终端中查看数据库是否存在。

    SHOW DATABASES;
    

2. 架设读写分离

基于Amoeba实现MySQL的读写分离

Amoeba节点:192.168.1.128

客户端节点:192.168.1.129

2.1 配置Amoeba

  1. 安装1.6版本的Java,这里以安装JDK1.6版本的二进制文件为例。

    # Amoeba基于JDK1.5开发,官方推荐使用1.5或1.6版本的JDK
    chmod +x jdk-6u14-linux-x64.bin
    ./jdk-6u14-linux-x64.bin、
    mv jdk1.6.0_14 /usr/local/jdk1.6
    
  2. 安装Amoeeba。

    mkdir /usr/local/amoeba
    tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
    chmod -R 755 /usr/local/amoeba
    
  3. 配置环境变量。

    export JAVA_HOME=/usr/local/jdk1.6
    export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
    export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
    export AMOEBA_HOME=/usr/local/amoeba
    export PATH=$PATH:$AMOEBA_HOME/bin
    
  4. 刷新环境变量。

    source /etc/profile
    
  5. 登录三个MySQL节点的终端,创建Amoeba用户,并授权。

    CREATE USER 'amoeba'@'192.168.1.%' IDENTIFIED WITH mysql_native_password BY '123456';
    GRANT REPLICATION SLAVE ON *.* TO 'amoeba'@'192.168.1.%';
    GRANT ALL PRIVILEGES ON *.* TO 'amoeba'@'192.168.1.%';
    FLUSH PRIVILEGES;
    
  6. 配置Amoeba的配置文件conf/amoeba.xml。

    <!--30行,修改为在MySQL终端中创建的用户名-->
    <property name="user">amoeba</property>
    <!--32行,修改为在MySQL终端中创建的密码-->
    <property name="password">123456</property>
    <!--115行,设置默认节点-->
    <property name="defaultPool">master</property>
    <!--117行,去掉注释,设置写数据节点和读数据节点-->
    <property name="writePool">master</property>
    <property name="readPool">slaves</property>
    
  7. 配置Amoeba的配置文件conf/dbServers.xml。

    <!--23行注释掉-->
    <!-- <property name="schema">test</property> -->
    <!--26行修改,-->
    <property name="user">amoeba</property>  
    <!--28行,去掉注释-->
    <property name="password">123456</property>
    <!--45行,设置主节点的名称master-->
    <dbServer name="master"  parent="abstractServer">
    <!--48行,设置节点的地址-->
    <property name="ipAddress">192.168.1.131</property>
    <!--52行,设置从节点1的名称slave1-->
    <dbServer name="slave1"  parent="abstractServer">
    <!--55行,设置从节点1的地址-->
    <property name="ipAddress">192.168.1.132</property>
    <!--58行,复制节点1的配置,设置从服务器2的名称slave2和地址-->
    <dbServer name="slave2"  parent="abstractServer">
    <property name="ipAddress">192.168.1.133</property>
    <!--65行,修改名称-->
    <dbServer name="slaves" virtual="true">
    <!--71行,修改从节点名称-->
    <property name="poolNames">slave1,slave2</property>
    
  8. 后台启动Amoeba,并查看8066端口是否正常开启。

    amoeba start &
    netstat -antp | grep 8066
    

2.2 配置客户端

  1. 安装mariadb数据库。

    apt -y install mariadb-server
    
  2. 启动mariadb数据库。

    systemctl start mariadb.service
    

2.3 验证读写分离

  1. 在三台MySQL节点上实时查看MySQL的普通日志。

    tail -f /usr/local/mysql/data/mysql.log
    
  2. 在客户端上通过Amoeba服务器访问MySQL数据库。

    mysql -h 192.168.1.128 -P 8066 -u amoeba -p
    
  3. 在终端上执行下面语句,查看三个节点是否实时更新相关日志。

    CREATE DATABASE test;
    USE test;
    CREATE TABLE student(id int,name char(10));
    INSERT INTO student VALUES (1, '刘一');
    INSERT INTO student VALUES (2, '陈二');
    SELECT * FROM student WHERE id=1;
    SELECT * FROM student WHERE id=2;
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值