网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
3. 创建MySQL
后期要使用Canal,需要把MySQL的配置文件提取出来,所以要进行相关的配置文件的编写
#创建MySQL配置文件
mkdir -p /mnt/mysql/conf
#创建配置文件mysql.cnf
vim /mnt/mysql/conf/mysql.cnf
#内容如下:
[mysqld]
# 设置关闭二进制日志
skip-log-bin
启动MySQL容器
# 创建MySQL网络环境,指定子网网段
docker network create --subnet=172.36.0.0/16 seckill_network
# 启动MySQL 指定容器IP,固定IP地址
docker run -id --name seckill_mysql \
--net seckill_network --ip 172.36.0.3 \
-v /mnt/mysql/data:/var/lib/mysql \
-v /mnt/mysql/conf:/etc/mysql/conf.d \
--restart=always -p 3306:3306 \
-e MYSQL\_ROOT\_PASSWORD=eVcWs1dsEgiv4ijEZ1b6 mysql:8.0.18
4. 创建Canal数据同步
配置MySQL
需要让canal伪装成salve并正确获取mysql中的binary log,首先要开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式
修改MySQL配置文件,如下操作:
# 执行修改命令
vi /mnt/mysql/conf/mysql.cnf
# 配置文件 mysql.cnf 内容如下
[mysqld]
# 设置关闭二进制日志
#skip-log-bin
# 开启二进制日志
log-bin=mysql-bin
#开启binlog 选择ROW模式
binlog-format=ROW
#server\_id不要和canal的slaveId重复
server\_id=1
配置文件修改完成后重启MySQL
docker restart seckill_mysql
在MySQL中执行以下sql,查询数据库状态
show variables like 'log\_bin';
show variables like 'binlog\_format';
show master status;
创建连接MySQL的账号canal
并授予作为 MySQL slave 的权限,执行以下sql:
# 创建账号
CREATE USER canal IDENTIFIED BY 'canal';
# 授予权限
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON \*.\* TO 'canal'@'%';
# 修改数据库加密算法
ALTER USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY 'canal';
# 刷新并应用
FLUSH PRIVILEGES;
创建并配置Cancal
创建canal-server容器
docker run -d --name canal-server \
--net seckill_network --ip 172.36.0.8 \
--restart=always -p 11111:11111 \
canal/canal-server:v1.1.4
配置Canal
# 进入Canal容器
docker exec -it canal-server /bin/bash
# 修改配置文件
vi /home/admin/canal-server/conf/example/instance.properties
# instance.properties需要修改以下三个部分
# 修改Canal的slaveId,不能和MySQL的server\_id重复
canal.instance.mysql.slaveId=101
# 修改需要进行同步操作的MySQL的连接地址
canal.instance.master.address=172.36.0.3:3306
# 修改需要进行监听的数据库表
canal.instance.filter.regex=seckill_goods.tb_sku
# 修改完成后重启Canal服务
docker restart canal-server
监听数据库表的配置 canal.instance.filter.regex
如下:
mysql 数据解析关注的表,Perl正则表达式.
多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\)
常见例子:
1. 所有表:.* or .*\\..*
2. canal schema下所有表: canal\\..*
3. canal下的以canal打头的表:canal\\.canal.*
4. canal schema下的一张表:canal.test1
5. 多个规则组合使用:canal\\..*,mysql.test1,mysql.test2 (逗号分隔)
注意:此过滤条件只针对row模式的数据有效(ps. mixed/statement因为不解析sql,所以无法准确提取tableName进行过滤)
5. 创建Elasticsearch和kibana
准备IK分词器
# 创建存放IK分词器的目录
mkdir -p /mnt/elasticsearch/plugins/ik
# 上传IK分词器
# 解压IK到指定路径
tar -xf ik-7.4.0.tar -C /mnt/elasticsearch/plugins/ik
启动docker服务
# 创建单机版elasticsearch容器
docker run -id --name elasticsearch \
--net seckill_network --ip 172.36.0.13 \
-v /mnt/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
--restart=always -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" elasticsearch:7.4.0
# 创建kibana
docker run -id --name kibana --net seckill_network \
-e ELASTICSEARCH\_HOSTS=http://172.36.0.13:9200 \
--restart=always -p 5601:5601 kibana:7.4.0
连接kibana,测试中文分词
GET /_analyze
{
"analyzer": "ik\_smart",
"text": "乒乓球明年总冠军"
}
初始化索引库
GET goodsindex
PUT goodsindex
{
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "ik\_smart"
},
"price": {
"type": "long"
},
"seckillPrice": {
"type": "long"
},
"image": {
"type": "text"
},
"updateTime": {
"type": "date"
},
"category1Id": {
"type": "text"
},
"category2Id": {
"type": "text"
},
"category3Id": {
"type": "text"
},
"category1Name": {
"type": "keyword"
},
"category2Name": {
"type": "keyword"
},
"category3Name": {
"type": "keyword"
},
"brandName": {
"type": "keyword"
},
"bgtime": {
"type": "keyword"
},
"brandId": {
"type": "text"
},
"seckillBegin": {
"type": "date"
},
"seckillEnd": {
"type": "date"
},
"status": {
"type": "integer"
},
"spec": {
"type": "text"
},
"points": {
"type": "integer"
}
}
}
}
6. 创建Redis集群
准备环境:
#创建文件目录
mkdir -p /mnt/redis/r1/data
mkdir -p /mnt/redis/r2/data
mkdir -p /mnt/redis/r3/data
mkdir -p /mnt/redis/r4/data
mkdir -p /mnt/redis/r5/data
mkdir -p /mnt/redis/r6/data
准备Redis配置文件,需要准备6份,第一份:
执行命令 vi /mnt/redis/r1/redis.conf
内容为:
port 7001
bind 0.0.0.0
protected-mode no
databases 1
appendonly yes
#开启集群
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
配置文件注意路径不同,端口号为7001~7006
编写 vim /mnt/redis/docker-compose.yml
,内容为:
version: "3.6"
services:
redis1:
container\_name: redis1
image: redis:5.0.9
network\_mode: host
volumes:
- /mnt/redis/r1/redis.conf:/config/redis.conf
- /mnt/redis/r1/data:/data
command: [ "redis-server", /config/redis.conf ]
restart: always
redis2:
container\_name: redis2
image: redis:5.0.9
network\_mode: host
volumes:
- /mnt/redis/r2/redis.conf:/config/redis.conf
- /mnt/redis/r2/data:/data
command: [ "redis-server", /config/redis.conf ]
restart: always
redis3:
container\_name: redis3
image: redis:5.0.9
network\_mode: host
volumes:
- /mnt/redis/r3/redis.conf:/config/redis.conf
- /mnt/redis/r3/data:/data
command: [ "redis-server", /config/redis.conf ]
restart: always
redis4:
container\_name: redis4
image: redis:5.0.9
network\_mode: host
volumes:
- /mnt/redis/r4/redis.conf:/config/redis.conf
- /mnt/redis/r4/data:/data
command: [ "redis-server", /config/redis.conf ]
restart: always
redis5:
container\_name: redis5
image: redis:5.0.9
network\_mode: host
volumes:
- /mnt/redis/r5/redis.conf:/config/redis.conf
- /mnt/redis/r5/data:/data
command: [ "redis-server", /config/redis.conf ]
restart: always
redis6:
container\_name: redis6
image: redis:5.0.9
network\_mode: host
volumes:
- /mnt/redis/r6/redis.conf:/config/redis.conf
- /mnt/redis/r6/data:/data
command: [ "redis-server", /config/redis.conf ]
restart: always
执行服务编排:
#进入指定路径
cd /mnt/redis
#服务编排启动Redis集群
docker-compose up -d
启动集群:
# 进入容器内部
docker exec -it redis1 /bin/bash
#执行Redis集群创建命令,注意要修改所有的192.168.200.188为自己设备的实际IP,如果使用云服务器,则使用公网IP
redis-cli --cluster create 192.168.200.188:7001 192.168.200.188:7002 192.168.200.188:7003 192.168.200.188:7004 192.168.200.188:7005 192.168.200.188:7006 --cluster-replicas 1
redis-cli --cluster create 39.103.206.202:7001 39.103.206.202:7002 39.103.206.202:7003 39.103.206.202:7004 39.103.206.202:7005 39.103.206.202:7006 --cluster-replicas 1
#集群节点信息
redis-cli -p 7001 cluster nodes
# 连接集群
redis-cli -h 127.0.0.1 -p 7001 -c
如果卡在 Waiting for the cluster to join
这一步,检查端口号是否开放。redis集群除了需要使用7001~7006,还需要开通集群总线端口,端口号为redis端口号+10000 在这里就是端口号为17001~17006的都需要开放
注意:
集群启动成功后,需要在宿主机中检查集群节点的配置文件(Ctrl+d可以退出容器)
#查看配置文件命令:
cat vi /mnt/redis/r1/data/nodes.conf
# 如果出现内网IP(例如172.x.x.x),则需要修改宿主机的集群配置文件
# 检查6个配置文件,把所有的内网IP都改为当前公网IP
# 在宿主机分别执行以下命令,分别进行修改:
vi /mnt/redis/r1/data/nodes.conf
vi /mnt/redis/r2/data/nodes.conf
vi /mnt/redis/r3/data/nodes.conf
vi /mnt/redis/r4/data/nodes.conf
vi /mnt/redis/r5/data/nodes.conf
vi /mnt/redis/r6/data/nodes.conf
#服务编排启动Redis集群
docker-compose up -d
#服务编排停止Redis集群并删除容器
docker-compose down
7. 创建Zookeeper
docker run -d --name zk \
--net seckill_network --ip 172.36.0.16 \
--restart=always \
-v /etc/localtime:/etc/localtime \
-p 3181:2181 zookeeper:3.4.14
8. 创建Kafka
创建Kafka之前,必须先确保Zookeeper已经存在,请先确认 7.创建Zookeeper
是否完成。
使用Docker启动Kafka:
docker run -d --name kafka \
--restart=always -p 9092:9092 \
-e KAFKA\_BROKER\_ID=0 \
-e KAFKA\_ZOOKEEPER\_CONNECT=192.168.200.188:3181/kafka \
-e KAFKA\_ADVERTISED\_LISTENERS=PLAINTEXT://192.168.200.188:9092 \
-e KAFKA\_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-v /etc/localtime:/etc/localtime \
wurstmeister/kafka:2.12-2.4.1
注意:需要修改192.168.200.188为宿主机的实际ip地址(如果有公网IP,填写公网IP地址)
测试Kafka
创建队列:
# 进入容器
docker exec -it kafka /bin/bash
# 进入目录
cd /opt/kafka_2.12-2.4.1/bin
# 创建队列
./kafka-topics.sh --create --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1 --topic itemaccess
使用kafka-topics.sh创建队列:
–create:执行创建一个新的队列操作
--bootstrap-server:需要链接的kafka配置,必填
--partitions 1:设置一个topic设置几个分区(就是把数据切割成几块,分别存储)
--replication-factor 1:设置分区的副本数量(就是设置多少个备份,有了备份,一个挂了没事,可以使用备份)
--topic itemaccess:队列的名字叫itemaccess
消息发布
在kafka容器中执行消息发送(接着上面的步骤执行):
# 发送消息
./kafka-console-producer.sh --broker-list localhost:9092 --topic itemaccess
# 发送内容为
{"actime":"2021-4-10 9:50:10","uri":"http://www-seckill.itheima.net/items/333.html","IP":"119.123.33.231","Token":"Bearer itcast"}
消息订阅
# 进入容器
docker exec -it kafka /bin/bash
# 进入目录
cd /opt/kafka_2.12-2.4.1/bin
# 订阅消息
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic itemaccess --from-beginning
其他命令
# 进入容器
docker exec -it kafka /bin/bash
# 进入目录
cd /opt/kafka_2.12-2.4.1/bin
# 查看topic列表
./kafka-topics.sh --bootstrap-server localhost:9092 --list
# 查看指定的topic信息
./kafka-topics.sh --bootstrap-server localhost:9092 --list
# 删除topics
./kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic itemaccess2
9. 创建OpenRestry
如果因为本地计算机的内存不够,不能使用本地虚拟机而使用云服务器,最好还是把OpenRestry放在本地。
也就是说,除了OpenRestry以外的服务都可以安装到云服务器上,OpenRestry需要安装到本地虚拟机中。后面在进行秒杀抢单的时候,需要进行Nginx转发,OpenRestry在本地更方便配置。
9.1 安装OpenRestry
安装OpenRestry:
# 安装环境
yum -y install pcre-devel openssl-devel gcc curl
# 上传openresty-1.11.2.5.tar.gz
# 解压
tar -xf openresty-1.11.2.5.tar.gz
# 进入到解压目录
cd openresty-1.11.2.5
# 安装
./configure --prefix=/usr/local/openresty \
--with-luajit \
--without-http_redis2_module \
--with-http_stub_status_module \
--with-http_v2_module \
--with-http_gzip_static_module \
--with-http_sub_module
# 编译
make
#安装
make install
配置环境变量:
# 修改环境文件
vi /etc/profile
# 修改为以下内容
export JAVA\_HOME=/usr/local/jdk8
export OPENRESTY\_HOME=/usr/local/openresty/nginx
export PATH=$JAVA\_HOME/bin:$OPENRESTY\_HOME/sbin:$PATH
# 使环境文件生效
source /etc/profile
9.2 安装Lua的Kafka插件
# 上传lua-resty-kafka-master.zip
# 解压
unzip lua-resty-kafka-master.zip
# 移动到指定目录
mv lua-resty-kafka-master /usr/local/openresty/
# 修改nginx.conf
vi /usr/local/openresty/nginx/conf/nginx.conf
# 添加内容 在配置文件中指定lua-resty-kafka的库文件位置
# 配置到http里面,和server平级
lua_package_path "/usr/local/openresty/lua-resty-kafka-master/lib/?.lua;;";
配置效果如下:
http {
......
#gzip on;
#添加内容 在配置文件中指定lua-resty-kafka的库文件位置
lua_package_path "/usr/local/openresty/lua-resty-kafka-master/lib/?.lua;;";
server {
listen 80;
server_name localhost;
......
}
9.2 安装Lua的Jwt插件
# 安装环境
yum install -y yum-utils
# 设置yum的资源地址
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
# 安装resty和opm工具
yum install -y openresty-resty
yum install -y openresty-opm
# 安装jwt组件
opm get SkyLothar/lua-resty-jwt
9.3 安装Lua的Redis插件
# 安装环境
yum install -y lua-devel
# 上传资料中的lua-resty-redis-cluster-master.zip到服务器的 /root目录下
# 解压
cd /root
unzip lua-resty-redis-cluster-master.zip
# 拷贝redis\_slot.c:
cp /root/lua-resty-redis-cluster-master/lib/redis_slot.c /usr/local/openresty/lualib/
# 拷贝rediscluster.lua:
cp /root/lua-resty-redis-cluster-master/lib/resty/rediscluster.lua /usr/local/openresty/lualib/resty/
# 编译
cd /usr/local/openresty/lualib
gcc redis_slot.c -fPIC -shared -o libredis_slot.so
lua-resty-redis-cluster
中有部分redis指令并未开放,我们可以手动修改,开放相关指令,我们这里开放过期指令,因为后面会用到该指令。
开放设置过期时间的指令,步骤如下:
# 修改配置文件
vi /usr/local/openresty/lualib/resty/rediscluster.lua
# 进入指定的行数
:90
# 插入空行
o
# 在空行中添加指令,设置过期时间的指令如下:(注意""和,都不能少)
"expire",
# 按 Esc 进入一般模式,保存退出
:wq
10. 创建Druid
下载Druid安装包 https://mirrors.aliyun.com/apache/druid/
,注意下载bin版本,不是src源码
# 上传资料中的apache-druid-0.20.2-bin.tar.gz,
# 也可以使用命令 wget https://mirrors.aliyun.com/apache/druid/0.20.2/apache-druid-0.20.2-bin.tar.gz获取安装包
# 解压
tar -zxf apache-druid-0.20.2-bin.tar.gz
# 移动到指定位置
mv apache-druid-0.20.2 /usr/local/druid
# 修改时区
cd /usr/local/druid/conf/druid/single-server
sed -i "s/Duser.timezone=UTC/Duser.timezone=UTC+8/g" `grep Duser.timezone=UTC -rl ./`
# 进入启动脚本的目录
cd /usr/local/druid/bin
![img](https://img-blog.csdnimg.cn/img_convert/2087bf0df72e93d27631c2a0b0d95d53.png)
![img](https://img-blog.csdnimg.cn/img_convert/592af9068fe1133eebad168da2c7a2ad.png)
![img](https://img-blog.csdnimg.cn/img_convert/466b248aeb5e53c0518ac64dea5c56ed.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**
本,不是src源码
上传资料中的apache-druid-0.20.2-bin.tar.gz,
也可以使用命令 wget https://mirrors.aliyun.com/apache/druid/0.20.2/apache-druid-0.20.2-bin.tar.gz获取安装包
解压
tar -zxf apache-druid-0.20.2-bin.tar.gz
移动到指定位置
mv apache-druid-0.20.2 /usr/local/druid
修改时区
cd /usr/local/druid/conf/druid/single-server
sed -i “s/Duser.timezone=UTC/Duser.timezone=UTC+8/g” grep Duser.timezone=UTC -rl ./
进入启动脚本的目录
cd /usr/local/druid/bin
[外链图片转存中…(img-i1Isokfx-1715494482626)]
[外链图片转存中…(img-dWgmHXE9-1715494482627)]
[外链图片转存中…(img-bW8qpbRv-1715494482627)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新