您的位置:首页 > 运维架构 > Linux

Centos 6.5 Mysql amoeba读写分离

2016-10-13 15:42 316 查看


环境依赖JDK

=================================================================================================================================================================

解压JDK

tar -zvxf jdk-7u79-linux-x64.tar.gz

mv jdk1.7.0_79/ /usr/local/jdk1.7/

编辑环境变量文件

vim /etc/profile

#文件最后部分加入

export JAVA_HOME=/usr/local/jdk1.7

export JRE_HOME=${JAVA_HOME}/jre

export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

export PATH=${JAVA_HOME}/bin:$PATH

#刷新profiley文件

source /etc/profile

#查看JDK版本

java -version

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

安装amoeba

创建amoeba

mkdir  /usr/local/amoeba

环境依赖

yum -y install zip unzip vim

解压amoeba

unzip  amoeba-mysql-3.0.5-RC-distribution.zip

启动amoeba

/usr/local/amoeba/amoeba-mysql-3.0.5-RC/bin/launcher

关闭amoeba

/usr/local/amoeba/amoeba-mysql-3.0.5-RC/bin/shutdown

------------------------------------------------------------------------------------------------------

但是提示出现fatal exception:

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.

从错误文字上看,应该是由于stack size太小,导致JVM启动失败,要如何修改呢?

其实Amoeba已经考虑到这个问题,并将JVM参数配置写在属性文件里。现在,让我们通过该属性文件修改JVM参数。

修改jvm.properties文件JVM_OPTIONS参数。

------------------------------------------------------------------------------------------------------

解决方法

vi /usr/local/amoeba/amoeba-mysql-3.0.5-RC/jvm.properties

更改成

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

配置/usr/local/amoeba/amoeba-mysql-3.0.5-RC/conf/

vim 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>

            

            <!-- 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">

                    

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

                    <!-- 对外连接amoeba用户名密码-->

                    <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">master</property>

        

        <!-- 去除默认注释更改名称-->

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

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

        

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

    </queryRouter>

</amoeba:configuration>

vim 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>

            

            <!-- mysql schema -->

            <property name="schema">jiang</property>

            <!-- 连接默认数据库-->

            <!-- mysql user -->

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

            <!-- 连接默认数据库用户名密码-->

            <property name="password">1234.coM</property>

        </factoryConfig>

        <poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">

            <property name="maxActive">500</property>

            <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="master"  parent="abstractServer">

        <factoryConfig>

            <!-- mysql ip -->

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

            <!-- 定义数据库IP以及名称-->

        </factoryConfig>

    </dbServer>

    

    <dbServer name="slave1"  parent="abstractServer">

        <factoryConfig>

            <!-- mysql ip -->

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

        </factoryConfig>

    </dbServer>

    <dbServer name="slave2"  parent="abstractServer">

        <factoryConfig>

            <!-- mysql ip -->

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

        </factoryConfig>

    </dbServer>

    

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

        <!-- 定义slaves-->

        <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">slave1,slave2</property>

            <!-- 设置负载算法-->

        </poolConfig>

    </dbServer>

        

</amoeba:dbServers>

配置amoeba环境变量

vim /etc/profile

export AMOEBA_HOME=/usr/local/amoeba/amoeba-mysql-3.0.5-RC

查看服务状态

netstat -anplt | grep java

tcp        0      0 :::8066                     :::*                        LISTEN      3169/java

客户端连接Amoeba测试:

额外说明下,此处的yourpassword是连接Amoeba的密码,也就是在amoeba.xml配置文件中配置的密码,与Mysql密码不同,需要注意。

mysql -u amoeba -p -h192.168.31.6 -P8066  

mysql> show databases;

mysql> CREATE DATABASE  minunix;  \\  创建数据库,之后在主从库分别查看

通过Amoeba登录,进行数据的查询及插入更新等操作,并查看mysql-log日志,可发现所执行的INSERT 、UPDATE、DELETE等操作在主库server1上操作,SELECT查询语句在从库server2上执行



读写分离验证

登录master主数据库。

mysql -u amoeba -p -h192.168.31.6 -P8066

mysql> create table sxit (id int(10) ,name varchar(10));

关闭B C数据库

mysql -uroot -pyourpassword

mysql> slave stop;

主数据库插入。

mysql> insert into sxit values('1','zhangsan');

在从数据库B插入。

mysql> insert into sxit values('2','lisi');

在从数据库C插入。

mysql> insert into sxit values('3','john');

登陆到amoeba服务器,进行读写分离的测试:

[root@chenllcentos ~]# mysql -u amoeba -p -h192.168.31.6 -P8066

mysql> use test;

mysql> select * from sxit;

+------+------+

| id   | name |

+------+------+

|    2 | lisi |

+------+------+

mysql> select * from sxit;

+------+------+

| id   | name |

+------+------+

|    3 | john |

+------+------+

重复执行多次,发现始终只显示从数据库的数据,说明如果进行数据库读操作,Amoeba只将读数据SQL命令路由至从数据库。

登录主数据库。

[root@chenllcentos ~]# mysql -uroot -pyourpassword

mysql> use test;

mysql> select * from sxit;

+------+----------+

| id   | name     |

+------+----------+

|    1 | zhangsan |

+------+----------+

可以验证,使用Amoeba对Mysql读写分离成功。若此时开启从数据库主从复制,则可以进行Mysql集群和负载均衡。

参考文档
https://my.oschina.net/u/1169079/blog/390726 http://docs.hexnova.com/amoeba/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: