具体实现
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_schema
1 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: 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_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.6
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_14" #说明jdk配置OK
Java(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软件
[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/amoeba
amoeba 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读写分离成功。