`

整理下Mysql集群的的一些资料

 
阅读更多
有些需要参照别人,一起研究啊,前几天跟一个大牛聊天,说是使用了200多台的多主MYSQL集群,羡慕,嘿嘿。

(多主一从,一主多从,多主多从,一主一从)

MYsqL集群想做个多主或多从的专题研究,总结在这里。

二台Mysql服务器,他们的IP地址分别为:
A:192.168.0.97
B:192.168.0.98
数据库都是 test_3306
首先我给两台服务器的my.ini 贴出来
A:my.ini

server-id=2
master-host=192.168.0.98
master-user=mydb
master-password=123
master-port=3306
master-connect-retry=1
replicate-do-db=tbqu
log-bin=
log-slave-updates
binlog-ignore-db=mysql
slave-skip-errors=all

B:my.ini

server-id=1
master-host=192.168.0.97
master-user=mydb
master-password=123
master-port=3306
master-connect-retry=1
replicate-do-db=tbqu
log-bin=
log-slave-updates
binlog-ignore-db=mysql
slave-skip-errors=all

在这里,配置文件和主从配置方法基本上一样
log-slave-updates 这个参数一定要加上,否则不会给更新的记录些到二进制文件里
slave-skip-errors 是跳过错误,继续执行复制操作

多主互备和主从复制有一些区别,因为多主中 都可以对服务器有写权限,所以设计到自增长重复问题
出现的问题(多主自增长ID重复)
1:首先我们通过A,B的test表结构
2:掉A,在B上对数据表test(存在自增长ID)执行插入操作,返回插入ID为1
3:后停掉B,在A上对数据表test(存在自增长ID)执行插入操作,返回的插入ID也是1
4:然后 我们同时启动A,B,就会出现主键ID重复
解决方法:
我们只要保证两台服务器上插入的自增长数据不同就可以了
如:A查奇数ID,B插偶数ID,当然如果服务器多的话,你可以定义算法,只要不同就可以了
在这里我们在A,B上加入参数,以实现奇偶插入
A:my.ini上加入参数
auto_increment_offset = 1
auto_increment_increment = 2
这样A的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID了
B:my.ini上加入参数
auto_increment_offset = 2
auto_increment_increment = 2
这样B的auto_increment字段产生的数值是:2, 4, 6, 8, …等偶数ID了
可以看出,你的auto_increment字段在不同的服务器之间绝对不会重复,所以Master-Master结构就没有任何问题了。当然,你还可以使用3台,4台,或者N台服务器,只要保证auto_increment_increment = N 再设置一下auto_increment_offset为适当的初始值就可以了,那样,我们的MySQL可以同时有几十台主服务器,而不会出现自增长ID重复。
在这里我们说的是2台MYSQL服务器,你也可以扩展到多台,实现方法类似
A -> B -> C-> D ->A
这样一个环形的备份结构就形成了,最后可要记住 自增长ID(主键)要设计好哦,否则会出错的。
————————————————————————————————————————–
假定有三台Mysql服务器,他们的IP地址分别为:
192.168.1.8
192.168.1.88
192.168.1.188
在192.168.1.8的安装目录下找到my.ini文件,在该文件的最后加上:
server-id=1
log-bin
#asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字
binlog-do-db=asyntest1
#下面这句话很重要,只有加上它,从前一台机器上同步过来的数据才能同步到下一台机器
log-slave-updates
master-host=192.168.1.188
master-user=root
#在此处填入192.168.1.188的root密码
master-password=XXXXX
#asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字
replicate-do-db=asyntest1
master-connect-retry=10
#出现错误后忽略,如果不加这个,出现任何错误,同步进程会终止
slave-skip-errors=all
在192.168.1.88的安装目录下找到my.ini文件,在该文件的最后加上:
server-id=2
log-bin
#asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字
binlog-do-db=asyntest1
#下面这句话很重要,只有加上它,从前一台机器上同步过来的数据才能同步到下一台机器
log-slave-updates
master-host=192.168.1.8
master-user=root
#在此处填入192.168.1.8的root密码
master-password=XXXXX
#asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字
replicate-do-db=asyntest1
master-connect-retry=10
#出现错误后忽略,如果不加这个,出现任何错误,同步进程会终止
slave-skip-errors=all
在192.168.1.188的安装目录下找到my.ini文件,在该文件的最后加上:
server-id=3
log-bin
#asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字
binlog-do-db=asyntest1
#下面这句话很重要,只有加上它,从前一台机器上同步过来的数据才能同步到下一台机器
log-slave-updates
master-host=192.168.1.88
master-user=root
#在此处填入192.168.1.88的root密码
master-password=XXXXX
#asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字
replicate-do-db=asyntest1
master-connect-retry=10
#出现错误后忽略,如果不加这个,出现任何错误,同步进程会终止
slave-skip-errors=all
在192.168.1.8, 192.168.1.88, 192.168.1.188上建立完全一样的数据库asyntest1,重启这三台数据库,然后在任何一台机器上进行的更新操作,都会同步到另外的两台机器上,这是一种环形同步,在192.168.1.8有任何修改,会首先同步到192.168.1.88的机器上,88的机器再将同步的数据同步到 192.168.1.188的机器上。同样,如果在192.168.1.88上有任何更新,首先会同步到192.168.1.188的机器上,然后再同步到192.168.1.8的机器上;而在192.168.1.188的机器上有任何更新,首先会同步到192.168.1.8的机器上,然后在同步到 192.168.1.88的机器上。利用这种原理,可以解决任意多台机器的互相同步问题。
如果出现问题,首先请在每一台服务器上用命令行通过telnet命令检查其他机器3306端口的连通情况。另外,请检查各机器的防火墙设置和杀毒软件的配置。可将这些软件暂停后进行试验。


本文出自 “网络数据优化与安全_jxwpx” 博客,请务必保留此出处http://jxwpx.blog.51cto.com/15242/459174

options-future、jxwpx、Peter潘 3人 了这篇文章

类别:数据库系列┆技术圈( )┆阅读( )┆评论( ) ┆ 推送到技术圈┆返回首页
上一篇 整理下OPENMEETINGS作个专题吧 下一篇 postfix相关问题整理及处理
相关文章
MySQL CLUSTER 集群方案 MySQL Cluster集群配置 配置 MySQL cluster mysql cluster设置步骤 利用MySQL Cluster 7.0 + LVS 搭建高可用环境 [MySQL 6.0 体验] 集群(cluster)+复制(repli.. bencher - a benchmarking utility for MySQ.. NDB7.0 新特性 MySQL Cluster集群负载配置 新闻:MySQL Cluster 7.0 GA Release Ready .. 文章评论

[1楼]      jxwpx
2010-12-18 19:00:16
Tungsten replicator简介

Tungsten是一套用于数据库集群和复制的软件集合,包括replication, management, SQL routing, and proxying。Ppc2009大会对这套软件专门做了介绍,下载地址如下
http://sourceforge.net/project/showfiles.php?group_id=256125
tungsten replicator则是这套软件中用于数据复制的一个组件。通过在主从服务器上部署的java程序对主数据库的binlog进行跟踪,并将更新的内容解析出来发送到从服务器,而从服务器的java则将接收到的更新写入从数据库。


测试环境
Master1
192.168.1.8
Master2
192.168.1.4
Slave
192.168.1.7

由于tungsten replicator是java程序,因此需要各个服务器都架设jdk环境

Maser配置

下载tungsten replicator1.0.2的压缩包,解压到一个单独的目录。将conf目录下的replicator.properties.mysql重命名为replicator.properties,并根据实际情况修改以下内容:

#声明当前服务器是master模式
replicator.role=master
#服务启动后自动开始复制
replicator.auto_enable=true
#指定一个全局唯一的id,建议用服务器名
replicator.source_id=dev08
#指定用于存放复制数据的库名,在mysql手动生成一个空的库,并在my.cnf中将这个库加入binlog-ignore-db参数里。默认数据库为tungsten
replicator.schema=tungsten
#指定master的ip,本机则使用localhost
replicator.thl.remote_uri=thl://localhost/
#如果replicator.schema参数指定了其他的数据库名,则需要把tungsten改成指定的数据库名。
replicator.thl.url=jdbc:mysql://localhost/tungsten
#指定binlog文件所在的目录
replicator.extractor.mysql.binlog_dir=/usr/local/mysql/var
#指定binlog文件名的前缀
replicator.extractor.mysql.binlog_file_pattern=mysql-bin
#指定replicator程序使用的数据库用户名和密码,并在数据库中生成该用户,需要super权限。
replicator.thl.user=tungsten
replicator.thl.password=secret
replicator.applier.mysql.host=localhost
replicator.applier.mysql.port=3306
replicator.applier.mysql.user=tungsten
replicator.applier.mysql.password=secret
replicator.extractor.mysql.host=localhost
replicator.extractor.mysql.user=tungsten
replicator.extractor.mysql.password=secret

配置完成后使用bin目录下的trepsvc命令启动
Trepsvc start
用bin目录下的trepctl查看服务器状态
Trepctl status
Name
Value
===============================================
System ID
dev08
System Version:
1.0-beta5
System State:
ONLINE:MASTER
System Uptime (S): 282739.972s
State Uptime (S):
282739.351s
Error:
null
Error Exception:
null
Min Seq No:
0
Max Seq No:
179
Monitor Intvl (S): 282740.011
Extr Total:
179
Extr Last Seq No:
179
Extr/Sec:
6.330904427029223E-4
Recv Total:
0
Recv Last Seq No:
-1
Recv Source TS:
null
Recv Target TS:
null
Recv Latency (S):
0.0
Recv/Sec:
0.0
Apply Total:
0
Apply Last Seq No: -1
Apply Source TS:
null
Apply Target TS:
null
Apply Latency (S): 0.0
Apply/Sec:
0.0
State: ONLINE:MASTER
Seqno Range: 0 -> 179
当state为ONLINE:MASTER说明启动成功。

Slave配置

由于要从2个master上同步数据,所以要将tungstereplicator解压到2个不同的目录,然后分别启动2个目录里的tungsten replicator程序。
基本配置和master相同,只是replicator.properties的内容不同,根据实际情况修改以下内容:

#声明本机是slave模式
replicator.role=slave
#服务启动后自动开始复制
replicator.auto_enable=true
#指定一个全局唯一的id,slave上2个replicator需要不同的id
replicator.source_id=dev071
#指定用于存放复制数据的库名,并在my.cnf中将这个库加入binlog-ignore-db参数里。2个replicator需要不同的库存放数据,在mysql里手动生成这2个空的库,并在my.cnf中将这2个库加入binlog-ignore-db参数里
replicator.schema=svnrep
#指定rmi端口,2个replicator需要指定不同端口
replicator.rmi_port=11000
#指定thl端口,2个replicator需要指定不同端口
replicator.thl.uri=thl://0.0.0.0:12112/
#指定master的ip,2个replicator指定不同master用于复制数据库。
replicator.thl.remote_uri=thl://192.168.1.4/
# replicator.schema参数,将svnrep改为实际的数据库名。
replicator.thl.url=jdbc:mysql://localhost/svnrep
其他配置与master相同。

配置完成后使用bin目录下的trepsvc命令启动
Trepsvc start
用bin目录下的trepctl查看服务器状态
Trepctl status
Name
Value
===============================================
System ID
dev071
System Version:
1.0-beta5
System State:
ONLINE:SLAVE
System Uptime (S): 6509.149s
State Uptime (S):
6325.891s
Error:
null
Error Exception:
null
Min Seq No:
0
Max Seq No:
5
Monitor Intvl (S): 6509.153
Extr Total:
0
Extr Last Seq No:
-1
Extr/Sec:
0.0
Recv Total:
2
Recv Last Seq No:
5
Recv Source TS:
2009-06-22 15:53:54.581
Recv Target TS:
2009-06-22 15:58:26.343
Recv Latency (S):
271.762
Recv/Sec:
3.072588835840643E-4
Apply Total:
1
Apply Last Seq No: 5
Apply Source TS:
2009-06-22 15:53:54.581
Apply Target TS:
2009-06-22 15:58:26.352
Apply Latency (S): 271.771
Apply/Sec:
1.536292765781721E-4
State: ONLINE:SLAVE
Seqno Range: 0 -> 5
当state为ONLINE:SLAVE时,说明已经复制成功。

由于当前版本的trepctl命令默认使用的是10000端口,所以查看端口为11000的replicator状态需要手动设置一下系统变量
export REPLICATOR_RMI_PORT=11000
然后再执行trepctl即可。

Tungsten replicator的一些特点

Tungsten replicator被定义为是异构数据库复制框架,可实现不同版本,不同种类数据库之间的数据库复制。根据官方的说明,现在可以实现mysql各版本件,以及mysql与oracle间的数据库复制,但是一些函数上限制还是不能避免。
本来测试这个软件是想用来代替mysql replication的,但是测试的效果不是很好,100万条记录同步,mysql replication需要4分10秒,tungsten replicator需要5分30秒。对行复制模式的binlog支持不是很好,对ddl语句支持不是很好。
由于tungsten replicator使用的是jdbc进行数据操作,所以一些在数据库中可以进行的操作会被jdbc认为是非法操作而导致复制中止,例如像datetime字段插入一个空字符。,所以如果web应用层不是java程序的话还是有一定风险的。而且java程序本身也需要一定的内存,当数据库的写入和更新操作比较频繁导致内存不够的时候,master上的tungsten会因为内存不够而出错,但是不会造成数据丢失,只是复制会中止。测试中我的服务器是2G内存,innodb_buffer_pool_size为1G,当我批量生成100万的数据的时候就会出错。tungsten默认最大内存为256M,可以通过修改wrapper.conf的wrapper.java.maxmemory参数来增加内存上限。
不过这个软件更新还是很快的,测试的时候还是1.0.1,测试完毕后就已经更新到1.0.2了。在这个软件的开发计划中,并行复制是比较让人期待的功能。

MySQL多主同步 负载均衡
(2010-06-29 19:15:12)
转载
标签:
it
分类: mysql

二台Mysql服务器,他们的IP地址分别为:
A:192.168.0.97
B:192.168.0.98
数据库都是 test_3306
首先我给两台服务器的my.ini 贴出来
A:my.ini
server-id=2
master-host=192.168.0.98
master-user=mydb
master-password=123
master-port=3306
master-connect-retry=1
replicate-do-db=tbqu
log-bin=
log-slave-updates
binlog-ignore-db=mysql
slave-skip-errors=all
B:my.ini
server-id=1
master-host=192.168.0.97
master-user=mydb
master-password=123
master-port=3306
master-connect-retry=1
replicate-do-db=tbqu
log-bin=
log-slave-updates
binlog-ignore-db=mysql
slave-skip-errors=all
在这里,配置文件和主从配置方法基本上一样
log-slave-updates 这个参数一定要加上,否则不会给更新的记录些到二进制文件里
slave-skip-errors 是跳过错误,继续执行复制操作
其他参数请参照 http://www.tbqu.com/post/15.html
多主互备和主从复制有一些区别,因为多主中 都可以对服务器有写权限,所以设计到自增长重复问题
出现的问题(多主自增长ID重复)
1:首先我们通过A,B的test表结构
2:掉A,在B上对数据表test(存在自增长ID)执行插入操作,返回插入ID为1
3:后停掉B,在A上对数据表test(存在自增长ID)执行插入操作,返回的插入ID也是1
4:然后 我们同时启动A,B,就会出现主键ID重复
解决方法:
我们只要保证两台服务器上插入的自增长数据不同就可以了
如:A查奇数ID,B插偶数ID,当然如果服务器多的话,你可以定义算法,只要不同就可以了
在这里我们在A,B上加入参数,以实现奇偶插入
A:my.ini上加入参数
auto_increment_offset = 1
auto_increment_increment = 2
这样A的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID了
B:my.ini上加入参数
auto_increment_offset = 2
auto_increment_increment = 2
这样B的auto_increment字段产生的数值是:2, 4, 6, 8, …等偶数ID了
可以看出,你的auto_increment字段在不同的服务器之间绝对不会重复,所以Master-Master结构就没有任何问题了。当然,你还可以使用3台,4台,或者N台服务器,只要保证auto_increment_increment = N 再设置一下auto_increment_offset为适当的初始值就可以了,那样,我们的MySQL可以同时有几十台主服务器,而不会出现自增长ID重复。
在这里我们说的是2台MYSQL服务器,你也可以扩展到多台,实现方法类似
A -> B -> C-> D ->A
这样一个环形的备份结构就形成了,最后可要记住 自增长ID(主键)要设计好哦,否则会出错的。
————————————————————————————————————————–
假定有三台Mysql服务器,他们的IP地址分别为:
192.168.1.8
192.168.1.88
192.168.1.188
在192.168.1.8的安装目录下找到my.ini文件,在该文件的最后加上:
server-id=1
log-bin
#asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字
binlog-do-db=asyntest1
#下面这句话很重要,只有加上它,从前一台机器上同步过来的数据才能同步到下一台机器
log-slave-updates
master-host=192.168.1.188
master-user=root
#在此处填入192.168.1.188的root密码
master-password=XXXXX
#asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字
replicate-do-db=asyntest1
master-connect-retry=10
#出现错误后忽略,如果不加这个,出现任何错误,同步进程会终止
slave-skip-errors=all
在192.168.1.88的安装目录下找到my.ini文件,在该文件的最后加上:
server-id=2
log-bin
#asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字
binlog-do-db=asyntest1
#下面这句话很重要,只有加上它,从前一台机器上同步过来的数据才能同步到下一台机器
log-slave-updates
master-host=192.168.1.8
master-user=root
#在此处填入192.168.1.8的root密码
master-password=XXXXX
#asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字
replicate-do-db=asyntest1
master-connect-retry=10
#出现错误后忽略,如果不加这个,出现任何错误,同步进程会终止
slave-skip-errors=all
在192.168.1.188的安装目录下找到my.ini文件,在该文件的最后加上:
server-id=3
log-bin
#asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字
binlog-do-db=asyntest1
#下面这句话很重要,只有加上它,从前一台机器上同步过来的数据才能同步到下一台机器
log-slave-updates
master-host=192.168.1.88
master-user=root
#在此处填入192.168.1.88的root密码
master-password=XXXXX
#asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字
replicate-do-db=asyntest1
master-connect-retry=10
#出现错误后忽略,如果不加这个,出现任何错误,同步进程会终止
slave-skip-errors=all
在192.168.1.8, 192.168.1.88, 192.168.1.188上建立完全一样的数据库asyntest1,重启这三台数据库,然后在任何一台机器上进行的更新操作,都会同步到另外的两台机器上,这是一种环形同步,在192.168.1.8有任何修改,会首先同步到192.168.1.88的机器上,88的机器再将同步的数据同步到 192.168.1.188的机器上。同样,如果在192.168.1.88上有任何更新,首先会同步到192.168.1.188的机器上,然后再同步到192.168.1.8的机器上;而在192.168.1.188的机器上有任何更新,首先会同步到192.168.1.8的机器上,然后在同步到 192.168.1.88的机器上。利用这种原理,可以解决任意多台机器的互相同步问题。
如果出现问题,首先请在每一台服务器上用命令行通过telnet命令检查其他机器3306端口的连通情况。另外,请检查各机器的防火墙设置和杀毒软件的配置。可将这些软件暂停后进行试验。



短消息通知评论者
[2楼]      Peter潘
2010-12-19 20:21:58
这可以写两篇了 呵呵 支持不错

短消息通知评论者
[3楼]      jxwpx
2010-12-20 09:44:54
MySQL多主一从的实现(转载)
===========================================================
作者: denniswwh(http://denniswwh.itpub.net)
发表于:2009.04.24 15:51
分类: MySQL
出处:http://denniswwh.itpub.net/post/15174/483254
---------------------------------------------------------------

大型的系统,数据库往往会根据业务逻辑分隔放在多台机上,但统计的时候又经常需要互相关联,MySQL理论上是不支持多个主库同步到一个从库上的,那么如果实现多主一从以方便统计查询呢?我试着利用MyISAM的简单文件存储的特点来实现,过程如下:

1设置主库,启用Binlog,建议复制帐号。具体过程跟一主多从设置一样。

2设置从库,在从库使用mysqld_multi启动多库实例,每个实例对应一个主库,并分别设置好主从复制。需要注意的是,1、从库只安装MyISAM引擎,这样不管主库是用什么引擎,从库都使用MyISAM。2、从库的几个实例的数据目录使用同一个,这样每个实例都可以访问其他实例的表。3、使用Crontab在从库每分钟执行一次Flush tables;以便每个实例都能看到其他实例对期数据的修改变化。

这样,就可以从任意一个实例下访问所以库的表了,还可以做跨库的表连接查询,查询统计很方便吧,呵呵。

denniswwh 发表于:2009.04.24 15:51 ::分类: ( MySQL ) ::阅读:(830次) :: 评论 (0) :: 引用 (0)

短消息通知评论者
[4楼]      jxwpx
2010-12-28 13:20:13
主节点配置
#log-bin=mysql-bin
#binlog-do-db=db
#server-id=1
#log-bin=/var/log/mysql/updatelog
#binlog-ignore-db=mysql

从节点配置
#server-id=2
#master-host=192.168.1.54
#master-user=replicate
#master-password=123123
#master-port=3306
#master-connect-retry=60
#replicate-ignore-db=mysql
#replicate-do-db=db
relay-log=mysqld-relay-bin
  • ea.rar (92.5 KB)
  • 下载次数: 4
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics