设为首页收藏本站

LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区!

 找回密码
 注册

QQ登录

只需一步,快速开始

#公告#抱歉,网站将关闭,不再开放。由于PC时代已远逝 。在这个后移动互联网时代,我们继续携手前行,保持对技术的热情。共同构建linuxtone知识星球欢迎加入,一起讨论技术、招聘人才、分享资源。请新老linuxtone人 扫码移步到 知识星球:linuxtone

学习是一种信仰!分享是一种快乐!能力= 心态 * 沟通 * 知识 (你的每一天需要正能量!)

 网站的发展需要你贡献一份力量!希望你能每天坚持看贴1小时,并回答网友的问题!祝你在浏览论坛的过程中取得进步!谢谢!linuxtone加油!大家加油! 友情提示: 你今天学习了吗?你今天进步了吗?少一点抱怨!多一点进步!Life is short ! Why not linuxtone ?  

网站的发展、感谢每位坛友的努力!

查看: 7767|回复: 10

[其它] 开源一个基于zookeeper实现的分布式基础信息管理系统swall [复制链接]

Rank: 6Rank: 6

签到
103
注册时间
2011-6-21
最后登录
2020-5-14
在线时间
1463 小时
阅读权限
70
积分
8682
帖子
1095
主题
1072
精华
0
UID
14532
发表于 2014-7-4 10:57:28 |显示全部楼层
本帖最后由 lionf 于 2014-7-4 11:05 编辑

一、Swall概述

       swall是一个基于zookeeper实现的分布式基础信息管理系统(Infrastructure Management)可以用于管理特别是架构比较灵活的服务,比如游戏。用swall, 你不用登陆到具体的服务器去操作,你指需要在一台机器上面就可以完成服务管理,比如获取服务器监控信息、执行shell命令等等,你还可以方便的实现自动化配置,一条命令实现所有应用的部署不再是难题。

特点:
  1. 1.使用zookeeper做任务信息存储,可配置高可用
  2. 2.配置节点灵活,可以处理一台服务器上存放多个业务的复杂环境
  3. 3.简单灵活,五脏六腑俱全(文件拷贝、命令执行、模块管理)
  4. 4.提供比较好的自省功能,可以让你比较方便调用各种模块
  5. 5.容易扩展
复制代码

二、Swall原理

swall原理很简单,用过zookeeper的人都知道,zookeeper比较擅长存储敏感的状态信息,并提供一系列机制来操作这些信息,swall主要利用的是zookeeper 的watcher功能,就是当某个数据变化的时候会提供一个机制来实现通知,那么swall主要架构很简单了:





三、Swall安装部署

准备两台机器,相关信息如下:
名称 系统版本 IP地址 python版本
  swall1 centos6.4 192.168.0.180 2.6.6
zookeeper1 centos6.4  192.168.0.181 2.6.6


(一)安装zookeeper集群

zookeeper服务部署在192.168.0.181,这里我配置的是standalone集群,有条件的可以配置多个实现高可用

1.下载 jdk,这里我以jdk-7u55-linux-x64.gz 为例

2.上传jdk-7u55-linux-x64.gz到服务器,解压
  1. [root@zookeeper1 ~]# tar xf jdk-7u55-linux-x64.gz -C /usr/local/
  2. [root@zookeeper1 ~]# ls /usr/local/
  3. /usr/local/jdk1.7.0_55
  4. [root@zookeeper1 ~]# mv /usr/local/jdk1.7.0_55 /usr/local/java
  5. [root@zookeeper1 ~]#
复制代码

3.配置jdk环境
  1. [root@zookeeper1 ~]# cat >> /etc/bashrc <<\eof
  2. > export JAVA_HOME=/usr/local/java
  3. > export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  4. > export PATH=$PATH:$JAVA_HOME/bin
  5. > eof
  6. [root@zookeeper1 ~]# source /etc/bashrc
复制代码

4.检查java是否安装成功
  1. [root@zookeeper1 ~]# java -version
  2. java version "1.7.0_55"
  3. Java(TM) SE Runtime Environment (build 1.7.0_55-b13)
  4. Java HotSpot(TM) 64-Bit Server VM (build 24.55-b03, mixed mode)
复制代码

5.下载zookeeper-3.4.5-cdh5.0.0

6.上传zookeeper-3.4.5-cdh5.0.0.tar.gz到服务器,解压
  1. [root@zookeeper1 ~]# tar xf zookeeper-3.4.5-cdh5.0.0.tar.gz -C /usr/local/
  2. [root@zookeeper1 ~]# ls -d /usr/local/zookeeper-3.4.5-cdh5.0.0
  3. /usr/local/zookeeper-3.4.5-cdh5.0.0
  4. [root@zookeeper1 ~]# mv /usr/local/zookeeper-3.4.5-cdh5.0.0 /usr/local/zookeeper
复制代码

7.配置zookeeper,这里配置的是单节点(最好配置成多节点)
  1. [root@zookeeper1 ~]# cd /usr/local/zookeeper/conf/
  2. [root@zookeeper1 conf]# mv zoo_sample.cfg zoo.cfg
  3. [root@zookeeper1 conf]# vim zoo.cfg #修改dataDir=/data/database/zookeeper
  4. [root@zookeeper1 conf]# mkdir -p /data/database/zookeeper
  5. [root@zookeeper1 conf]# cd ..
  6. [root@zookeeper1 zookeeper]# cd bin/
  7. [root@zookeeper1 bin]# ./zkServer.sh start
  8. JMX enabled by default
  9. Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
  10. Starting zookeeper ... STARTED
  11. [root@zookeeper1 bin]# ./zkServer.sh status
  12. JMX enabled by default
  13. Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
  14. Mode: standalone #说明配置成功
  15. [root@zookeeper1 bin]#
复制代码

8.配置防火墙,允许访问2181端口(这里以INPUT规则为例)
  1. [root@zookeeper1 bin]# iptables -A INPUT -p tcp --dport 2181 -j ACCEPT
  2. [root@zookeeper1 bin]# iptables -L -n | grep 2181
  3. ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:2181
  4. [root@zookeeper1 bin]# iptables-save > /etc/sysconfig/iptables
  5. [root@zookeeper1 bin]# echo ruok | nc localhost 2181
  6. imok #说明zookeeper安装成功
  7. [root@zookeeper1 bin]#
复制代码


(二)安装rsync服务

swall内部提供了一个组件的方式来实现文件传输,内部已经实现了三个组件:ssh、ftp、rsync,这几个组件按照swall约定实现了访问对应文件 服务器的api,对应的配置是fs.conf,组件具体功能是为swall提供一个存放和下载文件的临时场所,下面以rsync为例:

rsync配置在192.168.0.181,和zookeeper配置在一起,实际用的时候最好要部署到不同的机器上

1.添加rsync用户和目录
  1. [root@zookeeper1 ~]# useradd swall
  2. [root@zookeeper1 ~]# mkdir /data/swall_fs
  3. [root@zookeeper1 ~]# chown -R swall:swall /data/swall_fs
  4. [root@zookeeper1 ~]# vim /etc/rsyncd.conf
复制代码

2.设置rsync配置
  1. secrets file = /etc/rsyncd.secrets
  2. list = no
  3. port = 61768
  4. read only = yes
  5. uid = swall
  6. gid = swall
  7. max connections = 3000
  8. log file = /var/log/rsyncd_swall.log
  9. pid file = /var/run/rsyncd_swall.pid
  10. lock file = /var/run/rsync_swall.lock

  11. [swall_fs]
  12. path = /data/swall_fs
  13. auth users = swall
  14. read only = no
复制代码

3.设置rsync密码
  1. [root@zookeeper1 ~]# echo 'swall:vGjeVUncnbPV8CcZ' > /etc/rsyncd.secrets
  2. [root@zookeeper1 ~]# chmod 600 /etc/rsyncd.secrets
复制代码

4.防火墙要允许访问61768端口
  1. [root@zookeeper1 bin]# iptables -A INPUT -p tcp --dport 61768 -j ACCEPT
  2. [root@zookeeper1 bin]# iptables -L -n | grep 61768
  3. ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:61768
  4. [root@zookeeper1 bin]# iptables-save > /etc/sysconfig/iptables
复制代码

5.运行rsync服务
  1. [root@zookeeper1 bin]# rsync --port=61768 --config=/etc/rsyncd.conf --daemon
复制代码


6.测试rsync是否正常服务,登录其他机器,这里以192.168.0.180为例
  1. [root@swall1 ~]# RSYNC_PASSWORD=vGjeVUncnbPV8CcZ rsync -a --port=61768 --partial /etc/services swall@192.168.0.181::swall_fs/service
  2. [root@swall1 ~]# echo $?
  3. 0
  4. [root@swall1 ~]# RSYNC_PASSWORD=vGjeVUncnbPV8CcZ rsync -a --port=61768 --partial swall@192.168.0.181::swall_fs/service /tmp/service
  5. [root@swall1 ~]# ll /tmp/service
  6. -rw-r--r-- 1 root root 640999 Jan 12  2010 /tmp/service
复制代码
如上,说明rsync配置成功。


(三)安装Swall

Swall这里安装到192.168.0.180服务器上

1.下载最新版本swall
  1. [root@swall1 ~]# mkdir /data
  2. [root@swall1 ~]# cd /data
  3. [root@swall1 data]# git clone https://github.com/lufeng4828/swall.git
复制代码

2.安装swall的依赖包,建议用pip安装
  1. [root@swall1 ~]# cd swall
  2. [root@swall1 swall]# pip install -r requirememts.txt
复制代码
注意:如果还没有装pip,centos可以通过yum install python-pip,ubuntu可以通过 apt-get install python-pip安装

3.修改swall配置
  1. [root@swall1 swall]# cd conf
  2. [root@swall1 conf]# vim swall.conf
  3. [main]
  4. #以此用户运行swall
  5. user = swall
  6. #定义角色,多个角色用逗号分开
  7. node_role = server #这里我们只定义一个server角色
  8. #agent地址,根据具体情况
  9. node_ip = 192.168.0.180 #这里写上当前服务器ip 192.168.0.180
  10. #缓存路径
  11. cache = var/cache
  12. #模块路径
  13. module = module/
  14. #文件备份路径
  15. backup = var/backup
  16. #plugins路径
  17. fs_plugin = plugins/fservice
  18. #pid文件
  19. pidfile = /tmp/.swall.pid
  20. #日志定义
  21. log_file = logs/swall.log
  22. log_level = INFO
  23. #认证key,数据传输用
  24. token = yhIC7oenuJDpBxqyP3GSHn7mgQThRHtOnNNwqpJnyPVhR1n9Y9Q+/T3PJfjYCZdiGRrX03CM+VI=

  25. 说明:
  26. (1)node_role是定义agent角色的,一个角色对应module下面的目录的模块,多个角色用逗号分隔
  27. (2)路径如果不是绝对路径,以程序根路径为基础,例如程序路径是/data/swall,则fs_plugin为/data/swall/plugins/fservice
  28. (3)node_ip是当前agent的ip地址
  29. (4)如果日志文件不存在,程序日志是记录不了,需要手动生成

  30. [root@swall1 conf]# vim zk.conf
  31. [main]
  32. #zookeepr地址,支持多个,通过分号分隔
  33. zk_servers = 192.168.0.181:2181 #这里写刚才我们部署好的zookeeper地址格式为:host1:port2,..,hostN,portN
  34. #zookeeper权限管理方式
  35. zk_scheme = digest
  36. zk_auth = vcode:swall!@#
  37. #相关目录path
  38. root=/swall
  39. nodes=%(root)s/nodes

  40. 说明:
  41. (1)zk_servers是zookeeper地址,格式是host1:port1,host2:port2,..,hostN:portN
  42. (2)zk_scheme是指定zookeeper的权限管理方式,目前支持digest
  43. (3)zk_auth是zk_scheme对应的id格式为:username:BASE64(SHA1(password))

  44. [root@swall1 conf]# vim fs.conf
  45. [main]
  46. fs_type = rsync #选择rsync
  47. fs_host = 192.168.0.181 #这里写我们部署好rsync的服务器地址192.168.0.181
  48. fs_port = 61768
  49. fs_user = swall
  50. fs_pass = vGjeVUncnbPV8CcZ
  51. fs_tmp_dir = /data/swall_fs
  52. fs_failtry = 3

  53. 说明:
  54. (1)fs_type是指/data/swall/plugins/fservice下面的文件名(不带路径),目前只支持ssh、ftp、rsync,可以自己实现
  55. (2)fs_tmp_dir只有ssh组件使用到,,ftp和rsync用不到
  56. (3)fs_failtry只有rsync用到,当rsync传输失败了可以重试多少次
  57. (4)传输组件是用来给swall上传和下载文件来实现文件传输功能的

  58. [root@swall1 conf]# vim roles.d/server.conf
  59. [main]
  60. project = swall
  61. agent = sa
  62. node_name = %(project)s_%(agent)s_server_192.168.0.180

  63. 说明:
  64. (1)如果node_name不是@@格式的,一定要为角色指定project标识,因为公司里面可以有很多项目,这个用来处理多项目的环境
  65. (2)agent可以认为是二级项目标识,作用和project一样,如果node_name不是@@格式的,就一定要为你的角色指定一个二级标识
  66. (3)自定该角色节点名列表,可以写死,多个节点名通过逗号分隔,如:swall_sa_1,swall_sa_2,也可以通过模块自动生成节点名列表,通过加@@标识,如:@@gen.game,意思是调用gen.py的game函数生成,gen.py要放在module/common下面
复制代码

4.在启动swall之前,下面给出一个完整配置示例
  1. ###swall.conf配置
  2. [main]
  3. user = swall
  4. node_role = server
  5. node_ip = 192.168.0.180
  6. cache = var/cache
  7. module = module/
  8. backup = var/backup
  9. fs_plugin = plugins/fservice
  10. pidfile = /tmp/.swall.pid
  11. log_file = /data/logs/swall.log
  12. log_level = INFO
  13. token = yhIC7oenuJDpBxqyP3GSHn7mgQThRHtOnNNwqpJnyPVhR1n9Y9Q+/T3PJfjYCZdiGRrX03CM+VI=

  14. ###fs.conf配置
  15. fs_type = rsync
  16. fs_host = 192.168.0.181
  17. fs_port = 61768
  18. fs_user = swall
  19. fs_pass = vGjeVUncnbPV8CcZ
  20. fs_tmp_dir = /data/swall_fs
  21. fs_failtry = 3

  22. ###zk.conf配置
  23. [main]
  24. zk_servers = 192.168.0.181:2181
  25. zk_scheme = digest
  26. zk_auth = vcode:swall!@#
  27. root=/swall
  28. nodes=%(root)s/nodes

  29. ###roles.d/server.conf角色配置
  30. [main]
  31. project = swall
  32. agent = sa
  33. node_name = %(project)s_%(agent)s_server_192.168.0.180
复制代码

5.新增PATH和PYTHONPATH路径(PYTHONPATH一定要设置,否则程序运行会提示swall模块找不到的
  1. [root@swall1 ~]# export PATH=/data/swall/bin:$PATH
  2. [root@swall1 ~]# export PYTHONPATH=/data/swall:$PYTHONPATH
  3. [root@swall1 ~]# #备注:最好把着两个环境变量写入配置文件
复制代码

6.新建swall用户和设置文件权限
  1. [root@swall1 ~]# useradd swall
  2. [root@swall1 ~]# chown -R swall:swall /data/swall
复制代码

7.第一次配置swall集群下初始化zookeeper目录
  1. [root@swall1 ~]# cd /data/swall/bin
  2. [root@swall1 bin]# ./swall manage init
复制代码

8.启动swall节点程序
  1. [root@swall1 ~]# cd /data/swall/bin
  2. [root@swall1 bin]# ./swall server start
复制代码

9.测试命令
  1. [root@swall1 bin]# swall ctl server "*"  sys.ping
  2. ##################################################
  3. [server] swall_sa_server_192.168.0.180 : 1
  4. ##################################################
  5. 一共执行了[1]个,失败了[0]
复制代码

如果你想尝试使用swall,我已经打包好了docker镜像,可以直接从docker官方仓库下载:
lufeng4828/swall:zookeeper 提供了包含zookeeper和rsync配置的镜像
  1. [root@swall ~]# docker run  -it --name=zookeeper -h zookeeper.swall.org lufeng4828/swall:zookeeper /bin/bash
复制代码
lufeng4828/swall:agent 提供了一个配置了swall的镜像
  1. [root@swall ~]# docker run -it --name=agent1 -h agent1.swall.org lufeng4828/swall:agent  /bin/bash
复制代码
运行以后按照上面教程的运行zookeeper、rsync和配置swall

四、Swall命令入门

1.swall的管理工具是bin/swall, 使用方法如下
  1. Usage: swall ctl  <role> [target] <module.function> [arguments]

  2. Send command to swall server.

  3. Options:
  4. -h, --help            show this help message and exit

  5. Options for swall ctl:
  6. -e EXCLUDE, --exclude=EXCLUDE
  7.                     Specify the exclude hosts by regix

  8. -t TIMEOUT, --timeout=TIMEOUT
  9.                     Specify the timeout,the unit is second

  10. -r, --is_raw        Specify the raw output
  11. -n NTHREAD, --nthread=NTHREAD
  12.                     Specify running nthread

  13. Options for conf_dir:
  14. -c CONFIG_DIR, --config_dir=CONFIG_DIR
  15.                     Pass in an alternative configuration dir. Default: /data/swall/conf
复制代码

2.参数解释
  1. role:指的是在swall.conf的node_role配置角色,只有配置了对应的role才能接收到命令,role支持多个,通过","或者"|"分隔
  2. target:通配符或者正则,通配符只支持*号,用来匹配具体的节点,主要去匹配swall.conf的node_name
  3. module.function:要执行的函数,例如sys.ping,有内置函数和自定义函数
  4. arguments:传递到module.function中的参数,支持位置参数和关键字参数
复制代码

3.选项解释
  1. --exclude:     需要从target刷选的列表中排除,支持通配符和正则
  2. --timeout:     设置超时
  3. --is_raw:       打印结果需要显示颜色
  4. --nthread:     需要多少个线程去执行任务,如果为1,代表一个swall接收到的任务只会在一个线程中执行
  5. --config_dir:  指定swall配置文件,否则使用默认的配置/data/swall/conf
复制代码

4.下面演示一些功能函数的使用,假设已经配置了N个节点了

(1)查看swall通讯是否正常
  1. [root@swall1 ~]# swall ctl server "*"  sys.ping --timeout=10
  2. ##################################################
  3. [server] swall_sa_server_192.168.0.190 : 1
  4. [server] swall_sa_server_192.168.0.191 : 1
  5. [server] swall_sa_server_192.168.0.195 : 1
  6. [server] swall_sa_server_192.168.0.198 : 1
  7. [server] swall_sa_server_192.168.0.203 : 1
  8. [server] swall_sa_server_192.168.0.180 : 1
  9. ##################################################
  10. 一共执行了[6]个,失败了[0]
复制代码

(2)拷贝文件到远程
  1. [root@swall1 ~]# swall ctl server "*"  sys.copy /etc/hosts /tmp/xx_hosts --timeout=10
复制代码
支持关键字参数如上面的命令可以添加ret_type=full
  1. [root@swall1 ~]# swall ctl server "*"  sys.copy /etc/hosts /tmp/xx_hosts ret_type=full --timeout=10
  2. ##################################################
  3. [server] swall_sa_server_192.168.0.190 : /tmp/xx_hosts
  4. [server] swall_sa_server_192.168.0.191 : /tmp/xx_hosts
  5. [server] swall_sa_server_192.168.0.195 : /tmp/xx_hosts
  6. [server] swall_sa_server_192.168.0.198 : /tmp/xx_hosts
  7. [server] swall_sa_server_192.168.0.203 : /tmp/xx_hosts
  8. [server] swall_sa_server_192.168.0.180 : /tmp/xx_hosts
  9. ##################################################
  10. 一共执行了[6]个,失败了[0]
  11. [root@swall1 ~]#
复制代码


(3)从远程拷贝文件到当前
  1. [root@swall1 ~]# swall ctl server "swall_sa_server_192.168.0.190"  sys.get /etc/services /tmp/xxx_service
  2. ##################################################
  3. [server] swall_sa_server_192.168.0.190 : /tmp/xxx_service
  4. ##################################################
  5. 一共执行了[1]个,失败了[0]
  6. [root@swall1 ~]#
复制代码

(4)执行shell命令
  1. [root@swall1 swall]# swall ctl server "swall_sa_server_192.168.0.190"  cmd.call 'echo ok | awk "{print \$0}"'
  2. ##################################################
  3. [server] swall_sa_server_192.168.0.190 :
  4. {
  5.     "pid": 1149,
  6.     "retcode": 0,
  7.     "stderr": null,
  8.     "stdout": "ok"
  9. }

  10. ##################################################
  11. 一共执行了[1]个,失败了[0]
复制代码


五、Swall命令进阶

1.如果你安装好了swall,可以从sys.funcs和help来一步一步了解swall,swall内置有很多基本功能,如查看agent存活,拷贝文件,同步模块,查看模块,查看swall参数宏变量等, 同时在module部分也实现了很多功能模块:网络模块,linux信息查看、远程命令执行等,当然你可以自己实现,添加自己的模块很简单,后面再告诉怎么添加。

(1)查看内置功能
  1. [root@swall1 ~]# swall ctl server "swall_sa_server_192.168.0.190"  sys.funcs sys
  2. ##################################################
  3. [server] swall_sa_server_192.168.0.190 :
  4. [
  5.     "sys.rsync_module",
  6.     "sys.get_env",
  7.     "sys.job_info",
  8.     "sys.funcs",
  9.     "sys.exprs",
  10.     "sys.copy",
  11.     "sys.ping",
  12.     "sys.get",
  13.     "sys.reload_env",
  14.     "sys.roles",
  15.     "sys.reload_node",
  16.     "sys.reload_module",
  17.     "sys.version"
  18. ]

  19. ##################################################
  20. 一共执行了[1]个,失败了[0]
  21. [root@swall1 ~]#
复制代码

(2)查看功能函数帮助,在调用函数后面直接加上help就可以了
  1. [root@swall1 ~]# swall ctl server "swall_sa_server_192.168.0.190"  sys.copy help
  2. ##################################################
  3. [server] swall_sa_server_192.168.0.190 :
  4.     def copy(*args, **kwargs) -> 拷贝文件到远程 可以增加一个ret_type=full,支持返回文件名
  5.     @param args list:支持位置参数,例如 sys.copy /etc/src.tar.gz /tmp/src.tar.gz ret_type=full
  6.     @param kwargs dict:支持关键字参数,例如sys.copy local_path=/etc/src.tar.gz remote_path=/tmp/src.tar.gz
  7.     @return int:1 if success else 0
  8. ##################################################
  9. 一共执行了[1]个,失败了[0]
复制代码

(3)同步模块到节点
  1. [root@swall1 ~]# swall ctl server "swall_sa_server_192.168.0.190"  sys.rsync_module
  2. ##################################################
  3. [server] swall_sa_server_192.168.0.190 : 1
  4. ##################################################
  5. 一共执行了[1]个
复制代码
支持同步个别模块,多个需要用逗号分隔
  1. [root@swall1 ~]# swall ctl server "swall_sa_server_192.168.0.190"  sys.rsync_module server_tools.py
  2. ##################################################
  3. [server] swall_sa_server_192.168.0.190 : 1
  4. ##################################################
  5. 一共执行了[1]个,失败了[0]
  6. [root@swall1 ~]#
复制代码

2.swall提供一些内置变量,使用在参数中,在真正执行的时候会被替换,查看当前系统支持的“参数宏变量”,关于这个部分,后面会有一章专门来讲
  1. [root@swall1 ~]# swall ctl server "swall_sa_server_192.168.0.190"  sys.get_env
  2. ##################################################
  3. [server] swall_sa_server_192.168.0.190 :
  4. [
  5.     "NODE",
  6.     "IP",
  7.     "AGENT",
  8.     "PROJECT",
  9.     "ROLE",
  10.     "TIME",
  11.     "DATE"
  12. ]

  13. ##################################################
  14. 一共执行了[1]个,失败了[0]
  15. [root@swall1 bin]#
复制代码
使用的时候需要加大括号,如{IP}、{AGENT},参数宏变量自定义,查看参数宏变量的具体值如下:
  1. [root@swall1 bin]# swall ctl server "*"  sys.exprs "role:{ROLE},ip:{IP},node:{NODE}"
  2. ##################################################
  3. [server] swall_sa_server_192.168.0.190 : role:server,ip:192.168.0.190,node:swall_sa_server_192.168.0.190
  4. [server] swall_sa_server_192.168.0.191 : role:server,ip:192.168.0.191,node:swall_sa_server_192.168.0.191
  5. [server] swall_sa_server_192.168.0.195 : role:server,ip:192.168.0.195,node:swall_sa_server_192.168.0.195
  6. [server] swall_sa_server_192.168.0.198 : role:server,ip:192.168.0.198,node:swall_sa_server_192.168.0.198
  7. [server] swall_sa_server_192.168.0.203 : role:server,ip:192.168.0.203,node:swall_sa_server_192.168.0.203
  8. [server] swall_sa_server_192.168.0.180 : role:server,ip:192.168.0.180,node:swall_sa_server_192.168.0.180
  9. ##################################################
  10. 一共执行了[6]个,失败了[0]
  11. [root@swall1 bin]#
  12. [root@swall1 bin]# swall ctl game "*"  sys.copy /etc/services /data/{NODE}/ ret_type=full
  13. ##################################################
  14. [game] swall_sa_600 : /data/swall_sa_600/services
  15. [game] swall_sa_601 : /data/swall_sa_601/services
  16. [game] swall_sa_700 : /data/swall_sa_700/services
  17. ##################################################
  18. 一共执行了[3]个,失败了[0]
  19. [root@swall1 bin]#
复制代码


六、Swall模块编写

swall模块存放在module下面的特定目录中,module下面的目录就是swall里面的角色,说白了,角色就是一个含有特定模块文件的组, 你写的模块属于哪个角色就放到哪个目录下去,例如你写了一个server_tools.py,属于server角色,就放到当前你所在节点的 /data/swall/module/server目录下(角色可以随意创建,只要在/data/swall/module/创建一个目录存放模块即可)一个agent 可以配置多个角色,就是swall.conf中的node_role,配置好角色还要为角色配置节点(节点的概念在swall中代表node),下面开始编写模块。

1.swall模块最小单元是函数,目前不支持直接调用对象方法,函数需要加上node修饰器,同时最好要给函数设置doc帮助信息
  1. [root@swall1 server]# pwd
  2. /data/swall/module/server
  3. [root@swall1 server]# vim mem_info.py
  4. import psutil
  5. import logging
  6. from swall.utils import node

  7. log = logging.getLogger()

  8. @node
  9. def physical_memory_usage(*args, **kwarg):
  10.     """
  11.     def physical_memory_usage(*args, **kwarg) -> Return a dict that describes free and available physical memory.
  12.     @return dict:
  13.     """
  14.     return dict(psutil.phymem_usage()._asdict())
复制代码

2.编写好了以后需要同步出去,同步命令会自动加载模块
  1. [root@swall1 swall]# swall ctl server "*" sys.rsync_module mem_info.py
  2. ##################################################
  3. [server] swall_sa_server_192.168.0.190 : 1
  4. [server] swall_sa_server_192.168.0.191 : 1
  5. ##################################################
  6. 一共执行了[2]个,失败了[0]
复制代码

3.查看写好的模块
  1. [root@swall1 swall]# swall ctl server "*" sys.funcs mem_info
  2. ##################################################
  3. [server] swall_sa_server_192.168.0.190 : ['mem_info.physical_memory_usage']
  4. [server] swall_sa_server_192.168.0.191 : ['mem_info.physical_memory_usage']
  5. ##################################################
  6. 一共执行了[2]个,失败了[0]
  7. [root@swall1 swall]#

  8. [root@swall1 swall]# swall ctl server "*" mem_info.physical_memory_usage help
  9. ##################################################
  10. [server] swall_sa_server_192.168.0.190 :
  11.     def physical_memory_usage(*args, **kwarg) -> Return a dict that describes free and available physical memory.
  12.     @return dict:

  13. [server] swall_sa_server_192.168.0.191 :
  14.     def physical_memory_usage(*args, **kwarg) -> Return a dict that describes free and available physical memory.
  15.     @return dict:

  16. ##################################################
  17. 一共执行了[2]个,失败了[0]
复制代码

4.调用执行我们的模块
  1. [root@swall1 swall]# swall ctl server "*" mem_info.physical_memory_usage
  2. ##################################################
  3. [server] swall_sa_server_192.168.0.190 :
  4. {
  5.     "active": 417042432,
  6.     "available": 57892864,
  7.     "buffers": 5967872,
  8.     "cached": 45473792,
  9.     "free": 6451200,
  10.     "inactive": 24846336,
  11.     "percent": 88.700000000000003,
  12.     "total": 514326528,
  13.     "used": 507875328
  14. }

  15. [server] swall_sa_server_192.168.0.191 :
  16. {
  17.     "active": 417067008,
  18.     "available": 57929728,
  19.     "buffers": 5967872,
  20.     "cached": 45518848,
  21.     "free": 6443008,
  22.     "inactive": 24940544,
  23.     "percent": 88.700000000000003,
  24.     "total": 514326528,
  25.     "used": 507883520
  26. }

  27. ##################################################
  28. 一共执行了[2]个,失败了[0]
  29. [root@swall1 swall]#
复制代码

七、Swall参数宏变量

swall支持在调用函数的时候,在参数(位置参数、关键字参数)里面加上宏变量,这些变量会在agent执行命令的时候扩展为具体的值,目前swall已经 支持如下几个参数宏变量:
  1. NODE:      node的名称
  2. IP:            node的ip地址
  3. AGENT:     node的agent名称
  4. PROJECT: node的项目名称
  5. ROLE:       node的角色名
  6. TIME:        node的当前时间
  7. DATE:        node的当前日期
复制代码

1.查看参数宏变量列表
  1. [root@swall1 ~]# swall ctl server "swall_sa_server_192.168.0.190"  sys.get_env
  2. ##################################################
  3. [server] swall_sa_server_192.168.0.190 :
  4. [
  5.     "NODE",
  6.     "IP",
  7.     "AGENT",
  8.     "PROJECT",
  9.     "ROLE",
  10.     "TIME",
  11.     "DATE"
  12. ]

  13. ##################################################
  14. 一共执行了[1]个,失败了[0]
复制代码

2.查看具体参数宏变量的值
  1. [root@swall1 bin]# swall ctl server "*"  sys.exprs "{NODE}"
  2. ##################################################
  3. [server] swall_sa_server_192.168.0.190 : node:swall_sa_server_192.168.0.190
  4. [server] swall_sa_server_192.168.0.191 : node:swall_sa_server_192.168.0.191
  5. [server] swall_sa_server_192.168.0.195 : node:swall_sa_server_192.168.0.195
  6. [server] swall_sa_server_192.168.0.198 : node:swall_sa_server_192.168.0.198
  7. [server] swall_sa_server_192.168.0.203 : node:swall_sa_server_192.168.0.203
  8. [server] swall_sa_server_192.168.0.180 : node:swall_sa_server_192.168.0.180
  9. ##################################################
  10. 一共执行了[6]个,失败了[0]
复制代码
这里sys.exprs可以帮你打印节点的参数宏变量值,经常用来做参数宏变量查看的

3.在执行sys.copy的时候将当前/etc/hosts文件拷贝到server角色的所有节点的/tmp下面,同时加上拷贝的时间
  1. [root@swall1 swall]# swall ctl server "*190*;*191*" sys.copy /etc/hosts /tmp/hosts.{DATE}_{TIME} ret_type=full
  2. ##################################################
  3. [server] swall_sa_server_192.168.0.190 : /tmp/hosts.2014-07-03_07:36:17
  4. [server] swall_sa_server_192.168.0.191 : /tmp/hosts.2014-07-03_07:36:17
  5. ##################################################
  6. 一共执行了[2]个,失败了[0]
  7. [root@swall1 swall]#
复制代码

4.新增参数宏变量

(1)编辑module/common/_sys_common.py文件,直接在里面参考其他参数宏变量添加,然后通过下面的命令同步
  1. [root@swall1 swall]# swall ctl server "*" sys.rsync_module _sys_common.py
  2. ##################################################
  3. [server] swall_sa_server_192.168.0.190 : 1
  4. [server] swall_sa_server_192.168.0.191 : 1
  5. ##################################################
  6. 一共执行了[2]个,失败了[0]
复制代码

(2)由于同步模块不会自动加载参数宏变量,需要手动加载
  1. [root@swall1 swall]# swall ctl server "*" sys.reload_env
  2. ##################################################
  3. [server] swall_sa_server_192.168.0.190 : 1
  4. [server] swall_sa_server_192.168.0.191 : 1
  5. ##################################################
  6. 一共执行了[2]个,失败了[0]
  7. [root@swall1 swall]#
复制代码


八、一些问题

1.怎么添加节点到集群呢?
    答:只要配置zk.conf好了,启动swall以后会自动添到集群,swall集群认证原理是:只要zookeeper认证通过就自动加入集群

2.怎么匹配节点?
   答:swall支持通过通配符(*)和正则表达式匹配节点,如:
(1)通配符,只支持星号,功能和linux shell环境下面的功能是一样的,如果有多个通配符,支持通过分号分隔
  1. [root@swall1 swall]# swall ctl server "swall_sa_server*" sys.ping
  2.     ##################################################
  3.     [server] swall_sa_server_192.168.0.190 : 1
  4.     [server] swall_sa_server_192.168.0.191 : 1
  5.     ##################################################
  6.     一共执行了[2]个,失败了[0]
  7.     [root@swall1 swall]#
  8.     [root@swall1 swall]# swall ctl server "*190;*191" sys.ping
  9.     ##################################################
  10.     [server] swall_sa_server_192.168.0.190 : 1
  11.     [server] swall_sa_server_192.168.0.191 : 1
  12.     ##################################################
  13.     一共执行了[2]个,失败了[0]
复制代码
(2)正则表达式
  1. [root@swall1 swall]# swall ctl server "swall_sa_server_192.168.0.\d+" sys.ping
  2.     ##################################################
  3.     [server] swall_sa_server_192.168.0.190 : 1
  4.     [server] swall_sa_server_192.168.0.191 : 1
  5.     ##################################################
  6.     一共执行了[2]个,失败了[0]
复制代码
(3)写完整的节点名称,如果有多个,支持分号分隔
  1. [root@swall1 swall]# swall ctl server "swall_sa_server_192.168.0.190" sys.ping
  2.     ##################################################
  3.     [server] swall_sa_server_192.168.0.190 : 1
  4.     ##################################################
  5.     一共执行了[1]个,失败了[0]
复制代码

3.调用模块的时候如果不知道怎么使用模块,不知道传什么参数,怎么办?
    答:每个函数后面加上 help参数都会打印这个函数使用说明

  1. [root@swall1 ~]# swall ctl server "swall_sa_server_192.168.0.190"  sys.copy help
  2.     ##################################################
  3.     [server] swall_sa_server_192.168.0.190 :
  4.         def copy(*args, **kwargs) -> 拷贝文件到远程 可以增加一个ret_type=full,支持返回文件名
  5.         @param args list:支持位置参数,例如 sys.copy /etc/src.tar.gz /tmp/src.tar.gz ret_type=full
  6.         @param kwargs dict:支持关键字参数,例如sys.copy local_path=/etc/src.tar.gz remote_path=/tmp/src.tar.gz
  7.         @return int:1 if success else 0
  8.     ##################################################
  9.     一共执行了[1]个,失败了[0]
复制代码

4.需要查看摸个模块的函数列表,怎么办?
    答:提供了一个sys.funcs函数可以解决这个问题,需要输入想要查看的模块名称(不带后缀

  1. [root@swall1 swall]# swall ctl server "swall_sa_server_192.168.0.190"  sys.funcs network
  2.     ##################################################
  3.     [server] swall_sa_server_192.168.0.190 : ['network.get_ip', 'network.get_ping']
  4.     [root@swall1 ~]#
复制代码

5.写好了模块以后要怎么同步到节点呢?
    答:通过调用sys.rsync_module可以同步模块到节点
    如果写好了模块并且存放如当前节点的/module/{role},这里的{role}对应你要同步的角色,/module/common是所有角色公       用的模块,现在为server同步模块如下:
  1. [root@swall1 ~]# swall ctl server "swall_sa_server_192.168.0.190"  sys.rsync_module
  2.     ##################################################
  3.     [server] swall_sa_server_192.168.0.190 : 1
  4.     ##################################################
  5.     一共执行了[1]个,失败了[0]
复制代码

支持同步个别模块,多个需要用逗号分隔:
  1. [root@swall1 ~]# swall ctl server "swall_sa_server_192.168.0.190"  sys.rsync_module server_tools.py
  2.     ##################################################
  3.     [server] swall_sa_server_192.168.0.190 : 1
  4.     ##################################################
  5.     一共执行了[1]个,失败了[0]
  6.     [root@swall1 ~]#
复制代码

6.如何编写模块?
    答:模块编写只要保证函数加上修饰器node即可,如下所示:
  1. #coding:utf-8
  2. from swall.utils import node

  3. @node
  4. def ping(*args, **kwargs):
  5.     return 1
复制代码
说明:
所有模块需要加上node修饰器才可以让swall调用,函数一定要加上kwargs这个关键字扩展参数,swall内部会传一些信息过来,这些信息有:project,agent、role、node_name、node_ip在函数里面可以通过kwargs["project"]等获取这些信息。
写好模块以后保存,例如ping.py,存放到module下对应的角色目录中,通过命令同步到agent,归属于这个角色节点就可以调用该函数。

7.什么场景下使用参数宏变量呢?
    答:例如其他节点获取配置的时候,一般情况下,如果你不加参数宏变量,获取到当前节点的文件是同一个路径,你根本区分不出来,如下:
  1. [root@swall1 bin]# swall ctl server "*"  sys.get /etc/hosts /tmp/
  2.     ##################################################
  3.     [server] swall_sa_server_192.168.0.190 : /etc/hosts
  4.     [server] swall_sa_server_192.168.0.191 : /etc/hosts
  5.     [server] swall_sa_server_192.168.0.195 : /etc/hosts
  6.     [server] swall_sa_server_192.168.0.198 : /etc/hosts
  7.     [server] swall_sa_server_192.168.0.203 : /etc/hosts
  8.     [server] swall_sa_server_192.168.0.205 : /etc/hosts
  9.     ##################################################
  10.     一共执行了[6]个,失败了[0]
  11.     [root@swall1 bin]#
复制代码
这里就有一个问题了,所有获取的文件路径都是/etc/hosts,区分不出是那个节点的文件,如果使用参数宏变量,就不一样了:
  1. [root@swall1 bin]# swall ctl server "*"  sys.get /etc/hosts /tmp/hosts.{node}
  2.     ##################################################
  3.     [server] swall_sa_server_192.168.0.190 : /tmp/hosts.swall_sa_server_192.168.0.190
  4.     [server] swall_sa_server_192.168.0.191 : /tmp/hosts.swall_sa_server_192.168.0.191
  5.     [server] swall_sa_server_192.168.0.195 : /tmp/hosts.swall_sa_server_192.168.0.195
  6.     [server] swall_sa_server_192.168.0.198 : /tmp/hosts.swall_sa_server_192.168.0.198
  7.     [server] swall_sa_server_192.168.0.203 : /tmp/hosts.swall_sa_server_192.168.0.203
  8.     [server] swall_sa_server_192.168.0.205 : /tmp/hosts.swall_sa_server_192.168.0.205
  9.     ##################################################
  10.     一共执行了[6]个,失败了[0]
  11.     [root@swall1 bin]#
复制代码
还有一种场景,在游戏运维中,针对一机多服,假设游戏有/data/swall_sa_600,/data/swall_sa_601,/data/swall_sa_700三个程序,对应三个game的节点,节点名称就是目录名。如果我要拷贝文件到/data/swall_sa_600,/data/swall_sa_601,/data/swall_sa_700各个目录下,用swall的参数宏变量替换就很容易解决:
  1. [root@swall1 bin]# swall ctl game "*"  sys.copy /etc/services /data/{node}/ ret_type=full
  2.     ##################################################
  3.     [game] swall_sa_600 : /data/swall_sa_600/services
  4.     [game] swall_sa_601 : /data/swall_sa_601/services
  5.     [game] swall_sa_700 : /data/swall_sa_700/services
  6.     ##################################################
  7.     一共执行了[3]个,失败了[0]
  8.     [root@swall1 bin]#
复制代码

8.怎么找不到sys.py这个模块文件?
    答:swall模块一类是内置的,sys开头的函数调用都属于swall内部的,这些模块在agent.py里面实现了,
    其他模块都可以在module目录下找到。

9.swall数据传输安全么?
    答:swall数据传输用的是对称加密协议,对称key配置在token中


九、结束语

      swall集群是本人奋战于webgame长达2年而开发的作品,在此之前使用过func、salt等管理工具,func这个东西速度效率比较差,发一个命令如果客户端很多要等很久,对func进行二次开发,但效果不明显,后面研究了salt,这个东西号称非常快速到你难以想象,确实非常快,不过我在使用的时候发现对目前的我们的业务不合适,当时webgame方面我们已经实现了在一台机器上面运行多个游戏区服了,但是salt目前只支持一台机器一个节点,不支持一台机器上面创建多个逻辑节点。

      后面研究了salt的源码,得知它的基本架构和数据处理流程,我就自己开始编写,出来以后也是用zeromq做消息传输,但是后面发现过多封装的它出问题以后都不知道怎么调试,而且不同版本zmq数据传输不兼容,考虑到zookeeper的集群性能和watcher特性,后面尝试用zookeeper来编写,也就是现在的版本。
      
      swall目前已经我们的游戏服务器运行,负责服务器环境初始化,游戏环境自动部署,游戏版本更新,游戏配置更新等任务,考虑到好东西应该互相分享,我已经在我的github上面发布了swall开源版本,这个开源版本去掉了一些和业务相关的代码,也进行了比较多的测试,但是bug难免,如果大家喜欢,欢迎到 https://github.com/lufeng4828/swall 下载测试!

       由于本人水平有限,加上这个开源版本编写仓促,程序中难免出现错误或者不准确,恳请朋友们批评指正。










论坛元老

小运维——知我罪我,其惟UNIX-like

Rank: 8Rank: 8

注册时间
2010-11-12
最后登录
2016-8-4
在线时间
1122 小时
阅读权限
90
积分
91360
帖子
477
主题
21
精华
0
UID
11131
发表于 2014-7-4 16:40:47 |显示全部楼层
顶下,谢楼主共享!
天道酬勤——UNIX真美!GNU/Linux更美!
子曰:君子务本,本立而道生!

使用道具 举报

Rank: 8Rank: 8

注册时间
2011-3-5
最后登录
2015-7-22
在线时间
459 小时
阅读权限
90
积分
66622
帖子
141
主题
10
精华
0
UID
12263
发表于 2014-7-4 22:03:36 |显示全部楼层
不错不错,不知跟最近很火的etcd结合会产生什么火花呢
个人博客:http://m114.org/

使用道具 举报

Rank: 8Rank: 8

注册时间
2011-11-29
最后登录
2016-12-14
在线时间
236 小时
阅读权限
90
积分
57831
帖子
166
主题
6
精华
0
UID
16159
发表于 2014-7-5 09:54:13 |显示全部楼层
支持顶一下

使用道具 举报

Rank: 6Rank: 6

注册时间
2011-6-21
最后登录
2020-5-14
在线时间
1463 小时
阅读权限
70
积分
8682
帖子
1095
主题
1072
精华
0
UID
14532
发表于 2014-7-5 09:54:28 |显示全部楼层
zflczx 发表于 2014-7-4 22:03
不错不错,不知跟最近很火的etcd结合会产生什么火花呢

etcd是很不错一个新项目,其实我有考虑过在这一层上再做一个封装,可以针对不同场景选择zk或者etcd,甚至自己实现,可能后期加上

使用道具 举报

Rank: 8Rank: 8

注册时间
2011-9-16
最后登录
2020-5-27
在线时间
975 小时
阅读权限
90
积分
274705
帖子
2158
主题
2
精华
0
UID
15647
发表于 2014-7-5 10:55:01 |显示全部楼层
感谢楼主分享!

使用道具 举报

Rank: 7Rank: 7Rank: 7

注册时间
2008-11-26
最后登录
2017-9-11
在线时间
627 小时
阅读权限
100
积分
93417
帖子
450
主题
18
精华
1
UID
618
发表于 2014-7-5 14:51:01 |显示全部楼层
好文件,谢谢分享!

使用道具 举报

Rank: 8Rank: 8

注册时间
2011-8-5
最后登录
2019-2-19
在线时间
102 小时
阅读权限
90
积分
26113
帖子
69
主题
0
精华
0
UID
15279
发表于 2014-7-7 16:51:36 |显示全部楼层
这个必须赞,  牛 !

使用道具 举报

LT管理团队

想飞的鸟

Rank: 9Rank: 9Rank: 9

注册时间
2008-6-20
最后登录
2015-7-7
在线时间
594 小时
阅读权限
200
积分
23002
帖子
512
主题
83
精华
3
UID
95
发表于 2014-10-4 21:00:58 |显示全部楼层
好攒:victory:
&amp;lt;-sina_sign,1703616862,29fb6047,1-&amp;gt;

使用道具 举报

Rank: 8Rank: 8

注册时间
2014-8-1
最后登录
2017-6-29
在线时间
46 小时
阅读权限
90
积分
15750
帖子
32
主题
7
精华
0
UID
42511
发表于 2014-11-13 11:13:49 |显示全部楼层
支持共享,支持楼主的精神!
地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴!

使用道具 举报

Rank: 6Rank: 6

注册时间
2014-11-12
最后登录
2015-11-19
在线时间
18 小时
阅读权限
70
积分
4542
帖子
11
主题
0
精华
0
UID
43300
发表于 2014-11-24 15:42:23 |显示全部楼层
好东西,赞一个!

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

IT运维专家网感谢您的支持

合作联系: QQ:67888954/MSN:cnseek@msn.com/mail:netseek@linuxtone.org

Archiver|手机版|感谢所有关心和支持过LinuxTone的朋友们 转载本站内容请注明原作者名及出处 ( 京ICP备08103151 )   |

GMT+8, 2020-5-27 01:16 , Processed in 0.046229 second(s), 12 queries , Apc On.

Powered by Discuz! X2 Licensed

© 2001-2011 Comsenz Inc.

回顶部