@author isai 2017/6/13 11:27:10
一、环境
官网:https://github.com/alibaba/otter/wiki
相关网站:
http://lblog.lol/2016/07/30/otter%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/
http://blog.sina.com.cn/s/blog_6f6bc30e0101pclp.html
http://blog.csdn.net/xuejingfu1/article/details/52275750
1.服务器环境
两台阿里云服务器,都位于华东1,配置建议:4核4G内存5M宽带
2.数据库环境
两台数据库服务器
是否需要开外网:如果A服务器位于内网,A不用开外网端口,如果A不是内网,需要开外网
数据库条件:如果是自己安装的虚拟机或实体机,需要修改修改mysql配置文件:
vi /etc/my.cnf
log-bin=mysql-bin
binlog_format=ROW #只支持ROW
server-id = 1 #两个数据库的serverid设置为不一样的值
source /etc/my.cnf
如果是阿里云的数据库,默认配置如上,不用去修改
二、需要用到的软件
aria2 : aria2-1.17.1
cmake : cmake-2.8.11.2
JDK : jdk-7u79-linux-i586
manage.deployer : manager.deployer-4.2.13
node.deployer : node.deployer-4.2.13
zookeeper : zookeeper-3.4.6
三、cmake安装jdk
四、zookeeper安装
1.下载和解压
cd /www/soft
tar -zxvf /www/soft/zookeeper-3.3.6.tar.gz /www/server/
2.配置
(1)编辑配置文件
cd /www/server/zookeeper-3.3.6/conf
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
单机配置
编辑zoo.cfg的datadir为:
dataDir=/tmp/zookeeper
集群配置
ookeeper集群配置必须为2n+1 台集群,否则没有意义
编辑zoo.cfg文件为:
dataDir=/tmp/zookeeper
在文件末尾加上下面三句:
server.1=192.168.10.187:2888:3888
server.2=192.168.10.188:2888:3888
server.3=192.168.10.189:2888:3888
分别在上面三台中执行:
echo "1" > /tmp/zookeeper/myid #187机器,路径为dataDir下
echo "2" > /tmp/zookeeper/myid #188机器
echo "3" > /tmp/zookeeper/myid #189机器
(2)配置环境变量
export ZOOKEEPER_INSTALL=/www/soft/zookeeper-3.3.6
export PATH=$PATH:$ZOOKEEPER_INSTALL/bin
source /etc/profile
(3)建立软连接
ln -s /www/soft/zookeeper-3.3.6/bin/zkServer.sh /usr/local/bin/zk-server
ln -s /www/soft/zookeeper-3.3.6/bin/zkCli.sh /usr/local/bin/zk-cli
(4)启动
zk-server start
zk-server status
集群启动后,发现三台机器的status中,一个leader,两个follwer为正常
(5)排错
如果出现拒绝连接,请检查如下:
A.防火墙是否关闭 systemctl stop firewalld
B.需要将真实ip 映射到本地 /etc/hosts文件中,否则无法连接
五、manager安装
建议:manager 安装在内网的机器上,这样主服可以不用开外网端口,otter配置数据库也放在内网上
官网详细步骤:https://github.com/alibaba/otter/wiki/Manager_Quickstart
1.安装manager的数据库
wget https://raw.github.com/alibaba/otter/master/manager /deployer/src/main/resources/sql/otter-manager-schema.sql
创建otter数据库后,将脚本导进去
2.解压
mkdir /www/server/manager
cd /www/server/manager
tar zxvf /www/soft/manager.deployer-4.2.14.tar.gz
3.修改manager配置文件
vi /www/server/manager/conf/otter.properties
otter.domainName =192.168.10.104 ##修改为本机的ip
otter.port = 8080 ##对外访问的端口号
otter.database.driver.url = jdbc:mysql://192.168.2.104:3306/otter ##otter数据的配置
otter.database.driver.username = root ##otter数据的账号
otter.database.driver.password = 123456 ##otter数据的密码
otter.communication.manager.port = 1099 ##对应Node中的配置
otter.zookeeper.cluster.default = 192.168.2.104:2181 ##对应集群的地址,这里我是准备以这台机器为建立集群
4.修改本机hosts设置
vi /etc/hosts
添加 192.168.2.104 localhost localhost.localdomain localhost4 localhost4.localdomain4
5、启动manager
/www/server/manager/bin/startup.sh
http://127.0.0.1:8080/login.htm,初始密码为:admin/admin,即可完成登录,ip修改为本机ip
六、node安装
1.安装aria2
node节点进行跨机房传输时,会使用到HTTP多线程传输技术,目前主要依赖了aria2c做为其下载客户端,所以我们现在需要安装aria2
解压缩 aria2
./configure
make
make install
将ariar2c加入path中:
vi /root/.bash_profile
在PATH的末尾加上:/usr/local/bin 分号的作用是与之前的隔开。
source /root/.bash_profile
2.安装node
(1)配置manager的nid
otter node会受otter manager进行管理,所以需要预先安装otter manager
完成manager安装后,需要在manager页面为node定义配置信息,并生一个唯一id.
(2)安装
解压node
vi conf/otter.properties
otter.manager.address = 192.168.2.104:1099 ##对应manager中otter.properties的配置otter.communication.manager.port,也就是集群的ip
echo 1 > conf/nid 这个1也是对应的myid
启动node sh startup.sh
查看日志 vi logs/node/node.log
Exception in thread “main” java.lang.IllegalArgumentException: node[1] ip[127.0.0.1] port[2088] , but your host ip[10.12.48.215] is not matched!
at com.alibaba.otter.node.etl.OtterController.checkNidVaild(OtterController.java:245)
at com.alibaba.otter.node.etl.OtterController.initNid(OtterController.java:230)
at com.alibaba.otter.node.etl.OtterController.start(OtterController.java:73)
at com.alibaba.otter.node.deployer.OtterLauncher.main(OtterLauncher.java:25)
出现以上错误为ip配置错误
2013-08-14 15:42:16.886 [main] INFO com.alibaba.otter.node.deployer.OtterLauncher - INFO ## the otter server is running now ……
出现以上内容时为启动成功
(4)验证
安装完成并且启动后,登陆manager,会发现 该 nid对应的 node 状态为启动
七、同步配置
1.单向同步
没什么好注意的,按照官网来即可
2.双向同步
(1)数据库
双向同步需要在需要同步的两个数据库中新建retl数据库
1. 创建database retl
*/
CREATE DATABASE retl;
/* 2. 用户授权 给同步用户授权 */
CREATE USER retl@'%' IDENTIFIED BY 'retl';
GRANT USAGE ON *.* TO `retl`@'%';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO `retl`@'%';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `retl`.* TO `retl`@'%';
/* 业务表授权,这里可以限定只授权同步业务的表 */
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO `retl`@'%';
/* 3. 创建系统表 */
USE retl;
DROP TABLE IF EXISTS retl.retl_buffer;
DROP TABLE IF EXISTS retl.retl_mark;
DROP TABLE IF EXISTS retl.xdual;
CREATE TABLE retl_buffer
(
ID BIGINT(20) AUTO_INCREMENT,
TABLE_ID INT(11) NOT NULL,
FULL_NAME varchar(512),
TYPE CHAR(1) NOT NULL,
PK_DATA VARCHAR(256) NOT NULL,
GMT_CREATE TIMESTAMP NOT NULL,
GMT_MODIFIED TIMESTAMP NOT NULL,
CONSTRAINT RETL_BUFFER_ID PRIMARY KEY (ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE retl_mark
(
ID BIGINT AUTO_INCREMENT,
CHANNEL_ID INT(11),
CHANNEL_INFO varchar(128),
CONSTRAINT RETL_MARK_ID PRIMARY KEY (ID)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE xdual (
ID BIGINT(20) NOT NULL AUTO_INCREMENT,
X timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (ID)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
/* 4. 插入初始化数据 */
INSERT INTO retl.xdual(id, x) VALUES (1,now()) ON DUPLICATE KEY UPDATE x = now();
(2)注意事项
最好在单向同步没问题了再进行双向的同步
从A到B的单向为主站点,B到A的设置为非主站点
数据库一致性选择单向回环补救
从A到B 配置ddl同步,从B到A时: 关闭“支持ddl同步”并且开启“跳过ddl异常”
八、限制性条件
1、数据库禁止使用枚举类型
2、保证外网宽带的带宽,可以用 iotop来检测带宽
3、数据库的表必须要有主键