Amoeba是什么?

Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件。这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发,它位于与Client、DBServer(s)之间,对客户端透明。具有 负载均衡、高可用性、SQL过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果

通过Amoeba你能够完成多数据源的高可用、负载均衡、数据切片的功能,目前Amoeba已在很多 企业的生产线上面使用。

分布式数据库代理的相关概念

Amoeba在分布式数据库领域将致力解决数据切分,应付客户端“集中式”处理分布式数据。这里集中式是一个相对概念,客户端不需要知道某种数据的物理存储地。避免这种逻辑出现在业务端,大大简化了客户端操作分布式数据的复杂程度。

分布式数据库系统的优点:

  • 降低费用 。分布式数据库在地理上可以式分布的。其系统的结构符合这种分布的要求。允许用户在自己的本地录用、查询、维护等操作,实行局部控制,降低通信代价,避免集中式需要更高要求的硬件设备。而且分布式数据库在单台机器上面数据量较少,其响应速度明显提升。
  • 提高系统整体可用性。避免了因为单台数据库的故障而造成全部瘫痪的后果。
  • 易于扩展处理能力和系统规模。分布式数据库系统的结构可以很容易地扩展系统,在分布式数据库中增加一个新的节点,不影响现有系统的正常运行。这种方式比扩大集中式系统要灵活经济。在集中式系统中扩大系统和系统升级,由于有硬件不兼容和软件改变困难等缺点,升级的代价常常是昂贵和不可行的。

Amoeba不能做什么?

  • 目前还不支持事务
  • 暂时不支持存储过程(近期会支持)
  • 不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如一次请求返回10w以上甚至更多数据的场合)
  • 暂时不支持分库分表,amoeba目前只做到分数据库实例,每个被切分的节点需要保持库表结构一致

需求案例:

有三个数据库节点分别命名为Master、Slave1、Slave2如下:

  1. Master: Master (只写)
  2. Slaves:Slave1、Slave2 (2个平等的数据库。只读/负载均衡)
    案例实现Master、Slaves之间数据库主从复制、读写分离,负载均衡的高可用Mysql架构。

实验架构图:

Amoeba搭建Mysql集群(实现Mysql主从复制、读写分离、负载均衡)_第1张图片

系统环境:

主机 操作系统 IP地址 软件包
amoeba服务器 CentOS 7.0 x86_64 192.168.100.4 jdk-6u14-linux-x64.bin、amoeba-mysql-binary-2.2.0.tar.gz
Master服务器 CentOS 7.0 x86_64 192.168.100.5 mysql-5.5.24.tar.gz
Slave1服务器 CentOS 7.0 x86_64 192.168.100.6 mysql-5.5.24.tar.gz
Slave2服务器 CentOS 7.0 x86_64 192.168.100.7 mysql-5.5.24.tar.gz
客户端 CentOS 7.0 x86_64 192.168.100.3 mysql

软件包:百度网盘 密码:iikf

开始部署:

一般情况下,我们的集群为内网环境,无法和外网进行联网同步时间,那么这里我们使Slaves服务器与Master服务器进行时间同步。

一 、Master服务器同步时间

1.修改ntp.conf配置文件

vim /etc/ntp.conf

#本地是时钟源
server 127.127.100.0
#设置时间层级为8(限制在15内)
fudge 127.127.100.0 stratum 8

2.启动ntpd服务

service ntpd start

3.关闭防火墙及selinux

service iptables stop
setenforce 0

Slave1、Slave2服务器同步时间

1.启动ntpd服务

service ntpd start

2.关闭防火墙及selinux

service iptables stop
setenforce 0

3.进行时间同步

/usr/sbin/ntpdate 192.168.100.4

二、Master、Slave1、Slave2 分别安装mysql数据库

1.安装 gcc 、 gcc-c++ 、make、cmake ncurses-devel、bison、libaio-devel的软件包

yum install gcc gcc-c++ make cmake ncurses-devel bisonlibaio-devel -y

2.mysql软件包解压至/opt目录下

tar zxvf mysql-5.5.24.tar.gz -C /opt/

3.创建mysql用户

useradd  -s /sbin/nologin mysql

4.创建mysql目录

mkdir /usr/local/mysql

5.进入mysql目录进行软件包安装

cd /opt/mysql-5.5.24

#配置mysql

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DMYSQL_UNIX_ADDR=/home/mysql/mysql.sock
-DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci
-DWITH_EXTRA_CHARSETS=all
-DWITH_MYISAM_STORAGE_ENGINE=1
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_MEMORY_STORAGE_ENGINE=1
-DWITH_READLINE=1
-DENABLED_LOCAL_INFILE=1
-DMYSQL_DATADIR=/home/mysql
-DMYSQL_USER=mysql
-DMYSQL_TCP_PORT=3306

6.编译及安装(时间比较长)

make & make install

7.修改mysql目录的属主、属组信息

chown -R mysql.mysql /usr/local/mysql         

8.添加mysql的环境变量

vi /etc/profile

export PATH=$PATH:/usr/local/mysql/bin/

9.更新环境变量

source /etc/profile

10.复制mysql默认配置文件及启动脚本

cp /opt/mysql-5.5.24/support-files/my-medium.cnf /etc/my.cnf
cp /opt/mysql-5.5.24/support-files/mysql.server /etc/init.d/mysqld          

11.修改mysqld启动脚本执行权限

chmod 755 /etc/init.d/mysqld

12.添加至启动项并init3/5自动启动mysql服务

chkconfig --add /etc/init.d/mysqld                      
chkconfig mysqld --level 35 on                           

13.初始化mysql数据库

/usr/local/mysql/scripts/mysql_install_db \
--user=mysql \
--ldata=/var/lib/mysql \
--basedir=/usr/local/mysql \
--datadir=/home/mysql

14.建立软连接

ln -s /var/lib/mysql/mysql.sock /home/mysql/mysql.sock

15.配置mysqld中的mysql安装路径及数据目录路径

vi /etc/init.d/mysqld

basedir=/usr/local/mysql
datadir=/home/mysql

16.启动mysql服务

service mysqld start

17.修改mysql管理员(root)用户的密码

mysqladmin -u root password 'pwd123'

18.登录mysql测试

mysql -uroot -p pwd123

Amoeba搭建Mysql集群(实现Mysql主从复制、读写分离、负载均衡)_第2张图片

19.关闭防火墙及selinux

service iptables stop
setenforce 0

特别提醒:以上三台mysql服务器安装步骤一样


三、mysql主从服务器

Master主服务器配置

1.修改my.cnf

vim /etc/my.cnf

server-id = 1 #修改id号
log-bin=master-bin #新增,主服务器日志文件
log-slave-updates=true #新增,从服务器更新二进制日志

2.重启mysql服务

service mysqld restart

3.登录mysql

mysql -u root -p

4.为Slaves从服务器同步创建用户

GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.100.%' IDENTIFIED BY '123456';

5.以上修改直接生效

FLUSH PRIVILEGES;

6.查看master状态信息

show master status;

+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000002 | 339 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Slave1从服务器配置

1.修改my.cnf

vim /etc/my.cnf

server-id = 11 #修改id号
relay-log=relay-log-bin #新增,从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index #新增,定义relay-log的位置和名称

2.重启mysql服务

service mysqld restart

3.登录mysql

mysql -u root -p

4.添加向主服务器同步数据命令

change master to master_host='192.168.100.5',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=339;

5.开启slave从服务器

start slave;

6.查看slave状态

show slave status\G;

Amoeba搭建Mysql集群(实现Mysql主从复制、读写分离、负载均衡)_第3张图片
注意:Slave_IO_Running和Slave_SQL_Running状态都为‘Yes’,复制状态正常。

Slave2从服务器配置

1.修改my.cnf

vim /etc/my.cnf

server-id = 12 #修改id号
relay-log=relay-log-bin #新增,从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index #新增,定义relay-log的位置和名称

2.重启mysql服务

service mysqld restart

3.登录mysql

mysql -u root -p

4.添加向主服务器同步数据命令

change master to master_host='192.168.100.5',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=339;

5.开启slave从服务器

start slave;

6.查看slave状态

show slave status\G;

Amoeba搭建Mysql集群(实现Mysql主从复制、读写分离、负载均衡)_第4张图片

注意:Slave_IO_Running和Slave_SQL_Running状态都为‘Yes’,复制状态正常。

7.验证主从同步

在Master主服务器上创建数据库:

create database db_test;

分别查看Slave从服务器上数据库:

show databases;

四、amoeba服务器

1.关闭防火墙及selinux

service iptables stop
setenforce 0

2.复制jdk包及安装

cp jdk-6u14-linux-x64.bin /usr/local/
./jdk-6u14-linux-x64.bin          #  yes     按enter

3.修改jdk目录名称

mv jdk1.6.0_14/ /usr/local/jdk1.6

4.添加jdk、jre、amoeba环境变量

vi /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

5.刷新环境变量

source /etc/profile

6.创建amoeba目录

mkdir /usr/local/amoeba

7.解压amoeba软件包至/usr/local/amoeba目录下

tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/

8.修改amoebab目录权限

chmod -R 755 /usr/local/amoeba/

9.验证amoeba是否安装成功

/usr/local/amoeba/bin/amoeba
#显示amoeba start|stop说明安装成功

10.分别在三台mysql上添加权限提供给amoeba访问

10.1 登录mysql

mysql -u root -p abc123

10.2 为amoeba授权访问

grant all on *.* to amoeba@'192.168.100.%' identified by '123123';

11.回到amoeba服务器,修改其配置文件

cd /usr/local/amoeba/conf

12.编辑amoeba.xml配置文件

vim amoeba.xml

---30行--
amoeba #访问amoeba的用户名
----32行---------
123456 #密码
---117-去掉注释-
master #默认为主服务器
master #写入为主服务器
slaves #读取为slaves池,现有slave1、slave2服务器

Amoeba搭建Mysql集群(实现Mysql主从复制、读写分离、负载均衡)_第5张图片

Amoeba搭建Mysql集群(实现Mysql主从复制、读写分离、负载均衡)

13.修改dbServers.xml配置文件

vi dbServers.xml

43 #name为master
44
45
46 192.168.100.5 #主服务器IP地址
47

48

49
50 #name为slave1
51
52
53 192.168.100.6 #从服务器1 IP地址
54

55

56
57 #name为slave2
58
59
60 192.168.100.7 #从服务器2 IP地址
61

62

63
64 #name为slaves
65
66
67 1 #默认为轮询方式
68
69
70 slave1,slave2 #轮询顺序为:slave1、slave2
71

72

14.启动amoeba服务

/usr/local/amoeba/bin/amoeba start&

15.查看java服务

netstat -anpt | grep java

Amoeba搭建Mysql集群(实现Mysql主从复制、读写分离、负载均衡)

五、客户端

1.安装mysql软件

yum install -y mysql

2.登录amoeba服务器

mysql -u amoeba -p123456 -h 192.168.100.4 -P8066

Amoeba搭建Mysql集群(实现Mysql主从复制、读写分离、负载均衡)_第6张图片

3.关闭防火墙及selinux

service iptables stop
setenforce 0

六、客户端测试访问

一、验证主从复制

1.在Master服务器上创建表

mysql -u root -p

create database db_test;
use db_test;
create table zang (id int(10),name varchar(10),address varchar(20));
2.Master服务器上:

Amoeba搭建Mysql集群(实现Mysql主从复制、读写分离、负载均衡)_第7张图片

3.Slave1服务器上:

Amoeba搭建Mysql集群(实现Mysql主从复制、读写分离、负载均衡)_第8张图片

4.Slave2服务器上:

Amoeba搭建Mysql集群(实现Mysql主从复制、读写分离、负载均衡)_第9张图片

二、验证读写分离

1.分别在两台Slave1、Slave2从服务器上关闭同步

stop slave;

2.在客户端上插入记录,不会同步到从服务器

insert into zang values('1','zhang','this_is_master');

Amoeba搭建Mysql集群(实现Mysql主从复制、读写分离、负载均衡)_第10张图片

3.Slave1从服务器上插入记录

use db_test;
insert into zang values('2','zhang','this_is_slave1');

Amoeba搭建Mysql集群(实现Mysql主从复制、读写分离、负载均衡)_第11张图片

4.Slave2从服务器上插入记录

use db_test;
insert into zang values('3','zhang','this_is_slave2');

Amoeba搭建Mysql集群(实现Mysql主从复制、读写分离、负载均衡)_第12张图片

5.在客户端上测试----第一次会向从服务器Slave1 读数据-第二次会从服务器Slave2读取

#多次执行该sql语句查看
use db_test;
select * from zang;

Amoeba搭建Mysql集群(实现Mysql主从复制、读写分离、负载均衡)_第13张图片

三、验证负载均衡

1.在客户端上反复执行查询语句,已经轮询访问slave1、slave2服务器了

select * from zang;

Amoeba搭建Mysql集群(实现Mysql主从复制、读写分离、负载均衡)_第14张图片