MySQL读写分离理论+实验(下篇)

前言:

继上篇MySQL主从复制的环境,本篇博客将继续配置MySQL读写分离。可以直接从以下连接进入主从复制的博客:
MySQL主从复制理论+实验(上篇)

一、MySQL读写分离介绍

1.1 MySQL读写分离原理
  • 读写分离就是只在主服务器进行“写”的任务,在从服务器只做“读”的任务
  • 主数据库处理事务性查询,从数据库处理 select查询
  • 数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库

在这里插入图片描述

1.2 MySQL读写分离背景
  • 在实际企业环境中,会有大量数据请求,单台数据库无法承担所有读与写的操作,此时则需要配置读写分离
  • 配置多台数据库服务器实现读写分离
  • 读写分离建立在主从复制的基础上

二、MySQL读写分离实验

2.1 环境部署
  • ① 五台centos7虚拟机
  • ② 一台做为client
  • ③ 三台做为mysql服务器(其中一台为master服务器)
  • ④ 一台作为amoeba服务器
2.2.1 实验拓扑

在这里插入图片描述

2.2 实验过程
2.2.1 配置amoeba服务器
  • ① 关闭防火墙
[root@amoeba ~]# systemctl stop firewalld.service 
[root@amoeba ~]# setenforce 0
[root@amoeba ~]# systemctl disable firewalld.service 
  • ② 安装jdk
[root@amoeba ~]# mount.cifs //192.168.226.1/LAMP-C7 /mnt
Password for root@//192.168.226.1/LAMP-C7:  
[root@amoeba ~]# cd /mnt
[root@amoeba mnt]# cd LNMP-C7/
[root@amoeba LNMP-C7]# cp jdk-6u14-linux-x64.bin /usr/local
[root@amoeba LNMP-C7]# cd /usr/local
[root@amoeba local]# ls
bin  games    jdk-6u14-linux-x64.bin  lib64    sbin   src
etc  include  lib                     libexec  share
[root@amoeba local]# ./jdk-6u14-linux-x64.bin 
#文件是.bin结尾,所以直接执行即可
  • ③ 配置环境变量
[root@amoeba local]# vim /etc/profile
#指定JAVA工作目录、命令文件位置
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
#指定amoeba的工作目录和命令文件位置
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
[root@amoeba local]# source /etc/profile
  • ④ 安装Amoeba
[root@amoeba local]# mv jdk1.6.0_14/ jdk1.6
[root@amoeba local]# mkdir /usr/local/amoeba
[root@amoeba local]# cd /mnt
[root@amoeba mnt]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
......省略部分内容
[root@amoeba mnt]# chmod -R 755 /usr/local/amoeba/
[root@amoeba usr]# /usr/local/amoeba/bin/amoeba
amoeba start|stop
#查看是否安装成功
  • ⑤ 在三台mysql服务器添加权限开放给amoeba访问
mysql> grant all on *.* to test@'192.168.226.%' identified by '123.com'; 
Query OK, 0 rows affected (0.00 sec)
  • ⑥ 修改amoeba主配置文件
[root@amoeba usr]# cd /usr/local/amoeba/
[root@amoeba amoeba]# ls
benchmark  bin  changelogs.txt  conf  lib  LICENSE.txt  README.html
[root@amoeba amoeba]# cd conf/
[root@amoeba conf]# vi amoeba.xml    
#外网客户访问amoeba的账户                            <property name="user">amoeba</property>
#32行来访的密码    
<property name="password">123456</property>
#115行,将默认池子设置为master                
<property name="defaultPool">master</property>
#117行,取消注释       
<!-- -->
#写入池修改为master
<property name="writePool">master</property>
#读取池修改为slaves(附属)
<property name="readPool">slaves</property>
#120行的-->注释符号去除   
-------》wq
  • 修改amoeba数据库配置文件
[root@amoeba conf]# vim dbServers.xml 
#23行将text修改为mysql 
<property name="schema">mysql</property>
#26行,amoeba访问三台mysql数据库的账户和密码(账户为test)
<property name="user">test</property>
                            
#29行,修改访问的密码
<property name="password">123.com</property>
#45行,修改数据库主服务器名
<dbServer name="master"  parent="abstractServer">

#48行,修改master服务器ip
<property name="ipAddress">192.168.226.132</property>

#52行修改从服务器名
<dbServer name="slave1"  parent="abstractServer">
#55行修改从服务器地址
<property name="ipAddress">192.168.226.133</property>

#紧接复制52—57行,粘贴,添加第二台服务器名
<dbServer name="slave2"  parent="abstractServer">
#修改第二台服务器IP               
<property name="ipAddress">192.168.226.134</property>

#66行,修改多个服务器池的名称(修改为slaves)
<dbServer name="slaves" virtual="true">
#72行,添加两个从服务器的服务器名(slave1 slave2)
<property name="poolNames">slave1,slave2</property>
------>wq
  • 开启服务
[root@amoeba conf]# /usr/local/amoeba/bin/amoeba start &
#因为amoeba启动时会有一个实时监控,所以我们可以放在后台
#利用远程登录软件再开启一个终端,查看java服务状态
[root@amoeba ~]# netstat -natp | grep java
tcp6       0      0 127.0.0.1:47342         :::*                    LISTEN      81154/java          
tcp6       0      0 :::8066                 :::*                    LISTEN      81154/java          
tcp6       0      0 192.168.226.128:50826   192.168.226.132:3306    ESTABLISHED 81154/java          
tcp6       0      0 192.168.226.128:60952   192.168.226.134:3306    ESTABLISHED 81154/java          
tcp6       0      0 192.168.226.128:53836   192.168.226.133:3306    ESTABLISHED 81154/java        
2.3 使用客户端client验证
  • 关闭防火墙、增强性安全功能
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0
  • 安装mysql
[root@localhost ~]# yum install mysql -y
  • 使用指定账户和密码访问amoeba服务器
[root@localhost ~]# mysql -u amoeba -p123456 -h 192.168.226.128 -P8066
#使用amoeba账户、密码为123456 连接地址为192.168.226.128(amoeba服务器IP) -P8066(端口为8066)
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 1362913826
Server version: 5.1.45-mysql-amoeba-proxy-2.2.0 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> 
  • 进入work数据库创建一张表
MySQL [(none)]> use work;
Database changed
MySQL [work]> create table info(id int(4) not null primary key,name varchar(10) not null,score decimal(4,1) not null);
Query OK, 0 rows affected (0.03 sec)

MySQL [work]> show tables;
+----------------+
| Tables_in_work |
+----------------+
| info           |
+----------------+
1 row in set (0.00 sec)

MySQL [work]> select * from info;
Empty set (0.03 sec)
  • 在三台mysql数据库查中查看是否有info表
mysql> use work;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------+
| Tables_in_work |
+----------------+
| info           |
+----------------+
1 row in set (0.01 sec)

mysql> 
2.3.1 配置读写分离
  • ① 在两台MySQL从服务器上停止同步主服务器
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 192.168.226.132
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 890
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 762
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: No
            Slave_SQL_Running: No
............省略部分内容
  • ② 此时写入操作只在主服务器上进行,以下为验证

    在client数据库中往info数据表写入内容

MySQL [work]> insert into info (id,name,score) values (1,'changzhi',99);
Query OK, 1 row affected (0.05 sec)
  • 在主服务器查看数据表
mysql> select * from info;
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  1 | changzhi |  99.0 |
+----+----------+-------+
1 row in set (0.00 sec)

mysql> 
  • 在从服务器查看数据表
mysql> use work;
Database changed
mysql> select * from info;
Empty set (0.00 sec)
  • 此时,在client数据库中应该是看不到数据表的,如下
MySQL [work]> select * from info;
Empty set (0.01 sec)

以上以实现读写分离(主服务器执行“写,从服务器进行读)

  • ③ 此时验证数据服务器读取机制

    分别在两台从服务器上在info表中写入不同数据

  • slave 1服务器

mysql> insert into info (id,name,score) values (2,'zhangchi',100);
Query OK, 1 row affected (0.00 sec)

mysql> select * from info;
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  2 | zhangchi | 100.0 |
+----+----------+-------+
1 row in set (0.00 sec)

  • slave 2 服务器
mysql> insert into info (id,name,score) values (2,'zhizhi',18);
Query OK, 1 row affected (0.01 sec)

mysql> select * from info;
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  1 | changzhi |  99.0 |
|  2 | zhizhi   |  18.0 |
+----+----------+-------+
2 rows in set (0.00 sec)

  • 此时我们在client数据库中重复查询info表
MySQL [work]> select * from info;
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  2 | zhangchi | 100.0 |
+----+----------+-------+
1 row in set (0.00 sec)

MySQL [work]> select * from info;
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  1 | changzhi |  99.0 |
|  2 | zhizhi   |  18.0 |
+----+----------+-------+
2 rows in set (0.01 sec)

MySQL [work]> select * from info;
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  2 | zhangchi | 100.0 |
+----+----------+-------+
1 row in set (0.00 sec)

MySQL [work]> select * from info;
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  1 | changzhi |  99.0 |
|  2 | zhizhi   |  18.0 |
+----+----------+-------+
2 rows in set (0.01 sec)

以上可见,数据库轮流读取两台从服务器上的数据

  • ④ 此时我们恢复两台从服务器的同步,然后在master服务器上查看数据表
mysql> select * from info;
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  1 | changzhi |  99.0 |
+----+----------+-------+
1 row in set (0.00 sec)

mysql> 

再次证明,主从同步的放向是由slave向master单向同步的

总结:

伏笔~:devops 思想简述

devops 也是云计算的高阶版,其中有三大块方向

CI :持续性的集成

CD :持续性的交付

CD :持续性的部署

以上三点贯穿了整个软件开发的思想

传统软件的开发思想如下

需求——》设计——》开发——》测试——》发布

测试分为:单元测试,项目的各个功能测试

项目测试:中间有个构建,make(把源码文件转化为机器识别的二进制文件)

开发和测试是一个集成的过程,在git来回周折,也就是CI 持续集成

分层开发架构:三层

表示层:前端,效果 ( jsp html css…)

业务逻辑层:管理数据 (java c语言 php…)

持久层:数据库 (mysql oracle…)

分布式开发(微服务,docker容器,一个容器放一个服务,集合起来)

docker能够解决部署问题。因为起特性是无需载一底层环境,只要支持docker引擎就可以使用(难点在于服务之间的通讯)

因为docker容器数量巨大,人为管理不现实,所以有了群集管理compose(编排工具只能管一台) + machine(可以把一台不是docker的节点,初始化转化成docker节点并有资格加入到swarm群集中) + swarm (群集)

测试分为:单元测试,项目的各个功能测试

项目测试:中间有个构建,make(把源码文件转化为机器识别的二进制文件)

开发和测试是一个集成的过程,在git来回周折,也就是CI 持续集成

分层开发架构:三层

表示层:前端,效果 ( jsp html css…)

业务逻辑层:管理数据 (java c语言 php…)

持久层:数据库 (mysql oracle…)

分布式开发(微服务,docker容器,一个容器放一个服务,集合起来)

docker能够解决部署问题。因为起特性是无需载一底层环境,只要支持docker引擎就可以使用(难点在于服务之间的通讯)

因为docker容器数量巨大,人为管理不现实,所以有了群集管理compose(编排工具只能管一台) + machine(可以把一台不是docker的节点,初始化转化成docker节点并有资格加入到swarm群集中) + swarm (群集)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章