MySQL主从及读写分离配置

《《MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主从后,在A上写数据,B也会跟着写数据,两者数据实时同步》》

MySQL主从是基于binlog的,主上须开启binlog才能进行主从。 主从过程大致有3个步骤
1)主将更改操作记录到binlog里
2)从将主的binlog事件(sql语句)同步到从本机上并记录在relaylog里
3)从根据relaylog里面的sql语句按顺序执行

主上有一个log dump线程,用来和从的I/O线程传递binlog;从上有两个线程,其中I/O线程用来同步主的binlog并生成relaylog,另外一个SQL线程用来把relaylog里面的sql语句执行一遍;两种情况:一种是做备份用,一种是作为读用

环境准备:虚拟机装好,oneinstack部署好MySQL;主从服务器的Linux、数据库版本都一致;主的IP是192.168.1.115、从的IP是192.168.1.118        

闲话少说,开整!!!!

***********主从配置***********

1、配置主库服务器115的my.cnf文件

vi /etc/my.cnf

server-id = 115   #设置主服务器的ID

innodb_flush_log_at_trx_commit = 2  #这个默认已经配置了

sync_binlog = 1  #开启binlog日志同步功能

log_bin = mysql-bin-115   #binlog日志文件名

binlog-do-db=xxxx   #这个表示只同步某个库 (如果没有此项,表示同步所有的库,我没有配置此选项)

/etc/init.d/mysqld restart     #配置完成后重启数据库

grant replication slave on *.* to 'test'@'192.168.1.118' identified by 'Mysql.8899';  #授权给从服务器192.168.1.118使用test账号及密码Mysql.8899连接主服务器115、记得FLUSH PRIVILEGES;一下

show master status;   #查看主服务器的状态 file,position这两个值很有用。要放到slave配置中(mysql-bin-115.000001、419)

2、配置从库服务器118的my.cnf文件

vi /etc/my.cnf

server-id = 118  #设置从服务器的ID

innodb_flush_log_at_trx_commit = 2  #这个还是默认已经配置了

sync_binlog = 1    #开启binlog日志同步功能

log_bin = mysql-bin-118  #binlog日志文件名

/etc/init.d/mysqld restart  #重启数据库

change master to master_host='192.168.1.115',master_user='test',master_password='Mysql.8899',master_log_file='mysql-bin-115.000001',master_log_pos=419;   进入数据库,指定master

start slave;  #开启从库

show slave status G;   #查看从库状态:Slave_IO_Running、Slave_SQL_Running都为Yes表示配置成功

3、验证:在主库上创建一个库,再在从库上刷新查看是否同步创建

我这里在主上创建了一个testzhu,在从上也看到了testzhu。OK!打完收工

***************读写分离配置***************

概述

Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。

基于此可以实现负载均衡、读写分离、高可用性等需求。与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQL Proxy简单)。

Amoeba相当于一个SQL请求的路由器,目的是为负载均衡、读写分离、高可用性提供机制,而不是完全实现它们。用户需要结合使用MySQL的 Replication等机制来实现副本同步等功能。

amoeba对底层数据库连接管理和路由实现也采用了可插拨的机制,第三方可以开发更高级的策略类来替代作者的实现。这个程序总体上比较符合KISS原则的思想

优势

Amoeba主要解决以下问题:

a). 数据切分后复杂数据源整合

b). 提供数据切分规则并降低数据切分规则给数据库带来的影响

c). 降低数据库与客户端连接

d). 读写分离路由

不足

a)、目前还不支持事务

b)、暂时不支持存储过程

c)、不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如一次请求返回10w以上甚至更多数据的场合)

d)、暂时不支持分库分表,amoeba目前只做到分数据库实例,每个被切分的节点需要保持库表结构一致

***********环境准备**********

Amoeba:192.168.1.190

MySQL主(masterDB):192.168.1.129  

MySQL从(slaveDB)   :192.168.1.118

以上都是虚拟机centos7,mysql版本是5.6.42

1、配置Java环境

(1)安装java

Amoeba框架是居于JDK1.5开发的,采用了JDK1.5的特性,所以还需要安装java环境,建议使用javaSE1.5以上的JDK版本

先去官网下载:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html,我这里选择的是jdk-8u191-linux-x64.rpm

(2)设置java环境变量

vim /etc/profile

JAVA_HOME=/usr/java/jdk1.8.0_191-amd64

JRE_HOME=/usr/java/jdk1.8.0_191-amd64/jre

CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

export JAVA_HOME JRE_HOME CLASS_PATH PATH

(3)重新加载配置文件

source  /etc/profile   

(4)测试Java是否安装成功

java -version

java version "1.8.0_191"

Java(TM) SE Runtime Environment (build 1.8.0_191-b12)

Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

2、安装Amoeba

(1)下载最新版本的Amoeba,我这里下载的是amoeba-mysql-3.0.5-RC-distribution.zip。Amoeba安装非常简单,直接解压即可使用,这里将Amoeba解压到/usr/local/amoeba目录下,这样就安装完成了

下载地址:https://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/3.x/

(2)解压到/usr/local/下,并查看目录和文件是否正确

/usr/local/amoeba-mysql-3.0.5-RC      这是我的目录,以下是目录下的详细情况

(3)配置Amoeba

Amoeba的配置文件在本环境下位于/usr/local/amoeba-mysql-3.0.5-RC/conf下,配置文件较多,但是仅仅使用读写分离功能,只需配置两个文件dbServers.xml和amoeba.xml,如果需要配置ip访问控制,还需要修改access_list.conf文件,下面首先介绍dbServers.xml

cat /usr/local/amoeba-mysql-3.0.5-RC/conf/dbServers.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="connectionManager">${defaultManager}</property>
<property name="sendBufferSize">64</property>
<property name="receiveBufferSize">128</property>

<!-- mysql port -->
<property name="port">3306</property> #设置Amoeba要连接的mysql数据库的端口,默认是3306

<!-- mysql schema -->
<property name="schema">testzhu</property> #缺省数据库,当连接amoeba时,操作表必须显式的指定数据库名,即采用dbname.tablename的方式,不支持 use dbname指定缺省库,因为操作会调度到各个后端dbserver

<!-- mysql user -->
<property name="user">test1</property> #设置amoeba连接后端数据库服务器的账号和密码,因此需要在所有后端数据库上创建该用户,并授权amoeba服务器可连接

<property name="password">111111</property> #连接密码
</factoryConfig>

<poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">
<property name="maxActive">500</property> #最大连接数,默认500
<property name="maxIdle">500</property> #最大空闲连接数
<property name="minIdle">1</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="writedb" parent="abstractServer"> #设置一个后端可写的dbServer,这里定义为writedb,这个名字可以任意命名,后面还会用到
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.1.129</property> #设置后端可写dbserver
</factoryConfig>
</dbServer>

<dbServer name="slave" parent="abstractServer"> #设置后端可读dbserver
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.1.118</property> #后端可读dbserver的IP
</factoryConfig>
</dbServer>

<dbServer name="myslave" virtual="true"> #设置一个虚拟的dbserver,实际上相当于一个dbserver组,这里将可读的数据库ip统一放到一个组中,将这个组的名字命名为myslave
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property> #选择调度算法,1表示负载均衡,2表示权重,3表示HA, 这里选择1

<!-- Separated by commas,such as: server1,server2,server1 -->
<property name="poolNames">slave</property> #myslave组成员,也就是上面的后端可读dbserve
</poolConfig>
</dbServer>

</amoeba:dbServers>

(4)配置amoeba.xml文件

cat   /usr/local/amoeba-mysql-3.0.5-RC/conf/amoeba.xml

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

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

<proxy>

<!-- service class must implements com.meidusa.amoeba.service.Service -->
<service name="Amoeba for Mysql" class="com.meidusa.amoeba.mysql.server.MySQLService">
<!-- port -->
<property name="port">8066</property>      #设置amoeba监听的端口,默认是8066

<!-- bind ipAddress -->
<!--
<property name="ipAddress">127.0.0.1</property>  #监听接口
-->

<property name="connectionFactory">
<bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory">
<property name="sendBufferSize">128</property>
<property name="receiveBufferSize">64</property>
</bean>
</property>

<property name="authenticateProvider">
<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">

提供客户端连接amoeba时需要使用下面设定的账号 (这里的账号密码和amoeba连接后端数据库服务器的密码无关)

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

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

<property name="filter">
<bean class="com.meidusa.toolkit.net.authenticate.server.IPAccessController">
<property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
</bean>
</property>
</bean>
</property>

</service>

<runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext">

<!-- proxy server client process thread size -->
<property name="executeThreadSize">128</property>

<!-- per connection cache prepared statement size -->
<property name="statementCacheSize">500</property>

<!-- default charset -->
<property name="serverCharset">utf8</property>

<!-- query timeout( default: 60 second , TimeUnit:second) -->
<property name="queryTimeout">60</property>
</runtime>

</proxy>

<!--
Each ConnectionManager will start as thread
manager responsible for the Connection IO read , Death Detection
-->
<connectionManagerList>
<connectionManager name="defaultManager" class="com.meidusa.toolkit.net.MultiConnectionManagerWrapper">
<property name="subManagerClassName">com.meidusa.toolkit.net.AuthingableConnectionManager</property>
</connectionManager>
</connectionManagerList>

<!-- default using file loader -->
<dbServerLoader class="com.meidusa.amoeba.context.DBServerConfigFileLoader">
<property name="configFile">${amoeba.home}/conf/dbServers.xml</property>
</dbServerLoader>

<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="ruleLoader">
<bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
<property name="ruleFile">${amoeba.home}/conf/rule.xml</property>
<property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>
</bean>
</property>
<property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
<property name="LRUMapSize">1500</property>
<property name="defaultPool">writedb</property>   #设置amoeba默认的池,这里设置为writedb

<!--   #这里要删掉
<property name="writePool">writedb</property>    #这两个选项默认是注销掉的,需要取消注释(删掉上面的<!--和下面的-->),这里用来指定前面定义好的俩个读写池

<property name="readPool">myslave</property>
-->   #这里要删掉
<property name="needParse">true</property>
</queryRouter>
</amoeba:configuration>

(5)分别在masterdb和slavedb上为amoedb授权

use mysql;

GRANT ALL ON testzhu.* TO test1@'192.168.1.190' IDENTIFIED BY '111111';

flush privileges;

(6)/usr/local/amoeba-mysql-3.0.5-RC/bin/launcher     启动amoeba,但是,但是,有报错

The stack size specified is too small, Specify at least 228k
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit

vi     /usr/local/amoeba-mysql-3.0.5-RC/jvm.properties   改jvm的配置

改成:JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k -XX:PermSize=16m -XX:MaxPermSize=96m"

原为:JVM_OPTIONS="-server -Xms256m -Xmx1024m -Xss196k -XX:PermSize=16m -XX:MaxPermSize=96m"

/usr/local/amoeba-mysql-3.0.5-RC/bin/launcher start   再次启动无报错,端口8066和进程均正常启动

(7)测试读写分离是否成功

https://www.cnblogs.com/liuyisai/p/6009379.html     明天继续!

 


原文地址:https://www.cnblogs.com/leon2659/p/10037287.html