网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
#安装好后,可以查看docker的版本
docker -v
#修改Docker配置文件,使用国内的Docker镜像:
vi /etc/docker/daemon.json
添加以下内容
{“registry-mirrors”:[“https://ncwlarc2.mirror.aliyuncs.com”]}
#使之生效
systemctl daemon-reload
#重启
systemctl restart docker
安装Docker Compose
#国内资源(建议)
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-uname -s
-uname -m
> /usr/local/bin/docker-compose
将可执行权限应用于二进制文件:
chmod +x /usr/local/bin/docker-compose
创建软链:
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功:
docker-compose --version
JDK安装
jdk镜像仓库:https://repo.huaweicloud.com/java/jdk/8u171-b11/
下载、解压jdk
wget https://repo.huaweicloud.com/java/jdk/8u171-b11/jdk-8u171-linux-x64.tar.gz
tar -zxf jdk-8u171-linux-x64.tar.gz
mv jdk1.8.0_171 /usr/local/jdk8
配置环境
vi /etc/profile
添加内容:
export JAVA_HOME=/usr/local/jdk8
export PATH=
J
A
V
A
_
H
O
M
E
/
b
i
n
:
JAVA\_HOME/bin:
JAVA_HOME/bin:PATH
配置生效命令
source /etc/profile
#查看j版本命令
java -version
unzip命令安装
yum install -y unzip
#### 2. 创建Nacos
启动容器
docker run -id --name nacos
–restart=always -p 8848:8848
-e MODE=standalone nacos/nacos-server:1.4.1
#### 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正则表达式.
多个正则之间以逗号(,)分隔,转义符需要双斜杠(\)
常见例子:
- 所有表:.* or .\…
- canal schema下所有表: canal\…*
- canal下的以canal打头的表:canal\.canal.*
- canal schema下的一张表:canal.test1
- 多个规则组合使用: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=
J
A
V
A
_
H
O
M
E
/
b
i
n
:
JAVA\_HOME/bin:
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
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
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
[外链图片转存中…(img-zGHzn48N-1714893635254)]
[外链图片转存中…(img-LkG1E0Lo-1714893635254)]
[外链图片转存中…(img-D5F3V25Y-1714893635254)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新