Mysql主从复制和读写分离Amoeba实现

来源:互联网 发布:制作游戏的软件 编辑:程序博客网 时间:2024/05/21 12:41

具体实现

Mysql数据库读写分离的具体实现主要包括两个部分配置,即数据主从复制和Amoeba代理,现分别进行介绍:

整个环境的结构图如下所示:

这里写图片描述

主从复制

查看Master服务器是否已经安装Mysql数据库

[root@master ~]# rpm -qa | grep mysql

若无消息显示,则进行Mysql安装,否则跳过此步骤

[root@master ~]# yum install -y mysql-server mysql mysql-devel mysql-libs

启动Mysql服务

[root@master ~]# service mysqld start

接下来,设置Mysql账户密码

[root@master ~]# mysqladmin -u root password 'yourpassword'

此时,可以用刚才设置的账户密码登陆数据库

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

至此,Mysql数据库安装成功。同样的,对Slave1服务器和Slave2服务器安装Mysql数据库,此处略去。接下来,开始进行数据库主从复制的配置
1. 主数据库配置

[root@master ~]# vi /etc/my.cnf  #开启二进制日志,设置id     [mysqld]     server-id = 1                #Slave这台设置2     log-bin = mysql-bin     binlog-ignore-db = mysql,information_schema #忽略写入binlog日志的库     auto-increment-increment = 2        #字段变化增量值     auto-increment-offset = 1           #初始字段ID为1     slave-skip-errors = all             #忽略所有复制产生的错误     log-slave-updates = true            #运行slave更新日志

重启Mysql服务,使配置生效

[root@master ~]# service mysqld restart

登陆数据库

[root@master ~]# mysqladmin -u root password 'yourpassword'

查看下log bin日志和pos值位置

mysql> show master status\G*************************** 1. row ***************************            File: mysql-bin.000001        Position: 1141    Binlog_Do_DB: Binlog_Ignore_DB: mysql,information_schema1 row in set (0.00 sec)

可以看出,Binlog_Ignore_DB显示的信息就是刚才我们在配置文件所配置的信息。此外,还有两个重要的参数需要记下:mysql-bin.000001和1141。从数据库就是根据这两个参数,完成主从复制,以达到数据同步的效果。
从数据库要读取主数据库日志文件,需要主数据开放授权用户

mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.0.%' IDENTIFIED  BY '123456';mysql> flush privileges;

进行从数据库配置时,将使用到授权用户
至此,完成主数据库配置。接下来,让我们进行从数据库配置。
2. Mysql slave从服务器配置
从数据库配置相对主数据配置相对简单,主要包括配置文件修改和主从复制设置

[root@slave1 ~]# vi /etc/my.cnf  #开启二进制日志,设置id     [mysqld]     server-id = 2                    #Slave这台设置2     relay-log=relay-log-bin    relay-log-index=slave-relay-bin.index

登陆数据库,设置主从同步。

[root@slave1 ~]# mysql -u root -p
mysql> change master to master_host='192.168.29.128',master_user='replication',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=106;

启动主从复制

[root@slave1 ~] slave start;

查询slave状态

mysql> show slave status\G*************************** 1. row ***************************               Slave_IO_State: Reconnecting after a failed master event read                  Master_Host: 192.168.1.117                  Master_User: replication                  Master_Port: 3306                Connect_Retry: 60              Master_Log_File: mysql-bin.000001          Read_Master_Log_Pos: 1141               Relay_Log_File: relay-log-bin.679793                Relay_Log_Pos: 251        Relay_Master_Log_File: mysql-bin.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: 1141              Relay_Log_Space: 549              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: 0Master_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_IO_Running和Slave_SQL_Running都显示Yes时,才表示主从复制配置成功。否则失败,检查上述配置过程。
Mysql Slave2服务器从数据库的配置过程类似,此处略去。

主从复制验证

首先,在主数据建立一个db_test数据库,看两个从数据库是否会自动进行复制。
在Master服务器登录主数据库,查看现有数据库。

mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || mysql              || test               |+--------------------+

现在,新增一个测试数据库db_test。

mysql> create database db_test;+--------------------+| Database           |+--------------------+| information_schema || db_test            || mysql              || test               |+--------------------+

接下来,分别登录Mysql Slave1服务器和Mysql Slave2服务器的从数据库,查询数据库。

mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || db_test            || mysql              || test               |+--------------------+

可以发现,当主数据库发生改动,从数据库会相应同步,并且同步的过程是异步进行的。因此,可以验证我们配置的主从复制已经生效。

Amoeba数据库代理

需要:jdk、amoeba包
安装jdk

[root@localhost ~]# chmod +x ./jdk-6u14-linux-x64.bin [root@localhost ~]# ./jdk-6u14-linux-x64.bin [root@localhost ~]# mv jdk1.6.0_14/ /usr/local/jdk1.6[root@localhost ~]# vim /etc/profile    //增加export JAVA_HOME=/usr/local/jdk1.6export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/libexport PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/binexport AMOEBA_HOME=/usr/local/amoeba/export PATH=$PATH:$AMOEBA_HOME/bin[root@localhost ~]# source /etc/profile[root@localhost ~]# java -versionjava version "1.6.0_14"         #说明jdk配置OKJava(TM) SE Runtime Environment (build 1.6.0_14-b08)Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)

或者调用虚拟机java环境
这里写图片描述

安装amoeba 2.2.0软件

Amobea下载地址

[root@localhost ~]# mkdir /usr/local/amoeba
[root@localhost ~]# tar zxf 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/amoebaamoeba start|stop       #说明软件安装OK

但是提示出现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.

解决方法:
打开bin目录下 的amoeba启动文件

[root@localhost ~]#  vim amoeba

修改58行的Xss参数:

DEFAULT_OPTS=”-server -Xms1024m -Xmx1024m -Xss128k”
修改为:
DEFAULT_OPTS=”-server -Xms1024m -Xmx1024m -Xss256k”

在master、slave上开放权限

mysql> grant all on *.* to 'test'@'192.168.29.%' identified by '123.com';mysql> flush privileges;

修改Amoeba配置文件

[root@localhost ~]# cd /usr/local/amoeba/[root@localhost amoeba]# cp conf/amoeba.xml conf/amoeba.xml.bak[root@localhost amoeba]# vim conf/amoeba.xml

这里写图片描述

这里写图片描述

[root@localhost amoeba]# vim conf/dbServers.xml

这里写图片描述

这里写图片描述

这里写图片描述

配置完成后,重启Amoeba。

读写分离验证

[root@localhost ~]# mysql -uamoeba -p123456 -h 192.168.1.117 -P8066

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

Mysql Mster服务器创建一个表。

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

而后,分别停止Mysql Slave1服务器和Mysql Slave2服务器两个从数据库的主从复制,便于数据库操作观察。
登陆Mysql Slave1服务器,停止从数据库主从复制。

[root@slave1 ~]# mysql -u root -p
mysql> slave stop;

登陆Mysql Slave2服务器,停止从数据库主从复制。

[root@slave2 ~]# mysql -u root -p
mysql> slave stop;

Mysql Master服务器数据库插入。

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

Mysql Slave1数据库插入。

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

Mysql Slave2数据库插入。

mysql> insert into stu values('3','jhon');

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

[root@localhost ~]# mysql -uamoeba -p123456 -h 192.168.1.117 -P8066
mysql> use test;mysql> select * from stu;+------+------+| id   | name |+------+------+|    2 | lisi |+------+------+mysql> select * from stu;+------+------+| id   | name |+------+------+|    3 | john |+------+------+

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

[root@master ~]# mysql -uroot -pyourpassword 
mysql> use test;mysql> select * from stu;+------+----------+| id   | name     |+------+----------+|    1 | zhangsan |+------+----------+

可以验证,使用Amoeba对Mysql读写分离成功。