注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

胡益兵的博客

新的岗位,新的方向,新的使命,stem教育进行中。

 
 
 

日志

 
 

【实验通过】利用Amoeba实验mysql读写分离的访问调度(一)  

2015-10-13 21:22:33|  分类: linux应用 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


一、Amoeba 是什么

Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发。座落与ClientDB Server(s)之间。对客户端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。

主要解决:

降低 数据切分带来的复杂多数据库结构

提供切分规则并降低 数据切分规则 给应用带来的影响

降低db 与客户端的连接数

读写分离

 

二、为什么要用Amoeba

目前要实现mysql的主从读写分离,主要有以下几种方案:

1  通过程序实现,网上很多现成的代码,比较复杂,如果添加从服务器要更改多台服务器的代码。

2  通过mysql-proxy来实现,由于mysql-proxy的主从读写分离是通过lua脚本来实现,目前lua的脚本的开发跟不上节奏,而写没有完美的现成的脚本,因此导致用于生产环境的话风险比较大,据网上很多人说mysql-proxy的性能不高。

3  自己开发接口实现,这种方案门槛高,开发成本高,不是一般的小公司能承担得起。

4  利用阿里巴巴的开源项目Amoeba来实现,具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库,并且安装配置非常简单。国产的开源软件,应该支持,目前正在使用,不发表太多结论,一切等测试完再发表结论吧,哈哈!

 

假设有这样的使用场景,四台centos6 64 ,有三个数据库节点分别命名为MasterSlave1Slave2如下:

Amoeba: Amoeba <192.168.12.25>(前台调度机)

Master Master <192.168.12.15> (可读写)

SlavesSlave1 <192.168.12.16>Slave2<192.168.12.17> 2个平等的数据库。只读/负载均衡)

  主从数据库 的复制的部分, 仍然需要使用数据库自己的复制机制。 Amoeba 不提供复制功能。

 

、利用mysql实现主从数据库复制

 1 修改配置文件

 master/etc/my.cnf

[mysqld]

server-id = 1 #主数据库标志 

log-bin=mysql-bin #打开mysqlbinlog功能,后面的名字可以自己指定,如果不改名字的话,默认是以主机名字命名

#binlog-do-db=moodle #moodle是需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可

binlog-ignore-db=mysql  #不需要备份的数据库名称,如果需要忽略备份多个数据库,重复设置这个选项即可。

log = /data/mysql/mysql.log #增加 日志文件, 用于验证读写分离(注mysql5.6中该参数会导致mysql无法启动)

 lower_case_table_names = 1 (1:不区分大小写,0:区分大小写)


slave1/etc/my.cnf

[mysqld]

server-id = 2# 从数据库标志 

log-bin=mysql-bin #打开mysqlbinlog功能,后面的名字可以自己指定,如果不改名字的话,默认是以主机名字命名

#binlog-do-db=moodle #moodle是需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可

binlog-ignore-db=mysql  #不需要备份的数据库名称,如果需要忽略备份多个数据库,重复设置这个选项即可。

log = /data/mysql/mysql.log #增加 日志文件, 用于验证读写分离

 

slave2/etc/my.cnf

[mysqld]

server-id = 3 #从数据库标志 

log-bin=mysql-bin 启动二进制文件并命名

#binlog-do-db=moodle2 主从复制的数据库

binlog-ignore-db=mysql  不复制的数据库

log = /data/mysql/mysql.log 增加 日志文件, 用于验证读写分离

 

2、在主mysql上建立repl_user,让slave1slave2可以使用该账户复制数据库

mysql>GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY 'repl_password';

mysql>flush privileges;

这里一定将repl_user用户设置为远程任意节点可以登录。

master机上执行

mysql> show master status\g

+------------------+----------+--------------+------------------+

| File              | Position  | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000006 |      107 |                 | mysql              |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

记下FilePosition

 

3、在slave1slave2上执行如下命令:

mysql> change master to master_host='192.168.12.15', master_user='repl_user', master_password='repl_password', master_log_file='mysql-bin.000006', master_log_pos=107;  

执行完之后执行:

mysql> slave start;

Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.12.15

                  Master_User: repl_user

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000006

          Read_Master_Log_Pos: 107

               Relay_Log_File: mysql-relay-bin.000005

                Relay_Log_Pos: 253

        Relay_Master_Log_File: mysql-bin.000006

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB:

          Replicate_Ignore_DB:

           Replicate_Do_Table:

       Replicate_Ignore_Table:

      Replicate_Wild_Do_Table:

  Replicate_Wild_Ignore_Table:

                   Last_Errno: 0

                   Last_Error:

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 107

              Relay_Log_Space: 555

              Until_Condition: None

               Until_Log_File:

                Until_Log_Pos: 0

           Master_SSL_Allowed: No

           Master_SSL_CA_File:

           Master_SSL_CA_Path:

              Master_SSL_Cert:

            Master_SSL_Cipher:

               Master_SSL_Key:

        Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error:

               Last_SQL_Errno: 0

               Last_SQL_Error:

  Replicate_Ignore_Server_Ids:

             Master_Server_Id: 1

1 row in set (0.00 sec)

从输出可以看到:Slave_IO_RunningSlave_SQL_Running如果都为Yes时,表示配置成功。

 

可以做一些测试验证主从数据库复制情况,也可以通过通过查看masterslave机的log文件

tail -f  /data/mysql/mysql.log 查看复制情况。

============================
重启主从myslq服务器,如果从数据库出现Slave_IO_Running:No,检查主从file和position数值,如果不一致说明从数据库没有能和主数据库同步,
可以登录从mysql后执行,将新的主数据库file和position数值写入从数据库:
mysql> slave stop;(有的版本mysql可能是stop slave;)
mysql> change master to master_host='192.168.12.15', master_user='repl_user', master_password='repl_password', master_log_file='mysql-bin.000006', master_log_pos=107;  
mysql> slave start;
以上手动操作通过。但是生产环境用手动操作不太合适,不知道有没有自动调整同步的办法

网上其他的解决方案http://blog.csdn.net/mergerly/article/details/50068589
  评论这张
 
阅读(53)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018