使用tungsten-replicatior实现MySQL之间的主从复制

By | 2017年8月16日

tungsten是一个开源的,可以用来实现不同数据源间数据同步的软件(官网号称是实时同步),官网地址是http://www.continuent.com/。它的宣传口号里有一句非常吸引人的一句话“Oracle GoldenGate without the price tag.”,所以我想在虚拟机上搭一个试试看。有人会说,MySQL本身就提供了Master-Slave的主从复制,性能还比tungsten-replicatior好,那为什么要用它?其实tungsten-replicatior最大的卖点就是它能实现不同的数据源间数据的同步,因为它的大部分默认配置都是mysql的,所以我觉得它可能最早是基于MySQL开发的,对MySQL的支持最好,作为试用来说,自然从简单的入手,然后再研究oracle、MySQL、Postgresql之间的数据同步。
这里我记录了安装步骤,以及在安装过程中遇到的一些问题和解决方案。但是要注意的是,在计算机软件的使用过程中,会有很多“同症不同病”的问题。所以这些解决方案不一定适合你,任何问题都要确定了根上的原因,才能解决。
具体的安装文档参见https://docs.continuent.com/wiki/display/TEDOC/Tungsten+Replication+Guide

 

虚拟机配置情况:

Master : 192.168.137.100
Oracle Linux 6.4 x86
Perconal MySQL 5.5.32
tungsten-replicator-2.1.0-343.tar.gz(tungsten-replicator-2.1.1-113.tar.gz)

Slave  : 192.168.137.100
Oracle linux 6.4 x86
Perconal MySQL 5.5.32

 

一. tungsten-replicator 系统需求

 

1. 主机间必须能够ping的通
2. MySQL的配置文件my.cnf里有某些特定参数有要求
server-id=1   #必须设置
log-bin       #必须开启
innodb_buffer_pool_size >= 512M
default-table-type=InnoDB
innodb_flush_log_at_trx_commit=1   #用户手册里描述的是该参数必须设为2,但是如果设置成2在启动时会报错,https://code.google.com/p/tungsten-replicator/issues/上查的是1
max_allowed_packet >= 52m
3. 一个操作系统用户tungsten,属于mysql用户组
$ useradd -g mysql tungsten
4. MySQL用户,tungsten
mysql> create user tungsten@’%’ identified by ‘123456’;
mysql> grant all on *.* to tungsten@’%’ with grant option;
mysql> flush privileges;
5. 不启用MySQL的源生replicator
mysql> show slave status
Empty set (0.00 sec)
6. tungsten操作系统用户要能起停MySQL,既要求能sudo mysql start|stop
$ su – root
$ chmod u+w /etc/sudoers
$ vi /etc/sudoers
添加 tungsten ALL=(ALL) ALL
$ chmod u-w /etc/sudoers
$ su – tungsten
尝试关闭,启动数据库。
7. Master主机的tungsten用户必须能通过SSH登录Slave主机,并且不需要输入密码
方法如下:
在192.168.137.100的tungsten操作系统用户下执行:
$ ssh-keygen  -t rsa -f ~/.ssh/id_rsa
全选默认设置,会在/home/tungsten/.ssh/下生成一对公钥和私钥。
将公钥拷贝到192.168.137.101上,
$ scp id_rsa.pub tungsten@192.168.137.101:/home/tungsten/.ssh/192.168.137.100

这里注意复制过去的文件名要和主机名相同,我这里直接用的ip

在192.168.137.101的tungsten操作系统用户下执行:
$ cd /home/tungsten/.ssh
$ cat 192.168.137.100>>authorized_keys
$ chmod 644 *

在192.168.137.100的tungsten用户上执行
$ ssh tungsten@192.168.137.101
直接登录上,没有提示输入密码
二. 安装 tungsten-replicator

用tungsten用户登录192.168.137.100,解压replicator的安装文件
$ tar -zxvf tungsten-replicator-2.1.0-343.tar.gz
$ cd tungsten-replicator-2.1.0-343
$ tools/tungsten-installer –master-slave \
–master-host=192.168.137.100 \
–datasource-user=tungsten \
–datasource-password=123456 \
–service-name=logos \
–home-directory=/MySQL/software/continuent/ \
–cluster-hosts=192.168.137.100,192.168.137.101 \
–start-and-report

 

这里以–master-slave方式安装,tungsten-installer一共有3种方式,分别是:
–direct
–master-slave
–prefetch
具体每种工作方式的含义可以查看上面提到的官方文档

 

下面“home-directory”均指的是安装时–home-directory指定的值

–service-name 为当前同步服务名,设置后会在home-directory/tungsten/tungsten-replicator/log目录下出现一个同名文件夹,里面记录的是日志
–master-host 指定master主机
–datasource-user数据库用户
–datasource-password数据库用户登录的密码
–home-directory 安装tungsten的文件目录
–cluster-hosts当前集群里所有的主机
–datasource-mysql-conf mysql的配置文件不在默认位置/etc/my.cnf的话需要指定
–start-and-report

 

安装完成后在master和slave的home-directory下都会出现一套tungsten-replicator.

home-directory/tungsten/tungsten-replicator/bin/replicator start|stop|status 启停replicator,按上述参数安装后,如果没有出问题,master和slave上都会自动启动了replicator
通过下面的命令可以查看同步状态(我这里都在master上执行):
home-directory/tungsten/tungsten-replicator/bin/trepctl -host 192.168.137.100 services
Processing services command…
NAME              VALUE
—-              —–
appliedLastSeqno: 9
appliedLatency  : 0.334
role            : master
serviceName     : logos
serviceType     : local
started         : true
state           : ONLINE
Finished services command…

 

home-directory/tungsten/tungsten-replicator/bin/trepctl -host 192.168.137.101 services
Processing services command…
NAME              VALUE
—-              —–
appliedLastSeqno: 9
appliedLatency  : 26.896
role            : slave
serviceName     : logos
serviceType     : local
started         : true
state           : ONLINE
Finished services command…

 

如果类似上面这样appliedLatency参数的差距过大(说明同步延迟情况),可以通过下面命令重建心跳连接
home-directory/tungsten/tungsten-replicator/bin/trepctl heartbeat

三. 安装时遇到的问题
再次强调,解决问题要”对病下药”,有很多”同症不同病”的情况,只有找到问题的根在哪里,才能真正解决问题
由于我对Linux的理解不深,所以很多问题如果也有更好的解决方案,还请各位不吝赐教

1. 报错,ruby未安装
解决:yum install ruby

 

2. 报错,192.168.137.101 >> Failed: which mysql,192.168.137.101上的tungsten用户用which命令在$PATH下找不到mysql
因为我的MySQL是源代码编译安装的,不在默认位置,所以我给PATH加入了MySQL的路径,我用tungsten用户登录,执行which mysql是没有问题的
Linux设置环境变量的地方有3个,我最后修改了 /etc/profile 添加MySQL相关的环境变量,解决了这个问题

 

3. 报错,192.168.137.101 >> Unable to connect to the MySQL server using tungsten@192.168.137.101:3306 (WITH PASSWORD)。
原因就是192.168.137.101上用tungsten数据库用户无法登录本地MySQL。
解决:
mysql> create user tungsten@’localhost’ identified by ‘123456’;
Query OK, 0 rows affected (0.00 sec)

mysql> grant all on *.* to tungsten@’localhost’ identified by ‘123456’ with grant option;
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

 

4. 报错,192.168.137.101 >> Failed: mkdir -p /MySQL/software/continuent/
也就是说192.168.137.101的tungsten用户没有权限创建这个目录。
解决:手工创建或者给予权限,我这里是手工创建了目录
# mkdir /MySQL/software/continuent
# chown tungsten:mysql /MySQL/software/continuent

 

5. 报错, 192.168.137.101 >> The MySQL config file ‘/etc/my.cnf’ does not exist
解决:使用–datasource-mysql-conf来指定从服务器的MySQL配置文件位置

 

6. 启动失败
[tungsten@node1 bin]$ ./replicator start
Starting Tungsten Replicator Service…
Waiting for Tungsten Replicator Service……
WARNING: Tungsten Replicator Service may have failed to start.

检查日志文件home-directory/tungsten/tungsten-replicator/log/trepsvc.log 能看到错误
我这里是因为主机名映射的问题
INFO   | jvm 1    | 2013/07/16 23:07:37 | 2013-07-16 23:07:37,066 [ – WrapperSimpleAppMain] INFO  management.ReplicationServiceManager Exce
ption when trying to get the host name from the environment, reason=Java.NET.UnknownHostException: node1.localdomain: node1.localdomain: Na
me or service not known

所以我修改了192.168.137.100上的/etc/hosts文件
添加了映射
192.168.137.100 node1.localdomain
以及192.168.137.101上的/etc/hosts文件
添加
192.168.137.101 node2.localdomain

 

7. slave上报错:
[tungsten@node1 bin]$ ./trepctl -host 192.168.137.101 services
Processing services command…
NAME              VALUE
—-              —–
appliedLastSeqno: -1
appliedLatency  : -1.0
role            : slave
serviceName     : logos
serviceType     : unknown
started         : true
state           : OFFLINE:ERROR
Finished services command…

检查192.168.137.101上的日志文件,发现“Variable ‘sql_mode’ can’t be set to the value of ‘INVALID_DATES’”
已经确认是BUG, 在https://code.google.com/p/tungsten-replicator/issues/list上提交并得到了反馈,会在正式的2.1.1版中修改,并得到了开发人员提供的tungsten-replicator-2.1.1-113.tar.gz的新版软件(也就是我上面括号里写的那个版本)继续进行试验

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注