澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站Amoeba实现MySQL主从读写分离

==========================业务垂直细分:
1》介绍表明:

原创文章,转发请保留原版的书文链接:源于飞鸿无痕CU博客

澳门新浦京娱乐场网站 1      澳门新浦京娱乐场网站 2

看了下关于amoeba的小说,总体感到好像要比mysql-proxy好的多,也参照了重重的资料,此小说可能与其他作品小编会有同等的地点,请见谅,可是此进程真的是自个儿亲自试验得来的.
 
检查测试意况
操作系统:  SUSE Linux Enterprise Server 10 (x86_64)
 
服务器IP:  10.10.0.72  10.10.0.77  10.10.0.87
 
服务器角色:  10.10.0.72用作mysql的master服务器, 0.77作为mysql的slave服务器,0.87当做amoeba服务器
 
软件列表:    MySQL-client-community-5.1.54-1.sles10.i586.rpm
             MySQL-server-community-5.1.54-1.sles10.i586.rpm
             amoeba-mysql-1.3.1-BETA.zip
             jdk-1_5_0_16-linux-i586-rpm.bin
Amoeba的简介
Amoeba(变形虫)项目,专一遍及式数据proxy 开荒.座落与Client、DB Server(s)之间.对顾客端透明.具备负载均衡、高可用性、sql过滤、读写分离、可路由有关的query到对象数据库、可现身央浼多台数据库归计算果.
 
主要消灭了什么难点:

    随着公司的事务规模扩张,DBA供给依据企业数据业务进行切割,垂直切割又称之为纵向切割,垂直数据切割是依靠公司网站业务、成品举办切分,比方:客户数        据、博客小说数量、照片数量、标签数据类型、群组数等等,每一种专门的学业都独立的分库分表举行切割. 假若一个采纳只针对单纯的职业成效模块,那么能够一贯连接相应       的被垂直切分的数据库,可是多少复杂的施用供给利用到一定多的事体数据,以至牵扯到具有事情数据那么垂直切割将给使用带给一定的复杂度,况兼对研究开发人士也会    有必然的熏陶,引致整个应用复杂度升高,那么Amoeba在内部当做了门面效用*,疏通应用于五个数据库的简报如若垂直切分成效:**假如有有3个数据库:userdb blogdb      otherdb***

    前言:一直想找八个工具,能很好的兑现mysql主从的读写抽离架构,曾经试用过mysql-proxy开掘lua用起来非常不爽,非常是不懂lua脚本,乍然意识了Amoeba那几个体系,试用了下,以为还不易,写出文书档案,希望对大家有赞助!

 

? 裁减数据切分带来的目迷五色非常多据库结构

**2》***DB架构图:*

一、Amoeba 是什么

 

? 提供切分准绳并收缩数据切分准绳给使用带给的震慑

*          澳门新浦京娱乐场网站 3*

Amoeba(变形虫)项目,静心 布满式数据库 proxy 开辟。座落与Client、DB Server(s)时期。对客商端透明。具备负载均衡、高可用性、sql过滤、读写分离、可路由有关的query到目的数据库、可现身诉求多台数据库归计算果。

MySQL简介:

? 减少db 与顾客端的连接数

*                澳门新浦京娱乐场网站 4*

首要解决:

MySQL是最盛行的开放源码 SQL数据库管理种类,它是由 MySQL AB 公司支付、公布并支持的。它的插入式存款和储蓄引擎可以让使用者依据实际选择使用差异的积累。

? 读写分离
 
这里关于mysql的装置就背着了,网络的学科相当多.
兑现mysql的主从复制
在master服务器上举办如下命令:
#mysql –uroot –ptest
mysql> grant replication slave,file on *.* to 'sxit'@'10.10.0.77' identified by '123456';
mysql> flush privileges;
mysql> exit;
 
//修改master的my.cnf的配置
 
log-bin=mysql-bin            //张开mysql二进制日志
server-id = 1                //设置mysql_id,主从不可能平等
binlog-do-db=test            //设置二进制日志记录的库
sync_binlog=1     
 
//修改slave的my.cnf的配置
 
log-bin=mysql-bin
server-id = 2
replicate-do-db=test          //设置同步的库
log-slave-updates            //同步后记录二进制日志  
sync_binlog=1
slave-net-timeout=60
 
独家重启主从mysqld服务,登入master服务器.
 
在master服务器上奉行如下命令
 
# mysql –u root –ptest
mysql>  flush tables with read lock;
mysql>  show master statusG;
 
*************************** 1. row ***************************
 File: mysql-bin.000002
 Position: 106
 Binlog_Do_DB: test
Binlog_Ignore_DB:
澳门新浦京娱乐场网站Amoeba实现MySQL主从读写分离,Amoeba搞定mysql主从读写分离。 
mysql> unlock tables;
 
登录到slave服务器,实行如下命令:
 
# mysql –u root –ptest
 
mysql>  stop slave;
 
mysql> change master to master_host='10.10.0.72', master_user='sxit', master_password='123456',
       master_log_file='mysql-bin.000002',master_log_pos=106;
 
mysql>  start slave;
 
mysql>  show slave statusG;
 
纵然现身下边包车型客车情形,表明为主同步已经成功!
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
安装amoeba
鉴于amoeba基于JDK1.5支付的,接受了JDK1.5的性状,所以大家这里要安装JDK,到10.10.0.87服务器上安装相关程序
 
# chmod x jdk-1_5_0_16-linux-i586-rpm.bin
# ./ jdk-1_5_0_16-linux-i586-rpm.bin
#  vi /etc/profile          //在文书之中增加jdk的境遇变量,加多原委如下
 
JAVA_HOME=/usr/java/jdk1.5.0_16
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH
CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
export CLASSPATH
 
# source  /etc/profile
 
# mkdir amoeba
# cd  /usr/local/amoeba
# unzip amoeba-mysql-1.3.1-BETA.zip
# chmod -R x /usr/local/amoeba/bin/
 
Amoeba For MySQL 的接受特别轻易,全数的安顿文件都是正统的XML 文件,总共有八个布局文件.分别为:
 
◆ amoeba.xml:主配置文件,配置全体数据源以至Amoeba自个儿的参数设置,达成中央的话配
   置这么些文件就能够了;
 
◆ rule.xml:配置全体Query 路由法则的音信;
 
◆ functionMap.xml:配置用于拆解深入分析Query 中的函数所对应的Java 实现类;
 
◆ rullFunctionMap.xml:配置路由法则中需求利用到的特定函数的落成类;
 
经过修正amoeba.xml配置文件得以完毕mysql主从读写分离,配置如下:
 
<?xml version="1.0" encoding="gbk"?>
 
<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
<amoeba:configuration xmlns:amoeba=";
 
        <server>
                <!-- proxy server绑定的端口 -->
                <property name="port">8066</property>
 
                <!-- proxy server绑定的IP -->
                <property name="ipAddress">10.10.0.87</property>
                <!-- 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>
 
                <!-- socket Send and receive BufferSize(unit:K)  -->
                <property name="netBufferSize">128</property>
 
                <!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). -->
                <property name="tcpNoDelay">true</property>
 
                <!-- 对外表明的客户名 -->
                <property name="user">root</property>
 
                <!-- 对外证实的密码 -->
              
                <property name="password">sxit</property>
 
                <!-- query timeout( default: 60 second , TimeUnit:second) -->
                <property name="queryTimeout">60</property>
        </server>
 
        <!--
                每种ConnectionManager都将用作几个线程运营。
                manager担任Connection IO读写/过逝检验
        -->
        <connectionManagerList>
           <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>
 
<dbServerList>
     <!--
        黄金年代台mysqlServer 供给配备多个pool,
        要是多台 平等的mysql须求开展loadBalance,
        平台已经提供叁个持有负载均衡技巧的objectPool:com.meidusa.amoeba.mysql.server.MultipleServerPool
         轻易的布局是性质加上 virtual="true",该Pool 不允许配置factoryConfig
         可能自个儿写三个ObjectPool。
     -->
<dbServer name="server1">
 
     <!-- PoolableObjectFactory实现类 -->
        <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
             <property name="manager">defaultManager</property>
 
                <!-- 真实mysql数据库端口 -->
                     <property name="port">3306</property>
 
                <!-- 真实mysql数据库IP -->
                      <property name="ipAddress">10.10.0.72</property>
                      <property name="schema">test</property>
 
                <!-- 用于登录mysql的客商名 -->
                       <property name="user">test</property>
 
                 <!-- 用于登录mysql的密码 -->
 
                        <property name="password">123456</property>
 
            </factoryConfig>
 
      <!-- ObjectPool实现类 -->
         <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
                <property name="maxActive">200</property>
                  <property name="maxIdle">200</property>
                  <property name="minIdle">10</property>
                  <property name="minEvictableIdleTimeMillis">600000
</property>
                   <property name="timeBetweenEvictionRunsMillis">600000</property>
                        <property name="testOnBorrow">true</property>
                         <property name="testWhileIdle">true</property>
                   </poolConfig>
        </dbServer>

================================业务水平分割 

• 减少 数据切分带来的繁缛好多据库结构

MySQL源码安装 LVM逻辑卷

澳门新浦京娱乐场网站 5

1》介绍表达

• 提供切分法则并减弱 数据切分法则 给应用带给的影响

开创逻辑卷 /dev/mysqlvg/mysqllv
[root@localhost ~]# fdisk /dev/sdb
成立七个分区,将品种改为8e并保留退出

      上次大家讲到垂值切割。那么只要垂值切割不能够满足集团供给如何做??那么大家对架构进行越发优化,让水平切割来缓和这一难点,水平切割根User_ID范      围值划分,然后再进来取模 % 2 ,那么最终拿到的值独有0 和1**概念到每台DB Server 上去。此约束切合用于中小DB架构扩充,大家将在下风姿洒脱章将讲到360度环形库     的扩充,将用来大型DB架构划虚构计;**

• 缩短db 与客商端的连接数

[root@localhost ~]# partprobe /dev/sdb
[root@localhost ~]# pvcreate /dev/sdb1
[root@localhost ~]# vgcreate mysqlvg /dev/sdb1
[root@localhost ~]# lvcreate -L 30G -n mysqllv mysqlvg
[root@localhost ~]# mkfs.ext3 /dev/mysqlvg/mysqllv
[root@localhost ~]# mkdir /usr/local/mysql/data
[root@localhost ~]# mount /dev/mysqlvg/mysqllv /usr/local/mysql/data


• 读写抽离

[root@localhost ~]# vim /etc/fstab
/dev/mysqlvg/mysqllv /usr/local/mysql/data ext3 defaults 0 0

  必要表达:
    总客商数量500万
    User_DB 存款和储蓄客商基本音信<如、登陆认证、个人音信>
    Blog_DB 存款和储蓄顾客博客作品
    Other_DB 存款和储蓄其它职业
    经过垂直细分将3个DB分割到不一样的服务器上边,然后开展水平切割将DB客商量分割开来,
    User_DB1 承载250万客户的着力消息 User_ID范围值<500万 User_ID取模 % 2 取值0的读此服务器
    User_DB2 承载250万客商的着力音讯 User_ID范围值<500万 User_ID取模 % 2 取值1的读此服务器

 

[root@localhost ~]# mount -a

1)安装Mysql数据库
[root@localhost ~]# yum -y install ncurses-devel

安装配置工具cmake
[root@localhost ~]# tar xf cmake-2.8.12.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/cmake-2.8.12/
[root@localhost cmake-2.8.12]# ./configure && gmake && gmake install

[root@localhost ~]# tar xf mysql-5.7.2-m12.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/mysql-5.7.2-m12/
[root@localhost mysql-5.7.2-m12]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc && make && make install

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql  //主程序安装目录
-DDEFAULT_CHA帕JeroSET=utf8       //暗中同意字符集为 utf8
-DDEFAULT_COLLATION=utf8_general_ci   //暗中同意的字符集查对准绳
-DWITH_EXTRA_CHATiguanSETS=all      //安装全部字符集
-DSYSCONFDITiguan=/etc        //配置文件贮存目录

[root@localhost mysql-5.7.2-m12]# make && make install

2卡塔尔优化调度
[root@localhost mysql-5.7.2-m12]# cp support-files/my-default.cnf /etc/my.cnf
[root@localhost mysql-5.7.2-m12]# cp support-files/mysql.server /etc/init.d/mysqld
[root@localhost mysql-5.7.2-m12]# chmod x /etc/init.d/mysqld
[root@localhost mysql-5.7.2-m12]# chkconfig --add mysqld
[root@localhost mysql-5.7.2-m12]# chkconfig --list mysqld
mysqld          0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
[root@localhost mysql-5.7.2-m12]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
[root@localhost mysql-5.7.2-m12]# . /etc/profile
3卡塔尔开端化数据库
[root@localhost mysql-5.7.2-m12]# groupadd mysql
[root@localhost mysql-5.7.2-m12]# useradd -M -s /sbin/nologin -g mysql mysql
[root@localhost mysql-5.7.2-m12]# chown -R mysql:mysql /usr/local/mysql/
[root@localhost mysql-5.7.2-m12]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data --user=mysql
4)启动mysql服务
[root@localhost mysql-5.7.2-m12]# service mysqld start
Starting MySQL..............                               [确定]
[root@localhost mysql-5.7.2-m12]# mysqladmin -u root password '123456' //设置成本身的密码
[root@localhost mysql-5.7.2-m12]# mysql -u root -p123456

===============================================================================================================
案例概述
在实际生产碰着中,假如对数据库的读和写都在同叁个数据库服务器中操作,无论是在安全性,高可用照旧高并发等种种方面都不能够完全满意实际要求的,由此常常的话都以透过主从复制(Master-Slave卡塔尔的格局来一同数据,在通过读写抽离来升高数据的高并发负载手艺那样的方案来进展布局。

MYISAM 读写操作相互 互斥

MySQL Replication 概述
MySQL Replication 俗称MySQL AB复制(主从,双机热备卡塔尔,从库以一定的频率去读取主库的二进制日志文件,依据日志中记录对从库进行相通的操作,以达成同盟效果。

MySQL 扶植的复制类型
依照语句的复制 在主服务器上履行的SQL语句,在从服务器上施行同生龙活虎的说话,MySQL暗许使用基于语句的复制,作用相比高
据说行的复制 把改动的内容复制过去,实际不是把命令在从服务器上履行一遍
掺杂类型的复制 暗中认可采取基于语句的复制,大器晚成旦发觉基于语句不能够精确复制时,就会动用行

mysql 5.6 今后多了一个GTIDS复制

复制的行事进度
1.主库在各种事情更新完数据产生以前,Master在二进制日志(Binary log,binlog卡塔尔记录这几个改造,写入二进制日志完毕后,Master通告存款和储蓄引擎提交业务

2.Slave将Master的Binary log复制到此中中继日志,首先Slave开头一个职业线程-I/O线程在Master上开辟一个索然无味的连年,然后开首Binlog dump process,Binlog dump process从Master的二进制日志中读取事件,假诺已经跟上Master,它会催眠并等待Master爆发新的事件,I/O线程将这么些事件写入中继日志。

3.SQL Slave Thread(SQL从线程卡塔尔国管理该进程的末梢一步,SQL线程从当中继日志读取事件,一视同仁放当中的风浪而创新Slave的多寡,使其与Master中的数据风华正茂致,只要该线程与I/O线程保持生龙活虎致,中继日志平常会在OS的缓存中,所以中继日志的开荒相当小。

复制进度的范围
1.即复制在Slave上是串行化的,也正是说Master上的交互作用更新不能够在Slave上并行操作
2.MYSQL的本子都要超过3.2,还应该有三个大旨的规格正是作为从数据库的数据库版本能够高于主服务器数据库的本子,可是不得以低于主服务器的数据库版本

从库以一定的频率去读取主库的二进制日志文件,根据日志中记录对从库进行相近的操作,以到达合营效果。

MySQL Master IP: 192.168.200.101
MySQL Slave1 IP: 192.168.200.102
MySQL Slave2 IP: 192.168.200.103

每台机械上的操作
[root@localhost ~]# service iptables stop
[root@localhost ~]# service sshd restart
[root@localhost ~]# setenforce 0

在MySQL Master 上的铺排

在主服务器上树马上间同步服务器NTP
[root@localhost ~]# mount /dev/cdrom /mnt/
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# mkdir bak
[root@localhost yum.repos.d]# mv *.repo bak/
[root@localhost yum.repos.d]# vim yum.repo
[root@localhost yum.repos.d]# cat yum.repo
[base]
name=base
baseurl=file:///mnt
gpgcheck=0
[root@localhost yum.repos.d]# yum -y install ntp

配置NTP
[root@localhost yum.repos.d]# vim /etc/ntp.conf #增加两行
server 127.127.1.0
fudge 127.127.1.0 stratum 8

启动NTP服务
[root@localhost yum.repos.d]# service ntpd restart
关闭 ntpd:                                                [确定]
正在开发银行 ntpd:                                            [澳门新浦京娱乐场网站Amoeba实现MySQL主从读写分离,Amoeba搞定mysql主从读写分离。确定]

在从节点上扩充时间一齐
[root@localhost mysql-5.7.2-m12]# yum -y install ntpdate
[root@localhost mysql-5.7.2-m12]# /usr/sbin/ntpdate 192.168.200.101
 2 Jan 00:48:18 ntpdate[27781]: adjust time server 192.168.200.101 offset 0.301932 sec

 
 
 
配置mysql master服务器

1.在/etc/my.cnf 中修正或然扩大如下内容:
[root@mysql-master mysql]# vim /etc/my.cnf
[mysqld]
server-id=1
log-bin=mysql-binlog
log-slave-updates=true

重启mysql服务器
[root@mysql-master mysql]# service mysqld restart

2.创建Replication用户
[root@mysql-master mysql]# mysql -u root -p123456

mysql> grant replication slave on *.* to 'myslave'@'192.168.200.%' identified by '123456';               给从服务器授权
mysql> flush privileges;

replication slave: 用于复制型附属服务器(从主服务器中读取二进制日志事件卡塔尔国  

3 得到Master DB的有关音讯

mysql> show master status;
--------------------- ---------- -------------- ------------------
| File                | Position | Binlog_Do_DB | Binlog_Ignore_DB |
--------------------- ---------- -------------- ------------------
| mysql-binlog.000001 |      338 |              |                  |
--------------------- ---------- -------------- ------------------
1 row in set (0.00 sec)

 

供Slave DB连接时利用,记录下File和Position的值

备份的方法有多数,能够直接复制数据文件,也足以采取mysqldump。本文全新的搭建,所以不设有多少同步的问题
[root@mysql-master mysql]# mysqldump -u root -p123456 --all-databases > /root/alldbbackup.sql
[root@mysql-master mysql]# scp /root/alldbbackup.sql root@192.168.200.102:/root/
[root@mysql-master mysql]# scp /root/alldbbackup.sql root@192.168.200.103:/root/

 

4 在 MySQL Slave 上的布局

导入备份脚本
[root@localhost ~]# mysql -u root -p < /root/alldbbackup.sql

从库连接主库举办测量试验,借使老是成功验证主库配置成功
[root@localhost ~]# mysql -u myslave -p123456 -h 192.168.200.101

改正MySQL配置文件
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
server-id=2
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index

计划多个从服务器时依次安装server-id号

订正完后重启数据库
[root@localhost ~]# service mysqld restart

在 Slave服务器授权,运维从库,实行主从库数据同步
[root@localhost ~]# mysql -u root -p123456
mysql> stop slave;
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.200.101',
MASTER_USER='myslave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-binlog.000001',
MASTER_LOG_POS=338;

参数表明:
mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name', //主服务器的IP地址
-> MASTER_USER='replication_user_name', //同步数据库的顾客
-> MASTER_PASSWORD='replication_password', //同步数据库的密码
-> MASTER_LOG_FILE='recorded_log_澳门新浦京娱乐场网站,file_name', //主服务器二进制日志的文书名(前边要求记录的参数)
-> MASTER_LOG_POS=recorded_log_position; //日志文件的始发地方(前边供给记录的参数)

mysql> show slave statusG
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.200.101
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-binlog.000001
          Read_Master_Log_Pos: 338
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 254
        Relay_Master_Log_File: mysql-binlog.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 338
              Relay_Log_Space: 407
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
1 row in set (0.00 sec)

停止slave角色:
mysql> stop salve;

重置slave角色:
mysql> reset salve;

启动slave角色:
mysql> start salve;

5 测量试验主从复制是不是中标

可以在Master DB创设多个库,大概表,到 Slave DB上看,借使创制成功就印证能够成功同步。

主库查看当前设有的库
mysql> show databases;
--------------------
| Database           |
--------------------
| information_schema |
| mysql              |
| test               |
--------------------
3 rows in set (0.00 sec)

从库查看当前存在库
mysql> show databases;
--------------------
| Database           |
--------------------
| information_schema |
| mysql              |
| test               |
--------------------
3 rows in set (0.00 sec)
注解二者中的数据保持了大器晚成致性

主库创造库,表:
mysql> create database sampdb;
mysql> use sampdb
mysql> create table new(name char(20),phone char(20));

开发从库,查看:
mysql> show databases;
--------------------
| Database           |
--------------------
| information_schema |
| mysql              |
| sampdb             |
| test               |
--------------------
4 rows in set (0.00 sec)
mysql> use sampdb
mysql> show tables;

注明为主数据库创变成功。

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

报错解决方法:
ERROR 1201(HY000):Could now initialize master info structure; more error messages can be found in the MySQL error log

stop slave;
reset slave;
CHANGE MASTER TO MASTER_HOST='192.168.3.254', MASTER_USER='slave', MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-binlog.000003', MASTER_LOG_POS=246;

start slave;

数据不一齐化解办法:
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

mysql> set global sql_slave_skip_counter=1;
Query OK, 0 rows affected (0.00 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

 

着力数据库相关命令:
slave stop; slave start;  领头结束从数据库。
show slave statusG   显示从库状态音讯
show master statusG  展现主库状态新闻
purge master logs to ’binlog.000004’;  此命令非常当心,删除主数据库没用的二进制日志文件。要是误删除,那么从库就从不主意自动更新了。
change master;    从服务器上匡正参数使用

别的,尽管您眼下操作的从库从前曾经与其余服务器组建过主从关系,你大概会发觉固然你在my.cnf文件中纵然改良了主服务器的岗位,可是MSQL如故
在试图连接就旧的主服务器的气象。发生这种主题材料的时候,大家得以经过湮灭master.info这一个缓存文件或然在mysql中经过命令来拓宽安装。方式如下:

删除master.info方法
以此文件位于数据文件寄放目录里,能够平昔将其删除,然后再一次起动服务器。

b、mysql命令方法
如若你不方便人民群众重新起动服务器来讲,那么就一定要使用mysql命令来帮忙您完了。

率先登陆到主服务器上,查看当前服务器状态:
mysql> show master statusG;
--------------- ---------- -------------- ------------------
| File    | Position | Binlog_Do_DB | Binlog_Ignore_DB |
--------------- ---------- -------------- ------------------
| mysql-bin.003 | 73     | test     | manual,mysql     |
--------------- ---------- -------------- ------------------

1.FLUSH TABLES WITH READ LOCK
其一命令是大局读锁定,试行了命令之后全体库全体表都被锁定只读。平时皆以用在数据库联机备份,那时候数据库的写操作将被封堵,读操作顺遂实行
解锁的话语是unlock tables
2.LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
那个命令是表等第的锁定,可以定制锁定某一个表。比如: lock  tables test read; 不影响其余表的写操作。
解锁语句也是unlock tables。
那八个语句在履行的时候都须求注意个特征,在脱离mysql终端的时候都会隐式的施行unlock tables。也正是只要要让表锁定生效就一定要一贯维持对话

P.S.  MYSQL的read lock和wirte lock
read-lock:  允许任何并发的读诉求,但梗塞写央浼,即能够而且读,但不容许别的写。也叫分享锁
write-lock: 不容许任何并发的读和写须要,是排他的(exclusive)。也叫独占锁

  1. flush table tablename

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

MySQL读写分离原理

MySQL的主从复制和MySQL的读写抽离两个兼有紧凑联系,首先布置主从复制,唯有主从复制完了,本领在这里基本功上拓宽多少的读写抽离。

同理可得的话,读写分离正是只在主服务器上写,只在从服务器上读,基本的准则是让主数据库处监护人务性查询,而从数据库管理select查询,数据库复制被用来把事务性查询引致的改观纠正同步到集群中的从数据库。

当前较为普及的MySQL读写抽离有二种:

1.依据程序代码内部贯彻
在代码中依据select,insert进行路由分类,那类方法也是现阶段添丁境况应用最广大的,优点是性质好,因为在程序代码中落实,无需曾加额外的设备作为硬件开拓,劣点是索要开采人士来兑现,运行人士未能动手。

2.基于中间代理层完毕
代办平时位于客商端和服务器之间,代理服务器接到顾客端乞求后经过判别后转向到后端数据库,有两个代表性程序。

(1卡塔 尔(英语:State of Qatar)mysql-proxy 为mysql开源项目,通过其自带的lua脚本实行SQL判别,纵然是mysql的合法产物,不过mysql官方不提议将其采纳到临蓐处境

(2卡塔 尔(英语:State of Qatar)Amoeba (变形虫卡塔尔由陈思儒开拓,曾就职与Alibaba,该程序由java语言进行开拓,Alibaba将其接纳于生成情状,它不帮衬事物和仓库储存进程通进度序代码完成mysql读写分离自然是四个科学的选项,但是而不是具备的利用都切合在程序代码中完成读写抽离,像有的大型复杂的java应用,假若在程序代码中完成读写抽离对代码退换就非常的大,像这种利用平时会虚构使用代理层来落到实处。

MySQL Master IP: 192.168.200.101
MySQL Slave1 IP: 192.168.200.102
MySQL Slave2 IP: 192.168.200.103
MySQL Amoeba IP: 192.168.200.104
MySQL Client IP: 192.168.200.105

Amoeba (变形虫卡塔尔项目开源框架于二〇〇八年发布少年老成款Amoeba for mysql软件,那些软件从事于mysql的分布式数据库前端代理层,主要为应用层访谈mysql的时候担负SQL路由成效,并持有负载均衡,高可用性,SQL过滤,读写分离,可路由到相关的靶子数据库,可现身乞请多台数据库,通过Amoeba能够做到许多据源的高可用,负载均衡,数据切成条的职能,这段日子Amoeba已经在大多店肆的坐褥线上行使。

1.在主机Amoeba上安装java环境
因为Amoeba基于jdk1.5支付的,所以官方推荐使用jdk1.5 只怕1.6本子,高版本不提议使用
 .bin  通用二进制格式
 
[root@localhost ~]# chmod x jdk-6u31-linux-x64.bin
[root@localhost ~]# ./jdk-6u31-linux-x64.bin
[root@localhost ~]# mv jdk1.6.0_31/ /usr/local/java

[root@localhost ~]# vim /etc/profile
export JAVA_HOME=/usr/local/java
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
[root@localhost ~]# source /etc/profile
[root@localhost ~]# java -version
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)

2.装置并配置Amoeba
[root@localhost ~]# mkdir /usr/local/amoeba
[root@localhost ~]# tar xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
[root@localhost ~]# chmod -R 755 /usr/local/amoeba
[root@localhost ~]# /usr/local/amoeba/bin/amoeba
amoeba start|stop //彰显此内容表达Amoeba安装成功

3.配置Amoeba读写分离,五个Slave读负载均衡
Master,Slave1,Slave第22中学配备放松权利给Amoeba访问
grant all on *.* to 'test'@'192.168.200.%' identified by '123.com';
flush privileges;

编辑amoeba.xml配置文件
[root@localhost ~]# cp /usr/local/amoeba/conf/amoeba.xml{,.bak}
[root@localhost ~]# vim /usr/local/amoeba/conf/amoeba.xml
 27                         <property name="authenticator">
 28                                 <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
 29
 30                                         <property name="user">amoeba</property>
 31
 32                                         <property name="password">123456</property>
 33
 34                                         <property name="filter">
 35                                                 <bean class="com.meidusa.amoeba.server.IPAccessController">
 36                                                         <property name="ipFile">${amoeba.home}/conf/access_list.conf</property>                                        
 37                                                 </bean>
 38                                         </property>
 39                                 </bean>
 40                         </property>
 
 
113                 <property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
114                 <property name="LRUMapSize">1500</property>
115                 <property name="defaultPool">master</property>
116
117                
118                 <property name="writePool">master</property>
119                 <property name="readPool">slaves</property>
120                
121                 <property name="needParse">true</property>
122         </queryRouter>
123 </amoeba:configuration>

 
编纂dbServers.xml配置文件
[root@localhost ~]# cp /usr/local/amoeba/conf/dbServers.xml{,.bak}
[root@localhost ~]# vim /usr/local/amoeba/conf/dbServers.xml

 25                         <!-- mysql user -->
 26                         <property name="user">test</property>
 27
 28                         <property name="password">123.com</property>
 29                 </factoryConfig>

 43         <dbServer name="master"  parent="abstractServer">
 44                 <factoryConfig>
 45                         <!-- mysql ip -->
 46                         <property name="ipAddress">192.168.200.101</property>
 47                 </factoryConfig>
 48         </dbServer>
 
 50         <dbServer name="slave1"  parent="abstractServer">
 51                 <factoryConfig>
 52                         <!-- mysql ip -->
 53                         <property name="ipAddress">192.168.200.102</property>
 54                 </factoryConfig>
 55         </dbServer>
 
 56         <dbServer name="slave2"  parent="abstractServer">
 57                 <factoryConfig>
 58                         <!-- mysql ip -->
 59                         <property name="ipAddress">192.168.200.103</property>
 60                 </factoryConfig>
 61         </dbServer>

 63         <dbServer name="slaves" virtual="true">
 64                 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
 65                         <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
 66                         <property name="loadbalance">1</property>
 67
 68                         <!-- Separated by commas,such as: server1,server2,server1 -->
 69                         <property name="poolNames">slave1,slave2</property>
 70                 </poolConfig>
 71         </dbServer>
 72
 73 </amoeba:dbServers>

配置不错后,运维Amoeba软件,其私下认可端口是tcp 8066

[root@localhost ~]# cd /usr/local/amoeba/      
[root@localhost amoeba]# bin/amoeba start &
[root@localhost amoeba]# netstat -anpt |grep java
tcp        0      0 ::ffff:127.0.0.1:41432      :::*                        LISTEN      4169/java          
tcp        0      0 :::8066                     :::*                        LISTEN      4169/java 

 

测试
在Client上
[root@node1 ~]# yum -y install mysql

然后能够经过代理访谈MySQL

[root@node1 ~]# mysql -u amoeba -p123456 -h 192.168.200.104 -P8066

在mysql上创办二个表,同步到各样从服务器上,然后关掉各类从服务器上的Slave效能,在插入差别语句

mysql> create database db_test;
Query OK, 1 row affected (0.03 sec)

mysql> use db_test;
Database changed
mysql> create table zhang (id int(10),name varchar(10),address varchar(20));
Query OK, 0 rows affected (0.16 sec)

分级在两台从服务器上
mysql> show databases;
--------------------
| Database           |
--------------------
| information_schema |
| db_test            |
| mysql              |
| performance_schema |
| sampdb             |
| test               |
--------------------
6 rows in set (0.01 sec)

mysql> use db_test
Database changed
mysql> show tables;
-------------------
| Tables_in_db_test |
-------------------
| zhang              |
-------------------
1 row in set (0.00 sec)

两台从服务器甘休slave功效
mysql> stop slave;
Query OK, 0 rows affected (0.10 sec)

下一场在主服务器上
mysql> insert into zhang values('1','zhang','this_is_master');
Query OK, 1 row affected (0.18 sec)

slave1:

mysql> use db_test
mysql> insert into zhang values('2','zhang','this_is_slave1');
Query OK, 1 row affected (0.07 sec)

slave2:

mysql> use db_test
mysql> insert into zhang values('3','zhang','this_is_slave2');
Query OK, 1 row affected (0.07 sec)

测验读操作:
在测量试验机上第1次查询结果
mysql> select * from zhang;
------ ------- ----------------
| id   | name  | address        |
------ ------- ----------------
|    2 | zhang | this_is_slave1 |
------ ------- ----------------
1 row in set (0.00 sec)

在测量试验机上第2次查询结果
mysql> select * from zhang;
------ ------- ----------------
| id   | name  | address        |
------ ------- ----------------
|    3 | zhang | this_is_slave2 |
------ ------- ----------------
1 row in set (0.00 sec)

在测量试验机上第3次查询结果
mysql> select * from zhang;
------ ------- ----------------
| id   | name  | address        |
------ ------- ----------------
|    2 | zhang | this_is_slave1 |
------ ------- ----------------
1 row in set (0.00 sec)

 

测验写操作:
在Client上插入一条语句:
mysql> use db_test
mysql> insert into zhang values('4','zhang','write_test');

但在Client上询问不到,最后唯有在Master上才具查看见这条语句内容,表明写操作在master服务器上

mysql> select * from zhang;
------ ------- ----------------
| id   | name  | address        |
------ ------- ----------------
|    1 | zhang | this_is_master |
|    4 | zhang | write_test     |
------ ------- ----------------
1 row in set (0.00 sec)

透过申明,已经落到实处了Mysql读写抽离,前段时间全体的写操作都在Master主服务器上,用来幸免数据的不一致台,所有的读操作都平均给了Slave从服务器,用来平均分摊数据库压力。

 

    Blog_DB1 承载250万顾客的博客小说 User_ID范围值<500万 User_ID取模 % 2 取值0的读此服务器
    Blog_DB2 承载250万客户的博客小说User_ID范围值<500万User_ID取模 % 2 取值1的读此服务器

二、为什么要用Amoeba

    Other_DB1 承载250万客户的别样新闻User_ID范围值<500万User_ID取模 % 2 取值0的读此服务器
    Other_DB2 承载250万顾客的任何信息User_ID范围值<500万User_ID取模 % 2 取值1的读此服务器
    约等于2台机械针对500万客商。各承载了。2分之1,此节制能够遵照ID范围值,Infiniti扩充下去。**

时下要达成mysql的着力读写分离,首要有以下二种方案:

**2》*DB架构图*

1、  通进程序达成,互连网海人民广播广播台湾大学现有的代码,对比复杂,借使加上从服务器要改成多台服务器的代码。

*          澳门新浦京娱乐场网站 6*

2、  通过mysql-proxy来达成,由于mysql-proxy的主旨读写抽离是透过lua脚本来完毕,近年来lua的本子的支付跟不上节奏,而写未有周到的现有的脚本,由此诱致用于临盆条件的话风险比十分的大,据互连网海人民广播电视台湾大学人说mysql-proxy的属性不高。

3》遭受案例实战

3、  本身开拓接口实现,这种方案门槛高,开垦开支高,不是日常的小企能肩负得起。

*   因为大家地点已经讲过了读写分离,这么些实战案例主要讲水平划分,通过Amoeba完毕分割,剖断ID范围值与取模
  1>Amoeba_Server(Linux) 10.0.0.203 实现程度切割
  2>User_DBA_Server1(Linux) 10.0.0.201 承载250万客商中央消息User_ID范围值<500万 User_ID取模 % 2 取值0的读此服务器
  3>User_DBA_Server2(Linux) 10.0.0.202 承载250万顾客核心音信User_ID范围值<500 User_ID取模 % 2 取值1的读此服务器
  一定于2台机械针对500万用三户。各承载了。2分之1,此节制能够依据ID范围值,Infiniti扩大下去。注意那2台机器。并未做主             从,是独立的两台单机MYSQL*

4、  利用阿里Baba(Alibaba卡塔尔国的开源项目Amoeba来完成,具有负载均衡、高可用性、sql过滤、读写抽离、可路由相关的query到目的数据库,並且安装配置非常轻便。国产的开源软件,应该援救,近日正在利用,不登出太多结论,一切等测量检验完再公布结论吧,哈哈!

*4》设置DB_server1 DB_server2 设置Amoeba远程访谈授权*

 

  mysql-->grant all privileges on *.* to amoeba@'%' identified by '123456';

三、快速架设amoeba,完结mysql主从读写分离

  mysql-->flush privileges;

就算amoeba的前提条件:

**5》开创测量试验表**

n         Java SE 1.5 或以上 Amoeba 框架是依靠JDK1.5付出的,采取了JDK1.5的天性。

*  在DB_server1 和DB_server2 上,两侧的表结构甚至表名是同样的。注意。   创建t_user表
  create table zyalvin (
    user_id integer unsigned not null,
    user_name varchar(45),
    user_address varchar(100),
    primary key (user_id)
      )engine=innodb;
  Query OK, 0 rows affected (0.01 sec      *

n         扶植Mysql 协议版本10(mysql 4.1随后的版本卡塔 尔(阿拉伯语:قطر‎。

*6》配置Amoeba IP 与用户*

n         您的互联网情况起码运营有三个mysql 4.1上述的劳务

  vim /usr/local/amoeba/conf/amoeba.xml

       1、首先介绍下自家的施行意况。

         澳门新浦京娱乐场网站 7

              System:    CentOS release 5.4

*7》配置Server1和Server2*

              Master mysql:192.168.1.121

*  配置Server1:*

              Slave mysql:192.168.1.108

*           澳门新浦京娱乐场网站 8*

              Amoeba server:   192.168.1.159

*           配置Server2*

框架结构如如下所示:

*              澳门新浦京娱乐场网站 9*

澳门新浦京娱乐场网站 10

*                   澳门新浦京娱乐场网站 11*

本人这里只用了三个从数据库!

*8》**配备水平划分法规*

2、安装配置mysql主从情形,mysql的设置简便,请自行编写翻译或许用rpm安装

*  # vim /usr/local/amoeba/conf/rule.xml
  tableRule name=”zyalvin,t_user”能够多个表,*

###在master mysql创制同步顾客

***         澳门新浦京娱乐场网站 12***

grant replication slave,file on *.* to 'replication'@'192.168.1.108' identified by '123456';

***          运转服务
     #:nohup bash -x amoeba &   ***

       flush privileges;

***9》**布署测验数据*

####修改master的my.cnf的配置

***  在Amoeba Server登录:
  # mysql -uroot -p123456 -h 192.168.100.214 -P 9006
    mysql->use zytest;
   mysql->insert into zyalvin(user_id,user_name,user_address)values('1','user1','China');
   mysql->insert into zyalvin (user_id,user_name,user_address)values('2','user1','China');
   mysql->insert into zyalvin (user_id,user_name,user_address)values('3','user1','China');
   mysql->insert into zyalvin (user_id,user_name,user_address)values('4','user1','China');
   mysql->insert into zyalvin (user_id,user_name,user_address)values('5','user1','China');
   mysql->insert into zyalvin (user_id,user_name,user_address)values('6','user1','China');
   mysql->insert into zyalvin (user_id,user_name,user_address)values('7','user1','China');
   mysql->insert into zyalvin user_id,user_name,user_address)values('8','user1','China');
   mysql->insert into zyalvin (user_id,user_name,user_address)values('9','user1','China');
   mysql->insert into zyalvin (user_id,user_name,user_address)values('10','user1','China');
   DB_server1查看,偶数全部写入了server1***

log-bin=mysql-bin         #打开mysql二进制日志
server-id       = 1          #设置mysql_id,主从无法同风流倜傥
binlog-do-db=test          #安装二进制日志记录的库
binlog-ignore-db=mysql        ##设置二进制日志不记录的库
sync_binlog=1      

*          澳门新浦京娱乐场网站 13*

####修改slave的my.cnf的配置

*          DB_server2 查看,奇数全体写入了server2*

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

*            澳门新浦京娱乐场网站 14*

slave-net-timeout=60

***总结:**
    (1)amoeba 是依据 sql 解析来展热水平切分的,必要把切分的重视字段(这里是user_id卡塔 尔(阿拉伯语:قطر‎,参与到insert sql语句中,不然切分规              则不行。无效后,会在 server1, server2 均都插入数据。
    (2)amoeba插入数据的时候必需先use dbname(比如要先use test库名,也许查询带上库名和表名,test.t_user) 不然插入数据会默         认插到server1上边
    (3)在rule.xml 钦点的ID范围,在插入数据user_id的时候,不可能超越这些节制,不然分片无效,比方定义的ID范围为:1-500000号
    insert into zyalvin(user_id,user_name,user_address)values('5000001','user1','China');纵然插入ID超过5000000,产生了                   5000001的话那么这么些数额将同期写到server1和server2 招致分片无效。

个别重启主从mysqld服务,登陆主mysql,在主上奉行flush tables with read lock;后将test数据库的多寡copy到从上,并记下下主上show master statusG的结果:

张开以.xml结尾的公文现身乱码时,用以下办法管理:*

如:

*         澳门新浦京娱乐场网站 15*

mysql> show master statusG;

*************************** 1. row ***************************

            File: mysql-bin.000022

        Position: 1237

                  Binlog_Do_DB: test

Binlog_Ignore_DB: mysql

              然后进行unlock tables

              登入从mysql,在从上试行:

stop slave;

change master to master_host='192.168.1.121',master_user='replication',master_password='123456',master_log_file='mysql-bin.000022', master_log_pos=1237;

start slave;

show slave statusG;

              借使现身上边的意况,表达为主同步已经打响!

             Slave_IO_Running: Yes

             Slave_SQL_Running: Yes

             

3、安装JDK环境

       下载jdk1.5要么更新版本,地址

       笔者用的是:jdk-6u20-linux-i586-rpm.bin

       在Amoeba server上执行

chmod x jdk-6u20-linux-i586-rpm.bin

./ jdk-6u20-linux-i586-rpm.bin

##下一场按n次空格键,然后输入yes就能够了!^_ ^

ln -s /usr/java/jdk1.6.0_20/ /usr/java/jdk1.6

vi /etc/profile

#增添如下两行内容

export JAVA_HOME=/usr/java/jdk1.6

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

#执行上边包车型客车一声令下使改过的剧情生效

source /etc/profile

 

4、  安装amoeba-mysql

下载amoeba-mysql,近来风靡版本为amoeba-mysql-1.3.1-BETA.zip

mkdir /usr/local/amoeba/

wget http://blogimg.chinaunix.net/blog/upfile2/101027160252.zip

unzip 101027160252.zip

安插文件位于conf目录下,实践文书位于bin目录下,解压后意识bin目录下的起步文件并未有可履行权限,请试行:chmod -福睿斯 x /usr/local/amoeba/bin/

Amoeba For MySQL 的使用特简单,全数的安顿文件都是专门的学业的XML 文件,总共有四个布局文件。分别为:

◆ amoeba.xml:主配置文件,配置全数数据源以致Amoeba 自己的参数设置;完成宗旨的话配置那一个文件就足以了;

◆ rule.xml:配置全体Query 路由法则的音信;

◆ functionMap.xml:配置用于拆解深入分析Query 中的函数所对应的Java 完结类;

◆ rullFunctionMap.xml:配置路由法则中要求使用到的特定函数的兑现类;

下边我们就来经过改革amoeba.xml配置文件贯彻mysql主从读写分离,笔者的配置如下:

<?xml version="1.0" encoding="gbk"?><!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd"><amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">    <server>        <!-- proxy server绑定的端口 -->        <property name="port">8066</property>                <!-- proxy server绑定的IP -->        <property name="ipAddress">192.168.1.110</property>        <!-- 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>                <!-- socket Send and receive BufferSize(unit:K)  -->        <property name="netBufferSize">128</property>                <!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). -->        <property name="tcpNoDelay">true</property>                <!-- 对外验证的用户名 -->        <property name="user">root</property>                <!-- 对外验证的密码 -->        <property name="password">password</property>                <!-- query timeout( default: 60 second , TimeUnit:second) -->        <property name="queryTimeout">60</property>    </server>        <!--         每个ConnectionManager都将作为一个线程启动。        manager负责Connection IO读写/死亡检测    -->    <connectionManagerList>        <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>        <dbServerList>        <!--             一台mysqlServer 需要配置一个pool,            如果多台 平等的mysql需要进行loadBalance,             平台已经提供一个具有负载均衡能力的objectPool:com.meidusa.amoeba.mysql.server.MultipleServerPool            简单的配置是属性加上 virtual="true",该Pool 不允许配置factoryConfig            或者自己写一个ObjectPool。        -->        <dbServer name="server1">                        <!-- PoolableObjectFactory实现类 -->            <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">                <property name="manager">defaultManager</property>                                <!-- 真实mysql数据库端口 -->                <property name="port">3306</property>                                <!-- 真实mysql数据库IP -->                <property name="ipAddress">192.168.1.121</property>                <property name="schema">test</property>                                <!-- 用于登陆mysql的用户名 -->                <property name="user">zhang</property>                                <!-- 用于登陆mysql的密码 -->                                <property name="password">zhang123</property>                            </factoryConfig>                        <!-- ObjectPool实现类 -->            <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">                <property name="maxActive">200</property>                <property name="maxIdle">200</property>                <property name="minIdle">10</property>                <property name="minEvictableIdleTimeMillis">600000</property>                <property name="timeBetweenEvictionRunsMillis">600000</property>                <property name="testOnBorrow">true</property>                <property name="testWhileIdle">true</property>            </poolConfig>        </dbServer>                <dbServer name="server2">                        <!-- PoolableObjectFactory实现类 -->            <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">                <property name="manager">defaultManager</property>                                <!-- 真实mysql数据库端口 -->                <property name="port">3306</property>                                <!-- 真实mysql数据库IP -->                <property name="ipAddress">192.168.1.108</property>                <property name="schema">test</property>                                <!-- 用于登陆mysql的用户名 -->                <property name="user">zhang</property>                                <!-- 用于登陆mysql的密码 -->                                <property name="password">zhang123</property>                            </factoryConfig>                        <!-- ObjectPool实现类 -->            <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">                <property name="maxActive">200</property>                <property name="maxIdle">200</property>                <property name="minIdle">10</property>                <property name="minEvictableIdleTimeMillis">600000</property>                <property name="timeBetweenEvictionRunsMillis">600000</property>                <property name="testOnBorrow">true</property>                <property name="testWhileIdle">true</property>            </poolConfig>        </dbServer>                <dbServer name="master" virtual="true">            <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">                <!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->                <property name="loadbalance">1</property>                                <!-- 参与该pool负载均衡的poolName列表以逗号分割 -->                <property name="poolNames">server1</property>            </poolConfig>        </dbServer>        <dbServer name="slave" virtual="true">            <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">                <!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->                <property name="loadbalance">1</property>                                <!-- 参与该pool负载均衡的poolName列表以逗号分割 -->                <property name="poolNames">server1,server2</property>            </poolConfig>        </dbServer>            </dbServerList>        <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">        <property name="ruleConfig">${amoeba.home}/conf/rule.xml</property>        <property name="functionConfig">${amoeba.home}/conf/functionMap.xml</property>        <property name="ruleFunctionConfig">${amoeba.home}/conf/ruleFunctionMap.xml</property>        <property name="LRUMapSize">1500</property>        <property name="defaultPool">master</property>                <property name="writePool">master</property>        <property name="readPool">slave</property>        <property name="needParse">true</property>    </queryRouter></amoeba:configuration>

启动amoeba

/usr/local/amoeba/bin/amoeba &

查证运转是不是成功(使用的是私下认可的8066端口卡塔尔:

[root@Centos2 amoeba]# ps aux | grep amoeba

root     24580  0.2 19.2 408912 49264 pts/1    Sl   12:52   0:11 /usr/java/jdk1.6/bin/java -server -Xms256m -Xmx256m -Xss128k -Damoeba.home=/usr/local/amoeba -Dclassworlds.conf=/usr/local/amoeba/bin/amoeba.classworlds -classpath /usr/local/amoeba/lib/classworlds-1.0.jar org.codehaus.classworlds.Launcher

[root@Centos2 amoeba]# netstat -lnp | grep java

tcp        0      0 ::ffff:192.168.1.159:8066   :::*                        LISTEN      24580/java

 

5、  测试

测验以前先要保障amoeba-server有访谈七个基本服务器test库的权限,在着力mysql上都推行:

grant all on test.* to zhang@'192.168.1.%' identified by 'zhang123';

#客商名密码要和前面配置的意志力

flush privileges;

测验的时候和我们寻常应用相同,amoeba-mysql对我们接纳透明,正是个mysql的代办了!

登入mysql使用如下命令(顾客名密码和方面配置的要一直以来卡塔 尔(英语:State of Qatar):

mysql -uroot -ppassword -h192.168.1.159 -P8066

登陆上去后,为了测验读和写必须,先把mysql的主从复制停掉,本领更通晓地看来读写的服务器是哪台,在从上行使stop slave;登陆到amoeba-mysql上,使用命令mysql -uroot -ppassword -h192.168.1.159 -P8066,然后实施写和读操作,查看写的是哪台服务器,读的是哪台服务器,实验结果展现:写只在主上实行,读在主和从都进展,比率是1:1

测验步骤:

还从未停掉从协作此前,成立三个表:

create table zhang (id int(10) ,name varchar(10),address varchar(20));

在从上进行stop slave;

下一场在宗旨上各插入一条分化数量(供测量试验读的时候用卡塔 尔(英语:State of Qatar),

在主上插入:insert into zhang values('1','zhang','this_is_master');

在从上插入:insert into zhang values('2','zhang','this_is_slave');

接下去通过登入amoeba-mysql上来测验读写:

[root@Centos2 ~]# mysql -uroot -ppassword -h192.168.1.159 -P8066

Welcome to the MySQL monitor.  Commands end with ; or g.

Your MySQL connection id is 14556042

Server version: 5.1.45-mysql-amoeba-proxy-1.3.1-BETA Source distribution

 

Type 'help;' or 'h' for help. Type 'c' to clear the buffer.

 

mysql> use test;

Database changed

mysql> select * from zhang;    ###第4回实施显示在主上读取的多寡!

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

| id   | name  | address        |

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

|    1 | zhang | this_is_master |

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

1 row in set (0.02 sec)

 

mysql> select * from zhang;         ####第叁次实行select语句突显是在从上读取的多少

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

| id   | name  | address       |

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

|    2 | zhang | this_is_slave |

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

1 row in set (0.02 sec)

mysql> insert into zhang values('3','hhh','test_write');               ###插入一条数据,然后查询

Query OK, 1 row affected (0.01 sec)

mysql> select * from zhang;                ###我们能够见见插入的数量被增多到了主上!

------ ------- ----------------                    ####能够多插入四遍数据看看是还是不是会情不自禁谬误!

| id   | name  | address        |

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

|    1 | zhang | this_is_master |

|    3 | hhh   | test_write     |

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

mysql> select * from zhang;                ###从上依然不曾加塞儿,因为试行了stop slave;

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

| id   | name  | address       |

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

|    2 | zhang | this_is_slave |

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

 

6、  简单主从权重配置

世家可能会想到,大家投入独有两台数据库服务器,生机勃勃台主,风华正茂台从,根据地点的安顿只可以是主和从的读取比率是1:1,而写又全方位在主上举办,那样主的压力就一点都不小了,所以假若能让主和从的读设置权重,比方设置成1:3,那样就能够很好的解决主从不压力平衡的标题!通过钻研确实能够!

布局正是将上面的读的池的铺排修改一下:

将<property name="poolNames">server1,server2</property>更改成

<property name="poolNames">server1,server2,server2,server2</property>

自身测量试验的结果恰好为1:3,如下:

mysql> select * from zhang;

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

| id   | name  | address        |

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

|    1 | zhang | this_is_master |

|    3 | hhh   | test_write     |

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

2 rows in set (0.01 sec)

 

mysql> select * from zhang;

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

| id   | name  | address       |

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

|    2 | zhang | this_is_slave |

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

1 row in set (0.04 sec)

 

mysql> select * from zhang;

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

| id   | name  | address       |

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

|    2 | zhang | this_is_slave |

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

1 row in set (0.01 sec)

 

mysql> select * from zhang;

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

| id   | name  | address       |

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

|    2 | zhang | this_is_slave |

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

 

学习链接:

开辟者博客链接:

     amoeba 普通话文书档案下载地址:

    amoeba 现在上扬州大学势:

本文由澳门新浦京娱乐场网站发布于数据库,转载请注明出处:澳门新浦京娱乐场网站Amoeba实现MySQL主从读写分离