文章目录
背景
由于Seata需要配置的项比较多,且YAML文件格式比较矫情,虽然提供了保姆级的安装教程,实施部署过程中仍然遇到各种问题导致Seata安装失败来求助。提供个交互式的Shell脚本,一劳永逸自动部署。
手动部署见:【Seata】seata-server-1.5.1-直接部署(整合nacos)
环境说明
- 操作系统 Centos7.9
- seata版本为
seata-1.5.1
- 数据库
MySQL5.7
- Nacos-2.0.4
离线
安装,因部分生产环境不能访问互联网,所以脚本直接做成离线版
脚本解析
对脚本内容不感兴趣,可以直接跳过该环节,拉到底部使用说明和下载链接,下载后直接使用即可
变量定义及默认值
######################## Properties #######################
# 数据库设置===========
_MYSQL_IP=127.0.0.1
_MYSQL_PORT=3306
_MYSQL_USER=root
_MYSQL_PASSWORD=root
_SEATA_DATABASES_NAME=seata
# Nacos设置===========
_NACOS_IP=127.0.0.1
_NACOS_PORT=8848
_NACOS_USER=nacos
_NACOS_PASSWORD=nacos
_NACOS_GROUP=SEATA_GROUP
# 命名空间,配置中心和注册中心共用
_NACOS_NAMESPACE=
# Seata设置===========
# 安装路径
BASE_DIR=/app
# 事务分组
_SEATA_TX_SERVICE_GROUP=xxx_group
# Seata控制台用户名
_SEATA_CONSOLE_USER_NAME=seata
# Seata控制台密码
_SEATA_CONSOLE_USER_PASSWORD=seata
MySQL设置
# 设置数据库配置
setDBConfigs(){
read -p "请输入MySQL的IP,默认: [$_MYSQL_IP] " MYSQL_IP
while [ "${MYSQL_IP}" != "" ] && ! (echo "${MYSQL_IP}" | grep -iE "^((1[0-9]{
0,2}|2([0-4][0-9]|5[0-5])|2[0-9]{
0,1}|[3-9][0-9]{
0,1}|0)\.(1[0-9]{
0,2}|2([0-4][0-9]|5[0-5])|2[0-9]{
0,1}|[3-9][0-9]{
0,1}|0)\.(1[0-9]{
0,2}|2([0-4][0-9]|5[0-5])|2[0-9]{
0,1}|[3-9][0-9]{
0,1}|0)\.(1[0-9]{
0,2}|2([0-4][0-9]|5[0-5])|2[0-9]{
0,1}|[3-9][0-9]{
0,1}|0))$")
do
read -p ">>>>>>>> 请输入正确MySQL的IP,默认: [$_MYSQL_IP] " MYSQL_IP
done
if ! echo $MYSQL_IP | grep -qe '^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$' ; then
MYSQL_IP=$_MYSQL_IP
fi
echo "$MYSQL_IP"
read -p "请输入MySQL的端口号,默认: [$_MYSQL_PORT] " MYSQL_PORT
while [ "${MYSQL_PORT}" != "" ] && ! ( echo "${MYSQL_PORT}" | grep -E "^([1-9][0-9]{1,3}|[1-5][0-9]{4}|6([0-4][0-9]{3}|5([0-4][0-9]{2}|5([0-2][0-9]|3[0-5]))))$" )
do
read -p ">>>>>>>> 请输入正确的MySQL端口号,默认: [$_MYSQL_PORT]: " MYSQL_PORT
done
if ! echo $MYSQL_PORT | grep -qe '^[0-9]\{4,\}$' ; then
MYSQL_PORT=$_MYSQL_PORT
fi
echo "$MYSQL_PORT"
read -p "请输入MySQL的用户名,默认: [$_MYSQL_USER] " MYSQL_USER
if [ -z $MYSQL_USER ]; then
MYSQL_USER=$_MYSQL_USER
fi
echo "$MYSQL_USER"
read -p "请输入MySQL的密码,默认: [$_MYSQL_PASSWORD] " MYSQL_PASSWORD
if [ -z $MYSQL_PASSWORD ]; then
MYSQL_PASSWORD=$_MYSQL_PASSWORD
fi
echo "$MYSQL_PASSWORD"
read -p "请输入要创建的Seata的数据库名称,默认: [$_SEATA_DATABASES_NAME] " SEATA_DATABASES_NAME
if [ -z $SEATA_DATABASES_NAME ]; then
SEATA_DATABASES_NAME=$_SEATA_DATABASES_NAME
fi
echo "$SEATA_DATABASES_NAME"
}
Nacos服务设置
# 初始化Naco服务s配置
setNacosConfigs(){
read -p "请输入Nacos的IP,默认: [$_NACOS_IP] " NACOS_IP
while [ "${NACOS_IP}" != "" ] && ! (echo "${NACOS_IP}" | grep -iE "^((1[0-9]{
0,2}|2([0-4][0-9]|5[0-5])|2[0-9]{
0,1}|[3-9][0-9]{
0,1}|0)\.(1[0-9]{
0,2}|2([0-4][0-9]|5[0-5])|2[0-9]{
0,1}|[3-9][0-9]{
0,1}|0)\.(1[0-9]{
0,2}|2([0-4][0-9]|5[0-5])|2[0-9]{
0,1}|[3-9][0-9]{
0,1}|0)\.(1[0-9]{
0,2}|2([0-4][0-9]|5[0-5])|2[0-9]{
0,1}|[3-9][0-9]{
0,1}|0))$")
do
read -p ">>>>>>>> 请输入正确Nacos的IP,默认: [$_NACOS_IP] " NACOS_IP
done
if [ -z $NACOS_IP ]; then
NACOS_IP=$_NACOS_IP
fi
echo "$NACOS_IP"
read -p "请输入Nacos的端口号,默认: [$_NACOS_PORT] " NACOS_PORT
while [ "${NACOS_PORT}" != "" ] && ! ( echo "${NACOS_PORT}" | grep -E "^([1-9][0-9]{1,3}|[1-5][0-9]{4}|6([0-4][0-9]{3}|5([0-4][0-9]{2}|5([0-2][0-9]|3[0-5]))))$" )
do
read -p ">>>>>>>> 请输入正确的Nacos端口,默认端口[$_NACOS_PORT]: " NACOS_PORT
done
if [ -z $NACOS_PORT ]; then
NACOS_PORT=$_NACOS_PORT
fi
echo "$NACOS_PORT"
read -p "请输入Nacos的用户名,默认: [$_NACOS_USER] " NACOS_USER
if [ -z $NACOS_USER ]; then
NACOS_USER=$_NACOS_USER
fi
echo "$NACOS_USER"
read -p "请输入Nacos的密码,默认: [$_NACOS_PASSWORD] " NACOS_PASSWORD
if [ -z $NACOS_PASSWORD ]; then
NACOS_PASSWORD=$_NACOS_PASSWORD
fi
echo "$NACOS_PASSWORD"
read -p "请输入Seata所在Nacos的命名空间ID,默认: [$_NACOS_NAMESPACE] " NACOS_NAMESPACE
if [ -z $NACOS_NAMESPACE ]; then
NACOS_NAMESPACE=$_NACOS_NAMESPACE
fi
echo "$NACOS_NAMESPACE"
read -p "请输入Seata所在Nacos的分组,默认: [$_NACOS_GROUP] " NACOS_GROUP
if [ -z $NACOS_GROUP ]; then
NACOS_GROUP=$_NACOS_GROUP
fi
echo "$NACOS_GROUP"
}
生成Seata的application.yml配置
# application.yml
creataSeataApplicationYml(){
# 事务分组
read -p "请输入Seata的事务分组名称,默认: [$_SEATA_TX_SERVICE_GROUP] " SEATA_TX_SERVICE_GROUP
if [ -z $SEATA_TX_SERVICE_GROUP ]; then
SEATA_TX_SERVICE_GROUP=$_SEATA_TX_SERVICE_GROUP
fi
echo "$SEATA_TX_SERVICE_GROUP"
# seata控制台用户名
read -p "请输入Seata控制台用户名,默认: [$_SEATA_CONSOLE_USER_NAME] " SEATA_CONSOLE_USER_NAME
if [ -z $SEATA_CONSOLE_USER_NAME ]; then
SEATA_CONSOLE_USER_NAME=$_SEATA_CONSOLE_USER_NAME
fi
echo "$SEATA_CONSOLE_USER_NAME"
# seata控制台密码
read -p "请输入Seata控制台密码,默认: [$_SEATA_CONSOLE_USER_PASSWORD] " SEATA_CONSOLE_USER_PASSWORD
if [ -z $SEATA_CONSOLE_USER_PASSWORD ]; then
SEATA_CONSOLE_USER_PASSWORD=$_SEATA_CONSOLE_USER_PASSWORD
fi
echo "$SEATA_CONSOLE_USER_PASSWORD"
# 备份并配置application.yml
mv $BASE_DIR/seata/conf/application.yml $BASE_DIR/seata/conf/application.yml.bak
cat > $BASE_DIR/seata/conf/application.yml <<EOF
server:
port: 7091
spring:
application:
name: seata-server
logging:
config: classpath:logback-spring.xml
file:
path: \${user.home}/logs/seata
console:
user:
username: $SEATA_CONSOLE_USER_NAME
password: $SEATA_CONSOLE_USER_PASSWORD
seata:
config:
type: nacos
nacos:
server-addr: $NACOS_IP:$NACOS_PORT
namespace: $NACOS_NAMESPACE
group: $NACOS_GROUP
username: $NACOS_USER
password: $NACOS_PASSWORD
# nacos配置文件 data-id
data-id: seataServer.properties
registry:
type: nacos
nacos:
application: seata-server
server-addr: $NACOS_IP:$NACOS_PORT
group: $NACOS_GROUP
namespace: $NACOS_NAMESPACE
cluster: default
username: $NACOS_USER
password: $NACOS_PASSWORD
store:
# support: file 、 db 、 redis
mode: db
server:
service-port: 8091 #If not configured, the default is '\${server.port} + 1000'
security:
secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
tokenValidityInMilliseconds: 1800000
ignore:
urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login
EOF
}
生成seataServer.properties并上传Nacos
# seataServer.properties
creataSeataServerProperties(){
content=$(cat << EOF
#Transaction routing rules configuration, only for the client
# xxx_group 为事务分组,需要和客户端 vgroupMapping 保持一致
# default 为 application.yml中的 cluster的值,默认default
service.vgroupMapping.$SEATA_TX_SERVICE_GROUP=default
# default为service.vgroupMapping.xxx_group的值。
service.default.grouplist=$LOCAL_IP:8091
service.enableDegrade=false
service.disableGlobalTransaction=false
# application.yml 中如果配置了store,此处可以不配,看个人喜好
#Transaction storage configuration, only for the server. The file, DB, and redis configuration values are optional.
store.mode=db
store.lock.mode=db
store.session.mode=db
#These configurations are required if the \`store mode\` is \`db\`. If \`store.mode,store.lock.mode,store.session.mode\` are not equal to \`db\`, you can remove the configuration block.
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://$MYSQL_IP:$MYSQL_PORT/$SEATA_DATABASES_NAME?useUnicode=true
store.db.user=$MYSQL_USER
store.db.password=$MYSQL_PASSWORD
store.db.minConn=5
store.db.maxConn=30
# global_table、branch_table、distributed_lock、lock_table 四张表需要手动创建
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.distributedLockTable=distributed_lock
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
EOF
)
result=`curl -X POST "http://$NACOS_IP:$NACOS_PORT/nacos/v1/cs/configs" -d "username=$NACOS_USER&password=$NACOS_PASSWORD&dataId=seataServer.properties&group=$NACOS_GROUP&type=properties&content=$content"`
if [ "$result"x == "true"x ]; then
echo "seataServer.properties配置上传Nacos成功!"
else
die "seataServer.properties配置上传Nacos失败!"
fi
}
安装
########################## Install ############################
echo -e "\033[31m\n安装前请先确认MySQL中seata依赖的数据库和表已创建完成,Nacos已启动!\033[0m"
read -p ">>>>>>>> 确认是否继续执行: [y/n]" GO_ON
if !( echo "${GO_ON}" | grep -qwi "y" )
then
die "取消安装!"
fi
# 1、解压
if [ ! -d $BASE_DIR ];then
mkdir -p $BASE_DIR
fi
tar -xf packages/seata/seata-server-1.5.1.tar.gz -C $BASE_DIR
# 2、设置MySQL库参数
setDBConfigs
# 3、设置Nacos配置中心参数
setNacosConfigs
# 4、初始化Seata配置文件application.yml
creataSeataApplicationYml
# 5、获取本机IP
LOCAL_IP=`ip addr | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk '{print $2}'| cut -f 1 -d /`
# 6、Seata配置seataServer.properties上传Nacos
creataSeataServerProperties
# 7、启动Seata
$BASE_DIR/seata/bin/seata-server.sh
echo "查看启动日志命令:"
echo -e "\033[31m\n tail -100f $BASE_DIR/seata/logs/start.out \033[0m \n"
# 8、输出安装信息
echo "输出Seata安装信息到 install-info.txt !"
cat >> install-info.txt <<EOF
======================== Seata ========================
1、控制台地址: http://$LOCAL_IP:7091
2、安装路径: $BASE_DIR/
3、单机启动命令: $BASE_DIR/seata/bin/seata-server.sh
4、查看日志命令: tail -100f $BASE_DIR/seata/logs/start.out
EOF
脚本下载
地址
https://download.csdn.net/download/weixin_43582081/87554401
下载包目录及使用说明
目录
目录 | 说明 |
---|---|
seata-install.sh | 脚本 |
packages | 离线安装包 |
└─seata | seata相关 |
└─seata-server-1.5.1.tar.gz | seata安装包 |
└─seata-server-mysql.sql | seata-server数据库脚本 |
使用
需要提前手动创建seata的数据库
。可以执行扩展增加 MySQL中 seata库自动创建逻辑,考虑部署机器(Seata所在服务器)不一定安装有mysql-client
,本文去掉了该部分内容- 脚本和离线包上传,保证
seata-install.sh
和packages
在同一级目录(相对路径不变),shell脚本中使用的相对路径 - 给shell脚本副执行权限:
chmod +x seata-install.sh
- 执行安装
./seata-install.sh
- 除开始提示是否继续执行,为防止误操作必须手动输入
y
外,可以一直使用默认值部署 - 安装信息输出在seata-install.sh同级的
install-info.txt
部署:
查看部署信息记录:cat install-info.txt
Nacos配置中心
Nacos注册中心
Seata控制台