MySQL数据库的主从复制与读写分离

MySQL主从复制的介绍

  • MySQL的主从复制和MySQL的读写分离两者有着紧密联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离。
  • MySQL复制类型:
  • 基于语句的复制。主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。
  • 基于行的复制。把改变的内容复制过去,而不是把命令在服务器上执行一遍。
  • 混合类型复制。默认采用基于语句的复制,一旦发现语句无法精确复制时,就会采用基于行的复制。

MySQL读写分离的介绍

  • 读写分离就是只在主服务器上写,只在从服务器上读。基本原理是让主数据处理事务性查询,而从数据库处理select查询。数据库复制被用来把事务性查询导致的变更同步到群集中的从数据库。
    基于中间代理层实现:代理一般位于客户端和服务器之间,代理服务器接到客户端请求通过判断后转发到后端数据库。

主从复制与读写分离的实验操作

实验准备

服务器名称服务器ip
amoeba192.168.18.129
master192.168.18.147
slave1192.168.18.135
slave2192.168.18.146
  • 操作系统:CentOS7
  • 所需软件包:MySQL5.6,amoeba-mysql-binary ,dk1.6

主从复制实验步骤

  1. 安装ntp服务
    master:
yum install ntp -y
vim /etc/ntp.conf 

server 127.127.18.0  //本地是时钟源
fudge 127.127.18.0 stratum 8  //设置时间层级为8

在这里插入图片描述

slave1,2:

yum install ntp ntpdate -y
  1. 启动master,slave1,2服务
systemctl start ntpd
systemctl stop firewalld
setenforce 0
  1. slave1,2同步时间
/usr/sbin/ntpdate 192.168.18.147 //同步master时间

在这里插入图片描述

  1. 安装数据库(步骤略前面博客有)
  2. 配置主从数据库文件
    master:
vim /etc/my.cnf
server_id = 1
log-bin=master-bin  //主服务器日志文件记录到本地
log-slave-updates=true  //从服务器更新二进制日志
service mysqld restart
mysql -u root -p

登录之后输入:

GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.18.%' IDENTIFIED BY '123456';
show master status;

在这里插入图片描述
slave1,2:

vim /etc/my.cnf

server_id = 2           (slave1、2不能相同)
relay-log=relay-log-bin  //从主服务器上同步日志文件到本地
relay-log-index=slave-relay-log.index  //定义relay-log的位置和名称
service mysqld restart
mysql -u root -p

登录之后输入:

change master to master_host='192.168.18.147',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=411;
start slave;
show slave status \G

在这里插入图片描述

  1. 测试主从复制:
    master上创建数据库:
    在这里插入图片描述
    slave1,2上查看:
    在这里插入图片描述
    在这里插入图片描述
    实验成功,完成主从复制!

读写分离实验步骤

  1. 安装jdk1.6
cp jdk-6u14-linux-x64.bin /usr/local/
cd /usr/local/
chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
mv jdk1.6.0_14/ jdk1.6
  1. 配置环境变量
vim /etc/profile

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

source /etc/profile
  1. 安装amoeba
mkdir /usr/local/amoeba
tar -zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/

查看amoeba启动选项

/usr/local/amoeba/bin/amoeba
  1. 在三台MySQL服务器上授予amoeba权限
GRANT ALL ON *.* TO test@'192.168.18.%' IDENTIFIED BY '123.com';
  1. 修改amoeba配置文件
vim /usr/local/amoeba/conf/amoeba.xml

30行:              <property name="user">amoeba</property>
32行:                  <property name="password">123456</property>
                <property name="defaultPool">master</property>
117行:         <property name="writePool">master</property>
                <property name="readPool">slaves</property>

在这里插入图片描述
在这里插入图片描述

  1. 配置数据库:
    vim /usr/local/amoeba/conf/dbServers.xml
26行:<property name="user">test</property>
29行:<property name="password">123.com</property>

42行一直往下:<dbServer name="master"  parent="abstractServer">
                  <factoryConfig>
                          <!-- mysql ip -->
                          <property name="ipAddress">192.168.18.147</property>
                  </factoryConfig>
          </dbServer>
  
          <dbServer name="slave1"  parent="abstractServer">
                  <factoryConfig>
                          <!-- mysql ip -->
                          <property name="ipAddress">192.168.18.135</property>
                  </factoryConfig>
          </dbServer>
  
          <dbServer name="slave2"  parent="abstractServer">
                  <factoryConfig>
                          <!-- mysql ip -->
                          <property name="ipAddress">192.168.18.146</property>
                  </factoryConfig>
          </dbServer>

        <dbServer name="slaves" virtual="true">
               <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
                         <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
                       <property name="loadbalance">1</property>

                         <!-- Separated by commas,such as: server1,server2,server1 -->
                        <property name="poolNames">slave1,slave2</property>
                </poolConfig>
         </dbServer>

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  1. 启动服务
systemctl stop firewalld
setenforce 0
/usr/local/amoeba/bin/amoeba start &

在这里插入图片描述
在这里插入图片描述

  1. 读写分离测试:
    客户端通过amoeba账户登录mysql
mysql -u amoeba -p 123456 -h 192.168.18.129 -P8066

在这里插入图片描述
在主从服务器中查看:
在这里插入图片描述
关闭同步

stop slave;
show slave status

在这里插入图片描述
在客户端写入数据:
在这里插入图片描述
在主服务器查看:
在这里插入图片描述
在从服务器查看:
在这里插入图片描述
在客户端查看:
在这里插入图片描述
读写分离实验成功!

再在从服务器上分别插入数据:
slave1:
在这里插入图片描述
slave2:
在这里插入图片描述
在客户端查看:
在这里插入图片描述
轮询读取,实验完成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值