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

     

    
    
  • 相关阅读:
    奇虎董事长周鸿祎:谁说没钱不能创业
    分析.NET基础库源码,学习Stream类及相关类
    Why need two IF in singleton pattern in the multiple threads scenario
    It's bad design that leveraging singleton design pattern in db connection
    Asp.net mvc 3 JSONResult return array
    System.Web.HttpContext.Current vs. ControllerContext.HttpContext (almost the same)
    Nhibernate HQL example paging and avoid sql injection
    Asp.net mvc 3 JSON complext object mapping
    Nhibernate configuration in app.config with log4net enabled 0 of 4
    Setup and run a simple nhibernate example
  • 原文地址:https://www.cnblogs.com/leon2659/p/10037287.html
Copyright © 2020-2023  润新知