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

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主从复制、读写分离、负载均衡)

系统环境:

主机操作系统IP地址软件包
amoeba服务器CentOS 7.0 x86_64192.168.100.4jdk-6u14-linux-x64.bin、amoeba-mysql-binary-2.2.0.tar.gz
Master服务器CentOS 7.0 x86_64192.168.100.5mysql-5.5.24.tar.gz
Slave1服务器CentOS 7.0 x86_64192.168.100.6mysql-5.5.24.tar.gz
Slave2服务器CentOS 7.0 x86_64192.168.100.7mysql-5.5.24.tar.gz
客户端CentOS 7.0 x86_64192.168.100.3mysql

软件包:百度网盘 密码: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主从复制、读写分离、负载均衡)

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主从复制、读写分离、负载均衡)
注意: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主从复制、读写分离、负载均衡)

注意: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服务器

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

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

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

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

五、客户端

1.安装mysql软件
yum install -y mysql
2.登录amoeba服务器
mysql -u amoeba -p123456 -h 192.168.100.4 -P8066

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

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主从复制、读写分离、负载均衡)

3.Slave1服务器上:

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

4.Slave2服务器上:

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

二、验证读写分离

1.分别在两台Slave1、Slave2从服务器上关闭同步
stop slave;
2.在客户端上插入记录,不会同步到从服务器
insert into zang values('1','zhang','this_is_master');

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

3.Slave1从服务器上插入记录
use db_test;
insert into zang values('2','zhang','this_is_slave1');

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

4.Slave2从服务器上插入记录
use db_test;
insert into zang values('3','zhang','this_is_slave2');

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

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

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

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

三、验证负载均衡

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值