基于Tars高并发IM系统的设计与实现-实战篇2
框架部署
部署简介
需要了解 Tars 部署基础知识:
Tars 由 mysql+框架服务+业务服务组成:
- mysql, 用于存储各种服务信息
- 框架服务是由多个 Tars 实现好的服务(c++实现), web 管理平台(nodejs)构成
- 业务服务是由开发团队根据产品需求自己实现的服务, 这些服务可以由 c++, java, go, nodejs, php 等语言实现
Tars 完成部署后, 从服务器角度, 它由以下几部分组成:
- mysql 集群(主从配置或者集群配置): 通常主从配置即可, 正常情况, 即使 mysql 挂了, 也不会影响业务服务的运行(但是会影响部署和发布)
- 框架服务: 是由多个 c++实现的 tars 服务 + web 管理平台组成, 通常部署在两台机器上, 其中一台会多部署 web 管理平台, tarspatch, tarsAdminRegistry, 运行过程中框架服务器都挂了, 也不会影响业务服务的运行(影响部署和发布)
- 多台节点服务器: 从 1 台至上万台, 每台节点服务器上都必须部署一个 tarsnode 进程, tarsnode 要连接到框架服务上(连接 tarsregistry)
- 业务自己实现的服务通过 web 管理平台发布到这些节点服务器上
Tars 的部署工作包括:
- mysql 的安装
- 框架服务部署(一般是两台服务器)
- 节点服务器部署(部署 tarsnode), 一般可以通过 web 管理平台远程部署节点服务器
注意:如果节点服务器上运行了不同语言实现的业务服务, 那么节点服务器的运行环境需要自己安装, 比如安装 jdk, node 等
Tars 部署方式有以下几种:
- 源码编译部署
- Docker 部署
- K8s Docker 部署
- K8s Tars 融合部署
- K8s Framework 融合部署
根据你的需要选择一种即可;
推荐非K8S模式下使用Docker部署方式
部署实例
本实例主要展示docker部署方式,此种方式对于新手来说比较友好。
安装docker
Centos上安装Docker脚本如下:
sudo su
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce
systemctl start docker
systemctl enable docker
安装完毕以后, 查看Docker版本:
docker version
由于国内访问直接访问docker hub网速比较慢,拉取镜像的时间就会比较长。一般我们会使用镜像加速或者直接从国内的一些平台镜像仓库上拉取。
执行如下命令修改镜像源后,重启docker服务;
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF
systemctl restart docker
linux下docker安装后,一般会有读写权限问题,执行如下命令进行设置:
setenforce 0
- 创建虚拟网络
为了方便虚拟机、Mac、Linux 主机等各种环境下的 docker 部署,在本示例中先创建虚拟网络,模拟现实中的局域网内网环境(注意 docker 都还是在同一台机器, 只是 docker 的虚拟 ip 不同, 模拟多机)
docker network create -d bridge --subnet=172.25.0.0/16 --gateway=172.25.0.1 tars
注:如果不需要虚拟网络,此步可以忽略
创建基础框架
为框架运行提供 MySQL 服务,若使用宿主机或现有的 MySQL 可以跳过此步骤,建议框架和应用使用不同的 MySQL 服务
准备好mysql服务相关用户名,口令;
比如:172.16.2.190 root/xxxxx
虚网环境:
docker run -d \
--name=tars-framework \
--net=tars \
-e MYSQL_HOST="x.x.x.x" \
-e MYSQL_ROOT_PASSWORD="xxxx" \
-e MYSQL_USER=root \
-e MYSQL_PORT=3306 \
-e REBUILD=true \
-e INET=eth0 \
-e SLAVE=false \
--ip="172.25.0.3" \
-v /data/framework:/data/tars \
-v /etc/localtime:/etc/localtime \
-p 3000:3000 \
tarscloud/framework:v3.0.15
主机环境:
sudo docker run -d \
--name=tars-framework \
--net=host \
-e INET=eth0 \
-e MYSQL_HOST="x.x.x.x" \
-e MYSQL_ROOT_PASSWORD="xxx" \
-e MYSQL_USER=root \
-e MYSQL_PORT=3306 \
-e REBUILD=false \
-e SLAVE=false \
-v /opt/data/framework:/data/tars \
-v /etc/localtime:/etc/localtime \
tarscloud/framework:v3.0.15
说明:
- 使用指定版本,如:v3.0.10,便于开发和生产环境的部署,后期需要升级时可选择更新的版本 tag,升级之前请先查看 GitHub 的 changelog,避免升级到不兼容的版本造成损失。
- 注意这里的 Tag 不是源码 TarsFramework 的 tag 号, 而是 Tars 这个 GIT 仓库的 tag 号, 因为 tarscloud/framework 还包含了 TarsWeb
- 当部署好以后, TarsWeb 页面的右上角显示了内置的 TarsFramework&TarsWeb 的版本号, 以便你对应源码.
- mysql 版本8.0 缺省开启SSL,需要修改/etc/my.cnf.d/mysql-default-authentication-plugin.cnf参数skip_ssl关闭后重启方可生效。
安装完毕后, 访问 http://${your_machine_ip}:3000 打开 web 管理平台
第一次进入需要设置口令,登录后出现类似如下界面就OK了
创建节点服务
虚网环境:
docker run -d \
--name=tars-node \
--net=tars \
-e INET=eth0 \
-e WEB_HOST="http://172.25.0.3:3000" \
--ip="172.25.0.5" \
-e TARS_HOSTPATH=/data/tars \
-v /data/tars:/data/tars \
-v /etc/localtime:/etc/localtime \
-p 12000-12020:12000-12020 \
-v /var/run/docker.sock:/var/run/docker.sock \
tarscloud/tars-node:stable
主机环境:
docker run -d \
--name=tars-node \
--net=host \
-e INET=eth0 \
-e WEB_HOST="http://x.x.x.x:3000" \
-v /opt/data/tars:/data/tars \
-v /etc/localtime:/etc/localtime \
tarscloud/tars-node:latest
- 虚网环境初始开放了 12000-12020 端口供应用使用
- Node 启动之后会自动向框架 172.25.0.3 进行注册,部署完成之后在框架的 运维管理-节点管理 中可以看到 IP 为 172.25.0.5 的节点启动
部署 redis
docker run --restart=always --log-opt max-size=100m --log-opt max-file=2 -p 6379:6379 --name myredis -v /home/redis/myredis/myredis.conf:/etc/redis/redis.conf -v /home/redis/myredis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes --requirepass 000415
部署成功后在web管理平台-运维管理-节点管理中能看见节点,如图:
开发环境搭建
本节主要介绍Tars Cpp服务开发和编译时需要的开发环境, 以centos7来介绍.
注意: 如果本机上之前源码编译部署过Tars CPP 开发环境, 无需再部署
依赖环境
软件 | 软件要求 |
---|---|
linux内核版本: | 2.6.18及以上版本 |
gcc版本: | 4.8 及以上版本、glibc-devel |
bison工具版本: | 2.5及以上版本 |
flex工具版本: | 2.5及以上版本 |
cmake版本: | 3.2及以上版本 |
mysql版本: | 5.6及以上版本 |
编译包依赖下载安装介绍
源码编译过程需要安装:gcc, glibc, bison, flex, cmake
例如,在Centos7下,执行:
yum install glibc-devel gcc gcc-c++ bison flex cmake
yum install zlib-devel
- 下载源码
git clone https://github.com/TarsCloud/TarsCpp.git --recursive
- 编译安装
cd TarsCpp
mkdir build
cd build
cmake ..
make
make install
- 错误处理
如果cmake编译过程中遇到如下错误,
Make Error at servant/CMakeLists.txt:64 (add_subdirectory):
add_subdirectory given source "protocol/servant" which is not an existing
directory.
CMake Error at servant/CMakeLists.txt:65 (add_subdirectory):
add_subdirectory given source "protocol/framework" which is not an existing
directory.
原因是protocol子项目没pull下来,有两个方法可以解决:
- 到根目录执行如下命令:
git submodule update
- 到servant目录独立拉TarsProtocol后改名为protocol:
git clone https://github.com/TarsCloud/TarsProtocol.git
mv TarsProtocol protocol
至此, Tars Cpp的编译环境已经完成;
下一步可以实现Cpp的Tars服务了.
注意:
-
GCC 4.9.2、 GCC 10.2.1编译没有问题
-
GCC 12.2 编译mysqlclient有问题,报如下错误:
error Native atomics support not found! -
在linux系统多人并行开发,为了防止多人并行开发导致公共文件冲突,需要修改/usr/local/tars/cpp/makefile/makefile.tars 如下内容:
- 替换/home/tarsproto/" 为"${HOME}tarsproto/"
-
开启SSL, HTTP2:
cmake .. -DTARS_SSL=ON -DTARS_HTTP2=ON
make
make install
- 关闭SSL, HTTP2:
cmake .. -DTARS_SSL=OFF -DTARS_HTTP2=OFF
make
make install
注意默认情况下 examples的demo服务都没有编译, 如果希望编译这些demo服务, 请开启:
cmake .. -DONLY_LIB=OFF