欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

001.Amoeba读写分离部署

程序员文章站 2022-03-15 23:19:06
一 Amoeba简介 Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba forMysql软件。这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发。座落与 C ......

一 amoeba简介

amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 amoeba formysql软件。这个软件致力于mysql的分布式数据库前端代理层,它主要在应用层访问mysql的时候充当sql路由功能,专注于分布式数据库代理层(database proxy)开发。座落与 client、db server(s)之间,对客户端透明。具有负载均衡、高可用性、sql 过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。通过amoeba你能够完成多数据源的高可用、负载均衡、数据切片的功能,目前amoeba已在很多企业的生产线上面使用。
主要解决:
• 降低 数据切分带来的复杂多数据库结构
• 提供切分规则并降低 数据切分规则 给应用带来的影响
• 降低db 与客户端的连接数
• 读写分离

二 前期规划

1.1 主机规划

1.2 虚拟ip规划

 

1.3 用户列表

 
提示:以上角色需要在所有节点添加。
 

1.4 整体架构

三 mysql-mmm基础部署

略,具体可参考《002.mmm双主-双从读写分离部署》。

四 基础jdk安装

4.1 jdk下载

下载链接:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
jdk版本:jdk-8u144-linux-x64.rpm

4.2 jdk安装及配置

  1 [root@amoeba tmp]# rpm -ivh jdk-8u144-linux-i586.rpm
  2 [root@amoeba ~]# vi /etc/profile
  3 #set java environment
  4 java_home=/usr/java/jdk1.8.0_144/
  5 jre_home=/usr/java/jdk1.8.0_144/jre/
  6 class_path=.:$java_home/lib/dt.jar:$java_home/lib/tools.jar:$jre_home/lib
  7 path=$path:$java_home/bin:$jre_home/bin
  8 export java_home jre_home class_path path
  9 [root@amoeba ~]# source /etc/profile
 10 [root@amoeba ~]# java -version			#验证是否安装成功
 

五 amoeba安装

5.1 amoeba下载

  1 [root@amoeba tmp]# wget https://nchc.dl.sourceforge.net/project/amoeba/amoeba%20for%20mysql/3.x/amoeba-mysql-3.0.5-rc-distribution.zip
  2 [root@amoeba tmp]# unzip amoeba-mysql-3.0.5-rc-distribution.zip -d /usr/local/
  3 [root@amoeba ~]# mv /usr/local/amoeba-mysql-3.0.5-rc/ /usr/local/amoeba
 

5.2 amoeba-dbservers配置

  • dbservers.xml:读写分离配置文件
  • access_list.conf:ip访问列表控制配置文件
  • amoeba的配置文件路径:/usr/local/amoeba/conf
  1 [root@amoeba ~]# vi /usr/local/amoeba/conf/dbservers.xml
  2 ……
  3             <property name="port">3306</property>	#设置amoeba要连接的mysql数据库的端口,默认是3306。
  4             <property name="schema">testdb</property>
  5 #设置缺省的数据库,当连接amoeba时,操作表必须显式的指定数据库名,即采用dbname.tablename的方式,不支持use dbname指定缺省库,因为操作会调度到各个后端dbserver。
  6 <property name="user">test1</property>
  7             <property name="password">x12345678</property>
注意:设置amoeba连接后端数据库服务器的账号和密码,因此需要在所有后端数据库上创建该用户,并授权amoeba服务器可连接。
  1 ……
  2             <property name="maxactive">500</property>	#最大连接数,默认500
  3             <property name="maxidle">500</property>	#最大空闲连接数
  4             <property name="minidle">1</property>	#最新空闲连接数
  5 ……
  6     <dbserver name="writedb"  parent="abstractserver">
  7 #设置一个后端可写的dbserver,这里定义为writedb,这个名字可以任意命名,后面还会用到。
  8         <factoryconfig>
  9             <property name="ipaddress">172.24.8.100</property>
 10 #设置后端可写dbserver ip。
 11         </factoryconfig>
 12     </dbserver>
 13 
 14     <dbserver name="slave01"  parent="abstractserver">
 15         <factoryconfig>
 16             <property name="ipaddress">172.24.8.101</property>
 17         </factoryconfig>
 18     </dbserver>
 19 
 20     <dbserver name="slave02"  parent="abstractserver">
 21         <factoryconfig>
 22             <property name="ipaddress">172.24.8.102</property>
 23         </factoryconfig>
 24     </dbserver>
 25 
 26     <dbserver name="slave03"  parent="abstractserver">
 27         <factoryconfig>
 28             <property name="ipaddress">172.24.8.103</property>
 29         </factoryconfig>
 30     </dbserver>
 31 
 32     <dbserver name="slave04"  parent="abstractserver">
 33         <factoryconfig>
 34             <property name="ipaddress">172.24.8.104</property>
 35         </factoryconfig>
 36     </dbserver>				                #以上设置四台后端可读节点信息。
 37     <dbserver name="myslave" virtual="true">
 38 #设置定义一个虚拟的dbserver,实际上相当于一个dbserver组,这里将可读的数据库ip统一放到一个组中,将这个组的名字命名为myslave。
 39         <poolconfig class="com.meidusa.amoeba.server.multipleserverpool">
 40             <!-- load balancing strategy: 1=roundrobin , 2=weightbased , 3=ha-->
 41             <property name="loadbalance">1</property>	#选择调度算法,1表示负载均衡,2表示权重,3表示ha, 这里选择1。
 42 
 43             <!-- separated by commas,such as: server1,server2,server1 -->
 44             <property name="poolnames">slave01,slave02,slave03,slave04</property>	#myslave组成员。
 45         </poolconfig>
 46     </dbserver>
 

5.3 amoeba-amoeba配置

  1 [root@amoeba ~]# vi /usr/local/amoeba/conf/amoeba.xml
  2 ……
  3             <property name="port">8066</property>	#设置amoeba监听的端口,默认是8066
  4 ……
  5 <property name="ipaddress">127.0.0.1</property>   	#配置监听的接口,如果不设置,默认监听所以的ip
  6 ……
  7 <property name="user">root</property>
  8 <property name="password">x120952576</property>
 
注意:
  • 以上配置客户端连接amoeba时需要使用这里设定的账号;
  • 此处账号密码和amoeba连接后端数据库服务器的密码无关;
  • 前端应用程序连接数据库的地址就是amoeba服务器的值,连接用户名和密码即为此处配置的用户名和密码。
  1 ……
  2 <property name="defaultpool">writedb</property>        #设置amoeba默认的池,这里设置为writedb
  3 <property name="writepool">writedb</property>
  4 <property name="readpool">myslave</property>
  5 <property name="needparse">true</property>             #取消注释,则指定前面定义好的俩个读写池。
 

六 数据库配置

6.1 创建数据库

  1 [root@client ~]# mysql -ummm_test -px120952576 -h172.24.8.100        #从客户端使用可写vip连接数据库
  2 mysql> create database testdb;				         #曾经testdb数据库
  3 [root@master02 ~]# mysql -uroot -px120952576		         #使用master02进入
  4 mysql> show databases;					         #验证是否复制成功
 
提示:其他节点测试略。

6.2 授权amoeba用户

  1 [root@master01 ~]# mysql -uroot -px120952576
  2 mysql> grant all on testdb.* to 'test1'@'172.24.8.14' identified by 'x12345678';
 
注意:其他所有节点均需要授权此用户。

七 启动amoeba

  1 [root@amoeba ~]# /usr/local/amoeba/bin/launcher
可能会出现以下报错,原因是stack size太小,导致jvm启动失败
可执行如下修复操作:
  1 [root@amoeba ~]# vim /usr/local/amoeba/jvm.properties
  2 jvm_options="-server -xms2048m -xmx2048m -xss512k -xx:permsize=16m -xx:maxpermsize=96m"
 
提示:原为:jvm_options="-server -xms256m -xmx1024m -xss196k -xx:permsize=16m -xx:maxpermsize=96m"
  1 [root@amoeba ~]# /usr/local/amoeba/bin/launcher &	#建议直接放入后台启动
  2 [root@amoeba ~]# echo "/usr/local/amoeba/bin/launcher &" >> /etc/rc.local
 
[root@amoeba ~]# netstat -unlpt | grep java #查看进程

八 测试

8.1 打开日志记录

  1 [root@master01 ~]# touch /var/log/mysql_query_log
  2 [root@master01 ~]# chown mysql:mysql /var/log/mysql_query_log
  3 [root@master01 ~]# vi /etc/my.cnf
  4 general_log=on
  5 general_log_file=/var/log/mysql_query_log.log
 
注意:
打开mysql日志记录,必须存在log文件,且同时对mysql具有权限;
所有节点均需要打开日志记录,方便记录测试情况。

8.2 新增对应数据

  1 [root@master01 ~]# mysql -uroot -px120952576
  2 mysql> use testdb;
  3 mysql> create table mmm_test(id int,email varchar(60));
  4 mysql> insert into mmm_test (id,email) values (100,'ip is 172.24.8.10');
 
提示:
创建用于测试的表mmm_test,并插入含该节点ip的条目,方便之后测试;
所有节点均需要执行以上操作,但ip更换为对应的ip节点即可。

8.3 读写分离测试

  1 [root@client ~]# mysql -uroot -h172.24.8.14 -px120952576 -p8066
  2 mysql> select * from testdb.mmm_test;
 
提示:
  • 此处在client端使用的是amoeba的ip连接,端口为amoeba服务的8066端口;
  • 多次执行查询,可知select请求均衡的分配在mmm集群中的4个节点,由于master01和master02同步复制,因为有两条相同结果。
  1 [root@master01 ~]# tail -f /var/log/mysql_query_log | grep mmm_test
  2 #所有节点执行此命令,观察log信息。
  3 [root@client ~]# mysql -uroot -h172.24.8.14 -px120952576 -p8066
  4 mysql> create table mmm_test1(id int,email varchar(60));
  5 mysql> insert into mmm_test1 (id,email) values (104,'ip is 172.24.8.14');
 
提示:所有写操作均在master01上执行,其他节点的均由复制而来,由此可知已实现读写分离。

九 其他附加

amoeba主配置文件:$amoeba_home/conf/amoeba.xml,用来配置amoeba服务的基本参数,如amoeba主机地址、端口、认证方式、用于连接的用户名、密码、线程数、超时时间、其他配置文件的位置等。
数据库服务器配置文件:$amoeba_home/conf/dbservers.xml,用来存储和配置amoeba所代理的数据库服务器的信息,如:主机ip、端口、用户名、密码等。
切分规则配置文件:$amoeba_home/conf/rule.xml,用来配置切分规则。
数据库函数配置文件:$amoeba_home/conf/functionmap.xml,用来配置数据库函数的处理方法,amoeba将使用该配置文件中的方法解析数据库函数。
切分规则函数配置文件:$amoeba_home/conf/rulefunctionmap.xml,用来配置切分规则中使用的用户自定义函数的处理方法。
访问规则配置文件:$amoeba_home/conf/access_list.conf,用来授权或禁止某些服务器ip访问amoeba。
日志规格配置文件:$amoeba_home/conf/log4j.xml,用来配置amoeba输出日志的级别和方式。
 
参考资料: