准备

原理描述:

  1. 基于Canal开源产品,获取数据库增量日志数据。 什么是Canal, Canal是拉去源库binlog日志的,跟从库功能类似。
  2. 典型管理系统架构,manager(web管理)+node(工作节点)
    a. manager运行时推送同步配置到node节点
    b. node节点将同步状态反馈到manager上
  3. 基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作.
hostname ip app
otter 10.140.0.5(34.80.200.69) manager.deployer-4.2.18.tar.gz,node.deployer-4.2.18.tar.gz,apache-zookeeper-3.6.2-bin.tar.gz,Jdk-1.8,mysql5.7
data01 10.140.0.3 mysql5.7
data02 10.140.0.4 mysql5.7
  1. 下载otter managernode
  2. https://github.com/alibaba/otter/releases
  3. 下载zookeeper
  4. https://zookeeper.apache.org/releases.html#download

部署otter

安装jdk1.8

yum -y install java

安装mysql 5.7

3个机器都按如下步骤安装即可。

卸载mariadb

rpm -qa | grep mariadb
mariadb-libs-5.5.65-1.el7.x86_64

yum remove -y mariadb-libs-5.5.65-1.el7.x86_64

image.png

配置文件my.cnf

vim /etc/my.cnf
[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set=utf8mb4

[mysqld]

###############################基础设置#####################################
##设置东八区
default-time_zone='+8:00'
log_timestamps = SYSTEM
#Mysql服务的唯一编号 每个mysql服务Id需唯一
server-id = 1
log-bin-trust-function-creators=1
#服务端口号 默认3306
port = 3306

#开启gtid
gtid_mode=ON
enforce-gtid-consistency=true

#mysql安装根目录
basedir = /data/mysql

#mysql数据文件所在位置
datadir = /data/mysql/data

#临时目录比如load data infile会用到
tmpdir  = /tmp

#设置socket文件所在目录
socket  = /tmp/mysql.sock

##兼容mysql5.6 sql_mode
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

#只能用IP地址检查客户端的登录,不用主机名
skip-name-resolve

#事务隔离级别,默认为可重复读,mysql默认可重复读级别(此级别下可能参数很多间隙锁,影响性能)
transaction_isolation = READ-COMMITTED

#数据库默认字符集
character-set-server = utf8mb4

#数据库字符集对应一些排序等规则,注意要和character-set-server对应
collation-server = utf8mb4_unicode_ci


#是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names = 1

#最大连接数
max_connections = 1000

#最大错误连接数
max_connect_errors = 500

#TIMESTAMP如果没有显示声明NOT NULL,允许NULL值
explicit_defaults_for_timestamp = true

#SQL数据包发送的大小,如果有BLOB对象建议修改成1G
max_allowed_packet = 1024M

#MySQL连接闲置超过一定时间后(单位:秒)将会被强行关闭
#MySQL默认的wait_timeout  值为8个小时, interactive_timeout参数需要同时配置才能生效
interactive_timeout = 1800
wait_timeout = 1800

#内部内存临时表的最大值 ,设置成128M。
#比如大数据量的group by ,order by时可能用到临时表,
#超过了这个值将写入磁盘,系统IO压力增大
tmp_table_size = 134217728
max_heap_table_size = 134217728

#禁用mysql的缓存查询结果集功能
#后期根据业务情况测试决定是否开启
#大部分情况下关闭下面两项
query_cache_size = 0
query_cache_type = 0

#####################用户进程分配到的内存设置BEGIN#############################

##每个session将会分配参数设置的内存大小
#用于表的顺序扫描,读出的数据暂存于read_buffer_size中,当buff满时或读完,将数据返回上层调用者
#一般在128kb ~ 256kb,用于MyISAM
#read_buffer_size = 131072
#用于表的随机读取,当按照一个非索引字段排序读取时会用到,
#一般在128kb ~ 256kb,用于MyISAM
#read_rnd_buffer_size = 262144
#order by或group by时用到

#建议先调整为2M,后期观察调整
sort_buffer_size = 2097152

#一般数据库中没什么大的事务,设成1~2M,默认32kb
binlog_cache_size = 524288

########################用户进程分配到的内存设置END############################

#在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中
#官方建议back_log = 50 + (max_connections / 5),封顶数为900
back_log = 130

############################日志设置##########################################

#数据库错误日志文件
log_error = /data/mysql/error.log
pid-file = /data/mysql/mysql.pid

#慢查询sql日志设置
slow_query_log = 1
slow_query_log_file = /data/mysql/slow.log

#检查未使用到索引的sql
log_queries_not_using_indexes = 1

#针对log_queries_not_using_indexes开启后,记录慢sql的频次、每分钟记录的条数
log_throttle_queries_not_using_indexes = 5



#慢查询执行的秒数,必须达到此值可被记录
long_query_time = 3

#检索的行数必须达到此值才可被记为慢查询
min_examined_row_limit = 1000

#mysql binlog日志文件保存的过期时间,过期后自动删除
expire_logs_days = 7



#开启mysql binlog功能
log-bin=mysql-bin

#binlog记录内容的方式,记录被操作的每一行
binlog_format = ROW





#####################redo log和binlog的关系设置BEGIN#########################

#(步骤1) prepare dml相关的SQL操作,然后将redo log buff中的缓存持久化到磁盘
#(步骤2)如果前面prepare成功,那么再继续将事务日志持久化到binlog
#(步骤3)如果前面成功,那么在redo log里面写上一个commit记录
#当innodb_flush_log_at_trx_commit和sync_binlog都为1时是最安全的,
#在mysqld服务崩溃或者服务器主机crash的情况下,binary log只有可能丢失最多一个语句或者一个事务。
#但是都设置为1时会导致频繁的io操作,因此该模式也是最慢的一种方式。
#当innodb_flush_log_at_trx_commit设置为0,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。
#当innodb_flush_log_at_trx_commit设置为2,只有在操作系统崩溃或者系统掉电的情况下,上一秒钟所有事务数据才可能丢失。

#commit事务时,控制redo log buff持久化磁盘的模式 默认为1
innodb_flush_log_at_trx_commit = 1

#commit事务时,控制写入mysql binlog日志的模式 默认为0
#innodb_flush_log_at_trx_commit和sync_binlog都为1时,mysql最为安全但性能上压力也是最大
sync_binlog = 1

####################redo log和binlog的关系设置END############################

############################Innodb设置#####################################



#一般设置物理存储的60% ~ 70%
innodb_buffer_pool_size = 3G
innodb_data_file_path = ibdata1:10M:autoextend


#该参数针对unix、linux,window上直接注释该参数.默认值为NULL
#O_DIRECT减少操作系统级别VFS的缓存和Innodb本身的buffer缓存之间的冲突
innodb_flush_method = O_DIRECT




#提高刷新脏页数量和合并插入数量,改善磁盘I/O处理能力
#默认值200(单位:页)
#可根据磁盘近期的IOPS确定该值
innodb_io_capacity = 500

#为了获取被锁定的资源最大等待时间,默认50秒,超过该时间会报如下错误:
# ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
innodb_lock_wait_timeout = 30

#调整buffer pool中最近使用的页读取并dump的百分比,通过设置该参数可以减少转储的page数
innodb_buffer_pool_dump_pct = 40

#设置redoLog文件所在目录, redoLog记录事务具体操作内容
innodb_log_group_home_dir = /data/mysql/redolog/

#设置undoLog文件所在目录, undoLog用于事务回滚操作
innodb_undo_directory = /data/mysql/undolog/


#MySql5.7官方建议尽量设置的大些,可以接近innodb_buffer_pool_size的大小
#之前设置该值较大时可能导致mysql宕机恢复时间过长,现在恢复已经加快很多了
#该值减少脏数据刷新到磁盘的频次
#最大值innodb_log_file_size * innodb_log_files_in_group <= 512GB,单文件<=256GB
innodb_log_file_size = 1024M

#设置undoLog文件所占空间可以回收
#5.7之前的MySql的undoLog文件一直增大无法回收
innodb_undo_log_truncate = 1
innodb_undo_logs = 128

#强所有发生的死锁错误信息记录到error.log中,之前通过命令行只能查看最近一次死锁信息
innodb_print_all_deadlocks = 1

############################其他设置########################################

[mysqldump]
quick
max_allowed_packet = 1024M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 256k
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

[mysqld_safe]
#增加每个进程的可打开文件数量
open-files-limit = 28192
log_error = /data/mysql/error.log

下载安装

cd /root
wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
tar xvf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
mkdir -p /data
mkdir -p /var/log/mysql
mv mysql-5.7.31-linux-glibc2.12-x86_64 /data/mysql
mkdir -p /data/mysql/data
mkdir -p /data/mysql/redolog
mkdir -p /data/mysql/undolog
touch /data/mysql/error.log
touch /data/mysql/slow.log
groupadd mysql
useradd -g mysql mysql -M
chown -R mysql:mysql  /data/mysql/
chown -R mysql:mysql  /etc/my.cnf
yum -y install numactl-libs libaio*  autoconf automake
cd /data/mysql
./bin/mysqld --user=mysql --basedir=/data/mysql --datadir=/data/mysql/data --initialize

启动mysql

echo 'export PATH=$PATH:/data/mysql/bin'  > /etc/profile.d/mysql_bin.sh
source /etc/profile
cp /data/mysql/support-files/mysql.server  /etc/init.d/mysql 
cd /etc/init.d/
chmod +x mysql
chkconfig --add mysql
service mysql start

查看初始化密码

cat /data/mysql/error.log | grep password

mysql -uroot -p'密码'

image.png

修改密码,添加访问权限

SET PASSWORD = PASSWORD('123456root');
grant all privileges on *.* to 'root'@'%' identified by '123456root';

image.png

初始化otter库

wget https://github.com/alibaba/otter/archive/otter-4.2.18.zip
unzip otter-4.2.18.zip
mysql -uroot -p'123456root'

source /root/otter-otter-4.2.18/manager/deployer/src/main/resources/sql/otter-manager-schema.sql

安装zk

wget https://mirror-hk.koddos.net/apache/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz
tar xvf apache-zookeeper-3.6.2-bin.tar.gz
mkdir /data
mv apache-zookeeper-3.6.2-bin /data/zookeeper
mkdir /data/zookeeper/zk_file/data -p
mkdir /data/zookeeper/zk_file/logs -p
cat > /data/zookeeper/conf/zoo.cfg << EOF
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/zk_file/data
dataLogDir=/data/zookeeper/zk_file/logs
clientPort=2181
EOF
cd  /data/zookeeper/bin/
./zkServer.sh start

安装otter manager

wget https://github.com/alibaba/otter/releases/download/otter-4.2.18/manager.deployer-4.2.18.tar.gz
mkdir /data/manager -p
tar xvf manager.deployer-4.2.18.tar.gz -C /data/manager
cd /data/manager/conf
vim otter.properties

只需要修改以下几处
image.png
image.png

启动manager

cd /data/manager/bin/
./startup.sh

访问ip:8088 帐号和密码都是admin
image.png

manager添加zk

image.png
image.png
image.png

manager添加node

image.png
image.png

安装node

wget https://github.com/alibaba/otter/releases/download/otter-4.2.18/node.deployer-4.2.18.tar.gz
mkdir  /data/node -p
tar xvf node.deployer-4.2.18.tar.gz -C /data/node/
cd /data/node/conf
vim otter.properties

只需要修改下注册manager的地址即可
image.png

echo 1 > /data/node/conf/nid

启动node

cd /data/node/bin/
./startup.sh

image.png

到这里,已经成功安装整个otter。

同步任务配置

otter配置比较繁琐,并不会特别复杂,我这里先大概说下流程和几个关键名词解释

otter名词解释
数据源:读取的源实例信息,和写入的目标实例信息
数据表:配置映射用的,用于配置,源实例,什么库,什么表,同步到目标什么库,什么表
canal:otter是做增量同步的,增量同步基于mysql的binlog日志,并且是row格式。这里需要配置你读取binlog的信息,和数据源里面的源实例信息可以说是同一个。
通道配置: otter采用一个实例一个通道方式。一个实例可以多个配置多个库

pipeline:主要核心功能如下
(1)选择你的canal配置,读取哪个实例的binlog。
(2)选择整个同步是在哪个节点上进行,例如我们部署了三个node节点,可以由node1进行读取的操作,可以由node2进行目标实例写入操作。也可以同时放到一个节点上。
(3)binlog位置,默认不写就读最新位置的。
(4)高级配置里面有是否跳过DDL,传输模式,负载均衡算法等,一般保持默认即可。

流程
(1)新增数据源,一般最少配置2个,一个读取的源库,一个目标
(2)数据表,配置映射关系,从哪里同步到哪里。
(3)Canal,配置读取binlog的信息

上面步骤创建好后,我们就可以正式开始配置通道了
(4)创建通道
(5)创建pipeline
(6)创建表映射关系
(7)启动通道

举例:主库data01.从库data02, 同步data01中的test库到data02的test库中,
主库和从库先创建好test库和表

create database test;
use test;
create table test(id int(10) NOT NULL primary key, name varchar(20) NOT NULL);

添加数据源

image.png
image.png
image.png
image.png

数据表配置

image.png
image.png
image.png
image.png

canal配置

canal是用来监听主库binlog的
image.png
image.png

配置channel

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

启动channel

image.png
image.png

测试

在主库添加数据

insert into test values(1,'a');
insert into test values(2,'b');
insert into test values(3,'c');

image.png从库数据库查看数据
image.png