seata-server安裝、運行


seata-server為seata中的事務協調器。

參考:http://seata.io/en-us/docs/ops/deploy-server.html

只能在jdk8環境

 

seata的wiki

https://github.com/seata/seata/wiki/Home_Chinese

 

一、下載並安裝

wget -P /opt/downloads https://github.com/seata/seata/releases/download/v0.9.0/seata-server-0.9.0.tar.gz
mkdir /opt/seata-server
tar zxvf /opt/downloads/seata-server-0.9.0.tar.gz -C /opt/seata-server
mv /opt/seata-server/seata/* /opt/seata-server
rm -r /opt/seata-server/seata/

 

二、導入配置

本文使用nacos作為配置中心和服務發現,file、apollo、redis、zk、consul等也可以舉一反三。

我們這里用默認的導入先讓seata-server跑起來,過后對着file.conf和java程序啟動后的報錯調整,重新導入即可。

vim /opt/seata-server/conf/nacos-config.txt

以下是我根據自己的環境修改后的配置值

transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.thread-factory.boss-thread-prefix=NettyBoss
transport.thread-factory.worker-thread-prefix=NettyServerNIOWorker
transport.thread-factory.server-executor-thread-prefix=NettyServerBizHandler
transport.thread-factory.share-boss-worker=false
transport.thread-factory.client-selector-thread-prefix=NettyClientSelector
transport.thread-factory.client-selector-thread-size=1
transport.thread-factory.client-worker-thread-prefix=NettyClientWorkerThread
transport.thread-factory.boss-thread-size=1
transport.thread-factory.worker-thread-size=8
transport.shutdown.wait=3
service.vgroup_mapping.my_test_tx_group=default
service.vgroup_mapping.user-web-seata-service-group=default
service.vgroup_mapping.user-seata-service-group=default
service.vgroup_mapping.order-seata-service-group=default
service.vgroup_mapping.user2-seata-service-group=default
service.vgroup_mapping.order2-seata-service-group=default
service.vgroup_mapping.business-service-seata-service-group=default
service.vgroup_mapping.account-service-seata-service-group=default
service.vgroup_mapping.storage-service-seata-service-group=default
service.vgroup_mapping.order-service-seata-service-group=default
service.default.grouplist=192.168.0.101:8091
service.enableDegrade=false
service.disable=false
service.max.commit.retry.timeout=-1
service.max.rollback.retry.timeout=-1
client.async.commit.buffer.limit=10000
client.lock.retry.internal=10
client.lock.retry.times=30
client.lock.retry.policy.branch-rollback-on-conflict=true
client.table.meta.check.enable=true
client.report.retry.count=5
client.tm.commit.retry.count=1
client.tm.rollback.retry.count=1
store.mode=db
store.file.dir=file_store/data
store.file.max-branch-session-size=16384
store.file.max-global-session-size=512
store.file.file-write-buffer-cache-size=16384
store.file.flush-disk-mode=async
store.file.session.reload.read_size=100
store.db.datasource=druid
store.db.db-type=mysql
store.db.driver-class-name=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://192.168.0.101:3306/seata?useUnicode=true
store.db.user=root
store.db.password=root
store.db.min-conn=1
store.db.max-conn=3
store.db.global.table=global_table
store.db.branch.table=branch_table
store.db.query-limit=100
store.db.lock-table=lock_table
recovery.committing-retry-period=1000
recovery.asyn-committing-retry-period=1000
recovery.rollbacking-retry-period=1000
recovery.timeout-retry-period=1000
transaction.undo.data.validation=true
transaction.undo.log.serialization=jackson
transaction.undo.log.save.days=7
transaction.undo.log.delete.period=86400000
transaction.undo.log.table=undo_log
transport.serialization=seata
transport.compressor=none
metrics.enabled=false
metrics.registry-type=compact
metrics.exporter-list=prometheus
metrics.exporter-prometheus-port=9898
support.spring.datasource.autoproxy=false

ha見https://github.com/seata/seata-samples/tree/master/ha

service.default.grouplist為seata集群地址集

建立集群數據庫 

https://github.com/seata/seata/blob/v0.9.0/server/src/main/resources/db_store.sql

注意版本對應分支,官方鏈接指向了develop分支sql不同是會報錯的

-- the table to store GlobalSession data
drop table if exists `global_table`;
create table `global_table` (
  `xid` varchar(128)  not null,
  `transaction_id` bigint,
  `status` tinyint not null,
  `application_id` varchar(32),
  `transaction_service_group` varchar(32),
  `transaction_name` varchar(128),
  `timeout` int,
  `begin_time` bigint,
  `application_data` varchar(2000),
  `gmt_create` datetime,
  `gmt_modified` datetime,
  primary key (`xid`),
  key `idx_gmt_modified_status` (`gmt_modified`, `status`),
  key `idx_transaction_id` (`transaction_id`)
);

-- the table to store BranchSession data
drop table if exists `branch_table`;
create table `branch_table` (
  `branch_id` bigint not null,
  `xid` varchar(128) not null,
  `transaction_id` bigint ,
  `resource_group_id` varchar(32),
  `resource_id` varchar(256) ,
  `lock_key` varchar(128) ,
  `branch_type` varchar(8) ,
  `status` tinyint,
  `client_id` varchar(64),
  `application_data` varchar(2000),
  `gmt_create` datetime,
  `gmt_modified` datetime,
  primary key (`branch_id`),
  key `idx_xid` (`xid`)
);

-- the table to store lock data
drop table if exists `lock_table`;
create table `lock_table` (
  `row_key` varchar(128) not null,
  `xid` varchar(96),
  `transaction_id` long ,
  `branch_id` long,
  `resource_id` varchar(256) ,
  `table_name` varchar(32) ,
  `pk` varchar(36) ,
  `gmt_create` datetime ,
  `gmt_modified` datetime,
  primary key(`row_key`)
);

store.db.datasource的選擇 ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp) etc.

store.db.driver-class-name = "com.mysql.jdbc.Driver"   store.db.driver-class-name = "com.mysql.cj.jdbc.Driver"

選擇druid和com.mysql.jdbc.Driver(目前seata驅動為5.1.30)

 

導入配置到nacos。

格式為sh nacos-config.sh $Nacos-Server-IP

因為nacos-config.sh腳本中已經把8848端口寫死,如果你的nacos-server不是8848端口,請修改nacos-config.sh。

cd /opt/seata-server/conf/
bash /opt/seata-server/conf/nacos-config.sh nacosserver

nacosserver是nacos的ip

腳本執行最后輸出 "init nacos config finished, please start seata-server." 說明推送配置成功。若想進一步確認可登陸Nacos控制台->配置列表->篩選查詢Group為SEATA_GROUP的配置項。

將/opt/seata-server/conf/nacos-config.txt 腳本修改后重新導入即可。

 

 

三、啟動seata-server(事務協調器)

修改日志目錄(非必須)

vim /opt/seata-server/conf/logback.xml

改為

    <!--<property name="LOG_HOME" value="${user.home}/logs/seata"/>-->
    <property name="LOG_HOME" value="/var/log/seata-server"/>

sudo mkdir -p /var/log/seata-server;sudo chmod -R 777 /var/log/seata-server

 

配置修改

vim /opt/seata-server/conf/registry.conf 並復制到java代碼的properties目錄下

registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "nacos"

  nacos {
    serverAddr = "nacosserver"
    namespace = "public"
    cluster = "default"
  }
  eureka {
    serviceUrl = "http://localhost:8761/eureka"
    application = "default"
    weight = "1"
  }
  redis {
    serverAddr = "localhost:6379"
    db = "0"
  }
  zk {
    cluster = "default"
    serverAddr = "127.0.0.1:2181"
    session.timeout = 6000
    connect.timeout = 2000
  }
  consul {
    cluster = "default"
    serverAddr = "127.0.0.1:8500"
  }
  etcd3 {
    cluster = "default"
    serverAddr = "http://localhost:2379"
  }
  sofa {
    serverAddr = "127.0.0.1:9603"
    application = "default"
    region = "DEFAULT_ZONE"
    datacenter = "DefaultDataCenter"
    cluster = "default"
    group = "SEATA_GROUP"
    addressWaitTime = "3000"
  }
  file {
    name = "file.conf"
  }

}


config {
  # file、nacos 、apollo、zk、consul、etcd3
  type = "nacos"

  nacos {
    serverAddr = "nacosserver"
    namespace = ""
  }
  consul {
    serverAddr = "127.0.0.1:8500"
  }
  apollo {
    app.id = "seata-server"
    apollo.meta = "http://192.168.1.204:8801"
  }
  zk {
    serverAddr = "127.0.0.1:2181"
    session.timeout = 6000
    connect.timeout = 2000
  }
  etcd3 {
    serverAddr = "http://localhost:2379"
  }
  file {
    name = "file.conf"
  }
}

注:serverAddr不要填端口號   public為小寫

有處BUG:config.nacos.namespace="public"的值要去掉public寫成""

 

啟動格式sh seata-server.sh $LISTEN_PORT $PATH_FOR_PERSISTENT_DATA $IP(此參數可選)

$IP參數 用於多IP環境下指定 Seata-Server 注冊服務的IP    雖然是可選,但還是要填,之前我偷懶沒填,一大堆虛擬ip各種亂定位。

 

命令啟動

sh /opt/seata-server/bin/seata-server.sh -p 8091 -h 192.168.0.101 -m db -n 1

 

守護進程啟動

vim /opt/seata-server/startup.sh

填入

#!/bin/bash
sh /opt/seata-server/bin/seata-server.sh -p 8091 -h 192.168.0.101 -m db -n 1

 

vim /lib/systemd/system/seata-server.service

文件中填入

[Unit]
Description=seata-server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=simple
ExecStart=/opt/seata-server/startup.sh
Restart=always
PrivateTmp=true

[Install]
WantedBy=multi-user.target

賦予權限

chmod 777 /opt/seata-server/startup.sh
chmod 777 /lib/systemd/system/seata-server.service

啟用服務

systemctl enable seata-server.service
systemctl daemon-reload

運行

systemctl start seata-server.service

查看狀態

systemctl status seata-server.service

查看進程

ps -ef|grep seata-server

運行成功后可在Nacos控制台的 服務列表 看到 服務名serverAddr的條目

 

查看日志
sudo journalctl -u seata-server
sudo journalctl -u seata-server --since="2019-11-11 11:11:11"
sudo journalctl -u seata-server --since "30 min ago"
sudo journalctl -u seata-server --since yesterday
sudo journalctl -u seata-server --since "2019-11-10" --until "2018-11-11 11:11"
sudo journalctl -u seata-server --since 04:00 --until "2 hour ago"

 

四、創建數據表

(創建mysql數據庫略)

UNDO_LOG table is required by SEATA AT mode.

-- for AT mode you must to init this sql for you business databese. the seata server not need it.
drop table `undo_log`;
CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'increment id',
  `branch_id` bigint(20) NOT NULL COMMENT 'branch transaction id',
  `xid` varchar(100) NOT NULL COMMENT 'global transaction id',
  `context` varchar(128) NOT NULL COMMENT 'undo_log context,such as serialization',
  `rollback_info` longblob NOT NULL COMMENT 'rollback info',
  `log_status` int(11) NOT NULL COMMENT '0:normal status,1:defense status',
  `log_created` datetime NOT NULL COMMENT 'create datetime',
  `log_modified` datetime NOT NULL COMMENT 'modify datetime',
  `ext` varchar(100) DEFAULT NULL COMMENT 'reserved field',
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='AT transaction mode undo table';

每個業務數據庫都要建一個undo_log表

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM