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如下:
- Master: Master (只写)
- Slaves:Slave1、Slave2 (2个平等的数据库。只读/负载均衡)
案例实现Master、Slaves之间数据库主从复制、读写分离,负载均衡的高可用Mysql架构。
实验架构图:
系统环境:
主机 | 操作系统 | 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
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;
注意: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;
注意: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行--
<property name="user">amoeba</property> #访问amoeba的用户名
----32行---------
<property name="password">123456</property> #密码
---117-去掉注释-
<property name="defaultPool">master</property> #默认为主服务器
<property name="writePool">master</property> #写入为主服务器
<property name="readPool">slaves</property> #读取为slaves池,现有slave1、slave2服务器
13.修改dbServers.xml配置文件
vi dbServers.xml
43 <dbServer name="master" parent="abstractServer"> #name为master
44 <factoryConfig>
45 <!-- mysql ip -->
46 <property name="ipAddress">192.168.100.5</property> #主服务器IP地址
47 </factoryConfig>
48 </dbServer>
49
50 <dbServer name="slave1" parent="abstractServer"> #name为slave1
51 <factoryConfig>
52 <!-- mysql ip -->
53 <property name="ipAddress">192.168.100.6</property> #从服务器1 IP地址
54 </factoryConfig>
55 </dbServer>
56
57 <dbServer name="slave2" parent="abstractServer"> #name为slave2
58 <factoryConfig>
59 <!-- mysql ip -->
60 <property name="ipAddress">192.168.100.7</property> #从服务器2 IP地址
61 </factoryConfig>
62 </dbServer>
63
64 <dbServer name="slaves" virtual="true"> #name为slaves
65 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
66 <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
67 <property name="loadbalance">1</property> #默认为轮询方式
68
69 <!-- Separated by commas,such as: server1,server2,server1 -->
70 <property name="poolNames">slave1,slave2</property> #轮询顺序为:slave1、slave2
71 </poolConfig>
72 </dbServer>
14.启动amoeba服务
/usr/local/amoeba/bin/amoeba start&
15.查看java服务
netstat -anpt | grep java
五、客户端
1.安装mysql软件
yum install -y mysql
2.登录amoeba服务器
mysql -u amoeba -p123456 -h 192.168.100.4 -P8066
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服务器上:
3.Slave1服务器上:
4.Slave2服务器上:
二、验证读写分离
1.分别在两台Slave1、Slave2从服务器上关闭同步
stop slave;
2.在客户端上插入记录,不会同步到从服务器
insert into zang values('1','zhang','this_is_master');
3.Slave1从服务器上插入记录
use db_test;
insert into zang values('2','zhang','this_is_slave1');
4.Slave2从服务器上插入记录
use db_test;
insert into zang values('3','zhang','this_is_slave2');
5.在客户端上测试----第一次会向从服务器Slave1 读数据-第二次会从服务器Slave2读取
#多次执行该sql语句查看
use db_test;
select * from zang;
三、验证负载均衡
1.在客户端上反复执行查询语句,已经轮询访问slave1、slave2服务器了
select * from zang;