设为首页 收藏本站
查看: 330|回复: 0

[经验分享] amoeba实现MySQL读写分离

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-5-6 09:17:38 | 显示全部楼层 |阅读模式


读写分离的中间件:

    SQL解析-->规则处理-->SQL改写-->数据源选择-->执行SQL语句-->结果集返回合并处理

拆分中间件:

    SQL解析-->规则处理-->数据源选择-->执行SQL语句-->结果集返回合并处理


192.168.5.110作为mysql的master

192.168.5.111作为mysql的slave

192.168.5.101安装amoeba实现读写分离


mysql主从复制:

安装mysql-5.5.33

    1、准备数据存放的文件系统

     新建一个逻辑卷,并将其挂载至特定目录即可。

     挂载目录为/mydata,而后需要创建/mydata/data目录做为mysql数据的存放目录。
    2、新建用户以安全方式运行进程:    # groupadd -r mysql    # useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql

    # chown -R mysql:mysql /mydata/data

3、安装并初始化mysql-5.5.33
    # tar xf mysql-5.5.33-linux2.6-i686.tar.gz -C /usr/local
    # cd /usr/local/    # ln -sv mysql-5.5.33-linux2.6-i686  mysql    # cd mysql     # chown -R mysql:mysql  .    # scripts/mysql_install_db --user=mysql --datadir=/mydata/data

    # chown -R root  .

4、为mysql提供主配置文件:
    # cd /usr/local/mysql    # cp support-files/my-large.cnf  /etc/my.cnf    另外还需要在mysqld段添加如下行指定mysql数据文件的存放位置:

    datadir = /mydata/data

5、为mysql提供sysv服务脚本:
    # cd /usr/local/mysql    # cp support-files/mysql.server  /etc/rc.d/init.d/mysqld

    # chmod +x /etc/rc.d/init.d/mysqld

添加至服务列表:
    # chkconfig --add mysqld

    # chkconfig mysqld on

6、输出mysql的man手册至man命令的查找路径:
    编辑/etc/man.config,添加如下行即可:

    MANPATH  /usr/local/mysql/man

7、输出mysql的头文件至系统头文件路径/usr/include:

    # ln -sv /usr/local/mysql/include  /usr/include/mysql

8、输出mysql的库文件给系统库查找路径:

    # echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf

而后让系统重新载入系统库:

    # ldconfig

9、修改PATH环境变量,让系统可以直接使用mysql的相关命令。

master     

mysql> grant replication slave,replication client on *.* to 'repuser'@'192.168.%.%' identified by 'reppass';Query OK, 0 rows affected (0.02 sec) mysql> flush privileges;Query OK, 0 rows affected (0.00 sec)  mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 |      107 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.01 sec)

slave:

    修slave的配置文件my.cnf

#log-bin=mysql-binrelay-log=rely-bin# binary logging format - mixed recommendedbinlog_format=mixed # required unique id between 1 and 2^32 - 1# defaults to 1 if master-host is not set# but will not function as a master if omitted#server-id      = 1server-id       = 11

mysql> change master to master_host='192.168.5.110',master_user='repuser',master_password='reppass',master_log_file='mysql-bin.000002',master_log_pos=107;Query OK, 0 rows affected (0.10 sec) mysql> start slave ;Query OK, 0 rows affected (0.01 sec)mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.5.110
                  Master_User: repuser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 107
               Relay_Log_File: rely-bin.000002
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes

安装jdk-1.8.0_20

# tar xf jdk-8u20-linux-i586.gz  -C /usr/local/# ln -sv /usr/local/jdk1.8.0_20 /usr/local/java 导出java环境变量# vim /etc/profile.d/java.sh export JAVA_HOME=/usr/local/javaexport JRE_HOME=/usr/local/java/jreexport PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME:$JRE_HOME/lib:$CLASSPATH # java -versionjava version "1.8.0_20"Java(TM) SE Runtime Environment (build 1.8.0_20-b26)Java HotSpot(TM) Client VM (build 25.20-b23, mixed mode)# javac -versionjavac 1.8.0_20

安装amoeba实现数据读写分离:

    http://www.sf.net/projects/amoeba

    amoeba使用javacc研发,需要安装jdk环境

# mkdir   /usr/local/amoeba# tar xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/# cd /usr/local/amoeba/在master授权mysql> grant all  on *.* to 'amoeba'@'192.168.%.%' identified by 'amoeba';Query OK, 0 rows affected (0.12 sec) mysql> flush privileges;Query OK, 0 rows affected (0.20 sec)

配置amoeba.xml

   

# 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.net.ServerableConnectionManager">                        <!-- port -->                        <property name="port">8066</property>                         <!-- bind ipAddress -->                        <!--                         <property name="ipAddress">127.0.0.1</property>                         -->                         <property name="manager">${clientConnectioneManager}</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="authenticator">                                <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">                                         <property name="user">root</property>                                         <property name="password"></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>                 </service>                 <!-- server class must implements com.meidusa.amoeba.service.Service -->                <service name="Amoeba Monitor Server" class="com.meidusa.amoeba.monitor.MonitorServer">                        <!-- port -->                        <!--  default value: random number                        <property name="port">9066</property>                        -->                        <!-- bind ipAddress -->                        <property name="ipAddress">127.0.0.1</property>                        <property name="daemon">true</property>                        <property name="manager">${clientConnectioneManager}</property>                        <property name="connectionFactory">                                <bean class="com.meidusa.amoeba.monitor.net.MonitorClientConnectionFactory"></bean>                        </property>                 </service>                 <runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext">                        <!-- proxy server net IO Read thread size -->                        <property name="readThreadPoolSize">20</property>                         <!-- proxy server client process thread size -->                        <property name="clientSideThreadPoolSize">30</property>                         <!-- mysql server data packet process thread size -->                        <property name="serverSideThreadPoolSize">30</property>                         <!-- per connection cache prepared statement size  -->                        <property name="statementCacheSize">500</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="clientConnectioneManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">                        <property name="subManagerClassName">com.meidusa.amoeba.net.ConnectionManager</property>                        <!--                           default value is avaliable Processors                         <property name="processors">5</property>                         -->                </connectionManager>                <connectionManager name="defaultManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">                        <property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property><?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.net.ServerableConnectionManager">                        <!-- port -->                        <property name="port">3306</property>                         <!-- bind ipAddress -->                        <!--                         <property name="ipAddress">127.0.0.1</property>                         -->                         <property name="manager">${clientConnectioneManager}</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="authenticator">                                <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">                                         <property name="user">amoeba</property>                                         <property name="password">amoeba</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>                 </service>                 <!-- server class must implements com.meidusa.amoeba.service.Service -->                <service name="Amoeba Monitor Server" class="com.meidusa.amoeba.monitor.MonitorServer">                        <!-- port -->                        <!--  default value: random number                        <property name="port">9066</property>                        -->                        <!-- bind ipAddress -->                        <property name="ipAddress">127.0.0.1</property>                        <property name="daemon">true</property>                        <property name="manager">${clientConnectioneManager}</property>                        <property name="connectionFactory">                                <bean class="com.meidusa.amoeba.monitor.net.MonitorClientConnectionFactory"></bean>                        </property>                 </service>                 <runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext">                        <!-- proxy server net IO Read thread size -->                        <property name="readThreadPoolSize">20</property>                         <!-- proxy server client process thread size -->                        <property name="clientSideThreadPoolSize">30</property>                         <!-- mysql server data packet process thread size -->                        <property name="serverSideThreadPoolSize">30</property>                         <!-- per connection cache prepared statement size  -->                        <property name="statementCacheSize">500</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="clientConnectioneManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">                        <property name="subManagerClassName">com.meidusa.amoeba.net.ConnectionManager</property>                        <!--                           default value is avaliable Processors                         <property name="processors">5</property>                         -->                </connectionManager>                <connectionManager name="defaultManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">                        <property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property>                         <!--                           default value is avaliable Processors                         <property name="processors">5</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">readservers</property>                 <!--                <property name="writePool">server1</property>                <property name="readPool">server1</property>                -->                <property name="needParse">true</property>        </queryRouter></amoeba:configuration>

修改dbServer.xml

   

# 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,                         such as 'multiPool' dbServer                   -->         <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 port -->                        <property name="port">3306</property>                         <!-- mysql schema -->                        <property name="schema">test</property>                         <!-- mysql user -->                        <property name="user">amoeba</property>                        <property name="password">amoeba</property>                         <!--  mysql password                        <property name="password">password</property>                        -->                </factoryConfig>                 <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">                        <property name="maxActive">500</property>                        <property name="maxIdle">500</property>                        <property name="minIdle">10</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.5.110</property>                </factoryConfig>        </dbServer>         <dbServer name="slave"  parent="abstractServer">                <factoryConfig>                        <!-- mysql ip -->                        <property name="ipAddress">192.168.5.111</property>                </factoryConfig>        </dbServer>         <dbServer name="readservers" virtual="true">                <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">master,slave</property>                </poolConfig>        </dbServer> </amoeba:dbServers>

启动amoeba:

   

# ../bin/amoeba startlog4j:WARN log4j config load completed from file:/usr/local/amoeba/conf/log4j.xml2014-10-12 22:30:54,422 INFO  context.MysqlRuntimeContext - Amoeba for Mysql current versoin=5.1.45-mysql-amoeba-proxy-2.2.0log4j:WARN ip access config load completed from file:/usr/local/amoeba/conf/access_list.conf2014-10-12 22:31:06,090 INFO  net.ServerableConnectionManager - Amoeba for Mysql listening on 0.0.0.0/0.0.0.0:3306.2014-10-12 22:31:06,090 INFO  net.ServerableConnectionManager - Amoeba Monitor Server listening on /127.0.0.1:30486.

在安装amoeba的服务器上打开一个新的虚拟终端登录安装mysql客户端之后,基于amoeba前端登录mysql

# mysql -h192.168.5.101 -uamoeba -pamoebaWelcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 22831918Server version: 5.1.45-mysql-amoeba-proxy-2.2.0 Source distributionCopyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || test               |+--------------------+4 rows in set (0.13 sec)mysql> create database testdb;
Query OK, 1 row affected (0.12 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| testdb             |
+--------------------+
5 rows in set (0.01 sec)

登录master服务器验证:

mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || test               || testdb             |+--------------------+5 rows in set (0.00 sec)

登录slave服务器验证:

mysql> show databases;

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

| Database           |

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

| information_schema |

| mysql              |

| performance_schema |

| test               |

| testdb             |

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

5 rows in set (0.00 sec)







运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-64082-1-1.html 上篇帖子: MySQL中使用innobackupex、xtrabackup进行大数据的备份和还原 下篇帖子: MySQL导入.sql文件及常用命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表