Mingo

MySQL主从复制与读写分离
MySQL简介MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下...
扫描右侧二维码阅读全文
15
2018/09

MySQL主从复制与读写分离

MySQL简介

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。由于其社区版的性能卓越,搭配 PHP 和 Apache 可组成良好的开发环境。

实际生产环境中的缺点

在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的,所以可以通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。
生产环境

Amoeba读写分离简介

Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、读写分离、高可用性等需求。与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQL Proxy简单)。Amoeba相当于一个SQL请求的路由器,目的是为负载均衡、读写分离、高可用性提供机制,而不是完全实现它们。用户需要结合使用MySQL的 Replication等机制来实现副本同步等功能。amoeba对底层数据库连接管理和路由实现也采用了可插拨的机制,第三方可以开发更高级的策略类来替代作者的实现。这个程序总体上比较符合KISS原则的思想。

MySQL主从复制原理

主从复制

MySQL读写分离原理

读写分离

主从复制的配置方法

主从服务器上安装MySQL以及相关的依赖程序

yum install mysql mysql-server mysql-devel

配置主服务器的/etc/my.cnf文件

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0

server_id=11 #设定ServerID,这里注意的是这个ID是唯一的
log_bin=master_bin #开启二进制日志
log_slave_updates=true #开启级联主从复制

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

这里注意一点的是开启级联主从复制之后可能某些应用程序写入的时候写入不了,我搭建owncloud私有云盘是就遇到过说插入不了数据,在数据库里设置一下级别就好了
SET GLOBAL binlog_format = 'ROW';
SET SESSION binlog_format = 'MIXED';

授权从服务器同步
GRANT REPLICATION SLAVE ON . TO 'slave'@'192.168.1.2' IDENTIFIED BY '123456';
配置从服务器的/etc/my.cnf文件

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0

server-id=22 #设定ServerID,这里注意的是这个ID是唯一的
relay_log=relay_log_bin #定义relay_log的位置和名称,如果值为空,则默认位置在数据文件的目录
relay_log-index=slave_relay_bin.index #同relay_log,定义relay_log的位置和名称;

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

在主服务器上查询相关信息

show variables like 'log_bin'; #确认Log_bin开启
show variables like 'server_id'; #确认ServerID
show master status; #查询主数据库的复制参数

读写分离
在从服务器上设置复制参数

change master to master_host='192.168.1.1',master_user='slave',master_password='123456',master_log_file='master-bin.000004',master_log_pos=22076745;

查看slave状态情况

show slave status\G;

读写分离

假如说上面的信息不对,可以通过关闭Slave然后重新设定
slave start; #开启slave
slave stop; #关闭slave

读写分离的配置方法


安装Java程序

chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
mv jdk1.6.0_14/ /usr/local/jdk1.6

将Java添加到变量环境中,配置/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:$JAVA_HOME/bin
export AMOEBA_HOME=/usr/local/amoeba/
export PATH=$PATH:$AMOEBA_HOME

查看Java版本

java -version

读写分离
安装amoeba

tar zxf /CenetOS/Packages/amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba

主从数据库授权Amoeba访问

grant all on *.* to 'amoeba'@'' identified by '123456';

编辑amoeba配置文件,/usr/local/amoeba/conf/amoeba.xml

<property name="user">amoeba</property>
<property name="password">123456</property>

<property name="defaultPool">WritePool</property>
<property name="writePool">WritePool</property>
<property name="readPool">ReadPool</property>

编辑dbServer配置文件,/usr/local/amoeba/conf/dbServer.xml

<?xml version="1.0" encoding="gbk"?>

<!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd">
<amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/">

<!--
Each dbServer needs to be configured into a Pool,
If you need to configure multiple dbServer with load balancing that can be simplified by the following configuration:
add attribute with name virtual = "true" in dbServer, but the configuration does not allow the element with name factoryConfig
such as 'multiPool' dbServer
-->

<dbServer name="abstractServer" abstractive="true">
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="manager">${defaultManager}</property>
<property name="sendBufferSize">64</property>
<property name="receiveBufferSize">128</property>

<!-- mysql port -->
<property name="port">3306</property>

<!-- mysql schema -->
<property name="schema">owncloud</property>

<!-- mysql user -->
<property name="user">amoeba</property>

<!-- mysql password -->
<property name="password">H9A!5mM1K0$+8i2n</property>

</factoryConfig>

<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<property name="maxActive">500</property>
<property name="maxIdle">500</property>
<property name="minIdle">10</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testOnReturn">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>

<dbServer name="master" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">127.0.0.1</property>
<propertynamepropertyname="user">amoeba</property>
<propertynamepropertyname="password">H9A!5mM1K0$+8i2n</property>
</factoryConfig>
</dbServer>

<dbServer name="slave" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">118.25.48.231</property>
<propertynamepropertyname="user">amoeba</property>
<propertynamepropertyname="password">H9A!5mM1K0$+8i2n</property>
</factoryConfig>
</dbServer>

<dbServer name="WritePool" 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">master</property>
</poolConfig>
</dbServer>

<dbServer name="ReadPool" 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">slave</property>
</poolConfig>
</dbServer>

</amoeba:dbServers>

启动Amoeba

/usr/local/amoeba/bin/amoeba start &

读写分离

Last modification:May 19th, 2019 at 05:38 am

Leave a Comment