Mysql 主从复制及读写分离

特别推荐看:amoeba.xml 的配置部分,在百度上看了很多配置都不完整,是我测试时的痛点


实验的目的:

有两部分:第一实现Mysql主从复制,第二实现读写分离。



下面是实验的环境:

192.168.58.11     安装了amoeba 的节点

192.168.58.16      master    系统:rhel 5.4

192.168.58.12      slave     系统: rhel 5.4

192.168.58.11      代理      系统:rhel 5.4

192.168.58.15      外部机器  系统:Centos7

 

. Mysql 数据库安装      见附件

 

安装过程省

见《Linux下安装和迁移MySQL5.6指南》

 

下面开始配置:

主从复制                            由于图片无法正常显示,在附件中有完整图文模式


服务器 Master :192.168.58.16

Mysql 安装目录: /home/mysql/mysql  

vi  /etc/my.cnf

datadir=/home/mysql

socket=/var/lib/mysql/mysql.socket

 

服务器 Slave    192.168.58.12                     

Mysql 安装目录:/home/mysql/mysql                     

vi  /etc/my.cnf

datadir= /home/mysql

socket=/home/mysql/mysql.socket

 

2. 修改配置文件

vi   /etc/my.cnf

 

 (官方说明:为了使用事务的InnoDB在复制中最大的持久性和一致性,你应该指定innodb_flush_log_at_trx_commit=1,sync_binlog=1选项。)

 

修改master

/etc/my.cnf

1.  log-bin=mysql-bin   #slave会基于此log-bin来做replication  

2.  server-id=1         #master的标示  

3.    

4.  innodb_flush_log_at_trx_commit=1  

5.    

6.  sync_binlog=1  

 

 

修改 slave

 /etc/my.cnf

 

1. [mysqld]  

2.   

3. server-id=2     #slave的标示  

 

master

ps -ef|grep mysql

service mysql  start

 

slave :

 ps -ef|grepmysql

service mysql  start

 

4. Master 上创建一个专门用于复制的账号密码 repl repl

mysql>create  user  'repl'@'%' identified by 'repl';

mysql>grant  replication slave on *.* to 'repl';

mysql>flush  privileges;


5. 启动主从复制功能

 

需要查看 Master 中的  Master status

 

mysql> show  master status;

 

配置从服务器Slave
   mysql>change master tomaster_host='192.168.58.16',master_user='root',master_password='123456',
    master_log_file='mysql-bin.000001',master_log_pos=120;  

                                 //注意不要断开,120数字前后无单引号。

  
Mysql>startslave;    //启动从服务器复制功能

 

检查从服务器复制功能状态:

  
mysql> show slave status\G

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

             Slave_IO_State: Waiting for master to send event
             Master_Host: 192.168.58.16  //
主服务器地址
             Master_User: root   //
授权帐户名,尽量避免使用root
             Master_Port: 3306    //
数据库端口,部分版本没有此行
             Connect_Retry: 60
             Master_Log_File: mysql-bin.000001
             Read_Master_Log_Pos: 120     //#
同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos
             Relay_Log_File: ddte-relay-bin.000003
             Relay_Log_Pos: 251
             Relay_Master_Log_File: mysql-bin.000004
             Slave_IO_Running: Yes    //
此状态必须YES
             Slave_SQL_Running: Yes     //
此状态必须YES
                   ......

注:Slave_IOSlave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)

以上操作过程,主从服务器配置完成。

 

 

下面开始配置:

读写分离     由于图片不能正常显示,在附件中有完整说明

JDK的安装

1)以root身份登录系统,将jdk-6u16-linux-x64.bin通过FTP工具上传到/usr/java目录,执行以下命令:    

[root@localhost java]#chmod +x jdk-6u16-linux-x64.bin

[root@ localhost java]# ./jdk-6u16-linux-x64.bin

2)使用vi/etc/profile命令进入环境变量文件,设置环境变量(此处为所有用户创建统一的JDK,如果需要分别安装不同的版本,请修改当前用户目录下的.bash_profile):

JAVA_HOME=/usr/java/jdk1.6.0_16(其中jdk1.6.0_16是安装JDK后自动生成的)

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

CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH

export PATH JAVA_HOME CLASSPATH


3)使配置生效:source /etc/profile

4) 到此,JDK安装完成,可键入命令查看JAVA版本:

[root@ localhost ~]# java–version

Java(TM) SE Runtime Environment (build 1.6.0_16-b01)

Java HotSpot(TM) 64-Bit Server VM (build 14.2-b01, mixed mode)

出现上述信息表示安装完成。

 

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 -R +x /usr/local/amoeba/bin/

Amoeba For MySQL 的使用非常简单,所有的配置文件都是标准的XML 文件,总共有四个配置文件。分别为:

 amoeba.xml:主配置文件,配置所有数据源以及Amoeba 自身的参数设置;实现主从的话配置这个文件就可以了;

 rule.xml:配置所有Query 路由规则的信息;

 functionMap.xml:配置用于解析Query 中的函数所对应的Java 实现类;

 rullFunctionMap.xml:配置路由规则中需要使用到的特定函数的实现类;

进入主配置文件目录:
[root@Management amoeba]# cd conf/
[root@Management conf]# ls
access_list.conf   amoeba.xml       dbServers.xml    functionMap.xml   log4j.xml    ruleFunctionMap.xml
amoeba.dtd               dbserver.dtd    function.dtd    log4j.dtd               rule.dtd     rule.xml
在这里我主要介绍配置  amoeba.xml、   dbServers.xml、 log4j.xml 三个主要的配置文件,其它文件没有特殊需要默认就可以了。

[root@bb conf]# vi amoeba.xml

 

 

       

               

               8066

 

               

               

               192.168.58.11

                

               

               200

 

               

 

               300

               

               

               300

 

               

               300

 

               

               128

 

               

               true

 

               

               root

 

               

               

               123456

               

 

               

               60

       

 

       

       

               

                       com.meidusa.amoeba.net.AuthingableConnectionManager

 

                       

               

       

 

       

               

    

                   

                   

                     defaultManager

                               

                                3306

                               

                                192.168.58.16

                                test

                              

                                root

                           

                                123456

    

            

                       

                                200

                                200

                                10

                                600000

                                600000

                                true

                               true

                       

               

   

                   

                   

                     defaultManager

                               

                                3306

                               

                                192.168.58.12

                                test

                               

                                root

                           

                                123456

    

            

                       

                                200

                                200

                                10

                                600000

                                600000

                                true

                                true

                       

               

                master"virtual="true">

                       

                               

                                1

 

                               

                                server1

                       

               

" virtual="true">

                       

                               

                                1

 

                               

                                server2

                       

               

       

 

       

       ${amoeba.home}/conf/rule.xml

      ${amoeba.home}/conf/functionMap.xml

${amoeba.home}/conf/ruleFunctionMap.xml

               1500

               master

               master

               slave

               

               true

       

 

                                                  

启动amoeba

/usr/local/amoeba/bin/amoeba &

检验启动是否成功(使用的是默认的8066端口):

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

root     24580  0.219.2 408912 65685pxs/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

 

 

测试

主设置如下:

mysql>grant select,insert,update,delete on *.* to root@'192.168.58.%' identified by '123456';

#用户名密码要和前面配置的意志

mysql>flush privileges;


以后检查权限;

mysql>show grants for root@'192.168.58.%';

 

从设置如下:

mysql>grant select on *.* to root@'192.168.58.%'identified by '123456';

#用户名密码要和前面配置的意志

mysql>flush privileges;

 

在从服务器上

#stop slave;

 

class 为表 ,主从都创建了:

create table class(id int (3),name varchar(6));

insert into class values (001,'aaa');

insert into class values (002,'bbb');

insert into class values (003,'ccc');

 

 

1.在主上 

mysql>insert into class values(004,'master')

2.在从上

msyql>insert into class values(004,'slave')

 

 

在代理上:(192.168.58.15)

#mysql -uroot -p123456 -h192.168.58.11 -P8066

                          ######## 端口号是大写P,登录分离服务器。

 

测试读取是在从库还是主库?

mysql>select * from class;

 

 

测试写入数据是在从库还是主库?

mysql>insert into class values(005,'eee');

 

接下来查询,说明没有发现数据写入数据。

mysql>select * from class;

 

查看写入数据

主服务器:说明写入了数据。

mysql>select * from class;

 

从服务器:说明从服务器上没有写入数据

mysql>select * from class;

 

 

 

在从上:

# start  slave

 

 参考:

主从复制:

http://pengranxiang.iteye.com/blog/1141118      理论不错,实践全是错的

http://369369.blog.51cto.com/319630/790921           实践不错


读写分离:

http://blog.chinaunix.net/uid-20639775-id-154600.html      amoeba.xml 看不懂

http://docs.hexnova.com/amoeba/                                            amoeba 手册

http://wenku.baidu.com/link?url=1sbgL2yxmBcdjHGZz7S19RE-OCU5jFwBC7NUI9CF_FqieOn3vrvijqotG88fAV_U6isMZtoiRAMrjx_aaW1dLPdzeWjQG8eu9o-MLEIBaPG      这个最好