Mysql 主从复制,读写分离

Mysql 主从复制及读写分离

特别推荐看:amoeba.xml 的配置部分,在百度上看了很多配置都不完整,是我测试时的痛点

实验的目的:

有两部分:第一实现Mysql主从复制,第二实现读写分离。

下面是实验的环境:

192.168.58.11     安装了amoeba 的节点

192.168.58.16      master    系统:rhel 5.4

192.168.58.12      slave     系统: rhel 5.4

192.168.58.11      代理      系统:rhel 5.4

192.168.58.15      外部机器  系统:Centos7

 

. Mysql 数据库安装      见附件

安装过程省

见《Linux下安装和迁移MySQL5.6指南》

下面开始配置:

主从复制                            由于图片无法正常显示,在附件中有完整图文模式

服务器 Master :192.168.58.16

Mysql 安装目录: /home/mysql/mysql

vi  /etc/my.cnf

datadir=/home/mysql

socket=/var/lib/mysql/mysql.socket

服务器 Slave    :192.168.58.12

Mysql 安装目录:/home/mysql/mysql

vi  /etc/my.cnf

datadir= /home/mysql

socket=/home/mysql/mysql.socket

2. 修改配置文件

vi   /etc/my.cnf

(官方说明:为了使用事务的InnoDB在复制中最大的持久性和一致性,你应该指定innodb_flush_log_at_trx_commit=1,sync_binlog=1选项。)

修改master

/etc/my.cnf

1.  log-bin=mysql-bin   #slave会基于此log-bin来做replication

2.  server-id=1         #master的标示

3.

4.  innodb_flush_log_at_trx_commit=1

5.

6.  sync_binlog=1

修改 slave

/etc/my.cnf

 

1. [mysqld]

2.

3. server-id=2     #slave的标示

master

ps -ef|grep mysql

service mysql  start

slave :

ps -ef|grepmysql

service mysql  start

4. Master 上创建一个专门用于复制的账号密码 repl repl

mysql>create  user  ‘repl‘@‘%‘ identified by ‘repl‘;

mysql>grant  replication slave on *.* to ‘repl‘;

mysql>flush  privileges;

5. 启动主从复制功能

需要查看 Master 中的  Master status

mysql> show  master status;

配置从服务器Slave
   mysql>change master tomaster_host=‘192.168.58.16‘,master_user=‘root‘,master_password=‘123456‘,
    master_log_file=‘mysql-bin.000001‘,master_log_pos=120;

//注意不要断开,120数字前后无单引号。

Mysql>startslave;    //启动从服务器复制功能

检查从服务器复制功能状态:

mysql> show slave status\G;

*************************** 1. row***************************

Slave_IO_State: Waiting for master to send event
             Master_Host: 192.168.58.16  //主服务器地址
             Master_User: root   //授权帐户名,尽量避免使用root
             Master_Port: 3306    //数据库端口,部分版本没有此行
             Connect_Retry: 60
             Master_Log_File: mysql-bin.000001
             Read_Master_Log_Pos: 120     //#同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos
             Relay_Log_File: ddte-relay-bin.000003
             Relay_Log_Pos: 251
             Relay_Master_Log_File: mysql-bin.000004
             Slave_IO_Running: Yes    //此状态必须YES
             Slave_SQL_Running: Yes     //此状态必须YES
                   ......

注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。

以上操作过程,主从服务器配置完成。

 

 

下面开始配置:

读写分离     由于图片不能正常显示,在附件中有完整说明

JDK的安装

1)以root身份登录系统,将jdk-6u16-linux-x64.bin通过FTP工具上传到/usr/java目录,执行以下命令:

[[email protected] java]#chmod +x jdk-6u16-linux-x64.bin

[[email protected] localhost java]# ./jdk-6u16-linux-x64.bin

2)使用vi/etc/profile命令进入环境变量文件,设置环境变量(此处为所有用户创建统一的JDK,如果需要分别安装不同的版本,请修改当前用户目录下的.bash_profile):

JAVA_HOME=/usr/java/jdk1.6.0_16(其中jdk1.6.0_16是安装JDK后自动生成的)

PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH

export PATH JAVA_HOME CLASSPATH

3)使配置生效:source /etc/profile

4) 到此,JDK安装完成,可键入命令查看JAVA版本:

[[email protected] localhost ~]# java–version

Java(TM) SE Runtime Environment (build 1.6.0_16-b01)

Java HotSpot(TM) 64-Bit Server VM (build 14.2-b01, mixed mode)

出现上述信息表示安装完成。

4、  安装amoeba-mysql

下载amoeba-mysql,目前最新版本为amoeba-mysql-1.3.1-BETA.zip

mkdir /usr/local/amoeba/

wget http://blogimg.chinaunix.net/blog/upfile2/101027160252.zip

unzip 101027160252.zip

配置文件位于conf目录下,执行文件位于bin目录下,解压后发现bin目录下的启动文件没有可执行权限,请执行:chmod -R +x /usr/local/amoeba/bin/

Amoeba For MySQL 的使用非常简单,所有的配置文件都是标准的XML 文件,总共有四个配置文件。分别为:

◆ amoeba.xml:主配置文件,配置所有数据源以及Amoeba 自身的参数设置;实现主从的话配置这个文件就可以了;

◆ rule.xml:配置所有Query 路由规则的信息;

◆ functionMap.xml:配置用于解析Query 中的函数所对应的Java 实现类;

◆ rullFunctionMap.xml:配置路由规则中需要使用到的特定函数的实现类;

进入主配置文件目录:
[[email protected] amoeba]# cd conf/
[[email protected] conf]# ls
access_list.conf   amoeba.xml       dbServers.xml    functionMap.xml   log4j.xml    ruleFunctionMap.xml
amoeba.dtd               dbserver.dtd    function.dtd    log4j.dtd               rule.dtd     rule.xml
在这里我主要介绍配置  amoeba.xml、   dbServers.xml、 log4j.xml 三个主要的配置文件,其它文件没有特殊需要默认就可以了。

[[email protected] conf]# vi amoeba.xml

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

<!DOCTYPE amoeba:configuration SYSTEM"amoeba.dtd">

<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">

<server>

<!-- proxy server 绑定端口 -->

<property name="port">8066</property>

<!-- proxy server 绑定的IP(amoeba服务器) -->

<property name="ipAddress">192.168.58.11</property>

<!-- proxy server net IO Read thread size -->

<property name="readThreadPoolSize">200</property>

<!-- proxy server client process thread size -->

<property name="clientSideThreadPoolSize">300</property>

<!--mysql server client packet process thread size -->

<property name="clientSideThreadPoolSize">300</property>

<!-- mysql server data packet process thread size -->

<property name="serverSideThreadPoolSize">300</property>

<!-- socket Send and receive BufferSize(unit:K)  -->

<property name="netBufferSize">128</property>

<!-- Enable/disable TCP_NODELAY (disable/enable Nagle‘s algorithm).-->

<property name="tcpNoDelay">true</property>

<!-- 对外验证用户名-->

<property name="user">root</property>

<!-- 对外验证密码-->

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

<!-- query timeout( default: 60 second , TimeUnit:second) -->

<property name="queryTimeout">60</property>

</server>

<!--

每个ConnectionManager都将作为一个线程启动。

manager负责ConnectionIO 读写/死亡检测

-->

<connectionManagerList>

<connectionManager name="defaultManager"class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">

<propertyname="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property>

<!--

default value is avaliable Processors

<propertyname="processors">5</property>

-->

</connectionManager>

</connectionManagerList>

<dbServerList>

<!--

一台mysqlServer 需要配置一个pool,

如果多台平底的mysql需要进行LoadBalance,

平台已经提供一个具有负载均衡能力的ObjectPool:

com.meidusa.amoeba.mysql.server.MultipleServerPool

简单的配置是属性加上 virtual="true",该Pool 不允许配置FactoryConfig

或者自己写一个ObjectPool

-->

<dbServername="server1">

<!-- PoolableObjectFactory 实现类 -->

<factoryConfigclass="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">

<property name="manager">defaultManager</property>

<!-- 真实 mysql数据库端口-->

<propertyname="port">3306</property>

<!-- 真实mysql 数据库IP-->

<propertyname="ipAddress">192.168.58.16</property>

<propertyname="schema">test</property>

<!-- 用于登录 mysql 的用户名-->

<propertyname="user">root</property>

<!-- 用于登录 mysql 的密码-->

<propertyname="password">123456</property>

</factoryConfig>

<!-- ObjectPool 实现类 -->

<poolConfigclass="com.meidusa.amoeba.net.poolable.PoolableObjectPool">

<propertyname="maxActive">200</property>

<propertyname="maxIdle">200</property>

<propertyname="minIdle">10</property>

<propertyname="minEvictableIdleTimeMillis">600000</property>

<propertyname="timeBetweenEvictionRunsMillis">600000</property>

<propertyname="testOnBorrow">true</property>

<propertyname="testWhileIdle">true</property>

</poolConfig>

</dbServer>

<!--    以下内容 复制server1   -->

<dbServer name="server2">

<!-- PoolableObjectFactory 实现类 -->

<factoryConfigclass="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">

<property name="manager">defaultManager</property>

<!-- 真实 mysql数据库端口 -->

<propertyname="port">3306</property>

<!-- 真实mysql 数据库IP -->

<propertyname="ipAddress">192.168.58.12</property>

<propertyname="schema">test</property>

<!-- 用于登录 mysql 的用户名-->

<propertyname="user">root</property>

<!-- 用于登录 mysql 的密码 -->

<propertyname="password">123456</property>

</factoryConfig>

<!-- ObjectPool 实现类 -->

<poolConfigclass="com.meidusa.amoeba.net.poolable.PoolableObjectPool">

<propertyname="maxActive">200</property>

<propertyname="maxIdle">200</property>

<propertyname="minIdle">10</property>

<propertyname="minEvictableIdleTimeMillis">600000</property>

<propertyname="timeBetweenEvictionRunsMillis">600000</property>

<propertyname="testOnBorrow">true</property>

<propertyname="testWhileIdle">true</property>

</poolConfig>

</dbServer>

<dbServer name="master"virtual="true">

<poolConfigclass="com.meidusa.amoeba.server.MultipleServerPool">

<!-- 负载均衡参数 1=ROUNDROBIN , 2=W 3=HA-->

<property name="loadbalance">1</property>

<!-- 参与该 pool 负载均衡的poolName 列表以逗号分割 -->

<propertyname="poolNames">server1</property>

</poolConfig>

</dbServer>

<dbServer name="slave" virtual="true">

<poolConfigclass="com.meidusa.amoeba.server.MultipleServerPool">

<!-- 负载均衡参数 1=ROUNDROBIN , 2=W 3=HA-->

<propertyname="loadbalance">1</property>

<!-- 参与该 pool 负载均衡的poolName 列表以逗号分割 -->

<propertyname="poolNames">server2</property>

</poolConfig>

</dbServer>

</dbServerList>

<queryRouterclass="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">

<propertyname="ruleConfig">${amoeba.home}/conf/rule.xml</property>

<propertyname="functionConfig">${amoeba.home}/conf/functionMap.xml</property>

<property name="ruleFunctionConfig">${amoeba.home}/conf/ruleFunctionMap.xml</property>

<property name="LRUMapSize">1500</property>

<property name="defaultPool">master</property>

<propertyname="writePool">master</property>

<property name="readPool">slave</property>

<property name="needParse">true</property>

</queryRouter>

</amoeba:configuration>

启动amoeba

/usr/local/amoeba/bin/amoeba &

检验启动是否成功(使用的是默认的8066端口):

[[email protected] amoeba]# ps aux | grep amoeba

root     24580  0.219.2 408912 65685pxs/1    Sl   12:52   0:11/usr/java/jdk1.6/bin/java -server -Xms256m -Xmx256m -Xss128k-Damoeba.home=/usr/local/amoeba-Dclassworlds.conf=/usr/local/amoeba/bin/amoeba.classworlds -classpath/usr/local/amoeba/lib/classworlds-1.0.jar org.codehaus.classworlds.Launcher

[[email protected] amoeba]# netstat -lnp | grep java

tcp        0      0::ffff:192.168.1.159:8066   :::*                        LISTEN      24580/java

测试

主设置如下:

mysql>grant select,insert,update,delete on *.* to [email protected]‘192.168.58.%‘ identified by ‘123456‘;

#用户名密码要和前面配置的意志

mysql>flush privileges;

以后检查权限;

mysql>show grants for [email protected]‘192.168.58.%‘;

从设置如下:

mysql>grant select on *.* to [email protected]‘192.168.58.%‘identified by ‘123456‘;

#用户名密码要和前面配置的意志

mysql>flush privileges;

在从服务器上

#stop slave;

class 为表 ,主从都创建了:

create table class(id int (3),name varchar(6));

insert into class values (001,‘aaa‘);

insert into class values (002,‘bbb‘);

insert into class values (003,‘ccc‘);

1.在主上

mysql>insert into class values(004,‘master‘)

2.在从上

msyql>insert into class values(004,‘slave‘)

在代理上:(192.168.58.15)

#mysql -uroot -p123456 -h192.168.58.11 -P8066

######## 端口号是大写P,登录分离服务器。

测试读取是在从库还是主库?

mysql>select * from class;

测试写入数据是在从库还是主库?

mysql>insert into class values(005,‘eee‘);

接下来查询,说明没有发现数据写入数据。

mysql>select * from class;

查看写入数据

主服务器:说明写入了数据。

mysql>select * from class;

从服务器:说明从服务器上没有写入数据

mysql>select * from class;

在从上:

# start  slave

参考:

主从复制:

http://pengranxiang.iteye.com/blog/1141118      理论不错,实践全是错的

http://369369.blog.51cto.com/319630/790921           实践不错

读写分离:

http://blog.chinaunix.net/uid-20639775-id-154600.html      amoeba.xml 看不懂

http://docs.hexnova.com/amoeba/                                            amoeba 手册

http://wenku.baidu.com/link?url=1sbgL2yxmBcdjHGZz7S19RE-OCU5jFwBC7NUI9CF_FqieOn3vrvijqotG88fAV_U6isMZtoiRAMrjx_aaW1dLPdzeWjQG8eu9o-MLEIBaPG      这个最好

时间: 2024-10-02 14:11:01

Mysql 主从复制,读写分离的相关文章

mysql主从复制读写分离-Altas

mysql主从复制读写分离 本文读写分离使用的软件是Altas,altas是奇虎360公司开发的开源数据库代理软件.它是基于mysql-proxy开发而成的 它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行.基于此可以实现负载均衡.读写分离.高可用性等需求. mysql读写分离原理: 数据库层在高并发的情况下,i/o会产生瓶颈.而实际上用户读的请求要远远大于写的请求. 使用代理服务作为数据库前端,将不同的请求根据规则分配到不同的后端数据上面去,比如将写的请求分

【实战】Amoeba 代理 MySQL 主从复制 + 读写分离 【提供源码包】

目录简介: 1· Amoeba 的介绍2· MySQL 主从复制原理3· MySQL 读写分离原理4· 实战案例5· 总结归纳 Amoeba 的介绍 1)Amoeba 是什么: 1·Amoeba 的中文名是:变形虫.它是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行.基于此可以实现负载均衡.读写分离.高可用性等需求. 2·Amoeba相当于一个SQL请求的路由器,目的是为负载均衡.读

mysql主从复制读写分离之——proxysql应用

一.说明ProxySQL是一个开源的MySQL代理服务器,这意味着它充当MySQL服务器和访问其数据库的应用程序之间的中介.ProxySQL可以通过在多个数据库服务器池之间分配流量来提高性能,并且如果一个或多个数据库服务器发生故障,还可以通过自动故障切换到备用数据库来提高可用性. 系统环境:master1:ubuntu16.04 mysql5.6 192.168.1.10 3307 master2:ubuntu16.04 mysql5.6 192.168.1.20 3307slave1: ubu

mysql主从复制-读写分离-原理

Mysql主从复制和读写分离 在实际的生产环境中,如果对mysql数据库的读和写都在一台数据库服务器中操作,无论是在安全性.高可用性,还是高并发等各个方面都是不能满足实际需求的.因此,一般通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力. Mysql主从复制和读写分离 l 主从复制: Mysql的主从复制和mysql的读写分离两者有紧密的联系,首先要部署主从复制,只有主从复制完成了,才能再此基础上进行数据的读写分离. Mysql支持的复制类型: 1. 基于语句的复制:在主服

利用amoeba实现mysql主从复制读写分离

一般大型网站为了缓解大量的并发访问,会在web端实现负载均衡,但是这是远远不够的.到了数据存储层.数据访问层,如果还是传统的架构,或者只是依靠一台服务器,大量的数据库连接操作,会导致数据库面临崩溃的危险.进而造成数据丢失,后果不堪设想.所以我们会考虑如何减少数据库的连接,一方面进行代码的优化,采用优秀的数据缓存技术如memcached,如果资金丰厚的话,必然会想到假设服务器群,来分担主数据库的压力.今天我们就利用MySQL主从配置,实现读写分离,分散数据库的压力.这种方式,很多网站都有应用,今天

数据库---mysql主从复制读写分离

http://m.open-open.com/m/lib/view/1413274853450.html 原理及架构分析 部署前准备 下载好源码包存放位置要与脚本中对应 mysql-5.5.22.tar.gz,cmake-2.8.6.tar.gz,amoeba-mysql-binary-2.2.0.tar.gz,jdk-6u14-linux-x64.bin selinux和iptables不做设置,关闭 系统光盘镜像为本地yum源,配置好yum文件 环境介绍: 主服务器(master):192.

mysql主从复制+读写分离 菜鸟入门

MYsql主从复制 1.mysql主从复制原理: Master将数据变化记录到二进制日志中[binary log] Slave将master的二进制日志[binary log]拷贝到自己的中继日志[relay log]中. Slave将中继入日志[relay log]事件在做一次,将数据变化,反应到自身数据库. 简述:mysql主从复制其实就是完全备份,和二进制日志备份还原的过程.二进制日志的还原基本上是实时进行的.注意不是完全实时,而是异步实时,主从直接的执行有延迟.如果master压力过大,

mysql主从复制读写分离

一.环境 1.主服务器操作系统:Mac OS MySQL版本:5.1.6 2.从服务器操作系统:Centos 6.5 MySQL版本:5.1.6 二.实战 2.1MySQL主从复制,读写分离示意图 MySQL 复制的工作方式很简单,一台服务器作为主机,一台或多台服务器作为从机.主机会把数据库的变化记录到日志.一旦这些变化被记录到日志,就会立刻(或者以设定的时间间隔)被送到从机. 2.2 主服务器IP:172.16.151.1 从服务器IP:172.16.151.130 在两台服务器分别安装好My

mysql 主从复制读写分离

目标:实现主从复制,读写分离 环境:mysql-proxy:192.168.1.21      version:5.0.77mysql-master:192.168.1.24     version:5.0.95mysql-slave:192.168.1.7       version:5.0.95 一.主从配置过程:登陆mysql-master:授权给从数据库服务器192.168.1.7mysql> GRANT REPLICATION SLAVE ON *.* to 'rep1'@'192.1

mysql主从复制-读写分离

mysql5.6版本: mysql的主从复制环境构建故障恢复 基于GTID的mysql中从复制 使用atlas实现读写分离 文章下载包地址: 链接:https://pan.baidu.com/s/1ht1y9HnqcfrDdWuPHUq_gg 提取码:cxql 原文地址:https://www.cnblogs.com/myself-technology-summary/p/10859878.html