《《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 明天继续!