前言:作者踏入Linux大门不久,这是第一个完成的功能演练。本文包含了MySQL+Amoeba实现主从读写分离的配置及个人过程中遇到的问题总结,网上相关教学也很多,如有错误和疏漏请多多指教。
主从同步架构的优点
- 读取工作交给了从服务器,降低了主服务器的压力
- 在从服务器进行备份,避免备份期间影响主服务器服务
- 当主服务器出现问题时,可以切换到从服务器。
Amoeba介绍
Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件。这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的 时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发。座落与 Client、DB Server(s)之间,对客户端透明。具有负载均衡、高可用性、SQL 过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。 通过Amoeba你能够完成多数据源的高可用、负载均衡、数据切片的功能。本次主要用到的就是Amoeba for Mysql这个软件。
MySQL的主从同步配置
实验环境
- 服务器类型:虚拟机
- 系统: CentOS release 6.8 (Final)
- MySQL: 5.1.73
- 主数据库: 172.16.2.239
- 从数据库: 172.16.2.230
配置主库
- 本次操作使用yum服务进行安装,输入yum -y install mysql(注:-y 表示安装过程自动选择’y’)
- service mysql start 启动MySQL服务
- 在root账户下使用 mysqladmin -u root password ‘newpassword’为mysql的root账户设置密码(注:首次登录root账号没有密码,直接回车进入,但没有设置密码无法进行很多操作)
- mysql -u root -p 输入密码后登录
- grant replication salve on *. * to ‘root’@’172.16.2.230’ identified by ‘123456’ (添加从库到本机同步的远程账号下,root是账号,ip为从库地址,123456为登录密码)
- select user, host,password from mysql.user查看是否创建成功并查看有无账号密码为空的账户,并删除(注:这步不是必须,空账户的存在会影响登录,这是在遇到问题之前先进行排除)
- vim /etc/my.cnf
(server-id 不能与其它节点重复,replicate_ignore_db设置了不进行同步的databases) - 退出MySQL,service mysqld restart重启后登录,查看server_id 以及 File+position信息并记录
配置从库
- 在172.16.2.230上开始配置从库,安装过程参照主库(这里笔者使用的是默认数据库作为主从,所以直接用yum安装从库,如果主库有改动需要保持一致则使用dump备份并在从库节点上恢复的方式配置)
- vim /etc/my.cnf 编辑配置文件
(注:这里的server-id一定不能与主库相同) - service mysqld restart重启数据库
- mysql -u root -p -h 172.16.2.239验证连接主库(此处的root为在主库中授权过的账号)
- 退出远程连接,换为本地root账号登录,SHOW VARIABLES LIKE ‘server_id’查看ID号确认是否和主库重复
- slave stop;关闭同步服务
- change master to master_host=’172.16.2.239’, master_user=’root’, master_password=’123456’, master_log_file=’master_bin.000019’, master_log_pos=106;(注:此处的master_user为授权的账号,log_file和pos为之前主库上查看的记录,见上面第8步。如果在主库中在未同步的情况下使用过flush privileges命令刷新过数据库的话,log_file会自动+1)
- slave star**t 打开同步,**show slave status查看状态
这里主要注意的是Slave_IO_Running 和 shlave_SQL_Running是否为Yes,如果为NO,注意检查配置 - 检查完状态后可以在主库中的test库中建立一张表,写入完成后便能再从库中查看,同步完成
安装配置 Amoeba
1.配置JAVA环境
此处需要下载JDK,笔者图方便直接从yum上进行下载安装,yum -y install java-1.6.0-openjdk 这里使用的是1.6的版本。也可以直接使用wget 到Oracle上进行下载,只不过需要解压建立连接等操作。
vim /etv/profile 进行java环境变量的配置,注意下载方式不同,路径也不同
完成后执行source profile ,使用java -verison查看
2. 安装Amoeba
wget https://sourceforge.net/projects/amoeba/files/Amoeba_for_mysql/2.2.x/amoeba-mysql-binary-2.2.0.tar.gz/download
mkdir /usr/local/amoeba-2.2.0
tar xvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba-2.2.0
3.配置Amoeba
vim /usr/local/amoeba-2.2.0/conf/dbServers.xml
- port = 3306指的是主从数据库的端口号
- schema = test指的是amoeba代理数据库的名称
- user = root 以及 password 是amoeba登录主从服务器的账号密码,因此要注意这里的账户必须有访问两个数据库的权限才行
- 这里的localhost指的是主库的代号,底下的ipAddress为主库地址
- slave指的是从库的代号,底下的ipAddress为从库地址
- 轮询的主和从的读设置权重设置成1:3,这样就可以很好的解决主从不压力均衡的问题
vim /usr/local/amoeba-2.2.0/conf/amoeba.xml
- 这里的8066端口为amoeba代理所监听的端口
- user 和 password 是用来登录amoeba代理所使用的账号信息
- LRUMapSize定义了Amoeba缓存的SQL语句解析条数
- defaultPool配置了默认的节点,一些除了SELELCT/UPDATE/INSERT/DELETEDE的语句都会在上面执行
- writePool配置了写库,通常就是主库
- readPool配置了读库,可以为一个也可以是数据库池
这样Amoeba的配置就完成了(注:关于配置文件的参数意义在amoeba文档中有完整的解释)
接下来进行环境变量的配置,vim /etc/profile.d/amoeba.sh
export AMOEBA_HOME=/usr/local/amoeba-2.2.0/
export PATH=$AMOEBA_HOME/bin/:$PATH
4.启动Amoeba
执行amoeba start
The stack size specified is too small, Specify at least 160k
Could not create the Java virtual machine.
如果报以上错误,需编辑二进制脚本,因为JAVA启动对xss参数最小值有限制
vim /usr/local/amoeba-2.2.0/bin/amoeba
DEFAULT_OPTS=”-server -Xms256m -Xmx256m -Xss128k”
修改为如下
DEFAULT_OPTS=”-server -Xms256m -Xmx256m -Xss256k”
(注:如果启动失败要主要看有无 Amoeba Monitor Server shutdown completed!,如果没有请执行一遍amoeba stop)
5.连接amoeba
正常启动后连接amoeba数据库,mysql -u root -p -h 172.16.2.231 -P8066
这就是正常启动后的提示信息,如果提示错误的话可能性很多,但大多数是网络(防火墙没关,主从数据库未启动等)、权限(主从数据库未提供amoeba账号权限等)以及配置的问题,多多阅读错误提示和日志能让你更快的定位到错误
6.测试
测试的方法有很多种这里就不举例了,主要的思想是:
- 在amoeba上创建表,测试操作是否同步主从;
- 将从库的同步关闭slave stop,在amoeba上进行写操作看是否只有主库写入;在主从上分别插入一条数据,并在amoba上执行读操作看显示的数据等。