读写分离
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.77Amoeba服务器
配置主从同步
主服务编译
关闭防火墙及核心防护
[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/fserver-id = 1 主机身份log-bin=master-bin 开启二进制日志log-slave-updates=true 允许中继日志寻找二进制文件
开启服务
[root@localhost ~]# systemctl restart mysqld
查看一下日志文件是否生成
[root@localhost ~]# ls /usr/local/mysql/data/f ibdata1ib_logfile1 master-bin.000001 master-bin.index pe
进程mysql数据库创建权限账户
[root@slave02 ~]# mysql -uroot -pgrant 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/fserver-id = 22relay-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/fserver-id = 33relay-log=relay-log-binrelay-log-index=slave-relay-bin.index[root@slaver2 ~]# systemctl restart mysqld
配置连接主服务器同步
[root@slaver2 ~]# mysql -uroot -pmysql> 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.binyes 是否同意安装Press Enter to continue..... 回车 稍微等一会Done.
修改一下文件名称
[root@localhost local]# mv jdk1.6.0_14/ jdk1.6
配置环境变量 末尾插入
[root@localhost local]# vim /etc/profileexport JAVA_HOME=/usr/local/jdk1.6export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/libexport PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/binexport 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/amoebaamoeba start|stop 说明安装成功**
在三台mysql主从服务器上添加权限开放给amoeba访问 不在演示
mysql> grant all on *.* to test@'192.168.136.%' identified by '';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 <property name="user">amoeba</property> ## 将root替换为amoeba32 <property name="password">123456</property> ## 密码Wie123456修改将117、120行,将注释符去掉,并修改115、118、119行:
1:开启池子
117去掉注释掉
2:配置池子内容(读master写salves)
115 <property name="defaultPool">master</property>118 <property name="writePool">master</property>119 <property name="readPool">salves</property>
配置访问amoeba密码
[root@localhost conf]# cd /usr/local/amoeba/conf/[root@localhost conf]# vim dbServers.xml 配置数据库访问数据库的密码28-29 注释掉25 <!-- mysql user --> 26<property name="user">test</property>27 28 <!-- mysql password -->29 <property name="password"></property>
配置各节点的IP地址
主服务45 <dbServer name="master" parent="abstractServer">48 <property name="ipAddress">192.168.136.88</property>从服务器152 <dbServer name="slave1" parent="abstractServer">55 <property name="ipAddress">192.168.136.40</property>从服务器2(复制上面的6行在下面粘贴)59 <dbServer name="slave2" parent="abstractServer">62 <property name="ipAddress">192.168.136.77</property>末尾 修改66<dbServer name="slaves" virtual="true">72 <property name="poolNames">slave1,slave2</property>
后台启动
[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 (HY000): MySQL server has gone awayNo connection. Trying to reconnect...Connection id: 2074631480Current database: *** NONE ***ERROR (HY000): Lost connection to MySQL server during queryMySQL [(none)]>
解决方法!!! 把text改成mysql
[root@localhost ~]# cd /usr/local/amoeba/conf/[root@localhost conf]# vim dbServers.xml 22 <!-- mysql schema -->23<property name="schema">mysql</property>
ps: Amoeba数据库5.5中 23行 默认有text数据库 而数据库5.7中 23行 默认没有text数据库所有需要指定一个已有的数据库
解决了查看一下数据库,里面有了我们在主配置文件写的school文件
MySQL [(none)]> show databases;ERROR (HY000): MySQL server has gone awayNo connection. Trying to reconnect...Connection id: 1625168778Current 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 (HY000): MySQL server has gone awayNo connection. Trying to reconnect...Connection id: 1625168778Current database: *** NONE ***+--------------------+| Database |+--------------------+| in**加粗样式**formation_schema || mysql || performance_schema || school || sys|+--------------------+5 rows in set (0.11 sec)
完成
测试读写分离
关闭2台从服务器同步功能
[root@localhost ~]# mysql -uroot -pmysql> stop slave;mysql> show slave status\G 服务已经关闭Slave_IO_Running: NoSlave_SQL_Running: No
在从服务器插入信息
mysql> insert into info values (3,'wangwu'); 从服务器1mysql> 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)
在生产环境中开启同步功能,服务端读的信息是一样的,写数据只往主服务器写,不会往从服务器写,所有用户查询只在从服务器上进行,所以从服务器的并发大,主服务器配置不高