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服务
- 主服务器地址:192.168.136.88
- 从服务1地址:192.168.136.40
- 从服务器2地址:192.168.136.77
- 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 test 27 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
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)
在生产环境中开启同步功能,服务端读的信息是一样的,写数据只往主服务器写,不会往从服务器写,所有用户查询只在从服务器上进行,所以从服务器的并发大,主服务器配置不高
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
