1、mysql主服务器的配置
1.1 进入mysql中检查binlog是否开启
show VARIABLES like 'log_%'
1.2 在mysql中创建用户canal
分别运算下列语句
create user 'canal'@'%' IDENTIFIED with mysql_native_password by 'canal';
grant SELECT, REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'canal'@'%';
FLUSH PRIVILEGES;
2、安装Canal的docker容器
2.1 查询镜像
[root@localhost ~]# docker search canal
2.2 拉取镜像
[root@localhost ~]# docker pull docker.io/canal/canal-server
2.3 配置文件
- 在/usr/local/文件目录下创建software/canal/conf文件目录
[root@localhost local ]# mkdir -p software/cancl/conf
- 复制Canal文件中的文件到当前cancl/conf文件夹下
cp canal:/home/admin/canal-server/conf/canal.properties /usr/local/software/canal/conf
cp canal:/home/admin/canal-server/conf/instance.properties /usr/local/software/canal/conf
- 修改文件权限
[root@localhost conf]# chmod 777 *.properties
- 查询mysql主服务器容器的IP地址
[root@localhost conf]# docker inspect mysql_3306 |grep IPA
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAMConfig": null,
"IPAddress": "172.17.0.2",
- 查询mysql主服务的状态
//进入MySQL容器
[root@localhost conf]# docker exec -it mysql_3306 bash
//启动MySQL
bash-4.4# mysql -uroot -p123//查看状态
mysql> show master status;
- 修改instance.properties 配置文件
5 # enable gtid use true/false
6 canal.instance.gtidon=false
7
8 # position info
9 canal.instance.master.address=172.17.0.2:3306 #mysql容器的IP地址和端口号
10 canal.instance.master.journal.name=mysql-bin.000006 #数据库状态的File值
11 canal.instance.master.position=3771971 #数据库状态的Position值
12 canal.instance.master.timestamp=
13 canal.instance.master.gtid=
14
32 # username/password
33 canal.instance.dbUsername=root #数据库登录用户名
34 canal.instance.dbPassword=123 #数据库登录密码
35 canal.instance.connectionCharset = UTF-8
36 # enable druid Decrypt database password
37 canal.instance.enableDruid=false
38 #canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GC Mo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==
2.4创建Canal的docker容器
[root@localhost conf]# docker run -itd --name canal -p 11111:11111 --privileged=true
-v /usr/local/software/canal/conf/instance.properties:/home/admin/canal-server/conf/example/instance.properties
-v /usr/local/software/canal/conf/canal.properties:/home/admin/canal-server/conf/example/canal.properties
canal/canal-server
f9e8a8c5c661401826d6b12916442b45198560210dd4d5121054dd82da2b6a61
-v /usr/local/software/canal/conf/instance.properties:/home/admin/canal-server/conf/example/instance.properties 前面时自己创建的conf文件目录中的instance.properties的地址 后面时canal文件中的instance.properties地址
3、测试代码
Canal官网:ClientExample · alibaba/canal Wiki · GitHub (kgithub.com)
3.1 在springboot项目中导入Canal依赖
<dependency>
<groupId>com.alibaba.otter</groupId>
<artifactId>canal.client</artifactId>
<version>1.1.0</version>
</dependency>
3.2 测试代码
将官网中的ClientSample代码复制到项目中
将代码做一些修改
final InetSocketAddress HOST = new InetSocketAddress("192.168.121.128",11111);
CanalConnector connector = CanalConnectors.newSingleConnector(HOST, "example", "", "");
int batchSize = 1000;
int emptyCount = 0;
4、redis的回收策略
redis的回收机制有两种方式,一是清除过期的键对象,二是内存到达上限触发内存淘汰策略。
4.1 清除过期的键对象
redis所有的key都设置了过期属性,redis保存了大量的key,要精准保证每个键的过期删除机制太消耗CPU,这对单线程的redis来说付出的代价比较大,因此Redis采用惰性删除和定时任务删除机制实现过期键的内存回收。
- 惰性删除:惰性删除用于当客户端读取带有超时属性的键时,如果已经超过键设置的过期时间,会执行删除操作并返回空,这种策略是出于节省CPU成本考虑,不需要单独维护TTL链表来处理过期键的删除。但是单独用这种方式存在内存泄露的问题,当过期键一直没有访问将无法得到及时删除,从而导致内存不能及时释放。正因为如此,Redis还提供另一种定时任务删除机制作为惰性删除的补充。
- 定时任务删除:Redis内部维护一个定时任务,默认每秒运行10次(通过配置hz控制)。定时任务中删除过期键逻辑采用了自适应算法,根据键的过期比例,使用快慢两种速率模式回收键。
4.2淘汰策略
当Redis所用内存达到上限时会触发相应的淘汰策略,redis默认的淘汰策略为noeviction。
- volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。
- volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。
- volatile-random:从已设置过期时间的数据集中任意选择数据淘汰。
- volatile-lfu:从已设置过期时间的数据集挑选使用频率最低的数据淘汰。
- allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
- allkeys-lfu:从数据集中挑选使用频率最低的数据淘汰。
- allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
- no-enviction(驱逐):禁止驱逐数据,这也是默认策略。意思是当内存不足以容纳新入数据时,新写入操作就会报错,请求可以继续进行,线上任务也不能持续进行,采用no-enviction策略可以保证数据不被丢失
(9条消息) 超全详解Redis(8种)数据淘汰策略_redis淘汰策略_Adam`南帝·梁的博客-CSDN博客Redis内存回收策略 - 简书 (jianshu.com)