分类 笔记 下的文章

利用mysql的amoeba实现主从和读写分离

1.主从

主从数据库是通过mysql自带的功能完成的,mysql版本是5.7.7
主数据库:192.168.1.121
从数据库:192.168.1.122
统一主从数据的远程登陆账户密码,因为后面amoeba完成读写分离的需要这样
我就用root了,密码为123456
在主数据的配置文件的[mysqld]下面添加

#主数据库配置
log-bin=mysql-bin       #打开mysql二进制日志
server-id=1             #设置mysql_id主从不能相同,不能和其他的服务器相同
binlog-do-db=test       #设置二进制日志记录的库,多个数据库像这样复制一份就好了,所有数据库都需要记录,就去掉这一项
#binlog-do-db=test1        
binlog-ignore-db=mysql  #设置二进制日志不记录的库
sync_binlog=1

从数据库配置
在从数据库的配置文件的

#mysql主从配置 从数据库配置
log-bin=mysql-bin
server-id=2
replicate-do-db=test          #设置同步的库
replicate-ignore-db=mysql     #设置不同步的库
log-slave-updates             #同步后记录二进制日志
slave-skip-errors=all
sync_binlog=1
slave-net-timeout=60

在主数据库里面获得master的数据

mysql> show master status\G
*************************** 1. row ***************************
             File: mysql-bin.000002  #这个会用到
         Position: 913               #这个会用到
     Binlog_Do_DB: test
 Binlog_Ignore_DB: mysql
Executed_Gtid_Set: 
1 row in set (0.00 sec)

在从数据库里面设置主数据库

mysql>stop slave;
mysql>change master to master_host='192.168.1.121',master_user='root',
master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=913;
mysql>start slave;

在从数据库查看是否成功,标记的两个都是yes就是好了

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.121
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 375
               Relay_Log_File: 192-relay-bin.000004
                Relay_Log_Pos: 541
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes       #这个是yes
            Slave_SQL_Running: Yes       #这个是yes
              Replicate_Do_DB: test
          Replicate_Ignore_DB: mysql
...后面太长,省略了

我在这里碰到一个问题

mysql> show slave status\G;
*************************** 1. row ***************************
...前面太长省略
             Slave_IO_Running: No
...省略
                Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
...省略

因为我是直接复制的虚拟机,所以mysql的uuid相同了,把数据目录的auto.conf文件删除就ok了

2.读写分离

下载jdk我是下载地址
根据版本下载,我下载的是 jdk-6u45-linux-x64.bin
安装

安装
#mkdir/usr/java/
//新建一个文件夹,把安装包给拷贝到这个文件夹下面
#chmod755jdk-6u25-linux-i586.bin
//给文件授权#
./jdk-6u25-linux-i586.bin//解压文件
配置jdk环境变量
#vim/etc/profile
//打开文件
在文件最后添加如下内容
######forjava
export JAVA_HOME=/usr/java/jdk1.6.0_45
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
#######
#source/etc/profile//重新执行一遍(有必要)
=============================================================================
测试JDK和AMOEBA_HOME是否设置成功
#java-version
//查看jdk版本验证java环境变量是否配置成功
javaversion"1.6.0_45"

安装amoeba

下载Amoeba并安装
#mkdir/usr/local/amoeba///创建文件夹
#cd/usr/local/amoeba///打开说创建的文件夹
#wget
http://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/2.x/amoeba-mysql-binary-2.1.0-RC5.tar.gz/download
//下载Amoeba文件
#md5sumamoeba-mysql-binary-2.1.0-RC5.tar.gz//校验MD5一般不需要
44f6708652a46f28a95338f35f5d4083amoeba-mysql-binary-2.1.0-RC5.tar.gz
#chmod755amoeba-mysql-binary-2.1.0-RC5.tar.gz//文件授权
#tar-zxvfamoeba-mysql-binary-2.1.0-RC5.tar.gz/解压文件
配置Amoeba环境变量
#vim/etc/profile
//打开文件
在结尾添加如下内容###amoeba
export AMOEBA_HOME=/usr/local/amoeba/
export PATH=$PATH:$AMOEBA_HOME/bin#######

配置 AMOEBA配置文件
配置mysql服务器的信息

vi /usr/local/amoeba/conf/dbServers.xml

...这一部分不需要改省略掉...
 <dbServer name="abstractServer" abstractive="true">
                <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
                        <property name="manager">${defaultManager}</property>
                        <property name="sendBufferSize">64</property>
                        <property name="receiveBufferSize">128</property>
                        #配置这部分的数据库服务器的mysql的账号和密码,端口
                        <!-- mysql port -->
                        <property name="port">3306</property>

                        <!-- mysql schema -->
                        <property name="schema">test</property>

                        <!-- mysql user -->
                        <property name="user">root</property>


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

                </factoryConfig>
...这一部分不需要改省略掉...
#以下面的格式设置好mysql服务器的ip,设置好别名,别名不能一样,在其他地方会用到
<dbServer name="Master"  parent="abstractServer">
               <factoryConfig>
                       <!-- mysql ip -->
                       <property name="ipAddress">192.168.1.121</property>
               </factoryConfig>
</dbServer>

<dbServer name="Server1"  parent="abstractServer">
        <factoryConfig>
                <!-- mysql ip -->
                <property name="ipAddress">192.168.1.122</property>
        </factoryConfig>
</dbServer>

<dbServer name="Server2"  parent="abstractServer">
        <factoryConfig>
                <!-- mysql ip -->
                <property name="ipAddress">192.168.1.123</property>
        </factoryConfig>
</dbServer>
#这个比较特殊,用作轮询
<dbServer name="multiPool" virtual="true">
       <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
               <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
               #这个属性设置成1,代表的就是轮询,
               <property name="loadbalance">1</property>
               <!-- Separated by commas,such as: server1,server2,server1 -->
                #这个选项里面填上面几个设置的名字,会依次轮询填进去的服务器
               <property name="poolNames">Server1,Server2</property>
       </poolConfig>
</dbServer>
...这一部分不需要改省略掉...

配置amoeba的信息

...这一部分不需要改省略掉...
#下面这部分设置连接amoeba的账号密码,通过mysql连接mysql的时候就填这里设置的账号的密码
<property name="authenticator">
        <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">

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

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

                <property name="filter">
                        <bean class="com.meidusa.amoeba.server.IPAccessController">
                                <property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
                        </bean>
                </property>
        </bean>
</property>
...这一部分不需要改省略掉...
下面这部分就是设置读写分离和负载均衡的
<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>
        #DML操作的数据库,填主数据库就行了
        <property name="writePool">Master</property>
        #填设置了轮询的dbServer的名称
        <property name="readPool">multiPool</property>

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

这样就ok了,在这一步碰到问题

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

解决方法:

# vim amoeba
#修改58行的Xss参数:
DEFAULT_OPTS="-server -Xms1024m -Xmx1024m -Xss128k"
#修改为:
DEFAULT_OPTS="-server -Xms1024m -Xmx1024m -Xss256k"

参考:http://wenku.baidu.com/view/848d692e2e3f5727a4e96218.html?qq-pf-to=pcqq.c2c
http://blog.itpub.net/90618/viewspace-774894/