1. 配置master&slave服务
注意:此处是通过阿里云服务器做的实验
阿里云服务器参数:
系统:ubuntu
数据库:服务器的MySql
1.1 配置阿里云服务器
注意:该步骤主从都要配置
添加安全组规则:
入方向
协议类型选择My SQL
授权类型改为地址段访问
授权对象输入:0.0.0.0/0(所有ip所有端口)
1.2 配置Master
1.2.1 修改主机/etc/mysql/mysql.cnf.d/mysqld.cnf文件
1. 将bind_address注释掉(此处的目的是让mysql可以被远程访问)
2. 在[mysqld]模块中解开并配置如下:
# 设置服务器id,(在一个组中是唯一的,注意不要重复)
server-id = 1
# 设置修改日志(主机中的修改动作会存在此处供slave读取)
log_bin = /var/log/mysql/mysql-bin.log
# 设置要同步的数据库
binlog_do_db = your_database
# 需要忽略的数据库
binlog_ignore_db = mysql
1.2.2 创建一个新用户用来远程连接使用:
//1. 创建一个用来进行远程连接的用户,其中%表示所有地址可登录 例:
create user 'admin'@'%' IDENTIFIED BY 'admin'
//2. 给创建的用户授权 例:
GRANT SELECT, INSERT ON database.table TO 'admin'@'%';
//补充:你也可以授予所有权限:
GRANT ALL ON *.* TO 'admin'@'%';
//3. 授予从机操作权限
GRANT REPLICATION SLAVE ON *.* TO 'admin'@'%' IDENTIFIED BY 'admin';
1.2.3 重启MySql
- 退出mysql:exit;
- 输入service mysql restart
1.2.4 登录mysql,查看master状态(注意记录File 和Position的值待用)
show master status;
1.3 配置Slave
1.3.1 修改MySQL配置文件/etc/mysql.conf.d/mysqld.cnf
#1. 将bind_address注释掉(此处的目的是让mysql可以被远程访问)
#2. 在[mysqld]中添加:
#定义服务器id
server-id = 2
#定义从机日志位置(通过io流从主机读取的日志存放位置)
relay-log = slave-relay-bin
#同上
relay-log-index = slave-relay-bin.index
1.3.2 重启mysql服务
1.3.3 登录slave,设置master信息
change master to master_host='120.79.21.141',master_post=3306,master_user='ttt',master_password='111111',master_log_file='mysql-bin.000003',master_log_pos=154;
注意:
1. master_host对应主服务器的外网IP地址
2. master_port对应主服务器的端口(3306)
3. master_log_file对应show master status显示的File列:mysql->bin.000001
4. master_log_pos对应Position列:154
1.3.4 创建与Master相同的database及表
1.3.5 再次重启服务
1.3.6 登录slave开启slave服务 :start slave
1.3.7 查看slave状态:show slave status 出现两个yes就应该成功了
- 若不成功,查看状态,看是传入的io流的问题还是读写日志入库的原因。
- 前者检查change命令,后者检查配置文件
- stop slave重起一下slave服务
2.配置读写分离
2.1 配置MySql主从(同上)
2.2 安装amoeba
此处的版本:amoeba-mysql-3.0.5-RC
解压到某一个自定义文件加
2.3 配置amoeba
2.3.1 配置 doServers.xml(路径:安装路径下的conf文件夹中)
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd">
<amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/">
<dbServer name="abstractServer" abstractive="true">
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="connectionManager">${defaultManager}</property>
<property name="sendBufferSize">64</property>
<property name="receiveBufferSize">128</property>
<!-- 1. 修改成 mysql 端口号port -->
<property name="port">3306</property>
<!-- 2. mysql schema数据库名称 -->
<property name="schema">your_database</property>
<!--3. mysql 用户和密码-->
<property name="user">admin</property>
<property name="password">admin</property>
</factoryConfig>
<!-- 配置线程池-->
<poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">
<property name="maxActive">500</property>
<property name="maxIdle">500</property>
<property name="minIdle">1</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testOnReturn">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>
<!-- 配置Master,即实现写入数据的数据库——>
<dbServer name="server1" parent="abstractServer">
<factoryConfig>
<!—4. Master mysql ip -->
<property name="ipAddress">112.74.33.243</property>
</factoryConfig>
</dbServer>
<!-- 配置Slave,即实现读数据的数据库——>
<dbServer name="server2" parent="abstractServer">
<factoryConfig>
<!--5. slave mysql ip -->
<property name="ipAddress">119.23.247.195</property>
</factoryConfig>
</dbServer>
<!-- 配置一个服务器组-->
<dbServer name="multiPool" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!--6. 在此处配置刚刚配置的主从服务器 -->
<property name="poolNames">server1,server2</property>
</poolConfig>
</dbServer>
</amoeba:dbServers>
2.3.2 配置amoeba.xml,配置amoeba的信息
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">
<proxy>
<!-- service class must implements com.meidusa.amoeba.service.Service -->
<service name="Amoeba for Mysql" class="com.meidusa.amoeba.mysql.server.MySQLService">
<!--1. 配置amoeba服务器的端口-->
<property name="port">8066</property>
<!--2. bind ipAddress 此处可以配置指定连接的ip地址,这里注释掉即所有ip可访问 -->
<!--
<property name="ipAddress">127.0.0.1</property>
-->
<property name="connectionFactory">
<bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory">
<property name="sendBufferSize">128</property>
<property name="receiveBufferSize">64</property>
</bean>
</property>
<property name="authenticateProvider">
<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
<!—-3. 代理服务器的访问用户和密码-->
<property name="user">root</property>
<property name="password">root</property>
<property name="filter">
<bean class="com.meidusa.toolkit.net.authenticate.server.IPAccessController">
<property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
</bean>
</property>
</bean>
</property>
</service>
<runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext">
<!-- proxy server client process thread size -->
<property name="executeThreadSize">128</property>
<!-- per connection cache prepared statement size -->
<property name="statementCacheSize">500</property>
<!-- default charset -->
<property name="serverCharset">utf8</property>
<!-- query timeout( default: 60 second , TimeUnit:second) -->
<property name="queryTimeout">60</property>
</runtime>
</proxy>
<!--
Each ConnectionManager will start as thread
manager responsible for the Connection IO read , Death Detection
-->
<connectionManagerList>
<connectionManager name="defaultManager" class="com.meidusa.toolkit.net.MultiConnectionManagerWrapper">
<property name="subManagerClassName">com.meidusa.toolkit.net.AuthingableConnectionManager</property>
</connectionManager>
</connectionManagerList>
<!-- default using file loader -->
<dbServerLoader class="com.meidusa.amoeba.context.DBServerConfigFileLoader">
<property name="configFile">${amoeba.home}/conf/dbServers.xml</property>
</dbServerLoader>
<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="ruleLoader">
<bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
<property name="ruleFile">${amoeba.home}/conf/rule.xml</property>
<property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>
</bean>
</property>
<property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
<property name="LRUMapSize">1500</property>
<!-- 4. 这里配置默认的服务器(即在doServers.xml中配置的)
<property name="defaultPool">server1</property>
<!--5. 这里配置写入的服务器即Master-->
<property name="writePool">server1</property>
<!--6. 这里配置读取数据的服务即Slave
<property name="readPool">server2</property>
<property name="needParse">true</property>
</queryRouter>
</amoeba:configuration>
2.4 修改 jvm.proerties
在安装路径下,将JVM_OPTIONS后面的值中的 -Xss196k 修改为 -Xss256k
2.5给amoeba/bin目录执行权限
chmod +x 安装路径/bin/*
2.6 阿里服务器配置安全组
配置8066端口任意地址可访问
2.7 启动amoeba
进入bin目录下,通过./launcher start命令启动,如果出现可访问ip地址,启动成功,ctrl+c强制退出
2.8 配置项目JDBC连接信息
将项目jdbc的连接参数:url,端口,用户名,密码换成amoeba的,即在amoeba中配置的
常见错误:
1、如果提示 Unknown system variable ‘language’ 错误,将mysql的包换成5.1.24试试。
2、提示无法打开console.log,就将logs文件夹权限修改一下,比如:chmod 777 logs
3、提示Adress in Use,直接重启服务器好了,reboot