搭建mongodb三节点副本集(启用keyfile+auth访问控制)

环境版本:

CentOS Linux release 7.6.1810 (Core)

mongodb-linux-x86_64-rhel70-3.4.21.tgz

安装步骤:

The basic procedure is to start the mongod instances that will become members of the replica set, configure the replica set itself, and then add the mongod instances to it.

Before you can deploy a replica set, you must install MongoDB on each system that will be part of your replica set.

1、在每台机器上下载解压mongodb安装包

curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.4.21.tgz
tar -zxvf mongodb-linux-x86_64-rhel70-3.4.21.tgz
mv mongodb-linux-x86_64-rhel70-3.4.21/ /usr/local/mongodb

2、在每台机器上创建mongodb的data、log以及配置目录

cd /usr/local/mongodb
mkdir -p data/db
mkdir log
touch log/mongod.log
mkdir etc
touch etc/mongod.conf

3、在每台机器上配置config文件

vi etc/mongod.conf

为了启动方便,可以将mongodb的启动配置项直接设置在配置文件中:

dbpath = /usr/local/mongodb/data/db # 指定数据库路径
logpath = /usr/local/mongodb/log/mongod.log # 指定mongodb日志文件
logappend = true # 使用追加的方式写日志
port = 27017 #设置端口号为27017
fork = true #设置以守护进程的方式启动mongod
replSet = testxhrs             #设置副本集的名字为testxhrs,同一副本集群的replSet名称必相同

4分别在每台机器上启动mongodb

cd /usr/local/mongodb
./bin/mongod -f ./etc/mongod.conf #指定以mongod.conf配置启动mongod

5、初始化副本集

IMPORTANT:Run rs.initiate() on just one and only one mongod instance for the replica set.

登录任意一台机器的mongodb后台管理shell:

cd /usr/local/mongodb
./bin/mongo
use admin
rs.initiate( {

   _id : “testxhrs”,

   members: [

      { _id: 0, host: “192.168.191.147:27017” },

      { _id: 1, host: “192.168.191.148:27017” },

      { _id: 2, host: “192.168.191.149:27017” }

   ]

})   #初始化配置

注意:如果执行初始化报错,检查三台服务器的防火墙27017端口是否开放。

通过rs.conf()查看副本集配置:

testxhrs:PRIMARY> rs.conf()

{

“_id” : “testxhrs”,

“version” : 1,

“protocolVersion” : NumberLong(1),

“members” : [

{

“_id” : 0,

“host” : “192.168.191.147:27017”,

“arbiterOnly” : false,

“buildIndexes” : true,

“hidden” : false,

“priority” : 1,

“tags” : {

},

“slaveDelay” : NumberLong(0),

“votes” : 1

},

{

“_id” : 1,

“host” : “192.168.191.148:27017”,

“arbiterOnly” : false,

“buildIndexes” : true,

“hidden” : false,

“priority” : 1,

“tags” : {

},

“slaveDelay” : NumberLong(0),

“votes” : 1

},

{

“_id” : 2,

“host” : “192.168.191.149:27017”,

“arbiterOnly” : false,

“buildIndexes” : true,

“hidden” : false,

“priority” : 1,

“tags” : {

},

“slaveDelay” : NumberLong(0),

“votes” : 1

}

],

“settings” : {

“chainingAllowed” : true,

“heartbeatIntervalMillis” : 2000,

“heartbeatTimeoutSecs” : 10,

“electionTimeoutMillis” : 10000,

“catchUpTimeoutMillis” : 60000,

“getLastErrorModes” : {

},

“getLastErrorDefaults” : {

“w” : 1,

“wtimeout” : 0

},

“replicaSetId” : ObjectId(“5d0afcba1d434d32a01ea25f”)

}

}

testxhrs:PRIMARY>

通过rs.status()查看确认副本集主节点:

testxhrs:PRIMARY> rs.status()

{

“set” : “testxhrs”,

“date” : ISODate(“2019-06-20T03:36:28.575Z”),

“myState” : 1,

“term” : NumberLong(1),

“syncingTo” : “”,

“syncSourceHost” : “”,

“syncSourceId” : -1,

“heartbeatIntervalMillis” : NumberLong(2000),

“optimes” : {

“lastCommittedOpTime” : {

“ts” : Timestamp(1561001778, 1),

“t” : NumberLong(1)

},

“appliedOpTime” : {

“ts” : Timestamp(1561001778, 1),

“t” : NumberLong(1)

},

“durableOpTime” : {

“ts” : Timestamp(1561001778, 1),

“t” : NumberLong(1)

}

},

“members” : [

{

“_id” : 0,

“name” : “192.168.191.147:27017”,

“health” : 1,

“state” : 1,

“stateStr” : “PRIMARY”,

“uptime” : 1438,

“optime” : {

“ts” : Timestamp(1561001778, 1),

“t” : NumberLong(1)

},

“optimeDate” : ISODate(“2019-06-20T03:36:18Z”),

“syncingTo” : “”,

“syncSourceHost” : “”,

“syncSourceId” : -1,

“infoMessage” : “”,

“electionTime” : Timestamp(1561001157, 1),

“electionDate” : ISODate(“2019-06-20T03:25:57Z”),

“configVersion” : 1,

“self” : true,

“lastHeartbeatMessage” : “”

},

{

“_id” : 1,

“name” : “192.168.191.148:27017”,

“health” : 1,

“state” : 2,

“stateStr” : “SECONDARY”,

“uptime” : 642,

“optime” : {

“ts” : Timestamp(1561001778, 1),

“t” : NumberLong(1)

},

“optimeDurable” : {

“ts” : Timestamp(1561001778, 1),

“t” : NumberLong(1)

},

“optimeDate” : ISODate(“2019-06-20T03:36:18Z”),

“optimeDurableDate” : ISODate(“2019-06-20T03:36:18Z”),

“lastHeartbeat” : ISODate(“2019-06-20T03:36:28.211Z”),

“lastHeartbeatRecv” : ISODate(“2019-06-20T03:36:28.257Z”),

“pingMs” : NumberLong(0),

“lastHeartbeatMessage” : “”,

“syncingTo” : “192.168.191.147:27017”,

“syncSourceHost” : “192.168.191.147:27017”,

“syncSourceId” : 0,

“infoMessage” : “”,

“configVersion” : 1

},

{

“_id” : 2,

“name” : “192.168.191.149:27017”,

“health” : 1,

“state” : 2,

“stateStr” : “SECONDARY”,

“uptime” : 642,

“optime” : {

“ts” : Timestamp(1561001778, 1),

“t” : NumberLong(1)

},

“optimeDurable” : {

“ts” : Timestamp(1561001778, 1),

“t” : NumberLong(1)

},

“optimeDate” : ISODate(“2019-06-20T03:36:18Z”),

“optimeDurableDate” : ISODate(“2019-06-20T03:36:18Z”),

“lastHeartbeat” : ISODate(“2019-06-20T03:36:28.211Z”),

“lastHeartbeatRecv” : ISODate(“2019-06-20T03:36:28.248Z”),

“pingMs” : NumberLong(0),

“lastHeartbeatMessage” : “”,

“syncingTo” : “192.168.191.147:27017”,

“syncSourceHost” : “192.168.191.147:27017”,

“syncSourceId” : 0,

“infoMessage” : “”,

“configVersion” : 1

}

],

“ok” : 1

}

testxhrs:PRIMARY>

6、创建账号(在主节点上操作):
# ./bin/mongo

> use admin

# 创建用户管理员(可管理用户、权限)

> db.createUser({user: “admin”,pwd: “p@ssw0rd4admin”,roles: [ { role: “userAdminAnyDatabase”, db: “admin” } ]})

# 创建数据库管理员(可管理数据库)

在MongoDB shell中切换到数据库admin,再使用createUser添加角色为readWriteAnyDatabase、dbAdminAnyDatabase和clusterAdmin的用户。这让用户能够访问系统中的所有数据库、创建新的数据库以及管理 MongoDB 集群。

> use admin

switched to db admin

> db.createUser(

…    {

…      user: “dbadmin”,

…      pwd: “p@ssw0rd4dbadmin”,

…      roles: [ “readWriteAnyDatabase”, “dbAdminAnyDatabase”,”clusterAdmin” ]

…    }

… )

Successfully added user: {

    “user” : “dbadmin”,

    “roles” : [

            “readWriteAnyDatabase”,

            “dbAdminAnyDatabase”,

            “clusterAdmin”

    ]

}

# 创建超级管理员(可管理用户、权限、数据库)

> db.createUser({“user”:”SuperAdmin”,”pwd”:”p@ssw0rd4SA”,”roles”:[“root”]});

# 创建集群管理员

> db.createUser({“user” : “cluster”,”pwd” : “p@ssw0rd4cluster”,roles: [ { “role” : “clusterAdmin”, “db” : “admin” } ]})

#创建普通用户

> use db1;

> db.createUser({user:”user1″,pwd:”p@ssw0rd4user1″,roles:[{role:”dbOwner”,db:”db1″}]})

7、启用keyfile+auth访问控制

生成keyfile文件, 设置权限为400, 并拷贝到每个副本集成员:

注:Copy the keyfile to each server hosting the replica set members. Ensure that the user running the mongod instances is the owner of the file and can access the keyfile.

cd /usr/local/mongodb
mkdir conf

openssl rand -base64 756 -out conf/keyfile

chmod 400 conf/keyfile

在每个副本集成员上修改配置文件

keyFile = /usr/local/mongodb/conf/keyfile

auth = true

重新启动各个节点先关SECONDARY,后关PRIMARY

./bin/mongod -f ./etc/mongod.conf –shutdown

./bin/mongod -f ./etc/mongod.conf

8测试副本集的数据复制功能

在主节点测试写入

testxhrs:PRIMARY> use db1

switched to db db1

testxhrs:PRIMARY> db.auth(‘user1′,’p@ssw0rd4user1’)

1

testxhrs:PRIMARY> db.t_user.insert({“user”: “mongodb”})

WriteResult({ “nInserted” : 1 })

testxhrs:PRIMARY> db.t_user.find();

{ “_id” : ObjectId(“5d08acb0372140acd6e68525”), “user” : “mongodb” }

testxhrs:PRIMARY>

在secondary节点测试查询是否有数据同步:

testxhrs:SECONDARY> use db1

switched to db db1

testxhrs:SECONDARY> db.auth(‘user1′,’p@ssw0rd4user1’)

1

testxhrs:SECONDARY> db.t_user.find()

Error: error: {

“ok” : 0,

“errmsg” : “not master and slaveOk=false”,

“code” : 13435,

“codeName” : “NotMasterNoSlaveOk”

}

testxhrs:SECONDARY> rs.slaveOk()  #默认情况下secondary是不可以读写的,需要执行rs.slaveOk()才可以执行查看命令

注:因为mongodb默认是从主节点读写数据的,副本节点上不允许读,需要设置副本节点可以读。

testxhrs:SECONDARY> db.getMongo().setSlaveOk();

此时就可以读取数据了。

testxhrs:SECONDARY> db.t_user.find()

控制台输出:{ “_id” : ObjectId(“5d08acb0372140acd6e68525”), “user” : “mongodb” }

可以看出数据复制的功能是可用的。

9测试副本集的故障转移功能
将主节点192.168.191.147的mongod进程杀死:

testxhrs:PRIMARY> use admin
testxhrs:PRIMARY> db.shutdownServer()

通过rs.status()来查看副本集状态,此时可以看到,192.168.191.149原本是副节点,现在自动转换为主节点。

10、客户端工具连接测试

附:

1.查看所有账户 :

> use admin

switched to db admin

> db.auth(‘admin’,’password’)

1

> db.system.users.find().pretty()

2.查看当前库下账户 :

> use admin

switched to db admin

> show users

> use test

switched to db test

> show users

3.修改用户密码:

The following operation changes the password of the user named accountUser in the products database to SOh3TbYhx8ypJPxmt1oOfL:

use products

db.changeUserPassword(“accountUser”, “SOh3TbYhx8ypJPxmt1oOfL”)

4.修改用户权限等:

Example

Given a user appClient01 in the products database with the following user info:

{

   “_id” : “products.appClient01”,

   “user” : “appClient01”,

   “db” : “products”,

   “customData” : { “empID” : “12345”, “badge” : “9156” },

   “roles” : [

       { “role” : “readWrite”,

         “db” : “products”

       },

       { “role” : “read”,

         “db” : “inventory”

       }

   ]

}

The following db.updateUser() method completely replaces the user’s customData and roles data:

use products

db.updateUser( “appClient01”,

               {

                 customData : { employeeId : “0x3039” },

                 roles : [

                           { role : “read”, db : “assets”  }

                         ]

                }

             )

The user appClient01 in the products database now has the following user information:

{

   “_id” : “products.appClient01”,

   “user” : “appClient01”,

   “db” : “products”,

   “customData” : { “employeeId” : “0x3039” },

   “roles” : [

       { “role” : “read”,

         “db” : “assets”

       }

   ]

}

5.分配用户更多权限:

Example

Given a user accountUser01 in the products database with the following roles:

“roles” : [

    { “role” : “assetsReader”,

      “db” : “assets”

    }

]

The following grantRolesToUser() operation gives accountUser01 the readWrite role on the products database and the read role on the stock database.

use products

db.grantRolesToUser(

   “accountUser01”,

   [ “readWrite” , { role: “read”, db: “stock” } ],

   { w: “majority” , wtimeout: 4000 }

)

The user accountUser01 in the products database now has the following roles:

“roles” : [

    { “role” : “assetsReader”,

      “db” : “assets”

    },

    { “role” : “read”,

      “db” : “stock”

    },

    { “role” : “readWrite”,

      “db” : “products”

    }

]

6.撤销用户相关权限:

Example

The accountUser01 user in the products database has the following roles:

“roles” : [

    { “role” : “assetsReader”,

      “db” : “assets”

    },

    { “role” : “read”,

      “db” : “stock”

    },

    { “role” : “readWrite”,

      “db” : “products”

    }

]

The following db.revokeRolesFromUser() method removes the two of the user’s roles: the read role on the stock database and the readWrite role on the products database, which is also the database on which the method runs:

use products

db.revokeRolesFromUser( “accountUser01”,

                        [ { role: “read”, db: “stock” }, “readWrite” ],

                        { w: “majority” }

                      )

The user accountUser01 user in the products database now has only one remaining role:

“roles” : [

    { “role” : “assetsReader”,

      “db” : “assets”

    }

]

Manually Downloading and Installing a GitLab Package

1.Downloading a GitLab Package

All GitLab packages are posted to our package server and can be downloaded.

GitLab EE: for official Enterprise Edition releases

GitLab CE: for official Community Edition releases

Unstable: for release candidates and other unstable versions

Browse to the repository for the type of package you would like, in order to see the list of packages that are available. There are multiple packages for a single version, one for each supported distribution type. Next to the filename is a label indicating the distribution, as the file names may be the same.

Locate the desired package for the version and distribution you want to use, and click on the filename to download.

2.Installing the GitLab Package

With the desired package downloaded, use your systems package management tool to install it. For example:

  • DEB based (Ubuntu, Debian, Raspberry Pi): 

sudo EXTERNAL_URL=”http://gitlab.example.com” dpkg -i gitlab-ce_11.3.13-ce.0_amd64.deb

  • RPM based (CentOS, RHEL, Oracle, Scientific, openSUSE, SLES):

 sudo EXTERNAL_URL=”http://gitlab.example.com” rpm -i gitlab-ce-11.3.13-ce.0.el7.x86_64.rpm

Change http://gitlab.example.com to the URL at which you want to access your GitLab instance. Installation will automatically configure and start GitLab at that URL.

Note: Enabling HTTPS will require additional configuration to specify the certificates.

3.Browse to the hostname and login

On your first visit, you’ll be redirected to a password reset screen. Provide the password for the initial administrator account and you will be redirected back to the login screen. Use the default account’s username root to login.

Tomcat的SSL证书配置

一、PFX格式

从Tomcat7开始支持PFX格式证书,PFX格式只适用tomcat7 及其以上的版本

a.找到安装Tomcat目录下文件server.xml,一般默认路径都是在 conf 文件夹中。找到<Connection port=”8443″ 标签,增加如下属性:

keystoreFile=”cert/ 214002146520484.pfx”

keystoreType=”PKCS12″

keystorePass=”证书密码”

注:214002146520484.pfx 为证书文件名

完整的配置如下,其中port属性根据实际情况修改:

<Connector port=”443″

protocol=”org.apache.coyote.http11.Http11NioProtocol”

SSLEnabled=”true”

scheme=”https”

secure=”true”

keystoreFile=”ssl/214002146520484.pfx” //证书路径地址

keystoreType=”PKCS12″

keystorePass=”证书密码” //证书密码

clientAuth=”false”

SSLProtocol=”TLSv1+TLSv1.1+TLSv1.2″

ciphers=”TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,

TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256″/>

二、JKS格式

a. 使用java jdk将PFX格式证书转换为JKS格式证书

keytool -importkeystore -srckeystore domains_ssl.pfx -destkeystore domains.jks -srcstoretype PKCS12 -deststoretype JKS

回车后输入JKS证书密码和PFX证书密码,强烈推荐将JKS密码与PFX证书密码相同,否则可能会导致Tomcat启动失败。如下

Enter destination keystore password:

Re-enter new password:

Enter source keystore password:

Entry for alias alias successfully imported.

Import command completed: 1 entries successfully imported, 0 entries failed or cancelled

当然网上也有很多的证书格式转换工具,方便我们进行证书格式的转换。

b.找到安装 Tomcat 目录下文件server.xml,一般默认路径都是在 conf 文件夹中。找到<Connection port=”8443″ 标签,完整的配置如下,其中port属性根据实际情况修改:

<Connector port=”443″ protocol=”HTTP/1.1″ SSLEnabled=”true”

maxThreads=”150″ scheme=”https” secure=”true”

keystoreFile=”conf/www.domain.com.jks” //证书路径地址

keystorePass=”密码” //证书密码

clientAuth=”false” sslProtocol=”TLS” />

或者:

重启 Tomcat,通过 https 方式访问站点,测试站点证书是否正确安装配置。

使用Zabbix监控VMware ESXi

一、环境:

VMware ESXi 6.5、Zabbix 4.0.7

二、操作步骤:

2.1修改Zabbix配置文件

vim /etc/zabbix/zabbix_server.conf

StartVMwareCollectors – 预先启动Vmware collector收集器实例的数量。

此值取决于要监控的 VMware 服务的数量。在大多数情况下,这应该是:

servicenum < StartVMwareCollectors < (servicenum * 2)

其中 servicenum 是 VMware 服务的数量。例如:如果您有 1 个 VMware 服务要将 StartVMwareCollectors 设置为 2,那么如果您有 3 个 VMware 服务,请将其设置为 5。请注意,在大多数情况下,此值不应小于 2,不应大于 VMware 数量的 2 倍服务。

修改完成后,重启Zabbix服务端

$ sudo systemctl restart zabbix-server

2.2开启ESXi主机ManagedObjectBrowser(MOB)功能(注:设置完毕监控正常后可将其设置为false)

登录ESXi主机,在管理-系统-高级设置,找到键:Config.HostAgent.plugins.solo.enableMob,然后将其设置为true

接下来访问URL:https://esxi_ip/mob,会弹出访问接口浏览器身份验证

通过验证后可以访问ManagedObjectReference页面.

2.3找到ESXi主机对应的UUID

Zabbix将使用UUID唯一定位ESXi主机,因此需要先获得ESXi主机的UUID

访问URL:https://esxi_ip/mob/?moid=ha-host&doPath=hardware.systemInfo,即可找到该主机的UUID并记录

2.4为ESXi主机添加监控

登录Zabbix Server管理页面,添加主机。(注意:主机名称使用UUID,否则关联监控项时会报错)

注:上述截图Agent interfaces中port端口也可设置为默认10050

关联监控模板,Zabbix已内置了相关监控模板

VMware模板没有自动图表,需要手动创建图表:

至此操作完毕。

国内Android App在线漏洞检测平台

注:最新信息请参考官方站点。

腾讯金刚审计系统

http://service.security.tencent.com/kingkong 免费 无限制 

腾讯御安全

http://yaq.qq.com/ 免费 查看漏洞详情需认证 

阿里聚安全

http://jaq.alibaba.com/ 免费 查看漏洞详情需认证

 360显微镜

http://appscan.360.cn/ 免费 无限制 

360APP漏洞扫描

http://dev.360.cn/html/vulscan/scanning.html 免费 无限制 

百度MTC

http://mtc.baidu.com 9.9元/次 无限制 

梆梆

https://dev.bangcle.com 免费 无限制 

爱内测

http://www.ineice.com/ 免费 无限制 

通付盾 http://www.appfortify.cn/ 免费 无限制 

NAGA

http://www.nagain.com/appscan/ 免费 无限制 

GES审计系统

http://01hackcode.com/ 免费 无限制 

Java进程CPU使用率高问题排查步骤

java应用CPU使用率一直很高,经常达到100%,可通过以下步骤排查解决。

方法一:

1.jps 获取Java进程的PID。

2.jstack pid >> java.txt 导出CPU占用高进程的线程栈。

3.top -H -p PID 查看对应进程的哪个线程占用CPU过高。

4.echo “obase=16; PID” | bc 将线程的PID转换为16进制,大写转换为小写。

5.在第二步导出的Java.txt中查找转换成为16进制的线程PID,找到对应的线程栈。

6.分析负载高的线程栈都是什么业务操作,优化程序并处理问题。

方法二:

1.使用top 定位到占用CPU高的进程PID

top

2.获取线程信息,并找到占用CPU高的线程

ps -mp pid -o THREAD,tid,time | sort -rn

3.将需要的线程ID转换为16进制格式

printf “%x\n” tid

4.打印线程的堆栈信息

jstack pid |grep tid -A 30

RabbitMQ集群搭建

注:本文基于3个节点搭建rabbitmq集群,并且都是磁盘节点,只要有任何一个节点能够工作,rabbitmq集群对外就能提供服务。(所有节点状态保持一致,节点完全对等,即每个节点都提供服务给客户端连接,进行消息发送与接收。)

、环境介绍

系统及组件版本:

centos7.6

rabbitmq 3.6.10

准备三个节点,主机名及IP如下,mqsrv01作为master节点。    

NodeIPNote
mqsrv01192.168.191.152master节点
mqsrv02192.168.191.153slave节点
mqsrv03192.168.191.154slave节点

、部署步骤

1.各节点上配置/etc/hosts,如下:

192.168.191.152 mqsrv01

192.168.191.153 mqsrv02

192.168.191.154 mqsrv03

2.各节点上安装rabbitmq

2.1安装rabbitmq

yum -y install epel-release

yum -y install erlang socat

wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-3.6.10-1.el7.noarch.rpm

rpm -import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc

rpm -Uvh rabbitmq-server-3.6.10-1.el7.noarch.rpm

各节点启动rabbitmq服务

systemctl start rabbitmq-server

systemctl enable rabbitmq-server

各节点开启管理页面插件(监听15672端口)

rabbitmq-plugins enable rabbitmq_management

注:rabbitmq-plugins list命令可查看插件状态

2.2用浏览器访问rabbitmq管理页面

http://ip:15672/

2.3 远程访问配置(建议在集群配置之后设置)

默认网页(http://ip:15672)是不允许访问的,需要增加一个用户修改一下权限:

添加用户:rabbitmqctl add_user mqadmin 123456
添加权限:rabbitmqctl set_permissions -p “/” mqadmin “.*” “.*” “.*”

修改用户角色:rabbitmqctl set_user_tags mqadmin administrator

#根据需要创建以下内容
创建虚拟主机:rabbitmqctl add_vhost vhost(vhost为虚拟主机名)
清理原始权限:rabbitmqctl clear_permissions -p / mqadmin
授予新虚拟主机权限:rabbitmqctl set_permissions -p vhost mqadmin “.*” “.*” “.*”

然后就可以远程访问了,然后可直接配置用户权限等信息。

3.RabbitMQ集群配置

3.1前置条件检查并设置:

(1)所有节点上分别部署同一版本rabbitmq

使用以下命令确认节点主机名是否相同:rabbitmqctl status

要配置集群,保证所有节点的主机名不同,且能互相ping通。(/etc/hosts中设置)

(2)设置每个节点Cookie 

注:RabbitMQ集群通过.erlang.cookie内的cookie值来确认各节点是否在同一个集群。

rabbitmq的集群是依赖erlang的集群来工作的,所以必须先构建erlang的集群环境。erlang集群中各节点是通过一个 magic cookie来实现的,这个cookie存放在.erlang.cookie 中,文件是400的权限。所以必须保证各节点cookie保持一致,否则节点之间就无法通信. 建议在RabbitMQ服务启动前修改cookie,如果RabbitMQ服务已经启动,修改cookie值后,必须重启RabbitMQ服务。

.erlang.cookie一般会存在这两个目录下:第一个是$home/.erlang.cookie;第二个是/var/lib/rabbitmq/.erlang.cookie。如果使用解压缩方式安装部署的rabbitmq,那么这个文件会在${home}目录下,也就是$home/.erlang.cookie。如果使用rpm等安装包方式进行安装的,那么这个文件会在/var/lib/rabbitmq目录下。

将master节点mqsrv01中的.erlang.cookie通过scp复制到mqsrv02、mqsrv03节点:

# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.191.153:/var/lib/rabbitmq/.erlang.cookie

# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.191.154:/var/lib/rabbitmq/.erlang.cookie

查看同步后的.erlang.cookie是否一致:

[root@mqsrv01 ~]# cat /var/lib/rabbitmq/.erlang.cookie 

HGGCRHYLCACDFFFPXHMJ

[root@mqsrv02 ~]# cat /var/lib/rabbitmq/.erlang.cookie

HGGCRHYLCACDFFFPXHMJ

[root@mqsrv03 ~]# cat /var/lib/rabbitmq/.erlang.cookie

HGGCRHYLCACDFFFPXHMJ

3.2节点加入集群

设192.168.191.152 (mqsrv01)为主节点,在192.168.191.152机器上执行:
#rabbitmqctl stop_app 
#rabbitmqctl reset (这一步会重置<清空添加的用户信息等>,请备份数据) //非必须,只是为了初始化清空之前数据
#rabbitmqctl start_app 

查看mqsrv01节点集群状态:

将各slave节点加入到集群:

在192.168.191.153(mqsrv02)机器上执行:

[root@mqsrv02 ~]# rabbitmqctl stop_app

Stopping node rabbit@mqsrv02 …

[root@mqsrv02 ~]# rabbitmqctl join_cluster rabbit@mqsrv01

Clustering node rabbit@mqsrv02 with rabbit@mqsrv01 …

[root@mqsrv02 ~]# rabbitmqctl start_app

在192.168.191.154(mqsrv03)机器上执行:

[root@mqsrv03 ~]# rabbitmqctl stop_app

Stopping node rabbit@mqsrv03 …

[root@mqsrv03 ~]#rabbitmqctl join_cluster rabbit@mqsrv01

Clustering node rabbit@mqsrv03 with rabbit@mqsrv01 …

[root@mqsrv03 ~]# rabbitmqctl start_app

注:如果要使用内存节点,则可以使用 rabbitmqctl join_cluster –ram rabbit@mqsrv01加入集群

所有节点加入集群后,可在任意节点查看集群状态:

3.3设置镜像队列策略 //非必须,推荐操作,搭配均衡器,实现高可用集群。
使用镜像功能,需要基于rabbitmq策略来实现,策略是用来控制和修改集群范围的某个vhost队列行为和Exchange行为,在cluster中任意节点启用策略,策略会自动同步到集群节点。

在任意一个节点上执行:

# rabbitmqctl set_policy ha-all “^” ‘{“ha-mode”:”all”}’

上述命令将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一致。

完成上述步骤后,RabbitMQ 高可用集群就已经搭建好了,最后一个步骤就是搭建均衡器。

3.4使用haproxy创建LB集群

安装haproxy:

yum -y install haproxy

设置配置文件:

vi /etc/haproxy/haproxy.cfg

内容如下:

global

    log     127.0.0.1  local0 info

    log     127.0.0.1  local1 notice

    daemon

    maxconn 4096

defaults

    log     global

    mode    tcp

    option  tcplog

    option  dontlognull

    retries 3

    option  abortonclose

    maxconn 4096

    timeout connect 5000ms

    timeout client  3000ms

    timeout server  3000ms

    balance roundrobin

listen private_monitoring

    bind    0.0.0.0:8100

    mode    http

    option  httplog

    stats   refresh  5s

    stats   uri  /stats

    stats   realm   Haproxy

    stats   auth  admin:admin

listen rabbitmq_admin

    bind    0.0.0.0:15672

    server  mqsrv01  192.168.191.152:15672

    server  mqsrv02  192.168.191.153:15672

    server  mqsrv03  192.168.191.154:15672

listen rabbitmq_cluster

    bind    0.0.0.0:5672

    mode    tcp

    option  tcplog

    balance roundrobin

    server  mqsrv01  192.168.191.152:5672  check  inter  5000  rise  2  fall  3

    server  mqsrv02  192.168.191.153:5672  check  inter  5000  rise  2  fall  3

    server  mqsrv03  192.168.191.154:5672  check  inter  5000  rise  2  fall  3

保存退出。

启动haproxy:

systemctl start haproxy

访问HAProxy数据统计页面

http://haproxy server IP:8100/stats

访问RabbitMQ管理页面

http://haproxy server IP:15672/

注:参考2.3 远程访问配置章节内容设置用户、密码及权限、角色,即可访问RabbitMQ管理页面。

附录:

1.当第一次启动服务,检测数据库是否未初始化或者被删除,它会用下面的资源初始化一个新的数据库:一个命名为 / 的虚拟宿主,一个名为guest密码也为guest的用户,它拥有/虚拟宿主的所有权限,如果你的rabbitmq是公开访问的,最好修改guest用户的密码。

2.rabbitmqctl 是RabbitMQ的一个命令行管理工具。它通过连接一个节点执行所有的动作。可以通过这个命令前使用”-n”标志明确指定节点名称, 例如:

# rabbitmqctl -n rabbit@mqsrv02 add_user tony changeit

这个命令指示RabbitMQ在rabbit@mqsrv02节点创建一个tony/changeit的用户。

3.常用命令:

应用和集群管理

停止RabbitMQ应用,关闭节点:rabbitmqctl stop

停止RabbitMQ应用:rabbitmqctl stop_app

启动RabbitMQ应用:rabbitmqctl start_app

显示RabbitMQ信息:rabbitmqctl status

显示RabbitMQ集群信息:rabbitmqctl cluster_status

重置RabbitMQ节点:rabbitmqctl reset

用户管理

添加用户:rabbitmqctl add_user username password

删除用户:rabbitmqctl delete_user username

修改密码:rabbitmqctl change_password username newpassword

设置用户角色:rabbitmqctl set_user_tags username tag

tag可以为administrator,monitoring,management等。

列出所有用户:rabbitmqctl list_users

权限控制

创建虚拟主机:rabbitmqctl add_vhost vhostpath

删除虚拟主机:rabbitmqctl delete_vhost vhostpath

列出所有虚拟主机:rabbitmqctl list_vhosts

设置用户权限:rabbitmqctl set_permissions [-p vhostpath] username regexp regexp regexp

清除用户权限:rabbitmqctl clear_permissions [-p vhostpath] username

列出虚拟主机上的所有权限:rabbitmqctl list_permissions [-p vhostpath]

列出用户权限:rabbitmqctl list_user_permissions username

4.remove a node from a cluster(remove rabbit@rabbit3 from the cluster)

# on rabbit3

rabbitmqctl stop_app

# => Stopping node rabbit@rabbit3 …done.

rabbitmqctl reset

# => Resetting node rabbit@rabbit3 …done.

rabbitmqctl start_app

# => Starting node rabbit@rabbit3 …done.

Running the cluster_status command on the nodes confirms that rabbit@rabbit3 now is no longer part of the cluster and operates independently.

5.管理界面出现:/etc/rabbitmq/rabbitmq.config (not found)解决办法

# find / -name rabbitmq.config.example

/usr/share/doc/rabbitmq-server-3.6.10/rabbitmq.config.example

# cp /usr/share/doc/rabbitmq-server-3.6.10/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config

# systemctl restart rabbitmq-server

Install Python3.X on CentOS7

CentOS7默认自带Python2.7版本,因为项目需要使用Python3.x,可以按照此文的方法进行安装。

1.Requirements

yum install gcc openssl-devel bzip2-devel libffi-devel

2.Download Python 3.7

cd /usr/srcwget

https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz

tar xzf Python-3.7.3.tgz

3.Install Python 3.7

cd Python-3.7.3

./configure –enable-optimizations

make altinstall

Note:make altinstall is used to prevent replacing the default python binary file /usr/bin/python.

4.Check Python Version

python3.7 -V

备注:

1.如果要使用Python3.x作为python的默认版本 ,可以把用户自定义的配置放入/etc/profile.d/目录中,具体方法:

vi /etc/profile.d/python.sh

输入alias参数 alias python=’/usr/local/bin/python3.7’,保存退出。

使配置生效:source /etc/profile.d/python.sh

2.如果非root用户创建的文件需要注意设置权限:

chmod 755 /etc/profile.d/python.sh

源码编译安装Redis

环境:

CentOS7.2

redis version:4.0.11

安装步骤:

# tar zxf redis-4.0.11.tar.gz

# cd redis-4.0.11

# make

# make install PREFIX=/usr/local/redis //指定安装目录

# mkdir /usr/local/redis/conf //建配置文件目录

# cp redis.conf /usr/local/redis/conf

# mkdir /usr/local/redis/log //建日志文件目录

# touch /usr/local/redis/log/redis_6379.log //建日志文件

# vi /usr/local/redis/conf/redis.conf

修改如下内容:

bind 0.0.0.0 //允许任何连接

daemonize yes

logfile /usr/local/redis/log/redis_6379.log  //指定日志文件

dir /usr/local/redis/bin //工作目录,备份文件也保存在此目录

requirepass <设置密码> //设置认证密码

#vi /etc/profile

export PATH=”$PATH:/usr/local/redis/bin” 

# 保存退出

# 让环境变量立即生效: 

source /etc/profile

配置启动脚本:

# 复制脚本文件到init.d目录下 

# cp /usr/local/src/redis-4.0.11/utils/redis_init_script /etc/init.d/redis

vi /etc/init.d/redis

修改如下内容:

EXEC=/usr/local/redis/bin/redis-server

CLIEXEC=/usr/local/redis/bin/redis-cli

CONF=”/usr/local/redis/conf/redis.conf”

$CLIEXEC -a “password” -p $REDISPORT shutdown

#此处passowrd应与上述设置密码保持一致。

注:若修改了redis.conf文件中的bind地址之后,重启redis出现Could not connect to Redis at 127.0.0.1:6379: Connection refused错误,需要修改脚本(例如/etc/init.d/redis),找到如下字符串$CLIEXE -p $REDISPORT shutdown,修改为$CLIEXEC -h ip -a “password” -p $REDISPORT shutdown(即添加-h ip,ip应与上述bind地址保持一致)

# chmod +x /etc/init.d/redis

# chkconfig –add redis

# chkconfig –level 2345 redis on

# systemctl start redis #或者 /etc/init.d/redis start

# systemctl stop redis #或者 /etc/init.d/redis stop

附录1:日志中存在告警及解决

告警1:

WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

解决:

修改/etc/sysctl.conf文件,增加一行:

net.core.somaxconn = 1024

然后执行命令:sysctl -p

告警2:

2865:M 01 Nov 17:36:36.055 # WARNING overcommit_memory is set to 0! Background save may fail

 under low memory condition. To fix this issue add ‘vm.overcommit_memory = 1’ to /etc/sysctl.conf and then reboot or run the command ‘sysctl vm.overcommit_memory=1’ for this to take effect.

解决:

修改/etc/sysctl.conf文件,增加一行:

vm.overcommit_memory = 1

然后执行命令:sysctl -p

告警3:

2865:M 01 Nov 17:36:36.055 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command ‘echo never > /sys/kernel/mm/transparent_hugepage/enabled’ as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

解决:

Create following file:

vi /etc/systemd/system/disable-thp.service

and paste there following content:

[Unit]

Description=Disable Transparent Huge Pages (THP)

[Service]

Type=simple

ExecStart=/bin/sh -c “echo ‘never’ > /sys/kernel/mm/transparent_hugepage/enabled && echo ‘never’ > /sys/kernel/mm/transparent_hugepage/defrag”

[Install]

WantedBy=multi-user.target

Save the file and reload SystemD daemon:

systemctl daemon-reload

you can start the script and enable it on boot level:

systemctl start disable-thp

systemctl enable disable-thp

附录2:Redis 数据备份与恢复

备份数据:

127.0.0.1:6379> save

OK

该命令将在 redis 安装目录中创建dump.rdb文件。

另创建 redis 备份文件也可以使用命令 BGSAVE,该命令在后台执行。

127.0.0.1:6379> BGSAVE

Background saving started

恢复数据:

如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。获取 redis 目录可以使用 CONFIG 命令,如下所示:

redis 127.0.0.1:6379> CONFIG GET dir

1) “dir”

2) “/usr/local/redis/bin”

以上命令 CONFIG GET dir 输出的 redis 安装目录为 /usr/local/redis/bin。

附录3:Redis 性能测试

Redis 性能测试是通过同时执行多个命令实现的。

redis-benchmark [option] [option value]

以下实例同时执行 10000 个请求来检测性能:

$ redis-benchmark -n 10000  -q

以下实例使用了多个参数来测试 redis 性能:

$ redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 10000 -q

SET: 146198.83 requests per second

LPUSH: 145560.41 requests per second

以上实例中主机为 127.0.0.1,端口号为 6379,执行的命令为 set,lpush,请求数为 10000,通过 -q 参数让结果只显示每秒执行的请求数。

附录4:Redis 客户端连接

最大连接数:maxclients 的默认值是 10000,可以在 redis.conf 中对这个值进行修改。

config get maxclients

1) “maxclients”

2) “10000”

安装配置samba

一、环境:

CentOS 7.2

Samba 4.8.3

二、需求:

使用Samba搭建文件服务器。

(1)smbgrp组成员(tom,jack,david)可以修改及删除betterit360-publicdocs共享文件夹下目录名、文件名及文件内容。

(2)smbgrp组成员(tom,jack,david)可以修改及删除betterit360-personaldocs共享文件夹下自己创建的目录、文件,但不能修改及删除别人创建的目录、文件,也不能在别人创建的目录下创建子目录或文件,只可以查看。

(3)所有人员无需身份验证即可访问betterit360-tools共享文件夹,但只能查看,不能修改、删除。

三、安装及配置:

# yum -y install samba

查看安装版本:

# yum list installed | grep samba

# cd /etc/samba/

# mv smb.conf smb.conf.ori //备份默认配置文件

# vi smb.conf //创建新的配置文件

写入如下内容:

[global]

        workgroup = SAMBA

        security = user

        passdb backend = tdbsam

        printing = cups

        printcap name = cups

        load printers = yes

        cups options = raw

        map to guest = Bad User

[betterit360publicdocs]

       path = /sambashare/betterit360-publicdocs

       public = no

       create mask = 0775

       directory mask = 0775

       writable = yes

       valid users = @smbgrp

[betterit360-personaldocs]

       path = /sambashare/betterit360-personaldocs

       public = no

       create mask = 1744

       force create mode = 1744 //强制设置创建文件的默认权限,1表示设置sticky

       directory mask = 1755

       force directory mode = 1755 //强制设置创建目录的默认权限,1表示设置sticky

       writable = yes

       valid users = @smbgrp

[betterit360tools]

       path = /sambashare/betterit360tools

       public = yes

       writable = no    //所有人员无需身份验证即可查看及修改:writable = yes

保存并退出。

创建用户:

# groupadd smbgrp

# useradd -g smbgrp -M -s /sbin/nologin tom

# useradd -g smbgrp -M -s /sbin/nologin jack

# useradd -g smbgrp -M -s /sbin/nologin david

# smbpasswd -a tom

New SMB password:

Retype new SMB password:

Added user tom.

# smbpasswd -a jack

New SMB password:

Retype new SMB password:

Added user jack.

# smbpasswd -a david

New SMB password:

Retype new SMB password:

Added user david.

创建共享目录并设置权限:

# mkdir -p /sambashare

# mkdir -p /sambashare/betterit360-publicdocs

# mkdir -p /sambashare/betterit360-personaldocs

# mkdir -p /sambashare/betterit360-tools

# chmod -R 775 /sambashare/betterit360-publicdocs

# chmod -R 775 /sambashare/betterit360-personaldocs

# chmod -R o+t /sambashare/betterit360-personaldocs //此步若省略,则betterit360-personaldocs目录下创建的目录名、文件名,其他用户可以修改等。

# chmod -R 775 /sambashare/betterit360-tools

# chgrp -R smbgrp /sambashare/betterit360-publicdocs

# chgrp -R smbgrp /sambashare/betterit360-personaldocs

# chgrp -R smbgrp /sambashare/betterit360-tools

启动Samba:

# testparm    //测试Samba配置文件是否正确

# systemctl start smb //启动Samba

注:

systemctl restart smb //重启

systemctl enable smb //修改为开机启动

systemctl status smb //查看状态

四、 客户端测试访问(可以使用windows客户端测试,更直观):

示例图 :

附录:

windows 10 无法访问 CentOS 7 的 SMB 共享文件问题解决

不同的问题症状可参考如下不同的解决办法:

(1)修改 Win10 策略。按window+R键输入gpedit.msc 来启动本地组策略编辑器。依次找到“计算机配置-管理模板-网络-Lanman工作站”这个节点,在右侧内容区可以看到“启用不安全的来宾登录”这一条策略设置。状态是“未配置”,双击它,将其状态修改为“已启用”并单击确定按钮。

(2)进入Control Panel\Programs,点击【Turn Windows feautres on or off】,勾选 SMB 1.0/CIFS File Sharing Support 下的 SMB 1.0/CIFS Client 和 SMB 1.0/CIFS Server,点击【ok】,然后,重启电脑。

Linux History操作日志配置

History记录了用户操作命令,但没有记录来源ip地址、操作用户、操作时间等,且用户可以清空History记录,一旦服务器出现问题,很难调查取证和审计用户操作。

在没有堡垒机的情况下,可以通过logger将History中的操作命令记录到系统日志中。此方法实时记录用户操作,且记录来源ip地址、操作用户、操作时间、操作命令等。

HISTORY日志配置步骤:

1.使用root权限修改/etc/profile文件,增加 history操作日志配置,内容如下:

export HISTTIMEFORMAT=”[%Y-%m-%d %H:%M:%S] [`who am i 2>/dev/null|awk ‘{print $NF}’|sed -e ‘s/[()]//g’`]”

export PROMPT_COMMAND=’\

if [ -z “$OLD_PWD” ];then

export OLD_PWD=$PWD;

fi;

if [ ! -z “$LAST_CMD” ] && [ “$(history 1)” != “$LAST_CMD” ];then

logger -t `whoami`_shell_cmd “[$OLD_PWD]$(history 1)”;

fi;

export LAST_CMD=”$(history 1)”;

export OLD_PWD=$PWD;’

2.执行命令,使配置内容立即生效

source /etc/profile

3.配置完成后重新启动rsyslog服务

service rsyslog restart

4.日志记录文件及日志格式

logger命令默认的日志保存在 /var/log/messages中。

日志格式如下:

如查看示例图中user1相关操作命令,可执行命令:

grep ‘user1_shell_cmd’ /var/log/messages

安装Docker-CE

环境版本:

# cat /etc/redhat-release

CentOS Linux release 7.6.1810 (Core)

安装Docker-ce步骤:

1.移除旧的版本:

$ sudo yum remove docker \

docker-client \

docker-client-latest \

docker-common \

docker-latest \

docker-latest-logrotate \

docker-logrotate \

docker-selinux \

docker-engine-selinux \

docker-engine

2.安装一些必要的系统工具:

$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2

3.添加软件源信息(示例为阿里云):

$ sudo yum-config-manager –add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4.更新 yum 缓存: $ sudo yum makecache fast

5.安装 Docker-ce: $ sudo yum -y install docker-ce

6.启动 Docker 后台服务: $ sudo systemctl start docker

7.查看安装后的docker版本:

# yum list installed | grep docker

containerd.io.x86_64                 1.2.5-3.1.el7                  @docker-ce-stable

docker-ce.x86_64                     3:18.09.6-3.el7                @docker-ce-stable

docker-ce-cli.x86_64                 1:18.09.6-3.el7                @docker-ce-stable

附录:安装特定版本docker-ce

1.下载rpm包https://download.docker.com/linux/centos/7/x86_64/stable/Packages/

2.安装rpm包

yum install -y /path/docker-cexxx.rpm

或使用如下方法安装特定版本(示例为 17.09.0 ):

yum list docker-ce –showduplicates|sort -r

yum install docker-ce-17.09.0.ce-1.el7.cnetos -y