mysql5.7主从同步与读写分离

读写分离

  • Mysql主从复制的过程
    • 读写分离原理
    • 配置主从同步
    • 主服务编译
    • 部署第一台从服务器
    • 部署第2台从服务器配置
  • 配置读写分离关键服务
    • 定义具体的读写分离对象
    • 配置amoeba的主配置文件amoeba.xml
    • 测试客户端
    • 测试读写分离

Mysql主从复制的过程

  • 开启二进制日志文件
  • I/O线程同步日志
  • SQI读取中继日志存入数据库

在这里插入图片描述
数据MySQL、主数据更新写入bing log 日志(二进制日志),通过l/o线程写入mysql从到relay log(中继日志)中,通过sql线程读取中继日志进行数据更新删除

读写分离原理

  • 只在主服务器上写,只在从服务器上读

  • 主数据库处理事务查询,从数据库处理select查询

  • 数据库复制用于将事务性查询的变更同步到集群中的从数据库

    在这里插入图片描述

需要创建的三种账户:
1.master要创建权限账户(主从复制账户),允许slave能够读取进行复制
2.创建(读写分离账户),在读、写的每一台服务器上都要有
3.客户端访问Amoeba的账户,此账号和数据库没关系

读写分离方案

  • 基于程序代码内部实现
  • 基于中间代理层实现
  • Amoeba

编写环境

4台服务器每台服务器都装有Mysql服务

  1. 主服务器地址:192.168.136.88
  2. 从服务1地址:192.168.136.40
  3. 从服务器2地址:192.168.136.77
  4. Amoeba服务器

配置主从同步

主服务编译

关闭防火墙及核心防护

[root@slaver1 ~]# iptables -F
[root@slaver1 ~]# setenforce 0

下面编译在已经部署号的mysql服务下(mysql5.7版本)

ps:时间每台服务时间保持一致

为了方便更改一下主机名

[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# su
[root@maser ~]# 

开启二进制日志文件及中继日志

[root@localhost ~]# vim /etc/my.cnf
server-id = 1 主机身份
log-bin=master-bin  开启二进制日志
log-slave-updates=true  允许中继日志寻找二进制文件

开启服务

[root@localhost ~]# systemctl restart mysqld

在这里插入图片描述

查看一下日志文件是否生成

[root@localhost ~]# ls /usr/local/mysql/data/
auto.cnf        ibdata1      ib_logfile1  master-bin.000001       master-bin.index   pe

进程mysql数据库创建权限账户

[root@slave02 ~]# mysql -uroot -p
grant replication slave on *.* to 'myslave'@'192.168.136.%' identified by '123456';
创建权限账户允许salve来matser读取数据
mysql> flush privileges;      刷新
Query OK, 0 rows affected (0.00 sec)

检查从服务器位置

775定位你日志的位置(注意;后面需要定位这里)

mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      775 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

部署第一台从服务器

开启二进制日志文件及中继日志

[root@slave01 ~]# vim /etc/my.cnf
server-id = 22
relay-log=relay-log-bin       从主服务器上同步日志到本地
relay-log-index=slave-relay-bin.index    定义relay-log的位置和名称
[root@slaver1 ~]# systemctl restart mysqld

配置连接主服务器同步
注意这里pos是定义你的日志位置就是上面的775

mysql> change master to master_host='192.168.136.88',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=775;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> start slave;  开启功能

查看是否同步

mysql> show slave status\G
*************************** 1. row ***************************Slave_IO_Running: Yes  I/O线程同步日志Slave_SQL_Running: Yes  SQI读取中继日志存入数据库

部署第2台从服务器配置

开启二进制日志文件及中继日志

[root@slave01 ~]# vim /etc/my.cnf
server-id = 33
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
[root@slaver2 ~]# systemctl restart mysqld

配置连接主服务器同步

[root@slaver2 ~]# mysql -uroot -p
mysql> change master to master_host='192.168.136.88',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=775;
mysql> start slave;   开启配置

查看是否同步

mysql> show slave status\G
*************************** 1. row ***************************Slave_IO_Running: Yes   I/O线程同步日志Slave_SQL_Running: Yes   SQI读取中继日志存入数据库

实验查了是否同步
在主服务器创建文件及内容

mysql> creste database scholl mysql> create tabel info (id int(4,name char(10));mysql> insert into info values (1,'zhangsan'),(2,'lisi');
mysql> select * from info;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
+------+----------+

在这里插入图片描述

配置读写分离关键服务

配置amoeba服务

安装环境
amoeba是由jdk编写的所以需要环境
jdk-6u14-linux-x64.bin导入amoeba包

[root@localhost opt]# cp jdk-6u14-linux-x64.bin /usr/local/
[root@localhost opt]# cd /usr/local/
[root@localhost local]# chmod +x jdk-6u14-linux-x64.bin  给予权限

连接并安装jdk

./jdk-6u14-linux-x64.bin
yes  是否同意安装
Press Enter to continue..... 
回车  稍微等一会Done.   

修改一下文件名称

[root@localhost local]# mv jdk1.6.0_14/ jdk1.6

配置环境变量
末尾插入

[root@localhost local]# 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:$SAMOEBA_HOME/bin
[root@localhost local]# source /etc/profile  立即生效

在这里插入图片描述

创建amoeba家目录

[root@localhost local]# mkdir /usr/local/amoeba

解压amoeba到创建的目录中

[root@localhost opt]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/

递归给予amoeba所有文件权限

[root@localhost local]# chmod -R 755 /usr/local/amoeba/

查看是否安装成功

**[root@localhost local]# /usr/local/amoeba/bin/amoeba
amoeba start|stop  说明安装成功**

在三台mysql主从服务器上添加权限开放给amoeba访问 不在演示

mysql> grant all on *.* to test@'192.168.136.%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;  刷新

定义具体的读写分离对象

配置amoeba的主配置文件amoeba.xml

下面是客户端访问amoeba的账户并申明变量名
配密码

vim /usr/local/amoeba/conf/amoeba.xml修改第30、32行(客户端访问amoeba时的用户):30 amoeba    ## 将root替换为amoeba32 123456   ## 密码Wie123456修改将117、120行,将注释符去掉,并修改115、118、119行:

1:开启池子
117去掉注释掉
在这里插入图片描述

2:配置池子内容(读master写salves)
在这里插入图片描述

115                 master
118                 master
119                 salves

配置访问amoeba密码

[root@localhost conf]# cd /usr/local/amoeba/conf/
[root@localhost conf]# vim dbServers.xml  配置数据库
访问数据库的密码
28-29 注释掉25             26               test27 28         29    123.com

在这里插入图片描述

配置各节点的IP地址

主服务45   48  192.168.136.88
从服务器1
52   55  192.168.136.40
从服务器2(复制上面的6行在下面粘贴)59  62   192.168.136.77末尾  修改66     72   slave1,slave2

在这里插入图片描述

后台启动

[root@localhost conf]# /usr/local/amoeba/bin/amoeba start &   后台启动

打开一台新的linux服务器

[root@localhost ~]# setenforce 0
[root@localhost ~]# iptables -F
[root@localhost ~]# yum -y install mysql
[root@localhost ~]# mysql -u amoeba  -h 192.168.136.10 -P8066

测试客户端

  • 连接amoeba
  • 发现报错找不到数据库
MySQL [(none)]> show databases;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    2074631480
Current database: *** NONE ***ERROR 2013 (HY000): Lost connection to MySQL server during query
MySQL [(none)]> 

解决方法!!!
把text改成mysql

[root@localhost ~]# cd /usr/local/amoeba/conf/
[root@localhost conf]# vim dbServers.xml 22                 23          mysql

image-20200828211013795

ps: Amoeba数据库5.5中 23行 默认有text数据库 而数据库5.7中 23行 默认没有text数据库所有需要指定一个已有的数据库

解决了查看一下数据库,里面有了我们在主配置文件写的school文件

MySQL [(none)]> show databases;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    1625168778
Current database: *** NONE ***+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+
5 rows in set (0.11 sec)

测试远程amoeba连接并查看服务
重新找一台Linux服务器

[root@localhost ~]# yum -y install mysql  安装myslq服务
[root@localhost ~]# mysql -u amoeba  -h 192.168.136.10 -P8066    远程连接amoeba服务器

查看一下数据库

MySQL [(none)]> show databases;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    1625168778
Current database: *** NONE ***+--------------------+
| Database           |
+--------------------+
| in**加粗样式**formation_schema |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+
5 rows in set (0.11 sec)

完成

测试读写分离

关闭2台从服务器同步功能

[root@localhost ~]# mysql -uroot -p
mysql> stop slave;
mysql> show slave status\G   服务已经关闭Slave_IO_Running: NoSlave_SQL_Running: No

在从服务器插入信息

mysql> insert into info values (3,'wangwu');  从服务器1
mysql> insert into info values (2,'lisi');  从服务器2

在客户端查看(轮询式查看)

MySQL [school]> select * from info;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
|    3 | wangwu   |
+------+----------+
3 rows in set (0.01 sec)MySQL [school]> select * from info;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
+------+----------+
2 rows in set (0.00 sec)

在生产环境中开启同步功能,服务端读的信息是一样的,写数据只往主服务器写,不会往从服务器写,所有用户查询只在从服务器上进行,所以从服务器的并发大,主服务器配置不高


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部